From 8a506ccf46598297e8a2db38d07c788ef22e00bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20L=C3=A1szl=C3=B3?= <rlacko99@gmail.com> Date: Mon, 21 Dec 2020 20:42:45 +0100 Subject: [PATCH] refactor Warning middlewares --- src/middlewares/news/updateNews.ts | 3 + .../user/{getOwnUser.ts => setOwnUserId.ts} | 8 +- src/middlewares/warning/addWarning.ts | 82 ++++++++----------- src/middlewares/warning/deleteWarning.ts | 21 ++--- .../warning/getUserWarningsList.ts | 22 ++--- src/middlewares/warning/getWarning.ts | 18 ++-- src/middlewares/warning/responseWarning.ts | 5 +- .../warning/responseWarningList.ts | 2 +- src/middlewares/warning/updateWarning.ts | 35 +++----- src/routes/auth.ts | 3 +- src/routes/file.ts | 6 +- src/routes/user.ts | 11 ++- src/routes/warning.ts | 4 +- 13 files changed, 97 insertions(+), 123 deletions(-) rename src/middlewares/user/{getOwnUser.ts => setOwnUserId.ts} (77%) diff --git a/src/middlewares/news/updateNews.ts b/src/middlewares/news/updateNews.ts index baa113bf..73f60815 100644 --- a/src/middlewares/news/updateNews.ts +++ b/src/middlewares/news/updateNews.ts @@ -4,6 +4,9 @@ import { NextFunction, Request, Response } from "express"; // Valid fields to update const validFields = ["title", "text"]; +/** + * Update a News Object + */ const updateNews = () => async ( req: Request, res: Response, diff --git a/src/middlewares/user/getOwnUser.ts b/src/middlewares/user/setOwnUserId.ts similarity index 77% rename from src/middlewares/user/getOwnUser.ts rename to src/middlewares/user/setOwnUserId.ts index 29835218..160663fc 100644 --- a/src/middlewares/user/getOwnUser.ts +++ b/src/middlewares/user/setOwnUserId.ts @@ -8,8 +8,12 @@ import Warning from "../../models/WarningSchema"; * Middleware to set req.params.id to the current users id. * getUser() middleware should be called after this. */ -const getOwnUser = () => (req: Request, res: Response, next: NextFunction) => { +const setOwnUserId = () => ( + req: Request, + res: Response, + next: NextFunction +) => { req.params.id = req.session.user!.id!; next(); }; -export default getOwnUser; +export default setOwnUserId; diff --git a/src/middlewares/warning/addWarning.ts b/src/middlewares/warning/addWarning.ts index eb253b0a..200e14ff 100644 --- a/src/middlewares/warning/addWarning.ts +++ b/src/middlewares/warning/addWarning.ts @@ -3,61 +3,49 @@ import { NextFunction, Request, Response } from "express"; import Profile from "../../models/ProfileSchema"; import { ValidationError } from "../utils/ValidationError"; import Warning from "../../models/WarningSchema"; +import { validateFields } from "../utils/validateFields"; import warningsRoute from "../../routes/warning"; +const fields = [{ name: "text", required: true }]; + const addWarning = () => async ( req: Request, res: Response, next: NextFunction ) => { - try { - const warningReceiver = await Profile.findById(req.params.userId).exec(); - if (!warningReceiver) return res.status(400).send("Profile not found"); - - const warning = new Warning(); - - // Check required fields - const fields = [{ name: "text", required: true }]; - fields.forEach((field) => { - const value = req.body[field.name]; - if (field.required && !value) { - res.status(400); - throw new ValidationError(400, `Field: {${field.name}} is required!`); - } - if (value) warning.set(field.name, value); - }); - - warning.receiver = warningReceiver.id; - warning.date = new Date(); - warning.given_by = { - _id: res.data.profile!.id, - name: res.data.profile!.name, - }; - - await warning.save((err) => { - if (err) { - return res.status(400); - } - }); - - warningReceiver.warningIds = [ - ...warningReceiver.warningIds, - String(warning.id), - ]; - await warningReceiver.save((err) => { - if (err) { - warning.remove(); - return res.status(400); - } - }); - res.data.warning = warning; - return next(); - } catch (error) { - if (error instanceof ValidationError) { - const { code, message } = error; - return res.status(code).send({ message }); + const warningReceiver = await Profile.findById(req.params.userId).exec(); + if (!warningReceiver) return res.status(400).send("Profile not found"); + + const warning = new Warning(); + + // Validate and set fields from request body + validateFields({ fields, reqBody: req.body }); + fields.forEach((field) => { + const value = req.body[field.name]; + if (value) warning.set(field.name, req.body[field.name]); + }); + + warning.receiver = warningReceiver.id!; + warning.date = new Date(); + warning.given_by = { + _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; + next(); }; export default addWarning; diff --git a/src/middlewares/warning/deleteWarning.ts b/src/middlewares/warning/deleteWarning.ts index 62c41ee1..dbc566c4 100644 --- a/src/middlewares/warning/deleteWarning.ts +++ b/src/middlewares/warning/deleteWarning.ts @@ -3,23 +3,18 @@ import { NextFunction, Request, Response } from "express"; import Profile from "../../models/ProfileSchema"; import Warning from "../../models/WarningSchema"; -const deleteWarning = () => ( +const deleteWarning = () => async ( req: Request, res: Response, next: NextFunction ) => { - Warning.findByIdAndDelete(req.params.warningId, async (error, result) => { - if (!error) { - await Profile.updateOne( - { _id: result?.receiver }, - { $pull: { warningIds: result?._id } } - ); - res.status(204); - res.json({}); - } else { - console.warn(error); - } - }); + const warning = await Warning.findByIdAndRemove(req.params.warningId); + + await Profile.updateOne( + { _id: warning?.receiver }, + { $pull: { warningIds: warning?._id } } + ); + res.status(204).send(); }; export default deleteWarning; diff --git a/src/middlewares/warning/getUserWarningsList.ts b/src/middlewares/warning/getUserWarningsList.ts index fa236f14..06303340 100644 --- a/src/middlewares/warning/getUserWarningsList.ts +++ b/src/middlewares/warning/getUserWarningsList.ts @@ -3,27 +3,19 @@ import { NextFunction, Request, Response } from "express"; import Profile from "../../models/ProfileSchema"; import Warning from "../../models/WarningSchema"; -const getUserWarningsList = () => ( +const getUserWarningsList = () => async ( req: Request, res: Response, next: NextFunction ) => { - Profile.findById(req.params.userId, async (error, profile) => { - if (error) { - console.warn(error); - res.status(400); - } else { - res.status(200); + if (!res.data.profile) + return res.status(404).json({ message: "User not found" }); - if (!profile) return res.status(404).send("User not found"); - - const warnings = await Warning.find({ - _id: { $in: profile?.warningIds }, - }).exec(); - res.data.warnings = warnings; - } - next(); + res.data.warnings = await Warning.find({ + _id: { $in: res.data.profile?.warningIds }, }); + + next(); }; export default getUserWarningsList; diff --git a/src/middlewares/warning/getWarning.ts b/src/middlewares/warning/getWarning.ts index 92383e00..a529ad70 100644 --- a/src/middlewares/warning/getWarning.ts +++ b/src/middlewares/warning/getWarning.ts @@ -2,17 +2,13 @@ import { NextFunction, Request, Response } from "express"; import Warning from "../../models/WarningSchema"; -const getWarning = () => (req: Request, res: Response, next: NextFunction) => { - Warning.findById(req.params.warningId, (error, warning) => { - if (error) { - console.warn(error); - res.status(400); - } else { - res.status(200); - res.data.warning = warning; - } - next(); - }); +const getWarning = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + res.data.warning = await Warning.findById(req.params.warningId).lean().exec(); + next(); }; export default getWarning; diff --git a/src/middlewares/warning/responseWarning.ts b/src/middlewares/warning/responseWarning.ts index c66ffb37..e4bbb7c0 100644 --- a/src/middlewares/warning/responseWarning.ts +++ b/src/middlewares/warning/responseWarning.ts @@ -2,10 +2,9 @@ import { NextFunction, Request, Response, response } from "express"; const responseWarning = () => (req: Request, res: Response) => { if (!res.data.warning) { - res.status(404).json({ message: "Warning not found!" }); - } else { - res.json(res.data.warning); + return res.status(404).json({ message: "Warning not found!" }); } + res.json(res.data.warning); }; export default responseWarning; diff --git a/src/middlewares/warning/responseWarningList.ts b/src/middlewares/warning/responseWarningList.ts index 8323a6f8..432a60a5 100644 --- a/src/middlewares/warning/responseWarningList.ts +++ b/src/middlewares/warning/responseWarningList.ts @@ -1,7 +1,7 @@ import { NextFunction, Request, Response, response } from "express"; const responseWarningList = () => (req: Request, res: Response) => { - res.json(res.data.warnings); + return res.json(res.data.warnings); }; export default responseWarningList; diff --git a/src/middlewares/warning/updateWarning.ts b/src/middlewares/warning/updateWarning.ts index 89aca96b..722f4c45 100644 --- a/src/middlewares/warning/updateWarning.ts +++ b/src/middlewares/warning/updateWarning.ts @@ -5,32 +5,23 @@ import Warning from "../../models/WarningSchema"; // Valid fields to update const validFields = ["text"]; -const updateWarning = () => ( +const updateWarning = () => async ( req: Request, res: Response, next: NextFunction ) => { - Warning.findOne({ _id: req.params.warningId }, async (error, warning) => { - if (error) { - res.status(400); - } else { - if (!!warning) { - validFields.forEach((field) => { - const value = req.body[field]; - if (value) warning.set(field, value); - }); - await warning.save((error, warning) => { - if (!!error) { - console.error(error); - return res.status(500).send("Couldn't update the warning"); - } - }); - res.status(200); - res.data.warning = warning; - } - } - next(); - }); + const warning = await Warning.findById(req.params.warnmingId).exec(); + + if (warning) { + validFields.forEach((field) => { + const value = req.body[field]; + if (value) warning.set(field, value); + }); + await warning.save(); + } + res.data.warning = warning; + + next(); }; export default updateWarning; diff --git a/src/routes/auth.ts b/src/routes/auth.ts index 532eb47a..1202f644 100644 --- a/src/routes/auth.ts +++ b/src/routes/auth.ts @@ -1,6 +1,7 @@ import { Application } from "express"; import complete from "../middlewares/auth/complete"; import isAuthenticated from "../middlewares/auth/isAuthenticated"; +import isLoggedIn from "../middlewares/auth/isLoggedIn"; import login from "../middlewares/auth/login"; import logout from "../middlewares/auth/logout"; @@ -9,7 +10,7 @@ const authRoute = (app: Application): void => { app.get("/api/v1/complete", complete()); - app.get("/api/v1/logout", isAuthenticated(), logout()); + app.get("/api/v1/logout", isLoggedIn(), logout()); }; export default authRoute; diff --git a/src/routes/file.ts b/src/routes/file.ts index 1b851463..7546ec6a 100644 --- a/src/routes/file.ts +++ b/src/routes/file.ts @@ -2,14 +2,14 @@ import { Application } from "express"; import cardImageStorage from "../middlewares/files/card/cardImageStorage"; import { fileFilter } from "../middlewares/files/fileFilter"; import getCardImage from "../middlewares/files/card/getCardImage"; -import getOwnUser from "src/middlewares/user/getOwnUser"; import getProfilePicture from "../middlewares/files/profile/getProfilePicture"; -import getUser from "src/middlewares/user/getUser"; +import getUser from "../middlewares/user/getUser"; import handleFileValidationError from "../middlewares/files/handleFileValidationError"; import isAuthenticated from "../middlewares/auth/isAuthenticated"; import multer from "multer"; import profilePictureStorage from "../middlewares/files/profile/profilePictureStorage"; import responseCardImage from "../middlewares/files/card/responseCardImage"; +import setOwnUserId from "../middlewares/user/setOwnUserId"; import uploadCardImage from "../middlewares/files/card/uploadCardImage"; import uploadProfilePicture from "../middlewares/files/profile/uploadProfilePicture"; @@ -34,7 +34,7 @@ const fileRoute = (app: Application): void => { app.get( "/api/v1/files/profile", isAuthenticated(), - getOwnUser(), + setOwnUserId(), getUser(), getProfilePicture() ); diff --git a/src/routes/user.ts b/src/routes/user.ts index c78a861d..fe249ad3 100644 --- a/src/routes/user.ts +++ b/src/routes/user.ts @@ -5,7 +5,6 @@ import deleteUser from "../middlewares/user/deleteUser"; import deleteWarning from "../middlewares/warning/deleteWarning"; import emptyResponse from "../middlewares/utils/emptyResponse"; import getCardImage from "../middlewares/files/card/getCardImage"; -import getOwnUser from "../middlewares/user/getOwnUser"; import getUser from "../middlewares/user/getUser"; import getUserCard from "../middlewares/files/card/getUserCard"; import getUsersList from "../middlewares/user/getUsersList"; @@ -14,6 +13,7 @@ import getWarningsList from "../middlewares/warning/getUserWarningsList"; import isAuthenticated from "../middlewares/auth/isAuthenticated"; import responseUser from "../middlewares/user/responseUser"; import responseUserList from "../middlewares/user/responseUserList"; +import setOwnUserId from "../middlewares/user/setOwnUserId"; import updateUser from "../middlewares/user/updateUser"; import updateWarning from "../middlewares/warning/updateWarning"; @@ -27,12 +27,17 @@ const usersRoute = (app: Application): void => { app.post("/api/v1/users", addUser(), responseUser()); - app.get("/api/v1/users/me", isAuthenticated(), getOwnUser(), responseUser()); + app.get( + "/api/v1/users/me", + isAuthenticated(), + setOwnUserId(), + responseUser() + ); app.get( "/api/v1/users/me/card", isAuthenticated(), - getOwnUser(), + setOwnUserId(), getCardImage(), getUserCard() ); diff --git a/src/routes/warning.ts b/src/routes/warning.ts index 67f6d46f..389f2131 100644 --- a/src/routes/warning.ts +++ b/src/routes/warning.ts @@ -1,12 +1,12 @@ import { Application } from "express"; import addWarning from "../middlewares/warning/addWarning"; import deleteWarning from "../middlewares/warning/deleteWarning"; -import getOwnUser from "../middlewares/user/getOwnUser"; import getUserWarningsList from "../middlewares/warning/getUserWarningsList"; import getWarning from "../middlewares/warning/getWarning"; import isAuthenticated from "../middlewares/auth/isAuthenticated"; import responseWarning from "../middlewares/warning/responseWarning"; import responseWarningList from "../middlewares/warning/responseWarningList"; +import setOwnUserId from "../middlewares/user/setOwnUserId"; import updateWarning from "../middlewares/warning/updateWarning"; const warningsRoute = (app: Application): void => { @@ -27,7 +27,7 @@ const warningsRoute = (app: Application): void => { app.post( "/api/v1/warnings/user/:userId", isAuthenticated(), - getOwnUser(), + setOwnUserId(), addWarning(), responseWarning() ); -- GitLab