diff --git a/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js b/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js index 8f8b785a37..6970bccff8 100644 --- a/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js +++ b/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js @@ -1,6 +1,5 @@ /* eslint-disable max-len, - no-unused-vars, */ // TODO: This file was created by bulk-decaffeinate. // Fix any style issues and re-enable lint. @@ -13,10 +12,7 @@ */ let LinkedFilesController const SessionManager = require('../Authentication/SessionManager') -const EditorController = require('../Editor/EditorController') -const ProjectLocator = require('../Project/ProjectLocator') const Settings = require('@overleaf/settings') -const logger = require('@overleaf/logger') const _ = require('lodash') const AnalyticsManager = require('../../../../app/src/Features/Analytics/AnalyticsManager') const LinkedFilesHandler = require('./LinkedFilesHandler') @@ -45,8 +41,9 @@ const Modules = require('../../infrastructure/Modules') const { plainTextResponse } = require('../../infrastructure/Response') const ReferencesHandler = require('../References/ReferencesHandler') const EditorRealTimeController = require('../Editor/EditorRealTimeController') +const { expressify } = require('@overleaf/promise-utils') -function createLinkedFile(req, res, next) { +async function createLinkedFile(req, res, next) { const { project_id: projectId } = req.params const { name, provider, data, parent_folder_id: parentFolderId } = req.body const userId = SessionManager.getLoggedInUserId(req.session) @@ -59,94 +56,91 @@ function createLinkedFile(req, res, next) { data.provider = provider data.importedAt = new Date().toISOString() - return Agent.createLinkedFile( - projectId, - data, - name, - parentFolderId, - userId, - function (err, newFileId) { - if (err != null) { - return LinkedFilesController.handleError(err, req, res, next) - } - if (name.endsWith('.bib')) { - AnalyticsManager.recordEventForUserInBackground( - userId, - 'linked-bib-file', - { - integration: provider, - } - ) - } - return res.json({ new_file_id: newFileId }) - } - ) -} - -function refreshLinkedFile(req, res, next) { - const { project_id: projectId, file_id: fileId } = req.params - const userId = SessionManager.getLoggedInUserId(req.session) - - return LinkedFilesHandler.getFileById( - projectId, - fileId, - function (err, file, path, parentFolder) { - if (err != null) { - return next(err) - } - if (file == null) { - return res.sendStatus(404) - } - const { name } = file - const { linkedFileData } = file - if ( - linkedFileData == null || - (linkedFileData != null ? linkedFileData.provider : undefined) == null - ) { - return res.sendStatus(409) - } - const { provider } = linkedFileData - const parentFolderId = parentFolder._id - const Agent = LinkedFilesController._getAgent(provider) - if (Agent == null) { - return res.sendStatus(400) - } - - linkedFileData.importedAt = new Date().toISOString() - - Agent.refreshLinkedFile( - projectId, - linkedFileData, - name, - parentFolderId, + try { + const newFileId = await Agent.promises.createLinkedFile( + projectId, + data, + name, + parentFolderId, + userId + ) + if (name.endsWith('.bib')) { + AnalyticsManager.recordEventForUserInBackground( userId, - function (err, newFileId) { - if (err != null) { - return LinkedFilesController.handleError(err, req, res, next) - } - if (req.body.shouldReindexReferences) { - ReferencesHandler.indexAll(projectId, function (error, data) { - if (error) { - OError.tag(error, 'failed to index references', { - projectId, - }) - return next(error) - } - EditorRealTimeController.emitToRoom( - projectId, - 'references:keys:updated', - data.keys, - true - ) - res.json({ new_file_id: newFileId }) - }) - } else { - res.json({ new_file_id: newFileId }) - } + 'linked-bib-file', + { + integration: provider, } ) } + return res.json({ new_file_id: newFileId }) + } catch (err) { + return LinkedFilesController.handleError(err, req, res, next) + } +} + +async function refreshLinkedFile(req, res, next) { + const { project_id: projectId, file_id: fileId } = req.params + const userId = SessionManager.getLoggedInUserId(req.session) + + const { file, parentFolder } = await LinkedFilesHandler.promises.getFileById( + projectId, + fileId ) + + if (file == null) { + return res.sendStatus(404) + } + const { name } = file + const { linkedFileData } = file + if ( + linkedFileData == null || + (linkedFileData != null ? linkedFileData.provider : undefined) == null + ) { + return res.sendStatus(409) + } + + const { provider } = linkedFileData + const parentFolderId = parentFolder._id + const Agent = LinkedFilesController._getAgent(provider) + if (Agent == null) { + return res.sendStatus(400) + } + + linkedFileData.importedAt = new Date().toISOString() + let newFileId + try { + newFileId = await Agent.promises.refreshLinkedFile( + projectId, + linkedFileData, + name, + parentFolderId, + userId + ) + } catch (err) { + return LinkedFilesController.handleError(err, req, res, next) + } + + if (req.body.shouldReindexReferences) { + let data + try { + data = await ReferencesHandler.promises.indexAll(projectId) + } catch (error) { + OError.tag(error, 'failed to index references', { + projectId, + }) + return next(error) + } + EditorRealTimeController.emitToRoom( + projectId, + 'references:keys:updated', + data.keys, + true + ) + res.json({ new_file_id: newFileId }) + } else { + res.json({ new_file_id: newFileId }) + } } module.exports = LinkedFilesController = { @@ -174,9 +168,9 @@ module.exports = LinkedFilesController = { return LinkedFilesController.Agents[provider] }, - createLinkedFile, + createLinkedFile: expressify(createLinkedFile), - refreshLinkedFile, + refreshLinkedFile: expressify(refreshLinkedFile), handleError(error, req, res, next) { if (error instanceof AccessDeniedError) {