Files
Immich/server/src/dtos/file-vault.dto.ts
T

70 lines
2.1 KiB
TypeScript

import { createZodDto } from 'nestjs-zod';
import z from 'zod';
export const fileVaultName = z
.string()
.min(1)
.max(240)
.refine(
(name) =>
name.trim().length > 0 &&
!name.includes('/') &&
!name.includes('\\') &&
[...name].every((char) => {
const code = char.codePointAt(0) ?? 0;
return code >= 32 && code !== 127;
}) &&
!['.', '..'].includes(name) &&
Buffer.byteLength(name, 'utf8') <= 240,
'Invalid file name',
);
const folderId = z.uuid().nullable().optional();
const entry = z
.object({
id: z.uuid(),
parentId: z.uuid().nullable(),
name: z.string(),
isFolder: z.boolean(),
size: z.int(),
checksum: z.string().nullable(),
createdAt: z.string(),
updatedAt: z.string(),
deletedAt: z.string().nullable(),
})
.meta({ id: 'FileVaultEntryDto' });
const folder = z
.object({ id: z.uuid(), name: z.string(), parentId: z.uuid().nullable() })
.meta({ id: 'FileVaultFolderDto' });
export class FileVaultEntryDto extends createZodDto(entry) {}
export class FileVaultFolderDto extends createZodDto(folder) {}
export class FileVaultCreateFolderDto extends createZodDto(
z.object({ name: fileVaultName, parentId: folderId }).meta({ id: 'FileVaultCreateFolderDto' }),
) {}
export class FileVaultUpdateDto extends createZodDto(
z.object({ name: fileVaultName.optional(), parentId: folderId }).meta({ id: 'FileVaultUpdateDto' }),
) {}
export class FileVaultUploadDto extends createZodDto(
z.object({ name: fileVaultName, parentId: z.uuid().optional() }).meta({ id: 'FileVaultUploadDto' }),
) {}
export class FileVaultListDto extends createZodDto(
z
.object({
parentId: z.uuid().optional(),
trash: z.enum(['true', 'false']).optional(),
offset: z.coerce.number().int().min(0).default(0),
})
.meta({ id: 'FileVaultListDto' }),
) {}
export class FileVaultListResponseDto extends createZodDto(
z
.object({
entries: z.array(entry),
breadcrumbs: z.array(folder),
hasMore: z.boolean(),
usedBytes: z.int(),
maxFileBytes: z.int(),
})
.meta({ id: 'FileVaultListResponseDto' }),
) {}