From 4043954f952d00d9653a378bc1e47e18f171133c Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Mon, 11 Jan 2021 20:51:10 +0100 Subject: [PATCH] Split request into controller and repo. Also try returning better error message on exceptions and check for errors in payload to return well-defined errors. --- api/controllers/requestController.js | 64 ++++++++++++++++++++++++++++ api/request.js | 57 +++++++++++++------------ api/router.js | 8 ++-- 3 files changed, 99 insertions(+), 30 deletions(-) create mode 100644 api/controllers/requestController.js diff --git a/api/controllers/requestController.js b/api/controllers/requestController.js new file mode 100644 index 0000000..91cc391 --- /dev/null +++ b/api/controllers/requestController.js @@ -0,0 +1,64 @@ +const path = require("path"); +const RequestRepository = require(path.join( + __dirname, "../request" +)); + +function addRequest(req, res) { + const { wine } = req.body; + + return RequestRepository.addNew(wine) + .then(wine => res.json({ + message: "Successfully added new request", + wine: wine, + success: true + })) + .catch(error => { + const { message, statusCode } = error; + + return res.status(statusCode || 500).send({ + success: false, + message: message || "Unable to add requested wine." + }) + }) +} + +function getAllRequests(req, res) { + return RequestRepository.getAll() + .then(wines => res.json({ + wines: wines, + success: true + })) + .catch(error => { + console.log("error in getAllRequests:", error); + + const message = "Unable to fetch all requested wines." + return res.status(500).json({ + success: false, + message: message + }) + }) +} + +function deleteRequest(req, res) { + const { id } = req.params; + + return RequestRepository.deleteById(id) + .then(_ => res.json({ + message: `Slettet vin med id: ${ id }`, + success: true + })) + .catch(error => { + const { statusCode, message } = error; + + return res.status(statusCode || 500).send({ + success: false, + message: message || "Unable to delete requested wine." + }); + }) +} + +module.exports = { + addRequest, + getAllRequests, + deleteRequest +} \ No newline at end of file diff --git a/api/request.js b/api/request.js index 60388fa..f1429c6 100644 --- a/api/request.js +++ b/api/request.js @@ -1,4 +1,3 @@ -const express = require("express"); const path = require("path"); const RequestedWine = require(path.join( __dirname, "/schemas/RequestedWine" @@ -7,31 +6,15 @@ const Wine = require(path.join( __dirname, "/schemas/Wine" )); -const deleteRequestedWineById = async (req, res) => { - const { id } = req.params; - if(id == null){ - return res.json({ - message: "Id er ikke definert", - success: false - }) +class RequestedWineNotFound extends Error { + constructor(message="Wine with this id was not found.") { + super(message); + this.name = "RequestedWineNotFound"; + this.statusCode = 404; } - - await RequestedWine.deleteOne({wineId: id}) - return res.json({ - message: `Slettet vin med id: ${id}`, - success: true - }); } -const getAllRequestedWines = async (req, res) => { - const allWines = await RequestedWine.find({}).populate("wine"); - - return res.json(allWines); -} - -const requestNewWine = async (req, res) => { - const {wine} = req.body - +const addNew = async (wine) => { let thisWineIsLOKO = await Wine.findOne({id: wine.id}) if(thisWineIsLOKO == undefined){ @@ -59,11 +42,31 @@ const requestNewWine = async (req, res) => { } await requestedWine.save() - return res.send(requestedWine); + return requestedWine; +} + +const getById = (id) => { + return RequestedWine.findOne({ wineId: id }).populate("wine") + .then(wine => { + if (wine == null) { + throw new RequestedWineNotFound(); + } + + return wine; + }) +} + +const deleteById = (id) => { + return getById(id) + .then(wine => RequestedWine.deleteOne({ wineId: wine.id })) +} + +const getAll = () => { + return RequestedWine.find({}).populate("wine"); } module.exports = { - requestNewWine, - getAllRequestedWines, - deleteRequestedWineById + addNew, + getAll, + deleteById }; diff --git a/api/router.js b/api/router.js index 4d57057..43d4c2a 100644 --- a/api/router.js +++ b/api/router.js @@ -17,13 +17,15 @@ const virtualRegistrationApi = require(path.join( const lottery = require(path.join(__dirname, "/lottery")); const chatHistoryApi = require(path.join(__dirname, "/chatHistory")); +const requestController = require(path.join(__dirname, "/controllers/requestController")); + const router = express.Router(); router.get("/wineinfo/search", wineinfo.wineSearch); -router.get("/request/all", setAdminHeaderIfAuthenticated, request.getAllRequestedWines); -router.post("/request/new-wine", request.requestNewWine); -router.delete("/request/:id", request.deleteRequestedWineById); +router.get("/request/all", setAdminHeaderIfAuthenticated, requestController.getAllRequests); +router.post("/request/new-wine", requestController.addRequest); +router.delete("/request/:id", requestController.deleteRequest); router.get("/wineinfo/schema", mustBeAuthenticated, update.schema); router.get("/wineinfo/:ean", wineinfo.byEAN);