From 58b82517d05f57006a7270d5297e23a074054334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20L=C3=A1szl=C3=B3?= <rlacko99@gmail.com> Date: Thu, 24 Dec 2020 02:17:46 +0100 Subject: [PATCH] warnings middleware rework --- src/middlewares/warning/addWarning.ts | 29 ++++++------ src/middlewares/warning/deleteWarning.ts | 3 +- src/middlewares/warning/getWarning.ts | 3 ++ src/middlewares/warning/getWarningsList.ts | 21 +++++++++ src/middlewares/warning/updateWarning.ts | 25 ++++++----- src/routes/user.ts | 2 +- src/routes/warnings.ts | 51 +++++++++++++++++++--- 7 files changed, 100 insertions(+), 34 deletions(-) create mode 100644 src/middlewares/warning/getWarningsList.ts diff --git a/src/middlewares/warning/addWarning.ts b/src/middlewares/warning/addWarning.ts index 58704d64..ce60fe53 100644 --- a/src/middlewares/warning/addWarning.ts +++ b/src/middlewares/warning/addWarning.ts @@ -4,7 +4,7 @@ import { ErrorHandler } from "../utils/ErrorHandler"; import Profile from "../../models/ProfileSchema"; import Warning from "../../models/WarningSchema"; import { validateFields } from "../utils/validateFields"; -import warningsRoute from "../../routes/warning"; +import warningsRoute from "../../routes/warnings"; const fields = [{ name: "text", required: true }]; @@ -14,7 +14,9 @@ const addWarning = () => async ( next: NextFunction ) => { try { - const warningReceiver = await Profile.findById(req.params.id).exec(); + const warningReceiver = await Profile.findById(req.params.userId) + .lean() + .exec(); if (!warningReceiver) throw new ErrorHandler(404, "User not found!"); const warning = new Warning(); @@ -28,24 +30,21 @@ const addWarning = () => async ( warning.receiver = warningReceiver._id!; warning.date = new Date(); - warning.given_by = { - _id: req.session.user!.id!, + warning.givenBy = { + id: req.session.user!.id!, name: req.session.user!.name!, }; await warning.save(); - warningReceiver.warningIds = [ - ...warningReceiver.warningIds, - String(warning._id), - ]; - await warningReceiver.save(async (err) => { - if (err) { - await warning.remove(); - throw err; - } - }); - res.data.warning = warning; + await Profile.updateOne( + { _id: warningReceiver._id }, + { $push: { warnings: warning._id } } + ) + .lean() + .exec(); + + res.data.newObjectId = warning._id; next(); } catch (err) { next(err); diff --git a/src/middlewares/warning/deleteWarning.ts b/src/middlewares/warning/deleteWarning.ts index 6d1b6338..376ccefc 100644 --- a/src/middlewares/warning/deleteWarning.ts +++ b/src/middlewares/warning/deleteWarning.ts @@ -13,8 +13,9 @@ const deleteWarning = () => async ( await Profile.updateOne( { _id: warning?.receiver }, - { $pull: { warningIds: warning?._id } } + { $pull: { warnings: warning?._id } } ); + next(); } catch (err) { next(err); diff --git a/src/middlewares/warning/getWarning.ts b/src/middlewares/warning/getWarning.ts index f1d59c34..df0edcb8 100644 --- a/src/middlewares/warning/getWarning.ts +++ b/src/middlewares/warning/getWarning.ts @@ -2,6 +2,9 @@ import { NextFunction, Request, Response } from "express"; import Warning from "../../models/WarningSchema"; +/** + * req.params.warningId -> Get Warning and set res.data.warning + */ const getWarning = () => async ( req: Request, res: Response, diff --git a/src/middlewares/warning/getWarningsList.ts b/src/middlewares/warning/getWarningsList.ts new file mode 100644 index 00000000..3558a47d --- /dev/null +++ b/src/middlewares/warning/getWarningsList.ts @@ -0,0 +1,21 @@ +import { NextFunction, Request, Response } from "express"; + +import Warning from "../../models/WarningSchema"; + +/** + * -> Get Warnings and set res.data.warnings + */ +const getWarningsList = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + try { + res.data.warnings = await Warning.find().lean().exec(); + next(); + } catch (err) { + next(err); + } +}; + +export default getWarningsList; diff --git a/src/middlewares/warning/updateWarning.ts b/src/middlewares/warning/updateWarning.ts index 5d819d49..f8c8ff5b 100644 --- a/src/middlewares/warning/updateWarning.ts +++ b/src/middlewares/warning/updateWarning.ts @@ -1,26 +1,27 @@ import { NextFunction, Request, Response } from "express"; - -import Warning from "../../models/WarningSchema"; +import Warning, { IWarning } from "../../models/WarningSchema"; // Valid fields to update -const validFields = ["text"]; +const validFields: Partial<keyof IWarning>[] = ["text"]; +/** + * warningId -> Updates the warning + */ const updateWarning = () => async ( req: Request, res: Response, next: NextFunction ) => { try { - const warning = await Warning.findById(req.params.warnmingId).exec(); + let newFields: Partial<IWarning> = {}; + validFields.forEach((field) => { + const value = req.body[field]; + if (value) newFields[field] = value; + }); - if (warning) { - validFields.forEach((field) => { - const value = req.body[field]; - if (value) warning.set(field, value); - }); - await warning.save(); - } - res.data.warning = warning; + await Warning.updateOne({ _id: req.params.warningId }, { $set: newFields }) + .lean() + .exec(); next(); } catch (err) { diff --git a/src/routes/user.ts b/src/routes/user.ts index 74d52b7e..d37b39a9 100644 --- a/src/routes/user.ts +++ b/src/routes/user.ts @@ -92,7 +92,7 @@ const usersRoute = (prefix: string, app: Application): void => { deleteUser(), noContentResponse() ); - // Accept/Reject a users picture + // Accept/Reject a users picture TODO app.post(`${prefix}/user/:userId/picture/accept`, example()); app.post(`${prefix}/user/:userId/picture/reject`, example()); }; diff --git a/src/routes/warnings.ts b/src/routes/warnings.ts index 5fb80367..543ee149 100644 --- a/src/routes/warnings.ts +++ b/src/routes/warnings.ts @@ -1,17 +1,58 @@ import { Application } from "express"; +import addWarning from "../middlewares/warning/addWarning"; +import createdResponse from "../middlewares/utils/createdResponse"; +import deleteWarning from "../middlewares/warning/deleteWarning"; import example from "../middlewares/example"; +import getWarning from "../middlewares/warning/getWarning"; +import getWarningsList from "../middlewares/warning/getWarningsList"; +import isRegistered from "../middlewares/auth/isRegistered"; +import isStaffOrAdmin from "../middlewares/auth/isStaffOrAdmin"; +import noContentResponse from "../middlewares/utils/noContentResponse"; +import responseWarning from "../middlewares/warning/responseWarning"; +import responseWarningsList from "../middlewares/warning/responseWarningsList"; +import updateWarning from "../middlewares/warning/updateWarning"; const warningsRoute = (prefix: string, app: Application): void => { // Get all warnings - app.get(`${prefix}/`, example()); + app.get( + `${prefix}/`, + isRegistered(), + isStaffOrAdmin(), + getWarningsList(), + responseWarningsList() + ); // Add a warning to a user - app.post(`${prefix}/user/:userId`, example()); + app.post( + `${prefix}/user/:userId`, + isRegistered(), + isStaffOrAdmin(), + addWarning(), + createdResponse() + ); // Get a warning - app.get(`${prefix}/warning/:warningId`, example()); + app.get( + `${prefix}/warning/:warningId`, + isRegistered(), + isStaffOrAdmin(), + getWarning(), + responseWarning() + ); // Update a warning - app.put(`${prefix}/warning/:warningId`, example()); + app.put( + `${prefix}/warning/:warningId`, + isRegistered(), + isStaffOrAdmin(), + updateWarning(), + noContentResponse() + ); // Delete a warning - app.delete(`${prefix}/warning/:warningId`, example()); + app.delete( + `${prefix}/warning/:warningId`, + isRegistered(), + isStaffOrAdmin(), + deleteWarning(), + noContentResponse() + ); }; export default warningsRoute; -- GitLab