Lottery wine functions & controller.
Split all wine/prelottrey wines into separate controller. Now also have endpoints for deleting or updating single wine by id.
This commit is contained in:
149
api/controllers/lotteryWineController.js
Normal file
149
api/controllers/lotteryWineController.js
Normal file
@@ -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
|
||||||
|
};
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
const path = require("path");
|
const path = require("path");
|
||||||
const Attendee = require(path.join(__dirname, "/schemas/Attendee"));
|
const Attendee = require(path.join(__dirname, "/schemas/Attendee"));
|
||||||
|
const PreLotteryWine = require(path.join(__dirname, "/schemas/PreLotteryWine"));
|
||||||
|
|
||||||
class UserNotFound extends Error {
|
class UserNotFound extends Error {
|
||||||
constructor(message = "User not found.") {
|
constructor(message = "User not found.") {
|
||||||
@@ -11,6 +12,16 @@ class UserNotFound extends Error {
|
|||||||
// TODO log missing user
|
// 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 => {
|
const redactAttendeeInfoMapper = attendee => {
|
||||||
return {
|
return {
|
||||||
name: attendee.name,
|
name: attendee.name,
|
||||||
@@ -79,10 +90,71 @@ const deleteAttendees = () => {
|
|||||||
return Attendee.deleteMany();
|
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 = {
|
module.exports = {
|
||||||
allAttendees,
|
allAttendees,
|
||||||
addAttendee,
|
addAttendee,
|
||||||
updateAttendeeById,
|
updateAttendeeById,
|
||||||
deleteAttendeeById,
|
deleteAttendeeById,
|
||||||
deleteAttendees
|
deleteAttendees,
|
||||||
|
allWines,
|
||||||
|
addWines,
|
||||||
|
updateWineById,
|
||||||
|
deleteWineById,
|
||||||
|
deleteWines
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user