import z from 'zod'; import { srtLine } from '../interfaces/SRTLine'; import { authedServiceRequest, serviceRequest, serviceResponse, } from '../interfaces/common'; import { metadata } from '../interfaces/Metadata'; export const zDocumentTypes = z.enum([ 'YouTube', 'RSS', 'WebPage', 'File', ]); export const documentImportStatus = z.enum([ 'Pending', 'Running', 'Complete', 'Failed', ]); export const document = z.object({ _id: z.string(), organizationId: z.string(), sourceId: z.string(), syncId: z.string(), title: z.string(), description: z.string(), releasedAt: z.number(), views: z.number().optional(), type: zDocumentTypes, url: z.string().url(), domain: z.string().url().optional(), lang: z.string().optional(), audioFileId: z.string(), imageFileId: z.string(), predictionId: z.string().optional(), raw: z.string().nullable(), srt: z.array(srtLine), importStatus: documentImportStatus, archived: z.boolean().optional(), deleted: z.boolean().optional(), meta: metadata, }); export const documentSummary = document.omit({ raw: true, srt: true, }); export type Document = z.infer; export type DocumentSummary = z.infer; export type DocumentTypes = z.infer; export type DocumentImportStatus = z.infer; export interface DocumentService { create(request: CreateDocumentRequest): Promise; sync(request: SyncDocumentRequest): Promise; update(request: UpdateDocumentRequest): Promise; get(request: GetDocumentRequest): Promise; list(request: ListDocumentsRequest): Promise; listAll(request: ListAllDocumentsRequest): Promise; status(request: DocumentStatusRequest): Promise; } /** ****************************************************************************** * Create Document ******************************************************************************* */ export const createDocumentParams = z.object({ organizationId: z.string(), sourceId: z.string(), syncId: z.string(), imageFileId: z.string(), type: zDocumentTypes, url: z.string().url(), domain: z.string().url().optional(), lang: z.string().optional(), raw: z.string().optional(), title: z.string().optional(), }); export const createDocumentRequest = serviceRequest.merge( z.object({ params: createDocumentParams, }), ); export const createDocumentResponse = serviceResponse.merge( z.object({ document: document.nullable().optional(), }), ); export type CreateDocumentParams = z.infer; export type CreateDocumentRequest = z.infer; export type CreateDocumentResponse = z.infer; /** ****************************************************************************** * Sync Document ******************************************************************************* */ export const syncDocumentParams = z.object({ _id: z.string(), syncId: z.string(), deleted: z.boolean().optional(), }); export const syncDocumentRequest = serviceRequest.merge( z.object({ params: syncDocumentParams, }), ); export const syncDocumentResponse = serviceResponse.merge( z.object({ document: document.nullable().optional(), }), ); export type SyncDocumentParams = z.infer; export type SyncDocumentRequest = z.infer; export type SyncDocumentResponse = z.infer; /** ****************************************************************************** * Update Document ******************************************************************************* */ export const updateDocumentParams = z.object({ document: z.object({ _id: z.string().optional(), organizationId: z.string().optional(), sourceId: z.string().optional(), syncId: z.string().optional(), title: z.string().optional(), description: z.string().optional(), releasedAt: z.number().optional(), views: z.number().optional(), type: zDocumentTypes.optional(), url: z.string().url().optional(), domain: z.string().url().optional(), lang: z.string().optional(), audioFileId: z.string().optional(), imageFileId: z.string().optional(), predictionId: z.string().optional(), raw: z.string().nullable().optional(), srt: z.array(srtLine).optional(), importStatus: documentImportStatus.optional(), archived: z.boolean().optional(), deleted: z.boolean().optional(), meta: metadata.optional(), }), }); export const updateDocumentRequest = serviceRequest.merge( z.object({ params: updateDocumentParams, }), ); export const updateDocumentResponse = serviceResponse.merge( z.object({ document: document.nullable().optional(), }), ); export type UpdateDocumentParams = z.infer; export type UpdateDocumentRequest = z.infer; export type UpdateDocumentResponse = z.infer; /** ****************************************************************************** * Get Document ******************************************************************************* */ export const getDocumentParams = z.object({ documentId: z.string(), }); export const getDocumentRequest = serviceRequest.merge( z.object({ params: getDocumentParams, }), ); export const getDocumentResponse = serviceResponse.merge( z.object({ document: document.nullable().optional(), }), ); export type GetDocumentParams = z.infer; export type GetDocumentRequest = z.infer; export type GetDocumentResponse = z.infer; /** ****************************************************************************** * List Documents ******************************************************************************* */ export const listDocumentsParams = z.object({ sourceId: z.string(), search: z.string().optional(), offset: z.number().optional(), pageSize: z.number().optional(), }); export const listDocumentsRequest = authedServiceRequest.merge( z.object({ params: listDocumentsParams, }), ); export const listDocumentsResponse = serviceResponse.merge( z.object({ documents: z.array(documentSummary).optional(), total: z.number().optional(), }), ); export type ListDocumentsParams = z.infer; export type ListDocumentsRequest = z.infer; export type ListDocumentsResponse = z.infer; /** ****************************************************************************** * List All Documents ******************************************************************************* */ export const listAllDocumentsParams = z.object({ sourceId: z.string(), }); export const listAllDocumentsRequest = serviceRequest.merge( z.object({ params: listAllDocumentsParams, }), ); export const listAllDocumentsResponse = serviceResponse.merge( z.object({ documents: z.array(documentSummary).optional(), }), ); export type ListAllDocumentsParams = z.infer; export type ListAllDocumentsRequest = z.infer; export type ListAllDocumentsResponse = z.infer; /** ****************************************************************************** * Document Status ******************************************************************************* */ export const documentStatusParams = z.object({ sourceId: z.string(), }); export const documentStatusRequest = serviceRequest.merge( z.object({ params: documentStatusParams, }), ); export const documentStatusResponse = serviceResponse.merge( z.object({ statuses: z.object({ Pending: z.number(), Processing: z.number(), Complete: z.number(), Failed: z.number(), }).optional(), }), ); export type DocumentStatusParams = z.infer; export type DocumentStatusRequest = z.infer; export type DocumentStatusResponse = z.infer;