[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:
@@ -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,
|
||||
[],
|
||||
[]
|
||||
)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user