diff --git a/surfsense_web/contracts/types/document.types.ts b/surfsense_web/contracts/types/document.types.ts new file mode 100644 index 000000000..3a6bdde03 --- /dev/null +++ b/surfsense_web/contracts/types/document.types.ts @@ -0,0 +1,73 @@ +import { z } from "zod"; +import { paginationQueryParams } from "."; + +export const documentTypeEnum = z.enum([ + "EXTENSION", + "CRAWLED_URL", + "FILE", + "SLACK_CONNECTOR", + "NOTION_CONNECTOR", + "YOUTUBE_VIDEO", + "GITHUB_CONNECTOR", + "LINEAR_CONNECTOR", + "DISCORD_CONNECTOR", + "JIRA_CONNECTOR", + "CONFLUENCE_CONNECTOR", + "CLICKUP_CONNECTOR", + "GOOGLE_CALENDAR_CONNECTOR", + "GOOGLE_GMAIL_CONNECTOR", + "AIRTABLE_CONNECTOR", + "LUMA_CONNECTOR", + "ELASTICSEARCH_CONNECTOR", +]); + +export const document = z.object({ + id: z.number(), + title: z.string(), + document_type: documentTypeEnum, + document_metadata: z.record(z.string(), z.any()), + content: z.string(), + created_at: z.string(), + search_space_id: z.number(), +}); + +export const extensionDocumentContent = z.object({ + metadata: z.object({ + BrowsingSessionId: z.string(), + VisitedWebPageURL: z.string(), + VisitedWebPageTitle: z.string(), + VisitedWebPageDateWithTimeInISOString: z.string(), + VisitedWebPageReffererURL: z.string(), + VisitedWebPageVisitDurationInMilliseconds: z.string(), + }), + pageContent: z.string(), +}); + +export const getDocumentsRequest = z.object({ + queryParams: paginationQueryParams + .extend({ + search_space_id: z.number().or(z.string()).optional(), + document_type: z.array(documentTypeEnum).optional(), + }) + .nullish(), +}); + +export const getDocumentResponse = z.object({ + items: z.array(document), + total: z.number(), +}); + +export const createDocumentRequest = document + .pick({ document_type: true, search_space_id: true }) + .extend({ + content: z.string().or(z.array(z.string())).or(z.array(extensionDocumentContent)), + }); + +export const createDocumentResponse = z.object({ + message: z.literal("Document created successfully"), +}); + +export type GetDocumentsRequest = z.infer; +export type GetDocumentResponse = z.infer; +export type CreateDocumentRequest = z.infer; +export type CreateDocumentResponse = z.infer; diff --git a/surfsense_web/contracts/types/index.ts b/surfsense_web/contracts/types/index.ts index d00f7903f..e6f5da376 100644 --- a/surfsense_web/contracts/types/index.ts +++ b/surfsense_web/contracts/types/index.ts @@ -3,6 +3,10 @@ import { z } from "zod"; export const paginationQueryParams = z.object({ limit: z.number().optional(), skip: z.number().optional(), + // OR + page: z.number().optional(), + page_size: z.number().optional(), + // TODO: Normalize to page/page_size or limit/skip in backend }); export type PaginationQueryParams = z.infer; diff --git a/surfsense_web/lib/apis/documents-api.service.ts b/surfsense_web/lib/apis/documents-api.service.ts new file mode 100644 index 000000000..e69de29bb