70 lines
2.1 KiB
TypeScript
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' }),
|
|
) {}
|