|
@@ -0,0 +1,222 @@
|
|
|
|
|
+'use strict'
|
|
|
|
|
+
|
|
|
|
|
+const { z } = require('@overleaf/validation-tools')
|
|
|
|
|
+const Blob = require('overleaf-editor-core').Blob
|
|
|
|
|
+
|
|
|
|
|
+const hexHashPattern = new RegExp(Blob.HEX_HASH_RX_STRING)
|
|
|
|
|
+
|
|
|
|
|
+const fileSchema = z.object({
|
|
|
|
|
+ hash: z.string().optional(),
|
|
|
|
|
+ byteLength: z.number().int().nullable().optional(),
|
|
|
|
|
+ stringLength: z.number().int().nullable().optional(),
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const snapshotSchema = z.object({
|
|
|
|
|
+ files: z.record(z.string(), fileSchema),
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const v2DocVersionsSchema = z.object({
|
|
|
|
|
+ pathname: z.string().optional(),
|
|
|
|
|
+ v: z.number().int().optional(),
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const operationSchema = z.object({
|
|
|
|
|
+ pathname: z.string().optional(),
|
|
|
|
|
+ newPathname: z.string().optional(),
|
|
|
|
|
+ blob: z
|
|
|
|
|
+ .object({
|
|
|
|
|
+ hash: z.string(),
|
|
|
|
|
+ })
|
|
|
|
|
+ .optional(),
|
|
|
|
|
+ textOperation: z.array(z.any()).optional(),
|
|
|
|
|
+ file: fileSchema.optional(),
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const changeSchema = z.object({
|
|
|
|
|
+ timestamp: z.string(),
|
|
|
|
|
+ operations: z.array(operationSchema),
|
|
|
|
|
+ authors: z.array(z.number().int().nullable()).optional(),
|
|
|
|
|
+ v2Authors: z.array(z.string().nullable()).optional(),
|
|
|
|
|
+ projectVersion: z.string().optional(),
|
|
|
|
|
+ v2DocVersions: z.record(v2DocVersionsSchema).optional(),
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const schemas = {
|
|
|
|
|
+ initializeProject: z.object({
|
|
|
|
|
+ body: z
|
|
|
|
|
+ .object({
|
|
|
|
|
+ projectId: z.string().optional(),
|
|
|
|
|
+ })
|
|
|
|
|
+ .optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getProjectBlobsStats: z.object({
|
|
|
|
|
+ body: z.object({
|
|
|
|
|
+ projectIds: z.array(z.string()),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getBlobStats: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ body: z.object({
|
|
|
|
|
+ blobHashes: z.array(z.string()),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ deleteProject: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ body: z.any().optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getProjectBlob: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ hash: z.string().regex(hexHashPattern),
|
|
|
|
|
+ }),
|
|
|
|
|
+ headers: z.object({
|
|
|
|
|
+ range: z.string().optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ headProjectBlob: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ hash: z.string().regex(hexHashPattern),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ createProjectBlob: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ hash: z.string().regex(hexHashPattern),
|
|
|
|
|
+ }),
|
|
|
|
|
+ body: z.any().optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ copyProjectBlob: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ hash: z.string().regex(hexHashPattern),
|
|
|
|
|
+ }),
|
|
|
|
|
+ query: z.object({
|
|
|
|
|
+ copyFrom: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ body: z.any().optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getLatestContent: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getLatestHashedContent: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getLatestHistory: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getLatestHistoryRaw: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ query: z.object({
|
|
|
|
|
+ readOnly: z.boolean().optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getLatestPersistedHistory: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getHistory: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ version: z.coerce.number(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getContentAtVersion: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ version: z.coerce.number(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getHistoryBefore: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ timestamp: z.iso.datetime(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getZip: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ version: z.coerce.number(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ createZip: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ version: z.coerce.number(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ body: z.any().optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ getChanges: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ query: z.object({
|
|
|
|
|
+ since: z.coerce.number().optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ importSnapshot: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ body: snapshotSchema,
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ importChanges: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ query: z.object({
|
|
|
|
|
+ end_version: z.coerce.number(),
|
|
|
|
|
+ return_snapshot: z.enum(['hashed', 'none']).optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ body: z.array(changeSchema),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ flushChanges: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ body: z.any().optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+
|
|
|
|
|
+ expireProject: z.object({
|
|
|
|
|
+ params: z.object({
|
|
|
|
|
+ project_id: z.string(),
|
|
|
|
|
+ }),
|
|
|
|
|
+ body: z.any().optional(),
|
|
|
|
|
+ }),
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+module.exports = schemas
|