MockDocstoreApi.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. const { db, ObjectId } = require('../../../../app/src/infrastructure/mongodb')
  2. const AbstractMockApi = require('./AbstractMockApi')
  3. class MockDocstoreApi extends AbstractMockApi {
  4. reset() {
  5. this.docs = {}
  6. }
  7. createLegacyDeletedDoc(projectId, docId) {
  8. if (!this.docs[projectId]) {
  9. this.docs[projectId] = {}
  10. }
  11. this.docs[projectId][docId] = {
  12. lines: [],
  13. version: 1,
  14. ranges: {},
  15. deleted: true,
  16. }
  17. }
  18. getDeletedDocs(projectId) {
  19. return Object.entries(this.docs[projectId] || {})
  20. .filter(([_, doc]) => doc.deleted)
  21. .map(([docId, doc]) => {
  22. return { _id: docId, name: doc.name }
  23. })
  24. }
  25. applyRoutes() {
  26. this.app.post('/project/:projectId/doc/:docId', (req, res) => {
  27. const { projectId, docId } = req.params
  28. const { lines, version, ranges } = req.body
  29. if (this.docs[projectId] == null) {
  30. this.docs[projectId] = {}
  31. }
  32. if (this.docs[projectId][docId] == null) {
  33. this.docs[projectId][docId] = {}
  34. }
  35. const { version: oldVersion, deleted } = this.docs[projectId][docId]
  36. this.docs[projectId][docId] = { lines, version, ranges, deleted }
  37. if (this.docs[projectId][docId].rev == null) {
  38. this.docs[projectId][docId].rev = 0
  39. }
  40. this.docs[projectId][docId].rev += 1
  41. this.docs[projectId][docId]._id = docId
  42. res.json({
  43. modified: oldVersion !== version,
  44. rev: this.docs[projectId][docId].rev,
  45. })
  46. })
  47. this.app.get('/project/:projectId/doc', (req, res) => {
  48. res.json(Object.values(this.docs[req.params.projectId] || {}))
  49. })
  50. this.app.get('/project/:projectId/doc-deleted', (req, res) => {
  51. res.json(this.getDeletedDocs(req.params.projectId))
  52. })
  53. this.app.get('/project/:projectId/doc/:docId', (req, res) => {
  54. const { projectId, docId } = req.params
  55. const doc = this.docs[projectId][docId]
  56. if (!doc || (doc.deleted && !req.query.include_deleted)) {
  57. res.sendStatus(404)
  58. } else {
  59. res.json(doc)
  60. }
  61. })
  62. this.app.get('/project/:projectId/doc/:docId/deleted', (req, res) => {
  63. const { projectId, docId } = req.params
  64. if (!this.docs[projectId] || !this.docs[projectId][docId]) {
  65. res.sendStatus(404)
  66. } else {
  67. res.json({ deleted: Boolean(this.docs[projectId][docId].deleted) })
  68. }
  69. })
  70. this.app.patch('/project/:projectId/doc/:docId', (req, res) => {
  71. const { projectId, docId } = req.params
  72. if (!this.docs[projectId]) {
  73. res.sendStatus(404)
  74. } else if (!this.docs[projectId][docId]) {
  75. res.sendStatus(404)
  76. } else {
  77. Object.assign(this.docs[projectId][docId], req.body)
  78. res.sendStatus(204)
  79. }
  80. })
  81. this.app.post('/project/:projectId/destroy', async (req, res) => {
  82. const { projectId } = req.params
  83. delete this.docs[projectId]
  84. await db.docs.deleteMany({ project_id: ObjectId(projectId) })
  85. res.sendStatus(204)
  86. })
  87. }
  88. }
  89. module.exports = MockDocstoreApi
  90. // type hint for the inherited `instance` method
  91. /**
  92. * @function instance
  93. * @memberOf MockDocstoreApi
  94. * @static
  95. * @returns {MockDocstoreApi}
  96. */