From db727fe702f8e97b967c9a76e768f01aa172448b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafael=20L=C3=A1szl=C3=B3?= <rlacko99@gmail.com>
Date: Wed, 23 Dec 2020 17:39:22 +0100
Subject: [PATCH] updated API routes and added notification strings

---
 src/index.ts                               | 21 ++---
 src/middlewares/auth/complete.ts           |  4 +-
 src/middlewares/example.ts                 |  7 ++
 src/routes/auth.ts                         |  8 +-
 src/routes/card.ts                         | 30 -------
 src/routes/file.ts                         | 67 ----------------
 src/routes/files.ts                        | 43 ++++++++++
 src/routes/news.ts                         | 32 ++++----
 src/routes/notifications.ts                | 21 +++++
 src/routes/terms.ts                        | 29 +++++++
 src/routes/user.ts                         | 93 ++++++----------------
 src/routes/warning.ts                      | 61 --------------
 src/routes/warnings.ts                     | 17 ++++
 src/utils/strings/.gitignore               |  1 +
 src/utils/strings/notifications.example.ts |  6 ++
 15 files changed, 180 insertions(+), 260 deletions(-)
 create mode 100644 src/middlewares/example.ts
 delete mode 100644 src/routes/card.ts
 delete mode 100644 src/routes/file.ts
 create mode 100644 src/routes/files.ts
 create mode 100644 src/routes/notifications.ts
 create mode 100644 src/routes/terms.ts
 delete mode 100644 src/routes/warning.ts
 create mode 100644 src/routes/warnings.ts
 create mode 100644 src/utils/strings/.gitignore
 create mode 100644 src/utils/strings/notifications.example.ts

diff --git a/src/index.ts b/src/index.ts
index 0181a400..d5d79dbe 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -5,14 +5,15 @@ import express, { Application, NextFunction, Request, Response } from "express";
 
 import authRoute from "./routes/auth";
 import bodyParser from "body-parser";
-import cardRoute from "./routes/card";
 import expressSession from "express-session";
-import fileRoute from "./routes/file";
+import filesRoute from "./routes/files";
 import mongoose from "mongoose";
 import morgan from "morgan";
 import newsRoute from "./routes/news";
+import notificationsRoute from "./routes/notifications";
+import termsRoute from "./routes/terms";
 import usersRoute from "./routes/user";
-import warningsRoute from "./routes/warning";
+import warningsRoute from "./routes/warnings";
 
 mongoose
   .connect("mongodb://localhost:27017/bodysch", {
@@ -61,18 +62,20 @@ app.use((req: Request, res: Response, next: NextFunction) => {
 });
 
 // Register routes
+const prefix = "/api/v1";
+authRoute(prefix, app);
 
-authRoute(app);
+filesRoute(`${prefix}/files`, app);
 
-newsRoute(app);
+newsRoute(`${prefix}/news`, app);
 
-usersRoute(app);
+notificationsRoute(`${prefix}/notifications`, app);
 
-fileRoute(app);
+termsRoute(`${prefix}/terms`, app);
 
-cardRoute(app);
+usersRoute(`${prefix}/users`, app);
 
-warningsRoute(app);
+warningsRoute(`${prefix}/warnings`, app);
 
 app.use((err: any, req: Request, res: Response, next: NextFunction) => {
   if (err instanceof ErrorHandler) return handleError(err, res);
diff --git a/src/middlewares/auth/complete.ts b/src/middlewares/auth/complete.ts
index d53beb27..9be22e04 100644
--- a/src/middlewares/auth/complete.ts
+++ b/src/middlewares/auth/complete.ts
@@ -31,14 +31,14 @@ const complete = () => async (
     );
 
     req.session!.user = {
-      external_id: String(response.data.internal_id),
+      externalId: String(response.data.internal_id),
       email: String(response.data.mail),
       name: `${response.data.sn} ${response.data.givenName}`,
       token,
     };
 
     const profile = await Profile.findOne({
-      external_id: response.data.internal_id,
+      externalId: response.data.internal_id,
     }).lean();
 
     if (profile) req.session!.user.id = profile._id;
diff --git a/src/middlewares/example.ts b/src/middlewares/example.ts
new file mode 100644
index 00000000..0b4aabb1
--- /dev/null
+++ b/src/middlewares/example.ts
@@ -0,0 +1,7 @@
+import { NextFunction, Request, Response, response } from "express";
+
+const example = () => (req: Request, res: Response) => {
+  res.status(200).json({ message: "Example" });
+};
+
+export default example;
diff --git a/src/routes/auth.ts b/src/routes/auth.ts
index 1202f644..8cfc0593 100644
--- a/src/routes/auth.ts
+++ b/src/routes/auth.ts
@@ -5,12 +5,12 @@ import isLoggedIn from "../middlewares/auth/isLoggedIn";
 import login from "../middlewares/auth/login";
 import logout from "../middlewares/auth/logout";
 
-const authRoute = (app: Application): void => {
-  app.get("/api/v1/login", login());
+const authRoute = (prefix: string, app: Application): void => {
+  app.get(`${prefix}/login`, login());
 
-  app.get("/api/v1/complete", complete());
+  app.get(`${prefix}/complete`, complete());
 
-  app.get("/api/v1/logout", isLoggedIn(), logout());
+  app.get(`${prefix}/logout`, isLoggedIn(), logout());
 };
 
 export default authRoute;
diff --git a/src/routes/card.ts b/src/routes/card.ts
deleted file mode 100644
index 5532d735..00000000
--- a/src/routes/card.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Application } from "express";
-import addCard from "../middlewares/cards/addCard";
-import getCard from "../middlewares/cards/getCard";
-import getCardList from "../middlewares/cards/getCardList";
-import getCardListValid from "../middlewares/cards/getCardListValid";
-import isAuthenticated from "../middlewares/auth/isAuthenticated";
-import responseCard from "../middlewares/cards/responseCard";
-import responseCardList from "../middlewares/cards/responseCardList";
-
-const cardRoute = (app: Application): void => {
-  app.get("/api/v1/card/:id", isAuthenticated(), getCard(), responseCard());
-
-  app.get(
-    "/api/v1/cards",
-    isAuthenticated(),
-    getCardList(),
-    responseCardList()
-  );
-
-  app.get(
-    "/api/v1/cards/valid",
-    isAuthenticated(),
-    getCardListValid(),
-    responseCardList()
-  );
-
-  app.post("/api/v1/cards", isAuthenticated(), addCard(), responseCard());
-};
-
-export default cardRoute;
diff --git a/src/routes/file.ts b/src/routes/file.ts
deleted file mode 100644
index 720de10b..00000000
--- a/src/routes/file.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-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 getProfilePicture from "../middlewares/files/profile/getProfilePicture";
-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";
-
-const profilePictureUpload = multer({
-  storage: profilePictureStorage,
-  fileFilter,
-});
-
-const CardImageUpload = multer({
-  storage: cardImageStorage,
-  fileFilter,
-});
-
-const fileRoute = (app: Application): void => {
-  app.post(
-    "/api/v1/files/profile/picture/me",
-    isAuthenticated(),
-    profilePictureUpload.single("profile_picture"),
-    handleFileValidationError(),
-    setOwnUserId(),
-    getUser(),
-    uploadProfilePicture()
-  );
-  app.post(
-    "/api/v1/files/profile/picture/:id",
-    isAuthenticated(),
-    profilePictureUpload.single("profile_picture"),
-    handleFileValidationError(),
-    getUser(),
-    uploadProfilePicture()
-  );
-  app.get(
-    "/api/v1/files/profile",
-    isAuthenticated(),
-    setOwnUserId(),
-    getUser(),
-    getProfilePicture()
-  );
-
-  app.post(
-    "/api/v1/files/card",
-    isAuthenticated(),
-    CardImageUpload.single("card_image"),
-    handleFileValidationError(),
-    uploadCardImage()
-  );
-  app.get(
-    "/api/v1/files/card",
-    isAuthenticated(),
-    getCardImage(),
-    responseCardImage()
-  );
-};
-
-export default fileRoute;
diff --git a/src/routes/files.ts b/src/routes/files.ts
new file mode 100644
index 00000000..5b769a2e
--- /dev/null
+++ b/src/routes/files.ts
@@ -0,0 +1,43 @@
+import { Application } from "express";
+import cardImageStorage from "../middlewares/files/card/cardImageStorage";
+import example from "../middlewares/example";
+import { fileFilter } from "../middlewares/files/fileFilter";
+import multer from "multer";
+import profilePictureStorage from "../middlewares/files/profile/profilePictureStorage";
+
+const profilePictureUpload = multer({
+  storage: profilePictureStorage,
+  fileFilter,
+});
+
+const CardImageUpload = multer({
+  storage: cardImageStorage,
+  fileFilter,
+});
+
+const filesRoute = (prefix: string, app: Application): void => {
+  // Get a users profile picture
+  app.get(`${prefix}/user/:userId/picture`, example());
+  // Get a users accepted picture
+  app.get(`${prefix}/user/:userId/picture/accepted`, example());
+  // Get own picture
+  app.get(`${prefix}/me/picture`, example());
+  // Get own accepted picture
+  app.get(`${prefix}/me/picture/accepted`, example());
+  // Get a users card in a Term
+  app.get(`${prefix}/user/:userId/card/term/:termId`, example());
+  // Get own card in a Term
+  app.get(`${prefix}/me/card/term/:termId`, example());
+  // Add a profile picture to a user
+  app.post(`${prefix}/user/:userId/picture`, example());
+  // Add own profile picture
+  app.post(`${prefix}/me/picture`, example());
+  // Get a Term's card background image
+  app.get(`${prefix}/card/bg/term/:termId`, example());
+  // Add a Term's card background image or update it
+  app.post(`${prefix}/card/bg/term/:termId`, example());
+  // Pdf with all accepted cards in a term
+  app.get(`${prefix}/cards/term/:termId/accepted`, example());
+};
+
+export default filesRoute;
diff --git a/src/routes/news.ts b/src/routes/news.ts
index a5030463..adf19929 100644
--- a/src/routes/news.ts
+++ b/src/routes/news.ts
@@ -1,22 +1,18 @@
 import { Application, Response } from "express";
 
-import addNews from "../middlewares/news/addNews";
-import deleteNews from "../middlewares/news/deleteNews";
-import emptyResponse from "../middlewares/utils/emptyResponse";
-import getNews from "../middlewares/news/getNews";
-import getNewsList from "../middlewares/news/getNewsList";
-import responseNews from "../middlewares/news/responseNews";
-import responseNewsObject from "../middlewares/news/responseNewsObject";
-import updateNews from "../middlewares/news/updateNews";
+import example from "../middlewares/example";
 
-export default (app: Application): void => {
-  app.get("/api/v1/news", getNewsList(), responseNews());
-
-  app.post("/api/v1/news", addNews(), responseNewsObject());
-
-  app.get("/api/v1/news/:id", getNews(), responseNewsObject());
-
-  app.put("/api/v1/news/:id", getNews(), updateNews(), responseNewsObject());
-
-  app.delete("/api/v1/news/:id", deleteNews(), emptyResponse());
+const newsRoute = (prefix: string, app: Application): void => {
+  // Get all news
+  app.get(`${prefix}/`, example());
+  // Add a new News
+  app.post(`${prefix}/`, example());
+  // Get a News
+  app.get(`${prefix}/one/:newsId`, example());
+  // Update a News
+  app.put(`${prefix}/one/:newsId`, example());
+  // Delete a News
+  app.delete(`${prefix}/one/:newsId`, example());
 };
+
+export default newsRoute;
diff --git a/src/routes/notifications.ts b/src/routes/notifications.ts
new file mode 100644
index 00000000..e2db085a
--- /dev/null
+++ b/src/routes/notifications.ts
@@ -0,0 +1,21 @@
+import { Application } from "express";
+import example from "../middlewares/example";
+
+const notificationsRoute = (prefix: string, app: Application): void => {
+  // Get all Notifications
+  app.get(`${prefix}/`, example());
+  // Get a Notification
+  app.get(`${prefix}/notification/:notificationId`, example());
+  // Delete a Notification
+  app.delete(`${prefix}/notification/:notificationId`, example());
+  // Get own notifications
+  app.get(`${prefix}/me`, example());
+  // Notify all users
+  app.post(`${prefix}/notify/all`, example());
+  // Notify a given user
+  app.post(`${prefix}/notify/user/:userId`, example());
+  // Notify accepted term members
+  app.post(`${prefix}/notify/term/:termId/accepted`, example());
+};
+
+export default notificationsRoute;
diff --git a/src/routes/terms.ts b/src/routes/terms.ts
new file mode 100644
index 00000000..980891c0
--- /dev/null
+++ b/src/routes/terms.ts
@@ -0,0 +1,29 @@
+import { Application } from "express";
+import example from "../middlewares/example";
+
+const termsRoute = (prefix: string, app: Application): void => {
+  // Get all Terms
+  app.get(`${prefix}/`, example());
+  // Get a Term
+  app.post(`${prefix}/term/:termId`, example());
+  // Get members of a Term
+  app.get(`${prefix}/term/:termId/members`, example());
+  // Get filtered members of a Term (accepted/rejected/applied)
+  app.get(`${prefix}/term/:termId/members/:stateFilter`, example());
+  // Get own member state in a Term
+  app.get(`${prefix}/term/:termId/state/me`, example());
+  // Get a user's state in a Term
+  app.get(`${prefix}/term/:termId/state/user/:userId`, example());
+  // Get the latest Term
+  app.get(`${prefix}/latest`, example());
+  // Apply own user to the latest Term
+  app.post(`${prefix}/apply/me/latest`, example());
+  // Apply a user to the latest Term
+  app.post(`${prefix}/apply/user/:userId/latest`, example());
+  // Apply a user to a given Term
+  app.post(`${prefix}/apply/user/:userId/term/:termId`, example());
+  // Update a user's member data in a Term
+  app.put(`${prefix}/term/:termId/user/:userId`, example());
+};
+
+export default termsRoute;
diff --git a/src/routes/user.ts b/src/routes/user.ts
index c24d0eab..35f9f338 100644
--- a/src/routes/user.ts
+++ b/src/routes/user.ts
@@ -1,73 +1,28 @@
 import { Application } from "express";
-import addUser from "../middlewares/user/addUser";
-import addWarning from "../middlewares/warning/addWarning";
-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 getUser from "../middlewares/user/getUser";
-import getUserCard from "../middlewares/files/card/getUserCard";
-import getUsersList from "../middlewares/user/getUsersList";
-import getWarning from "../middlewares/warning/getWarning";
-import getWarningsList from "../middlewares/warning/getUserWarningsList";
-import isAuthenticated from "../middlewares/auth/isAuthenticated";
-import isLoggedIn from "../middlewares/auth/isLoggedIn";
-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";
-
-const usersRoute = (app: Application): void => {
-  app.get(
-    "/api/v1/users",
-    isAuthenticated(),
-    getUsersList(),
-    responseUserList()
-  );
-
-  app.post("/api/v1/users", isLoggedIn(), addUser(), responseUser());
-
-  app.get(
-    "/api/v1/users/me",
-    isAuthenticated(),
-    setOwnUserId(),
-    getUser(),
-    responseUser()
-  );
-
-  app.get(
-    "/api/v1/users/me/card",
-    isAuthenticated(),
-    setOwnUserId(),
-    getUser(),
-    getCardImage(),
-    getUserCard()
-  );
-
-  app.get("/api/v1/users/:id", getUser(), responseUser());
-
-  app.get(
-    "/api/v1/users/:id/card",
-    isAuthenticated(),
-    getUser(),
-    getCardImage(),
-    getUserCard()
-  );
-
-  app.get("/api/v1/users/:id/warnings", getWarningsList());
-
-  app.get("/api/v1/users/:userId/warnings/:warningId", getWarning());
-
-  app.post("/api/v1/users/:id/warnings", addWarning());
-
-  app.put("/api/v1/users/:id", updateUser(), responseUser());
-
-  app.put("/api/v1/users/:userId/warnings/:warningId", updateWarning());
-
-  app.delete("/api/v1/users/:id", deleteUser(), emptyResponse());
-
-  app.delete("/api/v1/users/:userId/warnings/:warningId", deleteWarning());
+import example from "../middlewares/example";
+
+const usersRoute = (prefix: string, app: Application): void => {
+  // Get all users
+  app.get(`${prefix}/`, example());
+  // Register own user
+  app.post(`${prefix}/me`, example());
+  // Get own user
+  app.get(`${prefix}/me`, example());
+  // Get a user
+  app.get(`${prefix}/user/:userId`, example());
+  // Get own warnings
+  app.get(`${prefix}/me/warnings`, example());
+  // Get a user's warnings
+  app.get(`${prefix}/user/:userId/warnings`, example());
+  // Update own user
+  app.put(`${prefix}/me`, example());
+  // Update a user
+  app.put(`${prefix}/user/:userId`, example());
+  // Delete a user
+  app.delete(`${prefix}/user/:userId`, example());
+  // Accept/Reject a users picture
+  app.post(`${prefix}/user/:userId/picture/accept`, example());
+  app.post(`${prefix}/user/:userId/picture/reject`, example());
 };
 
 export default usersRoute;
diff --git a/src/routes/warning.ts b/src/routes/warning.ts
deleted file mode 100644
index be2afb97..00000000
--- a/src/routes/warning.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Application } from "express";
-import addWarning from "../middlewares/warning/addWarning";
-import deleteWarning from "../middlewares/warning/deleteWarning";
-import emptyResponse from "../middlewares/utils/emptyResponse";
-import getUser from "../middlewares/user/getUser";
-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 => {
-  app.get(
-    "/api/v1/warnings/warning/:warningId",
-    isAuthenticated(),
-    getWarning(),
-    responseWarning()
-  );
-
-  app.get(
-    "/api/v1/warnings/me",
-    isAuthenticated(),
-    setOwnUserId(),
-    getUser(),
-    getUserWarningsList(),
-    responseWarningList()
-  );
-
-  app.get(
-    "/api/v1/warnings/user/:id",
-    isAuthenticated(),
-    getUser(),
-    getUserWarningsList(),
-    responseWarningList()
-  );
-
-  app.post(
-    "/api/v1/warnings/user/:id",
-    isAuthenticated(),
-    addWarning(),
-    responseWarning()
-  );
-
-  app.put(
-    "/api/v1/warnings/warning/:warningId",
-    isAuthenticated(),
-    updateWarning(),
-    responseWarning()
-  );
-
-  app.delete(
-    "/api/v1/warnings/warning/:warningId",
-    isAuthenticated(),
-    deleteWarning(),
-    emptyResponse()
-  );
-};
-
-export default warningsRoute;
diff --git a/src/routes/warnings.ts b/src/routes/warnings.ts
new file mode 100644
index 00000000..5fb80367
--- /dev/null
+++ b/src/routes/warnings.ts
@@ -0,0 +1,17 @@
+import { Application } from "express";
+import example from "../middlewares/example";
+
+const warningsRoute = (prefix: string, app: Application): void => {
+  // Get all warnings
+  app.get(`${prefix}/`, example());
+  // Add a warning to a user
+  app.post(`${prefix}/user/:userId`, example());
+  // Get a warning
+  app.get(`${prefix}/warning/:warningId`, example());
+  // Update a warning
+  app.put(`${prefix}/warning/:warningId`, example());
+  // Delete a warning
+  app.delete(`${prefix}/warning/:warningId`, example());
+};
+
+export default warningsRoute;
diff --git a/src/utils/strings/.gitignore b/src/utils/strings/.gitignore
new file mode 100644
index 00000000..a64fc457
--- /dev/null
+++ b/src/utils/strings/.gitignore
@@ -0,0 +1 @@
+notifications.ts
\ No newline at end of file
diff --git a/src/utils/strings/notifications.example.ts b/src/utils/strings/notifications.example.ts
new file mode 100644
index 00000000..df893c4f
--- /dev/null
+++ b/src/utils/strings/notifications.example.ts
@@ -0,0 +1,6 @@
+export const REGISTER = "Please register";
+export const MISSING_PROFILE_PICTURE = "Add a profile picture";
+export const NEW_WARNING = "You got a new warning";
+export const DELETED_WARNING = "One of your warning was deleted";
+export const TERM_MEMBER_ACCEPTED = "You've been accepted to a Term";
+export const TERM_MEMBER_REJECTED = "You've been rejected to a Term";
-- 
GitLab