diff --git a/src/routes/files.ts b/src/routes/files.ts index bda236c537..fe9458beff 100644 --- a/src/routes/files.ts +++ b/src/routes/files.ts @@ -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(); }) ); diff --git a/src/services/files.ts b/src/services/files.ts index 368ad19814..063e43a6bc 100644 --- a/src/services/files.ts +++ b/src/services/files.ts @@ -6,8 +6,8 @@ import database from '../database'; import logger from '../logger'; export const createFile = async ( - stream: NodeJS.ReadableStream, data: Record, + 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, query: Query) => { - return await ItemsService.updateItem('directus_files', pk, data, query); +// @todo Add query support +export const updateFile = async ( + pk: string | number, + data: Record, + 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) => { diff --git a/src/storage.ts b/src/storage.ts index 88c72f214f..e8d24b0ed5 100644 --- a/src/storage.ts +++ b/src/storage.ts @@ -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);