[web] remove deledFiles collection (#25750)

* [history-v1] remove processing of deleted files when back-filling hashes

* [web] remove deledFiles collection

GitOrigin-RevId: 7c080e564f7d7acb33ebe7ebe012f415a847d0df
This commit is contained in:
Jakob Ackermann
2025-05-23 08:05:01 +00:00
committed by Copybot
parent 52f1e46343
commit 11b94593c2
21 changed files with 155 additions and 809 deletions
@@ -324,19 +324,6 @@ async function undeleteProject(projectId, options = {}) {
})
restored.deletedDocs = []
}
if (restored.deletedFiles && restored.deletedFiles.length > 0) {
filterDuplicateDeletedFilesInPlace(restored)
const deletedFiles = restored.deletedFiles.map(file => {
// break free from the model
file = file.toObject()
// add projectId
file.projectId = projectId
return file
})
await db.deletedFiles.insertMany(deletedFiles)
restored.deletedFiles = []
}
// we can't use Mongoose to re-insert the project, as it won't
// create a new document with an _id already specified. We need to
@@ -388,7 +375,6 @@ async function expireDeletedProject(projectId) {
),
FilestoreHandler.promises.deleteProject(deletedProject.project._id),
ChatApiHandler.promises.destroyProject(deletedProject.project._id),
hardDeleteDeletedFiles(deletedProject.project._id),
ProjectAuditLogEntry.deleteMany({ projectId }),
Modules.promises.hooks.fire('projectExpired', deletedProject.project._id),
])
@@ -409,31 +395,3 @@ async function expireDeletedProject(projectId) {
throw error
}
}
function filterDuplicateDeletedFilesInPlace(project) {
const fileIds = new Set()
project.deletedFiles = project.deletedFiles.filter(file => {
const id = file._id.toString()
if (fileIds.has(id)) return false
fileIds.add(id)
return true
})
}
let deletedFilesProjectIdIndexExist
async function doesDeletedFilesProjectIdIndexExist() {
if (typeof deletedFilesProjectIdIndexExist !== 'boolean') {
// Resolve this about once. No need for locking or retry handling.
deletedFilesProjectIdIndexExist =
await db.deletedFiles.indexExists('projectId_1')
}
return deletedFilesProjectIdIndexExist
}
async function hardDeleteDeletedFiles(projectId) {
if (!(await doesDeletedFilesProjectIdIndexExist())) {
// Running the deletion command w/o index would kill mongo performance
return
}
return db.deletedFiles.deleteMany({ projectId })
}
@@ -15,7 +15,6 @@ const ProjectGetter = require('./ProjectGetter')
const ProjectLocator = require('./ProjectLocator')
const FolderStructureBuilder = require('./FolderStructureBuilder')
const SafePath = require('./SafePath')
const { DeletedFile } = require('../../models/DeletedFile')
const { iterablePaths } = require('./IterablePath')
const LOCK_NAMESPACE = 'mongoTransaction'
@@ -72,7 +71,6 @@ module.exports = {
'changes',
]),
createNewFolderStructure: callbackify(wrapWithLock(createNewFolderStructure)),
_insertDeletedFileReference: callbackify(_insertDeletedFileReference),
_putElement: callbackifyMultiResult(_putElement, ['result', 'project']),
_confirmFolder,
promises: {
@@ -87,7 +85,6 @@ module.exports = {
deleteEntity: wrapWithLock(deleteEntity),
renameEntity: wrapWithLock(renameEntity),
createNewFolderStructure: wrapWithLock(createNewFolderStructure),
_insertDeletedFileReference,
_putElement,
},
}
@@ -162,7 +159,6 @@ async function replaceFileWithNew(projectId, fileId, newFileRef, userId) {
element_id: fileId,
type: 'file',
})
await _insertDeletedFileReference(projectId, fileRef)
const newProject = await Project.findOneAndUpdate(
{ _id: project._id, [path.mongo]: { $exists: true } },
{
@@ -480,17 +476,6 @@ async function renameEntity(projectId, entityId, entityType, newName, userId) {
}
}
async function _insertDeletedFileReference(projectId, fileRef) {
await DeletedFile.create({
projectId,
_id: fileRef._id,
name: fileRef.name,
linkedFileData: fileRef.linkedFileData,
hash: fileRef.hash,
deletedAt: new Date(),
})
}
async function _removeElementFromMongoArray(
modelId,
path,
@@ -1627,8 +1627,6 @@ const ProjectEntityUpdateHandler = {
entry.path,
userId
)
} else if (entry.type === 'file') {
await ProjectEntityUpdateHandler._cleanUpFile(project, entry.entity)
}
}
return subtreeListing
@@ -1679,13 +1677,6 @@ const ProjectEntityUpdateHandler = {
return await DocumentUpdaterHandler.promises.deleteDoc(projectId, docId)
},
async _cleanUpFile(project, file) {
return await ProjectEntityMongoUpdateHandler.promises._insertDeletedFileReference(
project._id,
file
)
},
}
/**
@@ -33,7 +33,6 @@ addConnectionDrainer('mongodb', async () => {
const internalDb = mongoClient.db()
const db = {
contacts: internalDb.collection('contacts'),
deletedFiles: internalDb.collection('deletedFiles'),
deletedProjects: internalDb.collection('deletedProjects'),
deletedSubscriptions: internalDb.collection('deletedSubscriptions'),
deletedUsers: internalDb.collection('deletedUsers'),
@@ -1,21 +0,0 @@
const mongoose = require('../infrastructure/Mongoose')
const { Schema } = mongoose
const DeletedFileSchema = new Schema(
{
name: String,
projectId: Schema.ObjectId,
created: {
type: Date,
},
linkedFileData: { type: Schema.Types.Mixed },
hash: {
type: String,
},
deletedAt: { type: Date },
},
{ collection: 'deletedFiles', minimize: false }
)
exports.DeletedFile = mongoose.model('DeletedFile', DeletedFileSchema)
exports.DeletedFileSchema = DeletedFileSchema
-13
View File
@@ -12,18 +12,6 @@ const DeletedDocSchema = new Schema({
deletedAt: { type: Date },
})
const DeletedFileSchema = new Schema({
name: String,
created: {
type: Date,
},
linkedFileData: { type: Schema.Types.Mixed },
hash: {
type: String,
},
deletedAt: { type: Date },
})
const ProjectSchema = new Schema(
{
name: { type: String, default: 'new project' },
@@ -54,7 +42,6 @@ const ProjectSchema = new Schema(
archived: { type: Schema.Types.Mixed },
trashed: [{ type: ObjectId, ref: 'User' }],
deletedDocs: [DeletedDocSchema],
deletedFiles: [DeletedFileSchema],
imageName: { type: String },
brandVariationId: { type: String },
track_changes: { type: Object },