| 1 | import { createZodDto, PaginationDtoSchema } from '@yikart/common' |
| 2 | import { AssetType } from '@yikart/mongodb' |
| 3 | import { z } from 'zod' |
| 4 | |
| 5 | /** 图片元数据 Schema */ |
| 6 | export const ImageMetadataSchema = z.object({ |
| 7 | width: z.number().positive(), |
| 8 | height: z.number().positive(), |
| 9 | }) |
| 10 | |
| 11 | /** 视频元数据 Schema */ |
| 12 | export const VideoMetadataSchema = z.object({ |
| 13 | width: z.number().positive().optional(), |
| 14 | height: z.number().positive().optional(), |
| 15 | duration: z.number().positive().optional(), // seconds |
| 16 | cover: z.string().optional(), // 封面图 path |
| 17 | bitrate: z.number().positive().optional(), // bps |
| 18 | frameRate: z.number().positive().optional(), // fps |
| 19 | }) |
| 20 | |
| 21 | /** 音频元数据 Schema */ |
| 22 | export const AudioMetadataSchema = z.object({ |
| 23 | duration: z.number().positive(), // seconds |
| 24 | bitrate: z.number().positive().optional(), // bps |
| 25 | sampleRate: z.number().positive().optional(), // Hz |
| 26 | channels: z.number().positive().optional(), |
| 27 | }) |
| 28 | |
| 29 | /** Asset 元数据联合 Schema */ |
| 30 | export const AssetMetadataSchema = z.union([ |
| 31 | ImageMetadataSchema, |
| 32 | VideoMetadataSchema, |
| 33 | AudioMetadataSchema, |
| 34 | ]) |
| 35 | |
| 36 | export const UploadAssetDtoSchema = z.object({ |
| 37 | type: z.enum(AssetType), |
| 38 | mimeType: z.string(), |
| 39 | size: z.number().positive().optional(), |
| 40 | filename: z.string().optional(), |
| 41 | metadata: AssetMetadataSchema.optional(), |
| 42 | expiresInSeconds: z.number().positive().optional(), |
| 43 | }) |
| 44 | export class UploadAssetDto extends createZodDto(UploadAssetDtoSchema, 'UploadAssetDto') {} |
| 45 | |
| 46 | export const ConfirmAssetDtoSchema = z.object({ |
| 47 | assetId: z.string(), |
| 48 | size: z.number().positive().optional(), |
| 49 | metadata: AssetMetadataSchema.optional(), |
| 50 | }) |
| 51 | export class ConfirmAssetDto extends createZodDto(ConfirmAssetDtoSchema, 'ConfirmAssetDto') {} |
| 52 | |
| 53 | export const ListAssetsDtoSchema = PaginationDtoSchema.extend({ |
| 54 | type: z.enum(AssetType).optional(), |
| 55 | }) |
| 56 | export class ListAssetsDto extends createZodDto(ListAssetsDtoSchema, 'ListAssetsDto') {} |
| 57 | |
| 58 | export const UploadFromUrlDtoSchema = z.object({ |
| 59 | url: z.url(), |
| 60 | type: z.enum(AssetType), |
| 61 | filename: z.string().optional(), |
| 62 | metadata: AssetMetadataSchema.optional(), |
| 63 | }) |
| 64 | export class UploadFromUrlDto extends createZodDto(UploadFromUrlDtoSchema, 'UploadFromUrlDto') {} |
| 65 | |
| 66 | export const UploadFromBufferDtoSchema = z.object({ |
| 67 | type: z.enum(AssetType), |
| 68 | mimeType: z.string(), |
| 69 | filename: z.string().optional(), |
| 70 | metadata: AssetMetadataSchema.optional(), |
| 71 | }) |
| 72 | export class UploadFromBufferDto extends createZodDto(UploadFromBufferDtoSchema, 'UploadFromBufferDto') {} |
| 73 |