Init commit
This commit is contained in:
100
server/core/lib/uploadx.ts
Normal file
100
server/core/lib/uploadx.ts
Normal file
@@ -0,0 +1,100 @@
|
||||
import express, { Request, Response, NextFunction, RequestHandler } from 'express'
|
||||
import { buildLogger } from '@server/helpers/logger.js'
|
||||
import { getResumableUploadPath } from '@server/helpers/upload.js'
|
||||
import { CONFIG } from '@server/initializers/config.js'
|
||||
import { FileQuery, LogLevel, Uploadx, Metadata as UploadXMetadata } from '@uploadx/core'
|
||||
import { extname } from 'path'
|
||||
import { authenticate } from '@server/middlewares/auth.js'
|
||||
import { resumableInitValidator } from '@server/middlewares/validators/resumable-upload.js'
|
||||
|
||||
const logger = buildLogger({ labelSuffix: 'uploadx' })
|
||||
|
||||
export const uploadx = new Uploadx({
|
||||
directory: getResumableUploadPath(),
|
||||
|
||||
expiration: { maxAge: undefined, rolling: true },
|
||||
|
||||
// Could be big with thumbnails/previews
|
||||
maxMetadataSize: '10MB',
|
||||
|
||||
logger: {
|
||||
logLevel: CONFIG.LOG.LEVEL as LogLevel,
|
||||
debug: logger.debug.bind(logger),
|
||||
info: logger.info.bind(logger),
|
||||
warn: logger.warn.bind(logger),
|
||||
error: logger.error.bind(logger)
|
||||
},
|
||||
|
||||
userIdentifier: (_, res: express.Response) => {
|
||||
if (!res.locals.oauth) return undefined
|
||||
|
||||
return res.locals.oauth.token.user.id + ''
|
||||
},
|
||||
|
||||
filename: file => `${file.userId}-${file.id}${extname(file.metadata.filename)}`
|
||||
})
|
||||
|
||||
export function safeUploadXCleanup (file: FileQuery) {
|
||||
uploadx.storage.delete(file)
|
||||
.catch(err => logger.error('Cannot delete the file %s', file.name, { err }))
|
||||
}
|
||||
|
||||
export function buildUploadXFile<T extends UploadXMetadata> (reqBody: T) {
|
||||
return {
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-spread
|
||||
...reqBody,
|
||||
|
||||
path: getResumableUploadPath(reqBody.name),
|
||||
filename: reqBody.metadata.filename,
|
||||
originalname: reqBody.originalName
|
||||
}
|
||||
}
|
||||
|
||||
export function setupUploadResumableRoutes (options: {
|
||||
router: express.Router
|
||||
routePath: string
|
||||
|
||||
uploadInitBeforeMiddlewares?: RequestHandler[]
|
||||
uploadInitAfterMiddlewares?: RequestHandler[]
|
||||
|
||||
uploadedMiddlewares?: ((req: Request<any>, res: Response, next: NextFunction) => void)[]
|
||||
uploadedController: (req: Request<any>, res: Response, next: NextFunction) => void
|
||||
|
||||
uploadDeleteMiddlewares?: RequestHandler[]
|
||||
}) {
|
||||
const {
|
||||
router,
|
||||
routePath,
|
||||
uploadedMiddlewares = [],
|
||||
uploadedController,
|
||||
uploadInitBeforeMiddlewares = [],
|
||||
uploadInitAfterMiddlewares = [],
|
||||
uploadDeleteMiddlewares = []
|
||||
} = options
|
||||
|
||||
router.post(
|
||||
routePath,
|
||||
authenticate,
|
||||
...uploadInitBeforeMiddlewares,
|
||||
resumableInitValidator,
|
||||
...uploadInitAfterMiddlewares,
|
||||
// Prevent next() call, explicitly tell to uploadx it's the end
|
||||
(req, res) => uploadx.upload(req, res)
|
||||
)
|
||||
|
||||
router.delete(
|
||||
routePath,
|
||||
authenticate,
|
||||
...uploadDeleteMiddlewares,
|
||||
// Prevent next() call, explicitly tell to uploadx it's the end
|
||||
(req, res) => uploadx.upload(req, res)
|
||||
)
|
||||
|
||||
router.put(
|
||||
routePath,
|
||||
authenticate,
|
||||
uploadx.upload, // uploadx doesn't next() before the file upload completes
|
||||
...uploadedMiddlewares,
|
||||
uploadedController
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user