From ce955e34c1e6570dbe151d2be8df89015e6eb2e4 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Mon, 16 Dec 2019 16:05:43 -0800 Subject: [PATCH] Allow PUT to overwrite existing files --- lib/nbi.ts | 33 +++++++++++++++++++++++---------- lib/ui/api.ts | 6 ++++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/lib/nbi.ts b/lib/nbi.ts index 42aed00..e604999 100644 --- a/lib/nbi.ts +++ b/lib/nbi.ts @@ -565,22 +565,35 @@ export function listener(request, response): void { version: request.headers.version }; const bucket = new mongodb.GridFSBucket(db.client.db()); - const uploadStream = bucket.openUploadStreamWithId(filename, filename, { - metadata: metadata - }); + bucket.delete((filename as unknown) as mongodb.ObjectId, () => { + const uploadStream = bucket.openUploadStreamWithId( + filename, + filename, + { + metadata: metadata + } + ); - uploadStream.on("error", err => { - throwError(err, response); - }); + uploadStream.on("error", err => { + throwError(err, response); + }); - uploadStream.end(body, () => { - response.writeHead(201); - response.end(); + uploadStream.end(body, () => { + response.writeHead(201); + response.end(); + }); }); } else if (request.method === "DELETE") { const bucket = new mongodb.GridFSBucket(db.client.db()); bucket.delete((filename as unknown) as mongodb.ObjectId, err => { - if (err) return void throwError(err, response); + if (err) { + if (err.message.startsWith("FileNotFound")) { + response.writeHead(404); + response.end("404 Not Found"); + return; + } + return void throwError(err, response); + } response.writeHead(200); response.end(); diff --git a/lib/ui/api.ts b/lib/ui/api.ts index 291ec51..e8e1b26 100644 --- a/lib/ui/api.ts +++ b/lib/ui/api.ts @@ -455,6 +455,12 @@ router.put("/files/:id", async (ctx, next) => { return void (ctx.status = 403); } + try { + await db.deleteFile(id); + } catch (err) { + // File doesn't exist, ignore + } + await db.putFile(id, metadata, ctx.req); log.metadata = metadata; logger.accessInfo(log);