Newer
Older
const logger = require('@pubsweet/logger')
const File = require('./file.model')
const useTransaction = require('../useTransaction')
const {
deleteFiles: serviceDeleteFiles,
upload,
} = require('../../services/fileStorage')
const {
labels: { FILE_CONTROLLER },
} = require('./constants')
const createFile = async (
fileStream,
name,
alt = null,
caption = null,
tags = [],
objectId = null,
options = {},
) => {
try {
const { trx, forceObjectKeyValue } = options
logger.info(
`${FILE_CONTROLLER} createFile: creating a new file representation`,
)
return useTransaction(
async tr => {
const storedObjects = await upload(fileStream, name, {
forceObjectKeyValue,
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
})
return File.query(tr).insert({
name,
alt,
caption,
tags,
objectId,
storedObjects,
})
},
{
trx,
passedTrxOnly: true,
},
)
} catch (e) {
logger.error(`${FILE_CONTROLLER} createFile: ${e.message}`)
throw new Error(e)
}
}
const deleteFiles = async (ids, removeFromFileServer = true, options = {}) => {
try {
const { trx } = options
logger.info(
`${FILE_CONTROLLER} deleteFiles: deleting files with ids ${ids}`,
)
return useTransaction(
async tr => {
if (removeFromFileServer) {
logger.info(
`${FILE_CONTROLLER} deleteFiles: flag removeFromFileServer is enabled and will trigger permanent deletion of files in file server too`,
)
const toBeDeletedFiles = await File.query(tr).findByIds(ids)
await Promise.all(
toBeDeletedFiles.map(async deletedFile => {
const { storedObjects } = deletedFile
const keys = []
storedObjects.forEach(storedObject => keys.push(storedObject.key))
await serviceDeleteFiles(keys)
}),
)
}
const affectedRows = await Promise.all(
ids.map(async id => File.query(tr).deleteById(id)),
)
return affectedRows.length
},
{ trx, passedTrxOnly: true },
)
} catch (e) {
logger.error(`${FILE_CONTROLLER} deleteFiles: ${e.message}`)
throw new Error(e)
}
}
module.exports = {
createFile,
deleteFiles,
}