import z from 'zod'; import { authedServiceRequest, serviceRequest, serviceResponse, } from '../interfaces/common'; import { metadata } from '../interfaces/Metadata'; export const zSnippetTypes = z.enum([ 'YouTube', 'RSS', 'WebPage', 'File', ]); export const snippet = z.object({ _id: z.string(), organizationId: z.string(), sourceId: z.string(), syncId: z.string(), documentId: z.string(), title: z.string(), text: z.string(), type: zSnippetTypes, url: z.string().url(), domain: z.string().url().optional(), lang: z.string().optional(), hash: z.string(), index: z.number(), startTime: z.string().nullable(), startSeconds: z.number(), endTime: z.string().optional(), endSeconds: z.number().optional(), releasedAt: z.number().optional(), views: z.number().optional(), pageNumber: z.number().optional(), meta: metadata, }); export type Snippet = z.infer; export enum SnippetSortBy { Relevance = 'Relevance', MostPopular = 'Most Popular', LeastPopular = 'Least Popular', MostRecent = 'Most Recent', LeastRecent = 'Least Recent', } export interface SnippetService { create(request: CreateSnippetRequest): Promise; get(request: GetSnippetRequest): Promise; list(request: ListSnippetsRequest): Promise; count(request: CountSnippetsRequest): Promise; } /** ****************************************************************************** * Create Snippet ******************************************************************************* */ export const createSnippetParams = z.object({ organizationId: z.string(), sourceId: z.string(), syncId: z.string(), documentId: z.string(), title: z.string(), text: z.string(), type: zSnippetTypes, url: z.string().url(), domain: z.string().url().optional(), lang: z.string().optional(), hash: z.string(), index: z.number(), startTime: z.string().optional(), startSeconds: z.number().optional(), endTime: z.string().optional(), endSeconds: z.number().optional(), releasedAt: z.number().optional(), views: z.number().optional(), pageNumber: z.number().optional(), }); export const createSnippetRequest = serviceRequest.merge( z.object({ params: z.array(createSnippetParams), }), ); export const createSnippetResponse = serviceResponse.merge( z.object({ snippets: snippet.array().optional(), }), ); export type CreateSnippetParams = z.infer; export type CreateSnippetRequest = z.infer; export type CreateSnippetResponse = z.infer; /** ****************************************************************************** * Get Snippet ******************************************************************************* */ export const getSnippetParams = z.object({ snippetId: z.string(), }); export const getSnippetRequest = serviceRequest.merge( z.object({ params: getSnippetParams, }), ); export const getSnippetResponse = serviceResponse.merge( z.object({ snippet: snippet.nullable().optional(), }), ); export type GetSnippetParams = z.infer; export type GetSnippetRequest = z.infer; export type GetSnippetResponse = z.infer; /** ****************************************************************************** * List Snippets ******************************************************************************* */ export const listSnippetsParams = z.object({ _ids: z.array(z.string()).optional(), documentId: z.string().optional(), }); export const listSnippetsRequest = authedServiceRequest.merge( z.object({ params: listSnippetsParams, }), ); export const listSnippetsResponse = serviceResponse.merge( z.object({ snippets: z.array(snippet).optional(), }), ); export type ListSnippetsParams = z.infer; export type ListSnippetsRequest = z.infer; export type ListSnippetsResponse = z.infer; /** ****************************************************************************** * Count Snippets ******************************************************************************* */ export const countSnippetsParams = z.object({ sourceId: z.string(), }); export const countSnippetsRequest = serviceRequest.merge( z.object({ params: countSnippetsParams, }), ); export const countSnippetsResponse = serviceResponse.merge( z.object({ count: z.number().optional(), }), ); export type CountSnippetsParams = z.infer; export type CountSnippetsRequest = z.infer; export type CountSnippetsResponse = z.infer;