moahmedwafy commited on
Commit
ac9dbd5
·
1 Parent(s): 7f9a76e

refactor: stop using static controllers

Browse files
src/lib/controllers/controller.base.ts CHANGED
@@ -1,10 +1,8 @@
1
  import { Router } from "express";
2
 
3
  export abstract class BaseController {
4
- public static router: Router = Router();
5
- public static prefix: string = "/";
6
 
7
- public static setRoutes(_router: Router) {
8
- throw new Error(`routes not set for ${this.name}`);
9
- }
10
  }
 
1
  import { Router } from "express";
2
 
3
  export abstract class BaseController {
4
+ public router: Router = Router();
5
+ public prefix: string = "/";
6
 
7
+ public abstract setRoutes(): void;
 
 
8
  }
src/modules/common/decorators/prefix.decorator.ts CHANGED
@@ -2,6 +2,13 @@ import { BaseController } from "../../../lib/controllers/controller.base";
2
 
3
  export const Prefix = (prefix: string) => {
4
  return (target: typeof BaseController) => {
5
- target.prefix = prefix || target.prefix;
 
 
 
 
 
 
 
6
  };
7
  };
 
2
 
3
  export const Prefix = (prefix: string) => {
4
  return (target: typeof BaseController) => {
5
+ const originalConstructor = target;
6
+ const newConstructor: any = function (...args: any[]) {
7
+ const instance = new (originalConstructor as any)(...args);
8
+ instance.prefix = prefix || instance.prefix;
9
+ return instance;
10
+ };
11
+ newConstructor.prototype = originalConstructor.prototype;
12
+ return newConstructor;
13
  };
14
  };
src/modules/console/admins/controllers/admins.controller.ts CHANGED
@@ -10,20 +10,20 @@ import {
10
 
11
  @Prefix("/console/admins")
12
  export class AdminsController extends BaseController {
13
- static setRoutes(router: Router) {
14
- router.get("/", AdminsController.list);
15
- router.get("/:id", paramsValidator("id"), AdminsController.get);
16
- router.post("/", bodyValidator(createAdminSchema), AdminsController.create);
17
- router.patch(
18
  "/:id",
19
  paramsValidator("id"),
20
  bodyValidator(createAdminSchema),
21
- AdminsController.update
22
  );
23
- router.delete("/:id", paramsValidator("id"), AdminsController.delete);
24
  }
25
 
26
- static list(_, res: Response) {
27
  AdminsService.list({})
28
  .then((result) => {
29
  res.status(result.code).json(result);
@@ -33,24 +33,24 @@ export class AdminsController extends BaseController {
33
  });
34
  }
35
 
36
- static async get(req: Request, res: Response) {
37
  const data = await AdminsService.get({
38
  _id: req.params.id,
39
  });
40
  res.json(data);
41
  }
42
 
43
- static async create(req: Request, res: Response) {
44
  const data = await AdminsService.create(req.body);
45
  res.json(data);
46
  }
47
 
48
- static async update(req: Request, res: Response) {
49
  const data = await AdminsService.update(req.params.id, req.body);
50
  res.json(data);
51
  }
52
 
53
- static async delete(req: Request, res: Response) {
54
  const data = await AdminsService.remove(req.params.id);
55
  res.json(data);
56
  }
 
10
 
11
  @Prefix("/console/admins")
12
  export class AdminsController extends BaseController {
13
+ setRoutes() {
14
+ this.router.get("/", this.list);
15
+ this.router.get("/:id", paramsValidator("id"), this.get);
16
+ this.router.post("/", bodyValidator(createAdminSchema), this.create);
17
+ this.router.patch(
18
  "/:id",
19
  paramsValidator("id"),
20
  bodyValidator(createAdminSchema),
21
+ this.update
22
  );
23
+ this.router.delete("/:id", paramsValidator("id"), this.delete);
24
  }
25
 
26
+ list(_, res: Response) {
27
  AdminsService.list({})
28
  .then((result) => {
29
  res.status(result.code).json(result);
 
33
  });
34
  }
35
 
36
+ async get(req: Request, res: Response) {
37
  const data = await AdminsService.get({
38
  _id: req.params.id,
39
  });
40
  res.json(data);
41
  }
42
 
43
+ async create(req: Request, res: Response) {
44
  const data = await AdminsService.create(req.body);
45
  res.json(data);
46
  }
47
 
48
+ async update(req: Request, res: Response) {
49
  const data = await AdminsService.update(req.params.id, req.body);
50
  res.json(data);
51
  }
52
 
53
+ async delete(req: Request, res: Response) {
54
  const data = await AdminsService.remove(req.params.id);
55
  res.json(data);
56
  }
src/modules/console/users/controllers/users.controller.ts CHANGED
@@ -8,17 +8,17 @@ import { usersService } from "../services/users.service";
8
  const allowedRoles = ["superAdmin", "admin"];
9
 
10
  @Prefix("/console/users")
11
- export class adminUsersController extends BaseController {
12
- static setRoutes(router) {
13
- router.post(
14
  "/create",
15
  jwtHelper.verifyToken(allowedRoles),
16
  bodyValidator(userRegisterValidation),
17
- adminUsersController.create
18
  );
19
  }
20
 
21
- static async create(req, res) {
22
  try {
23
  let result = await usersService.create(req.body);
24
  return res.status(result.code).json(result);
 
8
  const allowedRoles = ["superAdmin", "admin"];
9
 
10
  @Prefix("/console/users")
11
+ export class AdminUsersController extends BaseController {
12
+ setRoutes() {
13
+ this.router.post(
14
  "/create",
15
  jwtHelper.verifyToken(allowedRoles),
16
  bodyValidator(userRegisterValidation),
17
+ this.create
18
  );
19
  }
20
 
21
+ async create(req, res) {
22
  try {
23
  let result = await usersService.create(req.body);
24
  return res.status(result.code).json(result);
src/modules/user/auth/controllers/auth.controller.ts CHANGED
@@ -1,25 +1,23 @@
1
  import { usersService } from "../services/users.service";
2
  import { jwtHelper } from "../../../../helpers/jwt.helper";
3
  import { BaseController } from "../../../../lib/controllers/controller.base";
4
- import { Router } from "express";
5
  import { Prefix } from "../../../common/decorators/prefix.decorator";
6
- import { Env } from "../../../../configs/env";
7
  import { bodyValidator } from "../../../../helpers/validation.helper";
8
  import { userRegisterValidation } from "../../../common/users/validation/user.baseValidation";
9
  import { loginValidation } from "../validation/user.Validation";
10
 
11
  @Prefix("/user/auth")
12
  export class AuthController extends BaseController {
13
- static setRoutes(router: Router): void {
14
- router.post(
15
  "/register",
16
  bodyValidator(userRegisterValidation),
17
- AuthController.register
18
  );
19
- router.post("/login", bodyValidator(loginValidation), AuthController.login);
20
  }
21
 
22
- static async register(req, res) {
23
  try {
24
  let result = await usersService.create(req.body);
25
  return res.status(result.code).json(result);
@@ -33,7 +31,7 @@ export class AuthController extends BaseController {
33
  }
34
  }
35
 
36
- static async login(req, res) {
37
  try {
38
  const { email, password } = req.body;
39
  let result: {
 
1
  import { usersService } from "../services/users.service";
2
  import { jwtHelper } from "../../../../helpers/jwt.helper";
3
  import { BaseController } from "../../../../lib/controllers/controller.base";
 
4
  import { Prefix } from "../../../common/decorators/prefix.decorator";
 
5
  import { bodyValidator } from "../../../../helpers/validation.helper";
6
  import { userRegisterValidation } from "../../../common/users/validation/user.baseValidation";
7
  import { loginValidation } from "../validation/user.Validation";
8
 
9
  @Prefix("/user/auth")
10
  export class AuthController extends BaseController {
11
+ setRoutes(): void {
12
+ this.router.post(
13
  "/register",
14
  bodyValidator(userRegisterValidation),
15
+ this.register
16
  );
17
+ this.router.post("/login", bodyValidator(loginValidation), this.login);
18
  }
19
 
20
+ async register(req, res) {
21
  try {
22
  let result = await usersService.create(req.body);
23
  return res.status(result.code).json(result);
 
31
  }
32
  }
33
 
34
+ async login(req, res) {
35
  try {
36
  const { email, password } = req.body;
37
  let result: {
src/routes.ts CHANGED
@@ -43,9 +43,10 @@ const importControllers = async (router: Router) => {
43
 
44
  await Promise.all(
45
  files.map(async (file) => {
46
- const controller = await importController(file);
47
- if (!controller) return;
48
- controller.setRoutes(controller.router);
 
49
  router.use(controller.prefix, controller.router);
50
  })
51
  );
@@ -54,6 +55,7 @@ const importControllers = async (router: Router) => {
54
  const importController = async (file: string) => {
55
  const controllers = Object.values(await import(file));
56
  return controllers.find(
57
- (controller: { router?: Router }) => controller.router
 
58
  ) as typeof BaseController;
59
  };
 
43
 
44
  await Promise.all(
45
  files.map(async (file) => {
46
+ const controllerClass = await importController(file);
47
+ if (!controllerClass) return;
48
+ const controller: BaseController = new (controllerClass as any)();
49
+ controller.setRoutes();
50
  router.use(controller.prefix, controller.router);
51
  })
52
  );
 
55
  const importController = async (file: string) => {
56
  const controllers = Object.values(await import(file));
57
  return controllers.find(
58
+ (controller: { prototype: typeof BaseController }) =>
59
+ controller.prototype instanceof BaseController
60
  ) as typeof BaseController;
61
  };