From 6d5f0e824f15b50f2cced310730ed82b2c9646e8 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 24 Jan 2021 12:12:52 +0100 Subject: [PATCH] Lottery wine functions & controller. Split all wine/prelottrey wines into separate controller. Now also have endpoints for deleting or updating single wine by id. --- api/controllers/lotteryWineController.js | 149 +++++++++++++++++++++++ api/lottery.js | 74 ++++++++++- 2 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 api/controllers/lotteryWineController.js diff --git a/api/controllers/lotteryWineController.js b/api/controllers/lotteryWineController.js new file mode 100644 index 0000000..cfa9ccd --- /dev/null +++ b/api/controllers/lotteryWineController.js @@ -0,0 +1,149 @@ +const path = require("path"); +const lotteryRepository = require(path.join(__dirname, "../lottery")); + +const allWines = (req, res) => { + return lotteryRepository + .allWines() + .then(wines => + res.send({ + wines: wines, + success: true + }) + ) + .catch(error => { + const { statusCode, message } = error; + + return res.status(statusCode || 500).send({ + success: false, + message: message || "Unable to fetch lottery wines." + }); + }); +}; + +const addWines = (req, res) => { + const { wines } = req.body; + + if (!(wines instanceof Array)) { + return res.status(400).send({ + message: "Wines must be array.", + success: false + }); + } + + const validateAllWines = wines => + wines.map(wine => { + const requiredAttributes = ["name", "vivinoLink", "rating", "image", "country", "id", "price"]; + + return Promise.all( + requiredAttributes.map(attr => { + if (typeof wine[attr] === "undefined") { + return Promise.reject({ + message: `Incorrect or missing attribute: ${attr}.`, + statusCode: 400, + success: false + }); + } + return Promise.resolve(); + }) + ).then(_ => Promise.resolve(wine)); + }); + + return Promise.all(validateAllWines(wines)) + .then(wines => lotteryRepository.addWines(wines)) + .then(savedWines => { + var io = req.app.get("socketio"); + io.emit("new_wine", {}); + return true; + }) + .then(success => + res.send({ + message: `Successfully added wines to lottery.`, + success: success + }) + ) + .catch(error => { + const { statusCode, message } = error; + + return res.status(statusCode || 500).send({ + message: message || "Unexpected error occured adding wines.", + success: false + }); + }); +}; + +const updateWineById = (req, res) => { + const { id } = req.params; + const { wine } = req.body; + + return lotteryRepository + .updateWineById(id, wine) + .then(updatedWine => { + var io = req.app.get("socketio"); + io.emit("refresh_data", {}); + return updatedWine; + }) + .then(wine => + res.send({ + wine, + message: `Updated wine: ${wine.name}`, + success: true + }) + ) + .catch(error => { + const { statusCode, message } = error; + + return res.status(statusCode || 500).send({ + message: message || "Unexpected error occured while deleteing wine by id.", + success: false + }); + }); +}; + +const deleteWineById = (req, res) => { + const { id } = req.params; + + return lotteryRepository + .deleteWineById(id) + .then(removedWine => { + var io = req.app.get("socketio"); + io.emit("refresh_data", {}); + return removedWine; + }) + .then(wine => + res.send({ + message: `Removed wine: ${wine.name}`, + success: true + }) + ) + .catch(error => { + const { statusCode, message } = error; + + return res.status(statusCode || 500).send({ + message: message || "Unexpected error occured while deleteing wine by id.", + success: false + }); + }); +}; + +const deleteWines = (req, res) => { + return lotteryRepository + .deleteWines() + .then(removedWine => { + var io = req.app.get("socketio"); + io.emit("refresh_data", {}); + }) + .then(_ => + res.send({ + message: "Removed all wines", + success: true + }) + ); +}; + +module.exports = { + allWines, + addWines, + updateWineById, + deleteWineById, + deleteWines +}; diff --git a/api/lottery.js b/api/lottery.js index ef78017..a748fc2 100644 --- a/api/lottery.js +++ b/api/lottery.js @@ -1,5 +1,6 @@ const path = require("path"); const Attendee = require(path.join(__dirname, "/schemas/Attendee")); +const PreLotteryWine = require(path.join(__dirname, "/schemas/PreLotteryWine")); class UserNotFound extends Error { constructor(message = "User not found.") { @@ -11,6 +12,16 @@ class UserNotFound extends Error { // TODO log missing user } +class WineNotFound extends Error { + constructor(message = "Wine not found.") { + super(message); + this.name = "WineNotFound"; + this.statusCode = 404; + } + + // TODO log missing user +} + const redactAttendeeInfoMapper = attendee => { return { name: attendee.name, @@ -79,10 +90,71 @@ const deleteAttendees = () => { return Attendee.deleteMany(); }; +const allWines = () => { + return PreLotteryWine.find(); +}; + +const addWines = wines => { + const prelotteryWines = wines.map(wine => { + let newPrelotteryWine = new PreLotteryWine({ + name: wine.name, + vivinoLink: wine.vivinoLink, + rating: wine.rating, + image: wine.image, + price: wine.price, + country: wine.country, + id: wine.id + }); + + return newPrelotteryWine.save(); + }); + + return Promise.all(prelotteryWines); +}; + +const updateWineById = (id, updateModel) => { + return PreLotteryWine.findOne({ _id: id }).then(wine => { + if (wine == null) { + throw new WineNotFound(); + } + + const updatedWine = { + name: updateModel.name || wine.name, + vivinoLink: updateModel.vivinoLink || wine.vivinoLink, + rating: updateModel.rating || wine.rating, + image: updateModel.image || wine.image, + price: updateModel.price || wine.price, + country: updateModel.country || wine.country, + id: updateModel.id || wine.id + }; + + return PreLotteryWine.updateOne({ _id: id }, updatedWine).then(_ => updatedWine); + }); +}; + +const deleteWineById = id => { + return PreLotteryWine.findOne({ _id: id }).then(wine => { + if (wine == null) { + throw new WineNotFound(); + } + + return PreLotteryWine.deleteOne({ _id: id }).then(_ => wine); + }); +}; + +const deleteWines = () => { + return PreLotteryWine.deleteMany(); +}; + module.exports = { allAttendees, addAttendee, updateAttendeeById, deleteAttendeeById, - deleteAttendees + deleteAttendees, + allWines, + addWines, + updateWineById, + deleteWineById, + deleteWines };