MockDocstoreApi.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. const express = require('express')
  2. const bodyParser = require('body-parser')
  3. const { expressify } = require('@overleaf/promise-utils')
  4. const app = express()
  5. const MAX_REQUEST_SIZE = 2 * (2 * 1024 * 1024 + 64 * 1024)
  6. const MockDocstoreApi = {
  7. docs: {},
  8. clearDocs() {
  9. this.docs = {}
  10. },
  11. getDoc(projectId, docId) {
  12. return this.docs[`${projectId}:${docId}`]
  13. },
  14. insertDoc(projectId, docId, doc) {
  15. if (doc.version == null) {
  16. doc.version = 0
  17. }
  18. if (doc.lines == null) {
  19. doc.lines = []
  20. }
  21. this.docs[`${projectId}:${docId}`] = doc
  22. },
  23. async patchDocument(projectId, docId, meta) {
  24. Object.assign(this.docs[`${projectId}:${docId}`], meta)
  25. },
  26. async peekDocument(projectId, docId) {
  27. return this.docs[`${projectId}:${docId}`]
  28. },
  29. async getAllDeletedDocs(projectId) {
  30. return Object.entries(this.docs)
  31. .filter(([key, doc]) => key.startsWith(projectId) && doc.deleted)
  32. .map(([key, doc]) => {
  33. return {
  34. _id: key.split(':')[1],
  35. name: doc.name,
  36. deletedAt: doc.deletedAt,
  37. }
  38. })
  39. },
  40. run() {
  41. app.get(
  42. '/project/:project_id/doc-deleted',
  43. expressify(async (req, res) => {
  44. try {
  45. const docs = await this.getAllDeletedDocs(req.params.project_id)
  46. return res.json(docs)
  47. } catch (error) {
  48. return res.sendStatus(500)
  49. }
  50. })
  51. )
  52. app.get(
  53. '/project/:project_id/doc/:doc_id/peek',
  54. expressify(async (req, res) => {
  55. try {
  56. const doc = await this.peekDocument(
  57. req.params.project_id,
  58. req.params.doc_id
  59. )
  60. if (doc) {
  61. return res.json(doc)
  62. } else {
  63. return res.sendStatus(404)
  64. }
  65. } catch (error) {
  66. return res.sendStatus(500)
  67. }
  68. })
  69. )
  70. app.patch(
  71. '/project/:project_id/doc/:doc_id',
  72. bodyParser.json({ limit: MAX_REQUEST_SIZE }),
  73. expressify(async (req, res) => {
  74. try {
  75. await MockDocstoreApi.patchDocument(
  76. req.params.project_id,
  77. req.params.doc_id,
  78. req.body
  79. )
  80. return res.sendStatus(204)
  81. } catch (error) {
  82. return res.sendStatus(500)
  83. }
  84. })
  85. )
  86. app
  87. .listen(3016, error => {
  88. if (error) {
  89. throw error
  90. }
  91. })
  92. .on('error', error => {
  93. console.error('error starting MockDocstoreApi:', error.message)
  94. process.exit(1)
  95. })
  96. },
  97. }
  98. MockDocstoreApi.run()
  99. module.exports = MockDocstoreApi