From 0447a96a1579ef2960dcd1828eece2de88dda123 Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Tue, 16 Jun 2020 16:57:39 -0400 Subject: [PATCH] Check if collection exists in items endpoints --- src/middleware/collection-exists.ts | 16 ++++++++++++++++ src/routes/items.ts | 6 ++++++ src/services/schema.ts | 5 +++++ 3 files changed, 27 insertions(+) create mode 100644 src/middleware/collection-exists.ts create mode 100644 src/services/schema.ts diff --git a/src/middleware/collection-exists.ts b/src/middleware/collection-exists.ts new file mode 100644 index 0000000000..e9b14bd613 --- /dev/null +++ b/src/middleware/collection-exists.ts @@ -0,0 +1,16 @@ +import { RequestHandler } from 'express'; +import asyncHandler from 'express-async-handler'; +import database from '../database'; +import APIError, { ErrorCode } from '../error'; + +const collectionExists: RequestHandler = asyncHandler(async (req, res, next) => { + if (!req.params.collection) return next(); + + const exists = await database.schema.hasTable(req.params.collection); + + if (exists) return next(); + + throw new APIError(ErrorCode.NOT_FOUND, `Collection "${req.params.collection}" doesn't exist.`); +}); + +export default collectionExists; diff --git a/src/routes/items.ts b/src/routes/items.ts index 50dcde712a..10e245b660 100644 --- a/src/routes/items.ts +++ b/src/routes/items.ts @@ -2,11 +2,13 @@ import express from 'express'; import asyncHandler from 'express-async-handler'; import { createItem, readItems, readItem, updateItem, deleteItem } from '../services/items'; import sanitizeQuery from '../middleware/sanitize-query'; +import collectionExists from '../middleware/collection-exists'; const router = express.Router(); router.post( '/:collection', + collectionExists, asyncHandler(async (req, res) => { await createItem(req.params.collection, req.body); res.status(200).end(); @@ -15,6 +17,7 @@ router.post( router.get( '/:collection', + collectionExists, sanitizeQuery, asyncHandler(async (req, res) => { const records = await readItems(req.params.collection, res.locals.query); @@ -27,6 +30,7 @@ router.get( router.get( '/:collection/:pk', + collectionExists, asyncHandler(async (req, res) => { const record = await readItem(req.params.collection, req.params.pk); @@ -38,6 +42,7 @@ router.get( router.patch( '/:collection/:pk', + collectionExists, asyncHandler(async (req, res) => { await updateItem(req.params.collection, req.params.pk, req.body); return res.status(200).end(); @@ -46,6 +51,7 @@ router.patch( router.delete( '/:collection/:pk', + collectionExists, asyncHandler(async (req, res) => { await deleteItem(req.params.collection, req.params.pk); return res.status(200).end(); diff --git a/src/services/schema.ts b/src/services/schema.ts new file mode 100644 index 0000000000..715c33ba86 --- /dev/null +++ b/src/services/schema.ts @@ -0,0 +1,5 @@ +import database from '../database'; + +export const hasCollection = async (collection: string) => { + return await database.schema.hasTable(collection); +};