From 7bfa5d312ac06af1fe65c7e3ae92e995e39fc912 Mon Sep 17 00:00:00 2001 From: Jakob Ackermann Date: Fri, 16 May 2025 09:01:08 +0100 Subject: [PATCH] [web] deletedDocs are not needed for joinProject anymore (#25654) * [web] deletedDocs are not needed for joinProject anymore * [web] cleanup unit tests GitOrigin-RevId: 91c9bc60ec776757b3031cbc85c67ae1bf4adf4d --- .../Features/Editor/EditorHttpController.js | 19 +------ .../Features/Project/ProjectEditorHandler.js | 18 +------ .../src/EditorHttpControllerTests.mjs | 33 +----------- .../src/Project/ProjectEditorHandlerTests.js | 51 +------------------ 4 files changed, 5 insertions(+), 116 deletions(-) diff --git a/services/web/app/src/Features/Editor/EditorHttpController.js b/services/web/app/src/Features/Editor/EditorHttpController.js index 45c9b2427a..8128a95b26 100644 --- a/services/web/app/src/Features/Editor/EditorHttpController.js +++ b/services/web/app/src/Features/Editor/EditorHttpController.js @@ -10,8 +10,6 @@ const CollaboratorsHandler = require('../Collaborators/CollaboratorsHandler') const PrivilegeLevels = require('../Authorization/PrivilegeLevels') const SessionManager = require('../Authentication/SessionManager') const Errors = require('../Errors/Errors') -const DocstoreManager = require('../Docstore/DocstoreManager') -const logger = require('@overleaf/logger') const { expressify } = require('@overleaf/promise-utils') const Settings = require('@overleaf/settings') @@ -77,20 +75,6 @@ async function _buildJoinProjectView(req, projectId, userId) { if (project == null) { throw new Errors.NotFoundError('project not found') } - let deletedDocsFromDocstore = [] - try { - deletedDocsFromDocstore = - await DocstoreManager.promises.getAllDeletedDocs(projectId) - } catch (err) { - // The query in docstore is not optimized at this time and fails for - // projects with many very large, deleted documents. - // Not serving the user with deletedDocs from docstore may cause a minor - // UI issue with deleted files that are no longer available for restore. - logger.warn( - { err, projectId }, - 'soft-failure when fetching deletedDocs from docstore' - ) - } const members = await CollaboratorsGetter.promises.getInvitedMembersWithPrivilegeLevels( projectId @@ -126,8 +110,7 @@ async function _buildJoinProjectView(req, projectId, userId) { project: ProjectEditorHandler.buildProjectModelView( project, members, - invites, - deletedDocsFromDocstore + invites ), privilegeLevel, isTokenMember, diff --git a/services/web/app/src/Features/Project/ProjectEditorHandler.js b/services/web/app/src/Features/Project/ProjectEditorHandler.js index a85e8b5764..05e5beba09 100644 --- a/services/web/app/src/Features/Project/ProjectEditorHandler.js +++ b/services/web/app/src/Features/Project/ProjectEditorHandler.js @@ -3,23 +3,11 @@ const _ = require('lodash') const Path = require('path') const Features = require('../../infrastructure/Features') -function mergeDeletedDocs(a, b) { - const docIdsInA = new Set(a.map(doc => doc._id.toString())) - return a.concat(b.filter(doc => !docIdsInA.has(doc._id.toString()))) -} - module.exports = ProjectEditorHandler = { trackChangesAvailable: false, - buildProjectModelView(project, members, invites, deletedDocsFromDocstore) { + buildProjectModelView(project, members, invites) { let owner, ownerFeatures - if (!Array.isArray(project.deletedDocs)) { - project.deletedDocs = [] - } - project.deletedDocs.forEach(doc => { - // The frontend does not use this field. - delete doc.deletedAt - }) const result = { _id: project._id, name: project.name, @@ -32,10 +20,6 @@ module.exports = ProjectEditorHandler = { description: project.description, spellCheckLanguage: project.spellCheckLanguage, deletedByExternalDataSource: project.deletedByExternalDataSource || false, - deletedDocs: mergeDeletedDocs( - project.deletedDocs, - deletedDocsFromDocstore - ), members: [], invites: this.buildInvitesView(invites), imageName: diff --git a/services/web/test/acceptance/src/EditorHttpControllerTests.mjs b/services/web/test/acceptance/src/EditorHttpControllerTests.mjs index de38f79be4..6dfdcf0858 100644 --- a/services/web/test/acceptance/src/EditorHttpControllerTests.mjs +++ b/services/web/test/acceptance/src/EditorHttpControllerTests.mjs @@ -14,43 +14,14 @@ describe('EditorHttpController', function () { 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) { + it('returns project details', function (done) { this.user.joinProject(this.projectId, (error, details) => { if (error) return done(error) - expect(details.project.deletedDocs).to.deep.equal([]) + expect(details.project.name).to.equal(this.projectName) 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() - }) - }) - }) }) }) diff --git a/services/web/test/unit/src/Project/ProjectEditorHandlerTests.js b/services/web/test/unit/src/Project/ProjectEditorHandlerTests.js index 8e78ea5168..0fb5b5fce4 100644 --- a/services/web/test/unit/src/Project/ProjectEditorHandlerTests.js +++ b/services/web/test/unit/src/Project/ProjectEditorHandlerTests.js @@ -42,13 +42,6 @@ describe('ProjectEditorHandler', function () { ], }, ], - deletedDocs: [ - { - _id: 'deleted-doc-id', - name: 'main.tex', - deletedAt: (this.deletedAt = new Date('2017-01-01')), - }, - ], } this.members = [ { @@ -95,9 +88,6 @@ describe('ProjectEditorHandler', function () { token: 'my-secret-token2', }, ] - this.deletedDocsFromDocstore = [ - { _id: 'deleted-doc-id-from-docstore', name: 'docstore.tex' }, - ] this.handler = SandboxedModule.require(modulePath) }) @@ -107,8 +97,7 @@ describe('ProjectEditorHandler', function () { this.result = this.handler.buildProjectModelView( this.project, this.members, - this.invites, - this.deletedDocsFromDocstore + this.invites ) }) @@ -141,18 +130,6 @@ describe('ProjectEditorHandler', function () { this.result.owner.privileges.should.equal('owner') }) - it('should include the deletedDocs', function () { - expect(this.result.deletedDocs).to.exist - this.result.deletedDocs.should.deep.equal([ - { - // omit deletedAt field - _id: this.project.deletedDocs[0]._id, - name: this.project.deletedDocs[0].name, - }, - this.deletedDocsFromDocstore[0], - ]) - }) - it('should gather readOnly_refs and collaberators_refs into a list of members', function () { const findMember = id => { for (const member of this.result.members) { @@ -231,33 +208,12 @@ describe('ProjectEditorHandler', function () { }) }) - describe('when docstore sends a deleted doc that is also present in the project', function () { - beforeEach(function () { - this.deletedDocsFromDocstore.push(this.project.deletedDocs[0]) - this.result = this.handler.buildProjectModelView( - this.project, - this.members, - this.invites, - this.deletedDocsFromDocstore - ) - }) - - it('should not send any duplicate', function () { - expect(this.result.deletedDocs).to.exist - this.result.deletedDocs.should.deep.equal([ - this.project.deletedDocs[0], - this.deletedDocsFromDocstore[0], - ]) - }) - }) - describe('deletedByExternalDataSource', function () { it('should set the deletedByExternalDataSource flag to false when it is not there', function () { delete this.project.deletedByExternalDataSource const result = this.handler.buildProjectModelView( this.project, this.members, - [], [] ) result.deletedByExternalDataSource.should.equal(false) @@ -267,7 +223,6 @@ describe('ProjectEditorHandler', function () { const result = this.handler.buildProjectModelView( this.project, this.members, - [], [] ) result.deletedByExternalDataSource.should.equal(false) @@ -278,7 +233,6 @@ describe('ProjectEditorHandler', function () { const result = this.handler.buildProjectModelView( this.project, this.members, - [], [] ) result.deletedByExternalDataSource.should.equal(true) @@ -296,7 +250,6 @@ describe('ProjectEditorHandler', function () { this.result = this.handler.buildProjectModelView( this.project, this.members, - [], [] ) }) @@ -326,7 +279,6 @@ describe('ProjectEditorHandler', function () { this.result = this.handler.buildProjectModelView( this.project, this.members, - [], [] ) }) @@ -351,7 +303,6 @@ describe('ProjectEditorHandler', function () { this.result = this.handler.buildProjectModelView( this.project, this.members, - [], [] ) })