Files
overleaf-cep/services/web/app/src/Features/LinkedFiles/LinkedFilesHandler.mjs
Andrew Rumble 7c9fea64ac [web] Convert models and self-referential test files to ESM (#29521)
from overleaf/ar-models-es-conversion

GitOrigin-RevId: a92ab8342c0f3e23155eacc0570458fc910c3d71
2025-11-13 09:06:13 +00:00

108 lines
2.5 KiB
JavaScript

import FileWriter from '../../infrastructure/FileWriter.js'
import EditorController from '../Editor/EditorController.mjs'
import ProjectLocator from '../Project/ProjectLocator.mjs'
import { Project } from '../../models/Project.mjs'
import ProjectGetter from '../Project/ProjectGetter.mjs'
import LinkedFilesErrors from './LinkedFilesErrors.mjs'
import { callbackifyAll } from '@overleaf/promise-utils'
const { ProjectNotFoundError, V1ProjectNotFoundError, BadDataError } =
LinkedFilesErrors
const LinkedFilesHandler = {
async getFileById(projectId, fileId) {
const { element, path, folder } = await ProjectLocator.promises.findElement(
{
project_id: projectId,
element_id: fileId,
type: 'file',
}
)
return { file: element, path, parentFolder: folder }
},
async getSourceProject(data) {
const projection = { _id: 1, name: 1, overleaf: 1 } // include the historyId for future use
if (data.v1_source_doc_id != null) {
const project = await Project.findOne(
{ 'overleaf.id': data.v1_source_doc_id },
projection
).exec()
if (project == null) {
throw new V1ProjectNotFoundError()
}
return project
} else if (data.source_project_id != null) {
const project = await ProjectGetter.promises.getProject(
data.source_project_id,
projection
)
if (project == null) {
throw new ProjectNotFoundError()
}
return project
} else {
throw new BadDataError('neither v1 nor v2 id present')
}
},
async importFromStream(
projectId,
readStream,
linkedFileData,
name,
parentFolderId,
userId
) {
const fsPath = await FileWriter.promises.writeStreamToDisk(
projectId,
readStream
)
return await EditorController.promises.upsertFile(
projectId,
parentFolderId,
name,
fsPath,
linkedFileData,
'upload',
userId
)
},
async importContent(
projectId,
content,
linkedFileData,
name,
parentFolderId,
userId
) {
const fsPath = await FileWriter.promises.writeContentToDisk(
projectId,
content
)
return await EditorController.promises.upsertFile(
projectId,
parentFolderId,
name,
fsPath,
linkedFileData,
'upload',
userId
)
},
}
export default {
promises: LinkedFilesHandler,
...callbackifyAll(LinkedFilesHandler, {
multiResult: { getFileById: ['file', 'path', 'parentFolder'] },
}),
}