import * as v from "valibot"; export const fileSchema = v.object({ id: v.string(), filename: v.string(), originalName: v.string(), mimeType: v.string(), size: v.pipe(v.number(), v.integer()), hash: v.string(), bucketName: v.string(), objectKey: v.string(), r2Url: v.string(), visibility: v.string(), userId: v.string(), metadata: v.optional(v.record(v.string(), v.any())), tags: v.optional(v.array(v.string())), status: v.string(), processingError: v.optional(v.string()), uploadedAt: v.date(), lastAccessedAt: v.optional(v.date()), expiresAt: v.optional(v.date()), createdAt: v.date(), updatedAt: v.date(), }); export type File = v.InferOutput; export type Files = File[]; export const fileUploadRequestSchema = v.object({ visibility: v.optional(v.string()), metadata: v.optional(v.record(v.string(), v.any())), tags: v.optional(v.array(v.string())), processImage: v.optional(v.boolean()), processDocument: v.optional(v.boolean()), processVideo: v.optional(v.boolean()), }); export type FileUploadRequest = v.InferOutput; export const fileFiltersSchema = v.object({ userId: v.string(), mimeType: v.optional(v.string()), visibility: v.optional(v.string()), status: v.optional(v.string()), search: v.optional(v.string()), tags: v.optional(v.array(v.string())), }); export type FileFilters = v.InferOutput; export const paginationOptionsSchema = v.object({ page: v.pipe(v.number(), v.integer()), pageSize: v.pipe(v.number(), v.integer()), sortBy: v.optional(v.string()), sortOrder: v.optional(v.string()), }); export type PaginationOptions = v.InferOutput; export const PaginatedFilesSchema = v.object({ data: v.array(fileSchema), total: v.pipe(v.number(), v.integer()), page: v.pipe(v.number(), v.integer()), pageSize: v.pipe(v.number(), v.integer()), totalPages: v.pipe(v.number(), v.integer()), }); export type PaginatedFiles = v.InferOutput; export const getFilesSchema = v.object({ filters: fileFiltersSchema, pagination: paginationOptionsSchema, }); export type GetFiles = v.InferOutput; export const presignedUploadRequestSchema = v.object({ filename: v.string(), mimeType: v.string(), size: v.pipe(v.number(), v.integer()), visibility: v.optional(v.string()), }); export type PresignedUploadRequest = v.InferOutput< typeof presignedUploadRequestSchema >; export const presignedUploadResponseSchema = v.object({ uploadUrl: v.string(), downloadUrl: v.optional(v.string()), expiresIn: v.pipe(v.number(), v.integer()), fileId: v.string(), objectKey: v.string(), fields: v.optional(v.record(v.string(), v.any())), }); export type PresignedUploadResponse = v.InferOutput< typeof presignedUploadResponseSchema >; export const fileUploadResultSchema = v.object({ success: v.boolean(), file: v.optional(fileSchema), uploadId: v.optional(v.string()), error: v.optional(v.string()), }); export type FileUploadResult = v.InferOutput; export const bulkFileIdsSchema = v.object({ fileIds: v.array(v.string()), }); export type BulkFileIds = v.InferOutput; export const fileUpdateRequestSchema = v.object({ filename: v.optional(v.string()), visibility: v.optional(v.string()), metadata: v.optional(v.record(v.string(), v.any())), tags: v.optional(v.array(v.string())), }); export type FileUpdateRequest = v.InferOutput; export const fileShareRequestSchema = v.object({ userId: v.string(), permissions: v.object({ canRead: v.optional(v.boolean()), canWrite: v.optional(v.boolean()), canDelete: v.optional(v.boolean()), canShare: v.optional(v.boolean()), }), expiresAt: v.optional(v.date()), }); export type FileShareRequest = v.InferOutput; // // Frontend specific models // export const clientFileFiltersSchema = v.object({ mimeType: v.optional(v.string()), visibility: v.optional(v.string()), status: v.optional(v.string()), search: v.optional(v.string()), tags: v.optional(v.array(v.string())), }); export type ClientFileFilters = v.InferOutput; export const clientPaginationOptionsSchema = v.object({ page: v.pipe(v.number(), v.integer()), pageSize: v.pipe(v.number(), v.integer()), sortBy: v.string(), sortOrder: v.picklist(["asc", "desc"]), }); export type ClientPaginationOptions = v.InferOutput< typeof clientPaginationOptionsSchema >;