const app = require('express').Router(); const crypto = require('crypto'); const checkPermission = require("../middlewares/checkPermission"); const giftValidation = require("../validation/giftValidation"); const Article = require("../models/Article"); const Gift = require("../models/Gift"); const ActivatedArticle = require("../models/ActivatedArticle"); app.put("/", checkPermission("admin.gift.create"), async (req, res) => { // Validate request const {error} = giftValidation.create.validate(req.body); if (error) return res.status(400).json({message: error.details[0].message}); // Set optional fields const giftID = (req.body.giftID || crypto.randomBytes(15).toString("hex")).toUpperCase(); const expiry_date = new Date(req.body.expiry_date || new Date("4000-01-01")); const item_expiry_date = new Date(req.body.item_expiry_date || new Date("4000-01-01")); // Check if article exists const {count: articleCount} = await Article.findAndCountAll({where: {id: req.body.articleID}}); if (articleCount === 0) return res.status(400).json({message: "Article does not exist"}); // Check if code already exists const {count: codeCount} = await Gift.findAndCountAll({where: {giftID: giftID}}); if (codeCount === 1) return res.status(400).json({message: "Code already exists"}); // Create gift await Gift.create({ giftID: giftID, articleID: req.body.articleID, expiry_date: expiry_date, item_expiry_date: item_expiry_date }); // Return gift res.status(200).json({ giftID: giftID, articleID: req.body.articleID, expiry_date: expiry_date.toISOString(), item_expiry_date: item_expiry_date.toISOString() }); }); app.get("/:giftID", checkPermission("admin.gift.info"), async (req, res) => { // Validate request if (!req.params.giftID) return res.status(400).json({message: "Gift ID is required"}); // Check if code is in database const giftInfo = await Gift.findOne({where: {giftID: req.params.giftID}}); // Return info if (giftInfo) res.status(200).json(giftInfo); else res.status(404).json({message: "Gift not found"}); }); app.delete("/:giftID", checkPermission("admin.gift.delete"), async (req, res) => { // Validate request if (!req.params.giftID) return res.status(400).json({message: "Gift ID is required"}); // Check if code exists const {count} = await Gift.findAndCountAll({where: {giftID: req.params.giftID}}); if (count === 0) return res.status(400).json({message: "Gift not found"}); // Delete code await Gift.destroy({where: {giftID: req.params.giftID}}); // Send response res.status(200).json({message: "Gift successfully deleted"}); }); app.patch("/", checkPermission("admin.gift.update"), async (req, res) => { // Validate request const {error} = giftValidation.update.validate(req.body); if (error) return res.status(400).json({message: error.details[0].message}); // Check if code exists const {count} = await Gift.findAndCountAll({where: {giftID: req.body.giftID}}); if (count === 0) return res.status(400).json({message: "Gift not found"}); // Add changes to object const updatedGift = {}; if (req.body.articleID) { // Check if article exists const {count: articleCount} = await Article.findAndCountAll({where: {articleID: req.body.articleID}}); if (articleCount === 0) return res.status(400).json({message: "Article does not exist"}); updatedGift["articleID"] = req.body.articleID; } if (req.body.expiry_date) updatedGift["expiry_date"] = req.body.expiry_date; if (req.body.item_expiry_date) updatedGift["item_expiry_date"] = req.body.item_expiry_date; // Update await Gift.update(updatedGift, {where: {giftID: req.body.giftID}}); // Send response res.status(200).json({message: "Gift updated successfully"}); }); app.post("/redeem", async (req, res) => { // Validate request const {error} = giftValidation.redeem.validate(req.body); if (error) return res.status(400).json({message: error.details[0].message}); // Check if code is in database const giftInfo = await Gift.findOne({where: {giftID: req.body.giftID}}); // Check if gift exists if (!giftInfo) return res.status(404).json({message: "Gift not found"}); // Get the article const article = await Article.findOne({where: {id: giftInfo.articleID}}); // Check if article limit reached const {count} = await ActivatedArticle.findAndCountAll({ where: { articleID: giftInfo.articleID, guildID: req.body.guildID } }); if (count >= article.maxOwnCount) return res.status(400).json({message: "Maximum limit of this item reached"}); // Redeem article await ActivatedArticle.create({ articleID: giftInfo.articleID, expiry_date: giftInfo.item_expiry_date, guildID: req.body.guildID }); await Gift.destroy({where: {giftID: req.body.giftID}}); // Send response res.json({message: "Article successfully redeemed"}); }); module.exports = app;