From 88d580f0a8e2980455e5de9bb110a2048c3483a9 Mon Sep 17 00:00:00 2001
From: "ignacio.bengoa" <ignacio.bengoa@fing.edu.uy>
Date: Thu, 21 Oct 2021 23:28:55 -0300
Subject: [PATCH] Update request doesnt get to users back - Cant say why

---
 .env                              |  4 +-
 src/Controllers/UserController.ts | 77 +++++++++++++++++++++++---
 src/Services/UserAPI.ts           | 91 +++++++++++++++++++++++++++++++
 src/index.ts                      |  9 ++-
 src/routes.ts                     |  3 +
 5 files changed, 171 insertions(+), 13 deletions(-)

diff --git a/.env b/.env
index b981354..31ac94e 100644
--- a/.env
+++ b/.env
@@ -2,6 +2,6 @@ PORT=8000
 INSTANCE=PROD
 HOST=localhost
 USER=root
-PASSWORD=rootroot
+PASSWORD=Comfortablynumb.07
 DB=parameter_database
-AUTH_BASE_URL=
\ No newline at end of file
+AUTH_BASE_URL=http://localhost:3000/users
\ No newline at end of file
diff --git a/src/Controllers/UserController.ts b/src/Controllers/UserController.ts
index 4a630c1..9b3ab78 100644
--- a/src/Controllers/UserController.ts
+++ b/src/Controllers/UserController.ts
@@ -1,42 +1,101 @@
+// TODO: Get rid of all the 'any' mentions
+/* eslint-disable @typescript-eslint/no-explicit-any */
+
 import {
   Handler, Request, Response, Router,
 } from 'express';
+import UserAPI from '../Services/UserAPI';
 
 const router = Router();
 
 const create: Handler = async (req: Request, res: Response) => {
+  try {
+    const user: any = await UserAPI.create(req.body);
+    return res.status(200).send(user);
+  } catch (error) {
+    const e = error as Error;
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 const listUsers: Handler = async (req: Request, res: Response) => {
-
+  try {
+    const userList: any = await UserAPI.listUsers(req.body);
+    return res.status(200).send(userList);
+  } catch (error) {
+    const e = error as Error;
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 const login: Handler = async (req: Request, res: Response) => {
-
+  try {
+    const { token, user }: any = await UserAPI.login(req.body);
+    return res.status(200).send({ token, user });
+  } catch (error) {
+    const e = error as Error;
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 const update: Handler = async (req: Request, res: Response) => {
-
+  try {
+    const user: any = await UserAPI.update(req.body, req.params.id);
+    return res.status(200).send(user);
+  } catch (error) {
+    const e = error as Error;
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 const password: Handler = async (req: Request, res: Response) => {
-
+  try {
+    const user: any = await UserAPI.password(req.body, req.params.id);
+    return res.status(200).send(user);
+  } catch (error) {
+    const e = error as Error;
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 const approve: Handler = async (req: Request, res: Response) => {
-
+  try {
+    const user: any = await UserAPI.approve(req.params.id);
+    return res.status(200).send(user);
+  } catch (error) {
+    const e = error as Error;
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 const cancel: Handler = async (req: Request, res: Response) => {
-
+  try {
+    const user: any = await UserAPI.cancel(req.params.id);
+    return res.status(200).send(user);
+  } catch (error) {
+    const e = error as Error;
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 const giveAdminPermission: Handler = async (req: Request, res: Response) => {
-
+  try {
+    const user: any = await UserAPI.giveAdminPermission(req.params.id);
+    return res.status(200).send(user);
+  } catch (error) {
+    const e = error as Error;
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 const removeAdminPermission: Handler = async (req: Request, res: Response) => {
-
+  try {
+    const user: any = await UserAPI.removeAdminPermission(req.params.id);
+    return res.status(200).send(user);
+  } catch (error) {
+    const e = error as Error;
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 router.post('/', create);
@@ -48,3 +107,5 @@ router.put('/:id/approve', approve);
 router.put('/:id/cancel', cancel);
 router.put('/:id/admin', giveAdminPermission);
 router.put('/:id/client', removeAdminPermission);
+
+export default router;
diff --git a/src/Services/UserAPI.ts b/src/Services/UserAPI.ts
index b0fc01f..25ca439 100644
--- a/src/Services/UserAPI.ts
+++ b/src/Services/UserAPI.ts
@@ -1,3 +1,8 @@
+// TODO: Set according return types and don't use 'any' explicitly. Nor implicitly.
+// Basically don't use 'any' in any context whatsoever. Despite it being the easiest solution.
+
+/* eslint-disable @typescript-eslint/explicit-function-return-type */
+/* eslint-disable @typescript-eslint/no-explicit-any */
 import axios from 'axios';
 
 const instance = axios.create({
@@ -11,7 +16,93 @@ export const validate = (token: string): number => {
       id = (res.data as any).userId as number;
     })
     .catch((err) => {
+      throw (err);
       // if needed implement later
     });
   return id;
 };
+
+const create = (user: any): any => {
+  instance.post('/', user)
+    .then((res) => res)
+    .catch((err) => {
+      throw (err);
+    });
+};
+
+const login = (user: any): any => {
+  instance.post('/login', user)
+    .then((res) => res)
+    .catch((err) => {
+      throw (err);
+    });
+};
+
+const listUsers = (requirements: any): any => {
+  instance.get('/', requirements)
+    .then((res) => res)
+    .catch((err) => {
+      throw (err);
+    });
+};
+
+const update = (user: any, idUser: string) => {
+  const url = `/${idUser}`;
+  instance.put(url, user)
+    .then((res) => res)
+    .catch((err) => {
+      throw (err);
+    });
+};
+
+const password = (user: any, idUser: string) => {
+  instance.put('/password', user, { params: { id: idUser } })
+    .then((res) => res)
+    .catch((err) => {
+      throw (err);
+    });
+};
+
+const approve = (idUser: string) => {
+  instance.put('/approve', { params: { id: idUser } })
+    .then((res) => res)
+    .catch((err) => {
+      throw (err);
+    });
+};
+
+const cancel = (idUser: string) => {
+  instance.put('/cancel', { params: { id: idUser } })
+    .then((res) => res)
+    .catch((err) => {
+      throw (err);
+    });
+};
+
+const giveAdminPermission = (idUser: string) => {
+  instance.put('/admin', { params: { id: idUser } })
+    .then((res) => res)
+    .catch((err) => {
+      throw (err);
+    });
+};
+
+const removeAdminPermission = (idUser: string) => {
+  instance.put('/client', { params: { id: idUser } })
+    .then((res) => res)
+    .catch((err) => {
+      throw (err);
+    });
+};
+
+export default {
+  create,
+  login,
+  listUsers,
+  update,
+  password,
+  approve,
+  cancel,
+  giveAdminPermission,
+  removeAdminPermission,
+};
diff --git a/src/index.ts b/src/index.ts
index a56eac5..4b81e70 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -14,6 +14,7 @@ import YAML from 'yamljs';
 import Routes from './routes';
 import logger from './Logger/logger';
 import ParameterDataBaseLoader from './Loaders/ParameterDataBaseLoader';
+import authChecker from './Middlewares/authChecker';
 
 const app: Application = express();
 const PORT = process.env.PORT || 8000;
@@ -38,11 +39,13 @@ app.use(express.raw({
   limit: '50mb',
 }));
 
-const auditMiddleware = (req, res, next) => {
+// TODO: Set according return type. Plus, 'res is declared but never used'
+// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
+const auditMiddleware = (req: Request, res: Response, next: NextFunction) => {
   next();
 };
-app.use(authChecker);
-app.use(auditMiddleware);
+// app.use(authChecker);
+// app.use(auditMiddleware);
 
 app.use(Routes);
 
diff --git a/src/routes.ts b/src/routes.ts
index c0ea909..c6d1ccb 100644
--- a/src/routes.ts
+++ b/src/routes.ts
@@ -2,6 +2,7 @@ import { Request, Response, Router } from 'express';
 import SheetController from './Controllers/SheetController';
 import CalculatorController from './Controllers/CalculatorController';
 import ParameterController from './Controllers/ParameterController';
+import UserController from './Controllers/UserController';
 
 const router = Router();
 
@@ -15,4 +16,6 @@ router.use('/repCalculator', CalculatorController);
 
 router.use('/parameters', ParameterController);
 
+router.use('/users', UserController);
+
 export default router;
-- 
GitLab