Просмотр исходного кода

Merge pull request #3651 from overleaf/jpa-hide-deleted-at-field

[misc] joinProject: hide deletedAt field in public deletedDocs array

GitOrigin-RevId: 0ee11c2a8222304d5d1c4edafa2105b7ad43d5d8
Jakob Ackermann 5 лет назад
Родитель
Сommit
f5965217c4

+ 4 - 0
services/web/app/src/Features/Project/ProjectEditorHandler.js

@@ -20,6 +20,10 @@ module.exports = ProjectEditorHandler = {
 
   buildProjectModelView(project, members, invites) {
     let owner, ownerFeatures
+    project.deletedDocs.forEach(doc => {
+      // The frontend does not use this field.
+      delete doc.deletedAt
+    })
     const result = {
       _id: project._id,
       name: project.name,

+ 59 - 0
services/web/test/acceptance/src/EditorHttpControllerTests.js

@@ -0,0 +1,59 @@
+const User = require('./helpers/User')
+const { expect } = require('chai')
+require('./helpers/MockDocstoreApi')
+require('./helpers/MockV1Api')
+require('./helpers/MockProjectHistoryApi')
+
+describe('EditorHttpController', function() {
+  beforeEach('login', function(done) {
+    this.user = new User()
+    this.user.login(done)
+  })
+  beforeEach('create project', function(done) {
+    this.projectName = 'wombat'
+    this.user.createProject(this.projectName, (error, projectId) => {
+      if (error) return done(error)
+      this.projectId = projectId
+      done()
+    })
+  })
+  beforeEach('create doc', function(done) {
+    this.user.createDocInProject(
+      this.projectId,
+      null,
+      'potato.tex',
+      (error, docId) => {
+        this.docId = docId
+        done(error)
+      }
+    )
+  })
+
+  describe('joinProject', function() {
+    it('should emit an empty deletedDocs array', function(done) {
+      this.user.joinProject(this.projectId, (error, details) => {
+        if (error) return done(error)
+
+        expect(details.project.deletedDocs).to.deep.equal([])
+        done()
+      })
+    })
+
+    describe('after deleting a doc', function() {
+      beforeEach(function(done) {
+        this.user.deleteItemInProject(this.projectId, 'doc', this.docId, done)
+      })
+
+      it('should include the deleted doc in the deletedDocs array', function(done) {
+        this.user.joinProject(this.projectId, (error, details) => {
+          if (error) return done(error)
+
+          expect(details.project.deletedDocs).to.deep.equal([
+            { _id: this.docId, name: 'potato.tex' }
+          ])
+          done()
+        })
+      })
+    })
+  })
+})

+ 27 - 0
services/web/test/acceptance/src/helpers/User.js

@@ -509,6 +509,33 @@ class User {
     )
   }
 
+  joinProject(projectId, callback) {
+    this.request.post(
+      {
+        url: `/project/${projectId}/join`,
+        qs: { user_id: this._id },
+        auth: {
+          user: settings.apis.web.user,
+          pass: settings.apis.web.pass,
+          sendImmediately: true
+        },
+        json: true,
+        jar: false
+      },
+      (error, res, body) => {
+        if (error) {
+          return callback(error)
+        }
+        if (res.statusCode < 200 || res.statusCode >= 300) {
+          return callback(
+            new Error(`failed to join project ${projectId} ${res.statusCode}`)
+          )
+        }
+        callback(null, body)
+      }
+    )
+  }
+
   addUserToProject(projectId, user, privileges, callback) {
     let updateOp
     if (privileges === 'readAndWrite') {

+ 7 - 1
services/web/test/unit/src/Project/ProjectEditorHandlerTests.js

@@ -150,7 +150,13 @@ describe('ProjectEditorHandler', function() {
 
       it('should include the deletedDocs', function() {
         should.exist(this.result.deletedDocs)
-        return this.result.deletedDocs.should.equal(this.project.deletedDocs)
+        this.result.deletedDocs.should.deep.equal([
+          {
+            // omit deletedAt field
+            _id: this.project.deletedDocs[0]._id,
+            name: this.project.deletedDocs[0].name
+          }
+        ])
       })
 
       it('should gather readOnly_refs and collaberators_refs into a list of members', function() {