Files
speckle-server/packages/server/modules/fileuploads/index.js
T
Gergő Jedlicska c2085d6b13 Hotfix/2.17 (#1955)
* gergo/apolloQueryDuration (#1949)

* add apollo query duration

* feat: add more details to apollo query logging

* fix: pr review

* feat: format log messages as clef (#1950)

* fix(logging): pinoClef log levels must be a string

* chore(fe2): reducing log level for some spammy req logs

* minor adjustment

* more robust path resolution

* better req log text

* feat(fe2): improved and more thorough logging to help with observability (#1948)

* better req log text

* minor improvements to server logging

* WIP FE2 req logging

* FE2 apollo operation logging

* undid apolloPlugin changes due to Gergos PR

* seq message templates introduced

* fix: request logs (#1964)

* fix: request logs

* chore: remove comments

* feat: add graphql subscription metrics (#1970)

* optimized preview msg resultListener

* fix(server): locking to avoid postgres notification listeners processing the same message multiple times (#1972)

* fix(server): locking to avoid postgres notification listeners processing the same message multiple times

* optimized locking

* minor cleanup

* msg update

* log level adjustments

* reduce failsafe expiry

---------

Co-authored-by: Iain Sproat <68657+iainsproat@users.noreply.github.com>
Co-authored-by: Kristaps Fabians Geikins <fabis94@live.com>
Co-authored-by: Kristaps Fabians Geikins <fabians@speckle.systems>
2024-01-17 16:39:33 +01:00

86 lines
2.5 KiB
JavaScript

/* istanbul ignore file */
const {
insertNewUploadAndNotify
} = require('@/modules/fileuploads/services/management')
const request = require('request')
const { streamWritePermissions } = require('@/modules/shared/authz')
const { authMiddlewareCreator } = require('@/modules/shared/middleware')
const { moduleLogger } = require('@/logging/logging')
const {
listenForImportUpdates
} = require('@/modules/fileuploads/services/resultListener')
const saveFileUploads = async ({ userId, streamId, branchName, uploadResults }) => {
await Promise.all(
uploadResults.map(async (upload) => {
await insertNewUploadAndNotify({
fileId: upload.blobId,
streamId,
branchName,
userId,
fileName: upload.fileName,
fileType: upload.fileName.split('.').pop(),
fileSize: upload.fileSize
})
})
)
}
exports.init = async (app, isInitial) => {
if (process.env.DISABLE_FILE_UPLOADS) {
moduleLogger.warn('📄 FileUploads module is DISABLED')
return
} else {
moduleLogger.info('📄 Init FileUploads module')
}
app.post(
'/api/file/:fileType/:streamId/:branchName?',
authMiddlewareCreator(streamWritePermissions),
async (req, res) => {
const branchName = req.params.branchName || 'main'
req.log = req.log.child({
streamId: req.params.streamId,
userId: req.context.userId,
branchName
})
req.pipe(
request(
`${process.env.CANONICAL_URL}/api/stream/${req.params.streamId}/blob`,
async (err, response, body) => {
if (err) {
res.log.error(err, 'Error while uploading blob.')
res.status(500).send(err.message)
return
}
if (response.statusCode === 201) {
const { uploadResults } = JSON.parse(body)
await saveFileUploads({
userId: req.context.userId,
streamId: req.params.streamId,
branchName,
uploadResults
})
} else {
res.log.error(
{
statusCode: response.statusCode,
path: `${process.env.CANONICAL_URL}/api/stream/${req.params.streamId}/blob`
},
'Error while uploading file.'
)
}
res.status(response.statusCode).send(body)
}
)
)
}
)
if (isInitial) {
listenForImportUpdates()
}
}
exports.finalize = () => {}