MockDocstoreApi.mjs 3.7 KB

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