[web] deletedDocs are not needed for joinProject anymore (#25654)

* [web] deletedDocs are not needed for joinProject anymore

* [web] cleanup unit tests

GitOrigin-RevId: 91c9bc60ec776757b3031cbc85c67ae1bf4adf4d
This commit is contained in:
Jakob Ackermann
2025-05-19 08:05:08 +00:00
committed by Copybot
parent cb7d75202b
commit 14cbd44d9b
4 changed files with 5 additions and 116 deletions
@@ -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,
@@ -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:
@@ -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()
})
})
})
})
})
@@ -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,
[],
[]
)
})