Add upload (replace) / update file

This commit is contained in:
rijkvanzanten
2020-06-26 15:02:07 -04:00
parent c31ef8fe17
commit e533d76082
3 changed files with 43 additions and 14 deletions

View File

@@ -4,14 +4,11 @@ import Busboy from 'busboy';
import sanitizeQuery from '../middleware/sanitize-query';
import validateQuery from '../middleware/validate-query';
import * as FilesService from '../services/files';
import storage from '../storage';
import { Readable } from 'stream';
import logger from '../logger';
const router = express.Router();
router.post(
'/',
const multipartHandler = (operation: 'create' | 'update') =>
asyncHandler(async (req, res, next) => {
const busboy = new Busboy({ headers: req.headers });
@@ -50,7 +47,11 @@ router.post(
});
try {
await FilesService.createFile(fileStream, payload);
if (operation === 'create') {
await FilesService.createFile(payload, fileStream);
} else {
await FilesService.updateFile(req.params.pk, payload, fileStream);
}
} catch (err) {
busboy.emit('error', err);
}
@@ -65,8 +66,9 @@ router.post(
});
return req.pipe(busboy);
})
);
});
router.post('/', multipartHandler('create'));
router.get(
'/',
@@ -90,9 +92,14 @@ router.get(
router.patch(
'/:pk',
asyncHandler(async (req, res) => {
const records = await FilesService.updateFile(req.params.pk, req.body, res.locals.query);
return res.json({ data: records });
asyncHandler(async (req, res, next) => {
if (req.is('multipart/form-data')) {
await multipartHandler('update')(req, res, next);
} else {
await FilesService.updateFile(req.params.pk, req.body);
}
return res.status(200).end();
})
);

View File

@@ -6,8 +6,8 @@ import database from '../database';
import logger from '../logger';
export const createFile = async (
stream: NodeJS.ReadableStream,
data: Record<string, any>,
stream: NodeJS.ReadableStream,
query?: Query
) => {
const payload = await PayloadService.processValues('create', 'directus_files', data);
@@ -26,8 +26,31 @@ export const readFile = async (pk: string | number, query: Query) => {
return await ItemsService.readItem('directus_files', pk, query);
};
export const updateFile = async (pk: string | number, data: Record<string, any>, query: Query) => {
return await ItemsService.updateItem('directus_files', pk, data, query);
// @todo Add query support
export const updateFile = async (
pk: string | number,
data: Record<string, any>,
stream?: NodeJS.ReadableStream,
query?: Query
) => {
const payload = await PayloadService.processValues('update', 'directus_files', data);
await ItemsService.updateItem('directus_files', pk, payload, query);
/**
* @TODO
* Handle changes in storage adapter -> going from local to S3 needs to delete from one, upload to the other
*/
if (stream) {
const file = await database
.select('storage', 'filename_disk')
.from('directus_files')
.where({ id: pk })
.first();
// @todo type of stream in flydrive is wrong: https://github.com/Slynova-Org/flydrive/issues/145
await storage.disk(file.storage).put(file.filename_disk, stream as any);
}
};
export const deleteFile = async (pk: string | number) => {

View File

@@ -11,7 +11,6 @@ import { GoogleCloudStorage } from '@slynova/flydrive-gcs';
/** @todo dynamically load storage adapters here */
console.log(getStorageConfig());
const storage = new StorageManager(getStorageConfig());
registerDrivers(storage);