From ccc99af273041f2e865700e01275e129ae6fc553 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 13:04:33 +0100
Subject: [PATCH] getFieldValue middleware

---
 src/middlewares/example.ts             |  1 +
 src/middlewares/utils/getFieldValue.ts | 25 +++++++++++++++++++++++++
 src/routes/files.ts                    | 14 +++++++++++++-
 src/utils/declarations/response.d.ts   |  4 +++-
 4 files changed, 42 insertions(+), 2 deletions(-)
 create mode 100644 src/middlewares/utils/getFieldValue.ts

diff --git a/src/middlewares/example.ts b/src/middlewares/example.ts
index 0b4aabb1..4b639411 100644
--- a/src/middlewares/example.ts
+++ b/src/middlewares/example.ts
@@ -1,6 +1,7 @@
 import { NextFunction, Request, Response, response } from "express";
 
 const example = () => (req: Request, res: Response) => {
+  console.log(res.data.value);
   res.status(200).json({ message: "Example" });
 };
 
diff --git a/src/middlewares/utils/getFieldValue.ts b/src/middlewares/utils/getFieldValue.ts
new file mode 100644
index 00000000..d3ffad58
--- /dev/null
+++ b/src/middlewares/utils/getFieldValue.ts
@@ -0,0 +1,25 @@
+import { NextFunction, Request, Response } from "express";
+
+import Profile from "../../models/ProfileSchema";
+import Term from "../../models/TermSchema";
+
+/**
+ * set res.data.value to res.data[objectName][fieldName]
+ */
+const getFieldValue = (
+  objectName: "profile" | "term",
+  fieldName: "picture" | "acceptedPicture" | "backgroundFile"
+) => async (req: Request, res: Response, next: NextFunction) => {
+  try {
+    const object: Record<string, any> = res.data[objectName]!;
+    if (object) {
+      res.data.value = object[fieldName];
+    }
+
+    next();
+  } catch (err) {
+    next(err);
+  }
+};
+
+export default getFieldValue;
diff --git a/src/routes/files.ts b/src/routes/files.ts
index 5b769a2e..fe7fd3a9 100644
--- a/src/routes/files.ts
+++ b/src/routes/files.ts
@@ -2,6 +2,11 @@ import { Application } from "express";
 import cardImageStorage from "../middlewares/files/card/cardImageStorage";
 import example from "../middlewares/example";
 import { fileFilter } from "../middlewares/files/fileFilter";
+import getFieldValue from "../middlewares/utils/getFieldValue";
+import getUser from "../middlewares/user/getUser";
+import isLoggedIn from "../middlewares/auth/isLoggedIn";
+import isRegistered from "../middlewares/auth/isRegistered";
+import isStaffOrAdmin from "../middlewares/auth/isStaffOrAdmin";
 import multer from "multer";
 import profilePictureStorage from "../middlewares/files/profile/profilePictureStorage";
 
@@ -17,7 +22,14 @@ const CardImageUpload = multer({
 
 const filesRoute = (prefix: string, app: Application): void => {
   // Get a users profile picture
-  app.get(`${prefix}/user/:userId/picture`, example());
+  app.get(
+    `${prefix}/user/:userId/picture`,
+    isRegistered(),
+    isStaffOrAdmin(),
+    getUser(),
+    getFieldValue("profile", "picture"),
+    example()
+  );
   // Get a users accepted picture
   app.get(`${prefix}/user/:userId/picture/accepted`, example());
   // Get own picture
diff --git a/src/utils/declarations/response.d.ts b/src/utils/declarations/response.d.ts
index 2dbecbab..878f90fe 100644
--- a/src/utils/declarations/response.d.ts
+++ b/src/utils/declarations/response.d.ts
@@ -2,6 +2,7 @@ import { INews } from "../../models/NewsSchema";
 import { IProfile } from "../../models/ProfileSchema";
 import { IFile } from "../../models/FileSchema";
 import { IWarning } from "../../models/WarningSchema";
+import { ITerm } from "../../models/TermSchema";
 
 declare global {
   namespace Express {
@@ -10,7 +11,8 @@ declare global {
         profile?: Partial<IProfile> | null;
         warnings?: Partial<IWarning>[] | null;
         newObjectId?: string | null;
-
+        value?: string | null;
+        term?: Partial<ITerm> | null;
         news?: Partial<INews>[] | null;
         newsObject?: Partial<INews> | null;
         profiles?: Partial<IProfile>[] | null;
-- 
GitLab