schema.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. 'use strict'
  2. const { z, zz } = require('@overleaf/validation-tools')
  3. const Blob = require('overleaf-editor-core').Blob
  4. const hexHashPattern = new RegExp(Blob.HEX_HASH_RX_STRING)
  5. const fileSchema = z
  6. .object({
  7. hash: z.string().optional(),
  8. rangesHash: z.string().optional(),
  9. byteLength: z.number().int().nullable().optional(),
  10. stringLength: z.number().int().nullable().optional(),
  11. metadata: z.object({}).passthrough().optional(),
  12. })
  13. .passthrough()
  14. const v2DocVersionsSchema = z.object({
  15. pathname: z.string().optional(),
  16. v: z.number().int().optional(),
  17. })
  18. const snapshotSchema = z.object({
  19. files: z.record(z.string(), fileSchema),
  20. projectVersion: z.string().optional(),
  21. v2DocVersions: z
  22. .record(z.string(), v2DocVersionsSchema)
  23. .nullable()
  24. .optional(),
  25. timestamp: z.string().optional(),
  26. })
  27. const operationSchema = z
  28. .object({
  29. pathname: z.string().optional(),
  30. newPathname: z.string().optional(),
  31. blob: z
  32. .object({
  33. hash: z.string(),
  34. })
  35. .optional(),
  36. textOperation: z.array(z.any()).optional(),
  37. file: fileSchema.optional(),
  38. contentHash: z.string().optional(),
  39. })
  40. .passthrough()
  41. const originSchema = z
  42. .object({
  43. kind: z.string().optional(),
  44. })
  45. .passthrough()
  46. const changeSchema = z
  47. .object({
  48. timestamp: z.string(),
  49. operations: z.array(operationSchema),
  50. authors: z.array(z.number().int().nullable()).optional(),
  51. v2Authors: z.array(z.string().nullable()).optional(),
  52. origin: originSchema.optional(),
  53. projectVersion: z.string().optional(),
  54. v2DocVersions: z.record(z.string(), v2DocVersionsSchema).optional(),
  55. })
  56. .passthrough()
  57. const schemas = {
  58. projectId: z.object({
  59. params: z
  60. .object({
  61. project_id: z.string().optional(),
  62. })
  63. .optional(),
  64. }),
  65. initializeProject: z.object({
  66. body: z
  67. .object({
  68. projectId: z.string().optional(),
  69. })
  70. .optional(),
  71. }),
  72. cloneProject: z.object({
  73. body: z.object({
  74. targetProjectId: z.string(),
  75. }),
  76. params: z.object({
  77. project_id: z.string(),
  78. }),
  79. }),
  80. getProjectBlobsStats: z.object({
  81. body: z.object({
  82. projectIds: z.array(z.string()),
  83. }),
  84. }),
  85. getBlobStats: z.object({
  86. params: z.object({
  87. project_id: z.string(),
  88. }),
  89. body: z.object({
  90. blobHashes: z.array(z.string()),
  91. }),
  92. }),
  93. deleteProject: z.object({
  94. params: z.object({
  95. project_id: z.string(),
  96. }),
  97. body: z.any().optional(),
  98. }),
  99. getProjectBlob: z.object({
  100. params: z.object({
  101. project_id: z.string(),
  102. hash: z.string().regex(hexHashPattern),
  103. }),
  104. headers: z.object({
  105. range: z.string().optional(),
  106. }),
  107. }),
  108. headProjectBlob: z.object({
  109. params: z.object({
  110. project_id: z.string(),
  111. hash: z.string().regex(hexHashPattern),
  112. }),
  113. }),
  114. createProjectBlob: z.object({
  115. params: z.object({
  116. project_id: z.string(),
  117. hash: z.string().regex(hexHashPattern),
  118. }),
  119. body: z.any().optional(),
  120. }),
  121. copyProjectBlob: z.object({
  122. params: z.object({
  123. project_id: z.string(),
  124. hash: z.string().regex(hexHashPattern),
  125. }),
  126. query: z.object({
  127. copyFrom: z.string(),
  128. }),
  129. body: z.any().optional(),
  130. }),
  131. getLatestContent: z.object({
  132. params: z.object({
  133. project_id: z.string(),
  134. }),
  135. }),
  136. getLatestHashedContent: z.object({
  137. params: z.object({
  138. project_id: z.string(),
  139. }),
  140. }),
  141. getLatestHistory: z.object({
  142. params: z.object({
  143. project_id: z.string(),
  144. }),
  145. }),
  146. getLatestHistoryRaw: z.object({
  147. params: z.object({
  148. project_id: z.string(),
  149. }),
  150. query: z.object({
  151. readOnly: z.coerce.boolean().optional(),
  152. }),
  153. }),
  154. getLatestPersistedHistory: z.object({
  155. params: z.object({
  156. project_id: z.string(),
  157. }),
  158. }),
  159. getHistory: z.object({
  160. params: z.object({
  161. project_id: z.string(),
  162. version: z.coerce.number(),
  163. }),
  164. }),
  165. getContentAtVersion: z.object({
  166. params: z.object({
  167. project_id: z.string(),
  168. version: z.coerce.number(),
  169. }),
  170. }),
  171. getHistoryBefore: z.object({
  172. params: z.object({
  173. project_id: z.string(),
  174. timestamp: zz.datetime(),
  175. }),
  176. }),
  177. getLatestZip: z.object({
  178. params: z.object({
  179. project_id: z.string(),
  180. }),
  181. }),
  182. getZip: z.object({
  183. params: z.object({
  184. project_id: z.string(),
  185. version: z.coerce.number(),
  186. }),
  187. }),
  188. createZip: z.object({
  189. params: z.object({
  190. project_id: z.string(),
  191. version: z.coerce.number(),
  192. }),
  193. body: z.any().optional(),
  194. }),
  195. getChanges: z.object({
  196. params: z.object({
  197. project_id: z.string(),
  198. }),
  199. query: z.object({
  200. since: z.coerce.number().optional(),
  201. }),
  202. }),
  203. importSnapshot: z.object({
  204. params: z.object({
  205. project_id: z.string(),
  206. }),
  207. body: snapshotSchema,
  208. }),
  209. importChanges: z.object({
  210. params: z.object({
  211. project_id: z.string(),
  212. }),
  213. query: z.object({
  214. end_version: z.coerce.number(),
  215. return_snapshot: z.enum(['hashed', 'none']).optional(),
  216. }),
  217. body: z.array(changeSchema),
  218. }),
  219. flushChanges: z.object({
  220. params: z.object({
  221. project_id: z.string(),
  222. }),
  223. body: z.any().optional(),
  224. }),
  225. expireProject: z.object({
  226. params: z.object({
  227. project_id: z.string(),
  228. }),
  229. body: z.any().optional(),
  230. }),
  231. }
  232. module.exports = schemas