import z from 'zod'; import { serviceRequest, serviceResponse, } from '../interfaces/common'; import { metadata } from '../interfaces/Metadata'; export const file = z.object({ _id: z.string(), name: z.string(), mimetype: z.string(), encoding: z.string(), sizeBytes: z.number().optional(), durationSeconds: z.number().optional(), url: z.string(), meta: metadata, }); export type File = z.infer; export interface FileService { create(request: CreateFileRequest): Promise; createFromUrl(request: CreateFromUrlRequest): Promise; createFromYouTube(request: CreateFileFromYouTubeRequest): Promise; get(request: GetFileRequest): Promise; getByUrl(request: GetFileByURLRequest): Promise; list(request: ListFilesRequest): Promise; } /** ****************************************************************************** * Create File ******************************************************************************* */ export const createFileParams = z.object({ name: z.string(), mimetype: z.string(), encoding: z.string(), sizeBytes: z.number().optional(), durationSeconds: z.number().optional(), buffer: z.instanceof(Buffer).optional(), }); export const createFileRequest = serviceRequest.merge( z.object({ params: createFileParams, }), ); export const createFileResponse = serviceResponse.merge( z.object({ file: file.optional(), uploadUrl: z.string().optional(), }), ); export type CreateFileParams = z.infer; export type CreateFileRequest = z.infer; export type CreateFileResponse = z.infer; /** ****************************************************************************** * Create From Url ******************************************************************************* */ export const creatFromUrlParams = z.object({ url: z.string(), }); export const creatFromUrlRequest = serviceRequest.merge( z.object({ params: creatFromUrlParams, }), ); export const creatFromUrlResponse = serviceResponse.merge( z.object({ file: file.optional(), }), ); export type CreateFromUrlParams = z.infer; export type CreateFromUrlRequest = z.infer; export type CreateFromUrlResponse = z.infer; /** ****************************************************************************** * Create File From YouTube ******************************************************************************* */ export const createFileFromYouTubeParams = z.object({ youtubeUrl: z.string(), }); export const createFileFromYouTubeRequest = serviceRequest.merge( z.object({ params: createFileFromYouTubeParams, }), ); export const createFileFromYouTubeResponse = serviceResponse.merge( z.object({ file: file.optional(), }), ); export type CreateFileFromYouTubeParams = z.infer; export type CreateFileFromYouTubeRequest = z.infer; export type CreateFileFromYouTubeResponse = z.infer; /** ****************************************************************************** * Get File ******************************************************************************* */ export const getFileParams = z.object({ fileId: z.string(), }); export const getFileRequest = serviceRequest.merge( z.object({ params: getFileParams, }), ); export const getFileByURLParams = z.object({ url: z.string(), }); export const getFileByURLRequest = serviceRequest.merge( z.object({ params: getFileByURLParams, }), ); export const getFileResponse = serviceResponse.merge( z.object({ file: file.optional().nullable(), }), ); export type GetFileParams = z.infer; export type GetFileRequest = z.infer; export type GetFileByURLParams = z.infer; export type GetFileByURLRequest = z.infer; export type GetFileResponse = z.infer; /** ****************************************************************************** * List Files ******************************************************************************* */ export const listFilesParams = z.object({ fileIds: z.array(z.string()), }); export const listFilesRequest = serviceRequest.merge( z.object({ params: listFilesParams, }), ); export const listFilesResponse = serviceResponse.merge( z.object({ files: z.array(file).optional(), }), ); export type ListFilesParams = z.infer; export type ListFilesRequest = z.infer; export type ListFilesResponse = z.infer;