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