schema.js 4.5 KB

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