Add assets endpoint + sharp

This commit is contained in:
rijkvanzanten
2020-06-26 17:57:43 -04:00
parent e533d76082
commit d279bf007f
4 changed files with 356 additions and 5 deletions

View File

@@ -11,6 +11,7 @@ import extractToken from './middleware/extract-token';
import authenticate from './middleware/authenticate';
import activityRouter from './routes/activity';
import assetsRouter from './routes/assets';
import authRouter from './routes/auth';
import collectionPresetsRouter from './routes/collection-presets';
import extensionsRouter from './routes/extensions';
@@ -35,6 +36,7 @@ const app = express()
.use(extractToken)
.use(authenticate)
.use('/activity', activityRouter)
.use('/assets', assetsRouter)
.use('/auth', authRouter)
.use('/collection_presets', collectionPresetsRouter)
.use('/extensions', extensionsRouter)

63
src/routes/assets.ts Normal file
View File

@@ -0,0 +1,63 @@
import { Router } from 'express';
import asyncHandler from 'express-async-handler';
import storage from '../storage';
import database from '../database';
import sharp, { ResizeOptions } from 'sharp';
import fs from 'fs';
const router = Router();
router.get(
'/:pk',
asyncHandler(async (req, res) => {
const file = await database
.select('type', 'storage', 'filename_disk', 'filename_download')
.from('directus_files')
.where({ id: req.params.pk })
.first();
res.setHeader('Content-Disposition', 'attachment; filename=' + file.filename_download);
res.setHeader('Content-Type', file.type);
const resizeOptions: ResizeOptions = {};
if (req.query.w) {
resizeOptions.width = Number(req.query.w);
}
if (req.query.h) {
resizeOptions.height = Number(req.query.h);
}
if (req.query.f) {
resizeOptions.fit = req.query.f as ResizeOptions['fit'];
}
const assetFilename = file.filename_disk + getAssetSuffix(resizeOptions);
const { exists } = await storage.disk(file.storage).exists(assetFilename);
if (exists) {
return storage.disk(file.storage).getStream(assetFilename).pipe(res);
}
// @todo add file-not-found error
const readStream = storage.disk(file.storage).getStream(file.filename_disk);
const transformer = sharp().resize(resizeOptions);
readStream.pipe(transformer).pipe(res);
})
);
export default router;
function getAssetSuffix(resizeOptions: ResizeOptions) {
if (Object.keys(resizeOptions).length === 0) return '';
return (
'__' +
Object.entries(resizeOptions)
.sort((a, b) => (a[0] > b[0] ? 1 : -1))
.map((e) => e.join('_'))
.join(',')
);
}