mirror of
https://github.com/immich-app/immich.git
synced 2026-06-04 13:55:19 -04:00
214 lines
6.8 KiB
TypeScript
214 lines
6.8 KiB
TypeScript
import { createZodDto } from 'nestjs-zod';
|
|
import { AssetOrderSchema, UserAvatarColorSchema } from 'src/enum';
|
|
import { UserPreferences } from 'src/types';
|
|
import z from 'zod';
|
|
|
|
const AlbumsUpdateSchema = z
|
|
.object({
|
|
defaultAssetOrder: AssetOrderSchema.optional(),
|
|
})
|
|
.optional()
|
|
.describe('Album preferences')
|
|
.meta({ id: 'AlbumsUpdate' });
|
|
|
|
const AvatarUpdateSchema = z
|
|
.object({
|
|
color: UserAvatarColorSchema.optional(),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'AvatarUpdate' });
|
|
|
|
const MemoriesUpdateSchema = z
|
|
.object({
|
|
enabled: z.boolean().optional().describe('Whether memories are enabled'),
|
|
duration: z.int().min(1).optional().describe('Memory duration in seconds'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'MemoriesUpdate' });
|
|
|
|
const RatingsUpdateSchema = z
|
|
.object({
|
|
enabled: z.boolean().optional().describe('Whether ratings are enabled'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'RatingsUpdate' });
|
|
|
|
const FoldersUpdateSchema = z
|
|
.object({
|
|
enabled: z.boolean().optional().describe('Whether folders are enabled'),
|
|
sidebarWeb: z.boolean().optional().describe('Whether folders appear in web sidebar'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'FoldersUpdate' });
|
|
|
|
const PeopleUpdateSchema = z
|
|
.object({
|
|
enabled: z.boolean().optional().describe('Whether people are enabled'),
|
|
sidebarWeb: z.boolean().optional().describe('Whether people appear in web sidebar'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'PeopleUpdate' });
|
|
|
|
const SharedLinksUpdateSchema = z
|
|
.object({
|
|
enabled: z.boolean().optional().describe('Whether shared links are enabled'),
|
|
sidebarWeb: z.boolean().optional().describe('Whether shared links appear in web sidebar'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'SharedLinksUpdate' });
|
|
|
|
const TagsUpdateSchema = z
|
|
.object({
|
|
enabled: z.boolean().optional().describe('Whether tags are enabled'),
|
|
sidebarWeb: z.boolean().optional().describe('Whether tags appear in web sidebar'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'TagsUpdate' });
|
|
|
|
const EmailNotificationsUpdateSchema = z
|
|
.object({
|
|
enabled: z.boolean().optional().describe('Whether email notifications are enabled'),
|
|
albumInvite: z.boolean().optional().describe('Whether to receive email notifications for album invites'),
|
|
albumUpdate: z.boolean().optional().describe('Whether to receive email notifications for album updates'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'EmailNotificationsUpdate' });
|
|
|
|
const DownloadUpdateSchema = z
|
|
.object({
|
|
archiveSize: z.int().min(1).optional().describe('Maximum archive size in bytes'),
|
|
includeEmbeddedVideos: z.boolean().optional().describe('Whether to include embedded videos in downloads'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'DownloadUpdate' });
|
|
|
|
const PurchaseUpdateSchema = z
|
|
.object({
|
|
showSupportBadge: z.boolean().optional().describe('Whether to show support badge'),
|
|
hideBuyButtonUntil: z.string().optional().describe('Date until which to hide buy button'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'PurchaseUpdate' });
|
|
|
|
const CastUpdateSchema = z
|
|
.object({
|
|
gCastEnabled: z.boolean().optional().describe('Whether Google Cast is enabled'),
|
|
})
|
|
.optional()
|
|
.meta({ id: 'CastUpdate' });
|
|
|
|
const UserPreferencesUpdateSchema = z
|
|
.object({
|
|
albums: AlbumsUpdateSchema,
|
|
avatar: AvatarUpdateSchema,
|
|
cast: CastUpdateSchema,
|
|
download: DownloadUpdateSchema,
|
|
emailNotifications: EmailNotificationsUpdateSchema,
|
|
folders: FoldersUpdateSchema,
|
|
memories: MemoriesUpdateSchema,
|
|
people: PeopleUpdateSchema,
|
|
purchase: PurchaseUpdateSchema,
|
|
ratings: RatingsUpdateSchema,
|
|
sharedLinks: SharedLinksUpdateSchema,
|
|
tags: TagsUpdateSchema,
|
|
})
|
|
.meta({ id: 'UserPreferencesUpdateDto' });
|
|
|
|
const AlbumsResponseSchema = z
|
|
.object({
|
|
defaultAssetOrder: AssetOrderSchema,
|
|
})
|
|
.meta({ id: 'AlbumsResponse' });
|
|
|
|
const FoldersResponseSchema = z
|
|
.object({
|
|
enabled: z.boolean().describe('Whether folders are enabled'),
|
|
sidebarWeb: z.boolean().describe('Whether folders appear in web sidebar'),
|
|
})
|
|
.meta({ id: 'FoldersResponse' });
|
|
|
|
const MemoriesResponseSchema = z
|
|
.object({
|
|
enabled: z.boolean().describe('Whether memories are enabled'),
|
|
duration: z.int().describe('Memory duration in seconds'),
|
|
})
|
|
.meta({ id: 'MemoriesResponse' });
|
|
|
|
const PeopleResponseSchema = z
|
|
.object({
|
|
enabled: z.boolean().describe('Whether people are enabled'),
|
|
sidebarWeb: z.boolean().describe('Whether people appear in web sidebar'),
|
|
})
|
|
.meta({ id: 'PeopleResponse' });
|
|
|
|
const RatingsResponseSchema = z
|
|
.object({
|
|
enabled: z.boolean().describe('Whether ratings are enabled'),
|
|
})
|
|
.meta({ id: 'RatingsResponse' });
|
|
|
|
const SharedLinksResponseSchema = z
|
|
.object({
|
|
enabled: z.boolean().describe('Whether shared links are enabled'),
|
|
sidebarWeb: z.boolean().describe('Whether shared links appear in web sidebar'),
|
|
})
|
|
.meta({ id: 'SharedLinksResponse' });
|
|
|
|
const TagsResponseSchema = z
|
|
.object({
|
|
enabled: z.boolean().describe('Whether tags are enabled'),
|
|
sidebarWeb: z.boolean().describe('Whether tags appear in web sidebar'),
|
|
})
|
|
.meta({ id: 'TagsResponse' });
|
|
|
|
const EmailNotificationsResponseSchema = z
|
|
.object({
|
|
enabled: z.boolean().describe('Whether email notifications are enabled'),
|
|
albumInvite: z.boolean().describe('Whether to receive email notifications for album invites'),
|
|
albumUpdate: z.boolean().describe('Whether to receive email notifications for album updates'),
|
|
})
|
|
.meta({ id: 'EmailNotificationsResponse' });
|
|
|
|
const DownloadResponseSchema = z
|
|
.object({
|
|
archiveSize: z.int().describe('Maximum archive size in bytes'),
|
|
includeEmbeddedVideos: z.boolean().describe('Whether to include embedded videos in downloads'),
|
|
})
|
|
.meta({ id: 'DownloadResponse' });
|
|
|
|
const PurchaseResponseSchema = z
|
|
.object({
|
|
showSupportBadge: z.boolean().describe('Whether to show support badge'),
|
|
hideBuyButtonUntil: z.string().describe('Date until which to hide buy button'),
|
|
})
|
|
.meta({ id: 'PurchaseResponse' });
|
|
|
|
const CastResponseSchema = z
|
|
.object({
|
|
gCastEnabled: z.boolean().describe('Whether Google Cast is enabled'),
|
|
})
|
|
.meta({ id: 'CastResponse' });
|
|
|
|
const UserPreferencesResponseSchema = z
|
|
.object({
|
|
albums: AlbumsResponseSchema,
|
|
folders: FoldersResponseSchema,
|
|
memories: MemoriesResponseSchema,
|
|
people: PeopleResponseSchema,
|
|
ratings: RatingsResponseSchema,
|
|
sharedLinks: SharedLinksResponseSchema,
|
|
tags: TagsResponseSchema,
|
|
emailNotifications: EmailNotificationsResponseSchema,
|
|
download: DownloadResponseSchema,
|
|
purchase: PurchaseResponseSchema,
|
|
cast: CastResponseSchema,
|
|
})
|
|
.meta({ id: 'UserPreferencesResponseDto' });
|
|
|
|
export class UserPreferencesUpdateDto extends createZodDto(UserPreferencesUpdateSchema) {}
|
|
export class UserPreferencesResponseDto extends createZodDto(UserPreferencesResponseSchema) {}
|
|
|
|
export const mapPreferences = (preferences: UserPreferences): UserPreferencesResponseDto => {
|
|
return preferences;
|
|
};
|