import z from 'zod'; import { authedServiceRequest, serviceRequest, serviceResponse, } from '../interfaces/common'; import { metadata } from '../interfaces/Metadata'; export const zSyncTypes = z.enum([ 'Initial', 'Manual', 'Automatic', ]); export const zSyncStatus = z.enum([ 'Pending', 'Running', 'Complete', 'Failed', ]); export const syncInfo = z.object({ total: z.number(), new: z.number(), existing: z.number(), removed: z.number(), pending: z.number(), running: z.number(), completed: z.number(), failed: z.number(), }); export const updateSyncInfoParams = z.object({ total: z.number().optional(), new: z.number().optional(), existing: z.number().optional(), removed: z.number().optional(), pending: z.number().optional(), running: z.number().optional(), completed: z.number().optional(), failed: z.number().optional(), }); export const sync = z.object({ _id: z.string(), organizationId: z.string(), sourceId: z.string(), type: zSyncTypes, status: zSyncStatus, message: z.string().optional(), info: syncInfo, meta: metadata, }); export type Sync = z.infer; export type SyncInfo = z.infer; export type SyncTypes = z.infer; export type SyncStatus = z.infer; export interface SyncService { create(request: CreateSyncRequest): Promise; update(request: UpdateSyncRequest): Promise; get(request: GetSyncRequest): Promise; latest(request: LatestSyncRequest): Promise; list(request: ListSyncsRequest): Promise; } /** ****************************************************************************** * Create Sync ******************************************************************************* */ export const createSyncParams = z.object({ sourceId: z.string(), type: zSyncTypes, }); export const createSyncRequest = authedServiceRequest.merge( z.object({ params: createSyncParams, }), ); export const createSyncResponse = serviceResponse.merge( z.object({ sync: sync.optional(), }), ); export type CreateSyncParams = z.infer; export type CreateSyncRequest = z.infer; export type CreateSyncResponse = z.infer; /** ****************************************************************************** * Update Sync ******************************************************************************* */ export const updateSyncParams = z.object({ _id: z.string(), status: zSyncStatus.nullable().optional(), message: z.string().nullable().optional(), infoDiff: updateSyncInfoParams.optional(), }); export const updateSyncRequest = serviceRequest.merge( z.object({ params: updateSyncParams, }), ); export const updateSyncResponse = serviceResponse.merge( z.object({ sync: sync.nullable().optional(), }), ); export type UpdateSyncParams = z.infer; export type UpdateSyncRequest = z.infer; export type UpdateSyncResponse = z.infer; /** ****************************************************************************** * Get Sync ******************************************************************************* */ export const getSyncParams = z.object({ syncId: z.string(), }); export const getSyncRequest = authedServiceRequest.merge( z.object({ params: getSyncParams, }), ); export const getSyncResponse = serviceResponse.merge( z.object({ sync: sync.nullable().optional(), }), ); export type GetSyncParams = z.infer; export type GetSyncRequest = z.infer; export type GetSyncResponse = z.infer; /** ****************************************************************************** * Latest Sync ******************************************************************************* */ export const latestSyncParams = z.object({ sourceId: z.string(), }); export const latestSyncRequest = authedServiceRequest.merge( z.object({ params: latestSyncParams, }), ); export const latestSyncResponse = serviceResponse.merge( z.object({ sync: sync.nullable().optional(), }), ); export type LatestSyncParams = z.infer; export type LatestSyncRequest = z.infer; export type LatestSyncResponse = z.infer; /** ****************************************************************************** * List Syncs ******************************************************************************* */ export const listSyncsParams = z.object({ sourceId: z.string(), }); export const listSyncsRequest = authedServiceRequest.merge( z.object({ params: listSyncsParams, }), ); export const listSyncsResponse = serviceResponse.merge( z.object({ syncs: z.array(sync).optional(), }), ); export type ListSyncsParams = z.infer; export type ListSyncsRequest = z.infer; export type ListSyncsResponse = z.infer;