moahmedwafy commited on
Commit
1628025
·
1 Parent(s): 1dea2ab

feat: auto find routes and controllers

Browse files
.vscode/settings.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "cSpell.words": [
3
+ "Routable"
4
+ ]
5
+ }
package-lock.json CHANGED
@@ -9,10 +9,12 @@
9
  "version": "1.0.0",
10
  "license": "ISC",
11
  "dependencies": {
 
12
  "bcrypt": "^5.1.1",
13
  "cors": "^2.8.5",
14
  "dotenv": "^16.3.1",
15
  "express": "^4.18.2",
 
16
  "http": "^0.0.1-security",
17
  "joi": "^17.11.0",
18
  "jsonwebtoken": "^9.0.2",
@@ -51,6 +53,68 @@
51
  "@hapi/hoek": "^9.0.0"
52
  }
53
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  "node_modules/@jridgewell/resolve-uri": {
55
  "version": "3.1.1",
56
  "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
@@ -117,6 +181,15 @@
117
  "sparse-bitfield": "^3.0.3"
118
  }
119
  },
 
 
 
 
 
 
 
 
 
120
  "node_modules/@sideway/address": {
121
  "version": "4.1.4",
122
  "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -202,6 +275,15 @@
202
  "@types/send": "*"
203
  }
204
  },
 
 
 
 
 
 
 
 
 
205
  "node_modules/@types/http-errors": {
206
  "version": "2.0.4",
207
  "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
@@ -214,6 +296,11 @@
214
  "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
215
  "dev": true
216
  },
 
 
 
 
 
217
  "node_modules/@types/node": {
218
  "version": "20.10.4",
219
  "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz",
@@ -326,6 +413,17 @@
326
  "node": ">=8"
327
  }
328
  },
 
 
 
 
 
 
 
 
 
 
 
329
  "node_modules/anymatch": {
330
  "version": "3.1.3",
331
  "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -484,6 +582,22 @@
484
  "node": ">=10"
485
  }
486
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
487
  "node_modules/color-support": {
488
  "version": "1.1.3",
489
  "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
@@ -552,6 +666,19 @@
552
  "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
553
  "dev": true
554
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
555
  "node_modules/debug": {
556
  "version": "4.3.4",
557
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -631,6 +758,11 @@
631
  "url": "https://github.com/motdotla/dotenv?sponsor=1"
632
  }
633
  },
 
 
 
 
 
634
  "node_modules/ecdsa-sig-formatter": {
635
  "version": "1.0.11",
636
  "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -803,6 +935,32 @@
803
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
804
  "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
805
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
806
  "node_modules/forwarded": {
807
  "version": "0.2.0",
808
  "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -902,19 +1060,21 @@
902
  }
903
  },
904
  "node_modules/glob": {
905
- "version": "7.2.3",
906
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
907
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
908
  "dependencies": {
909
- "fs.realpath": "^1.0.0",
910
- "inflight": "^1.0.4",
911
- "inherits": "2",
912
- "minimatch": "^3.1.1",
913
- "once": "^1.3.0",
914
- "path-is-absolute": "^1.0.0"
 
 
915
  },
916
  "engines": {
917
- "node": "*"
918
  },
919
  "funding": {
920
  "url": "https://github.com/sponsors/isaacs"
@@ -932,6 +1092,28 @@
932
  "node": ">= 6"
933
  }
934
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
935
  "node_modules/gopd": {
936
  "version": "1.0.1",
937
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
@@ -1122,6 +1304,28 @@
1122
  "node": ">=0.12.0"
1123
  }
1124
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1125
  "node_modules/joi": {
1126
  "version": "17.11.0",
1127
  "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz",
@@ -1643,6 +1847,37 @@
1643
  "node": ">=0.10.0"
1644
  }
1645
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1646
  "node_modules/path-to-regexp": {
1647
  "version": "0.1.7",
1648
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -1755,6 +1990,25 @@
1755
  "url": "https://github.com/sponsors/isaacs"
1756
  }
1757
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1758
  "node_modules/safe-buffer": {
1759
  "version": "5.2.1",
1760
  "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -1872,6 +2126,25 @@
1872
  "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1873
  "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1874
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1875
  "node_modules/side-channel": {
1876
  "version": "1.0.4",
1877
  "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
@@ -1944,6 +2217,20 @@
1944
  "node": ">=8"
1945
  }
1946
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1947
  "node_modules/strip-ansi": {
1948
  "version": "6.0.1",
1949
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -1955,6 +2242,18 @@
1955
  "node": ">=8"
1956
  }
1957
  },
 
 
 
 
 
 
 
 
 
 
 
 
1958
  "node_modules/supports-color": {
1959
  "version": "5.5.0",
1960
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -2173,6 +2472,20 @@
2173
  "node": ">=12"
2174
  }
2175
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2176
  "node_modules/wide-align": {
2177
  "version": "1.1.5",
2178
  "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
@@ -2181,6 +2494,99 @@
2181
  "string-width": "^1.0.2 || 2 || 3 || 4"
2182
  }
2183
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2184
  "node_modules/wrappy": {
2185
  "version": "1.0.2",
2186
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 
9
  "version": "1.0.0",
10
  "license": "ISC",
11
  "dependencies": {
12
+ "@types/glob": "^8.1.0",
13
  "bcrypt": "^5.1.1",
14
  "cors": "^2.8.5",
15
  "dotenv": "^16.3.1",
16
  "express": "^4.18.2",
17
+ "glob": "^10.3.10",
18
  "http": "^0.0.1-security",
19
  "joi": "^17.11.0",
20
  "jsonwebtoken": "^9.0.2",
 
53
  "@hapi/hoek": "^9.0.0"
54
  }
55
  },
56
+ "node_modules/@isaacs/cliui": {
57
+ "version": "8.0.2",
58
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
59
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
60
+ "dependencies": {
61
+ "string-width": "^5.1.2",
62
+ "string-width-cjs": "npm:string-width@^4.2.0",
63
+ "strip-ansi": "^7.0.1",
64
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
65
+ "wrap-ansi": "^8.1.0",
66
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
67
+ },
68
+ "engines": {
69
+ "node": ">=12"
70
+ }
71
+ },
72
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
73
+ "version": "6.0.1",
74
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
75
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
76
+ "engines": {
77
+ "node": ">=12"
78
+ },
79
+ "funding": {
80
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
81
+ }
82
+ },
83
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
84
+ "version": "9.2.2",
85
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
86
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
87
+ },
88
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
89
+ "version": "5.1.2",
90
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
91
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
92
+ "dependencies": {
93
+ "eastasianwidth": "^0.2.0",
94
+ "emoji-regex": "^9.2.2",
95
+ "strip-ansi": "^7.0.1"
96
+ },
97
+ "engines": {
98
+ "node": ">=12"
99
+ },
100
+ "funding": {
101
+ "url": "https://github.com/sponsors/sindresorhus"
102
+ }
103
+ },
104
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
105
+ "version": "7.1.0",
106
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
107
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
108
+ "dependencies": {
109
+ "ansi-regex": "^6.0.1"
110
+ },
111
+ "engines": {
112
+ "node": ">=12"
113
+ },
114
+ "funding": {
115
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
116
+ }
117
+ },
118
  "node_modules/@jridgewell/resolve-uri": {
119
  "version": "3.1.1",
120
  "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
 
181
  "sparse-bitfield": "^3.0.3"
182
  }
183
  },
184
+ "node_modules/@pkgjs/parseargs": {
185
+ "version": "0.11.0",
186
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
187
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
188
+ "optional": true,
189
+ "engines": {
190
+ "node": ">=14"
191
+ }
192
+ },
193
  "node_modules/@sideway/address": {
194
  "version": "4.1.4",
195
  "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
 
275
  "@types/send": "*"
276
  }
277
  },
278
+ "node_modules/@types/glob": {
279
+ "version": "8.1.0",
280
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
281
+ "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
282
+ "dependencies": {
283
+ "@types/minimatch": "^5.1.2",
284
+ "@types/node": "*"
285
+ }
286
+ },
287
  "node_modules/@types/http-errors": {
288
  "version": "2.0.4",
289
  "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
 
296
  "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
297
  "dev": true
298
  },
299
+ "node_modules/@types/minimatch": {
300
+ "version": "5.1.2",
301
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
302
+ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="
303
+ },
304
  "node_modules/@types/node": {
305
  "version": "20.10.4",
306
  "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz",
 
413
  "node": ">=8"
414
  }
415
  },
416
+ "node_modules/ansi-styles": {
417
+ "version": "6.2.1",
418
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
419
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
420
+ "engines": {
421
+ "node": ">=12"
422
+ },
423
+ "funding": {
424
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
425
+ }
426
+ },
427
  "node_modules/anymatch": {
428
  "version": "3.1.3",
429
  "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
 
582
  "node": ">=10"
583
  }
584
  },
585
+ "node_modules/color-convert": {
586
+ "version": "2.0.1",
587
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
588
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
589
+ "dependencies": {
590
+ "color-name": "~1.1.4"
591
+ },
592
+ "engines": {
593
+ "node": ">=7.0.0"
594
+ }
595
+ },
596
+ "node_modules/color-name": {
597
+ "version": "1.1.4",
598
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
599
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
600
+ },
601
  "node_modules/color-support": {
602
  "version": "1.1.3",
603
  "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
 
666
  "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
667
  "dev": true
668
  },
669
+ "node_modules/cross-spawn": {
670
+ "version": "7.0.3",
671
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
672
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
673
+ "dependencies": {
674
+ "path-key": "^3.1.0",
675
+ "shebang-command": "^2.0.0",
676
+ "which": "^2.0.1"
677
+ },
678
+ "engines": {
679
+ "node": ">= 8"
680
+ }
681
+ },
682
  "node_modules/debug": {
683
  "version": "4.3.4",
684
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
 
758
  "url": "https://github.com/motdotla/dotenv?sponsor=1"
759
  }
760
  },
761
+ "node_modules/eastasianwidth": {
762
+ "version": "0.2.0",
763
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
764
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
765
+ },
766
  "node_modules/ecdsa-sig-formatter": {
767
  "version": "1.0.11",
768
  "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
 
935
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
936
  "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
937
  },
938
+ "node_modules/foreground-child": {
939
+ "version": "3.1.1",
940
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
941
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
942
+ "dependencies": {
943
+ "cross-spawn": "^7.0.0",
944
+ "signal-exit": "^4.0.1"
945
+ },
946
+ "engines": {
947
+ "node": ">=14"
948
+ },
949
+ "funding": {
950
+ "url": "https://github.com/sponsors/isaacs"
951
+ }
952
+ },
953
+ "node_modules/foreground-child/node_modules/signal-exit": {
954
+ "version": "4.1.0",
955
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
956
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
957
+ "engines": {
958
+ "node": ">=14"
959
+ },
960
+ "funding": {
961
+ "url": "https://github.com/sponsors/isaacs"
962
+ }
963
+ },
964
  "node_modules/forwarded": {
965
  "version": "0.2.0",
966
  "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
 
1060
  }
1061
  },
1062
  "node_modules/glob": {
1063
+ "version": "10.3.10",
1064
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
1065
+ "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
1066
  "dependencies": {
1067
+ "foreground-child": "^3.1.0",
1068
+ "jackspeak": "^2.3.5",
1069
+ "minimatch": "^9.0.1",
1070
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
1071
+ "path-scurry": "^1.10.1"
1072
+ },
1073
+ "bin": {
1074
+ "glob": "dist/esm/bin.mjs"
1075
  },
1076
  "engines": {
1077
+ "node": ">=16 || 14 >=14.17"
1078
  },
1079
  "funding": {
1080
  "url": "https://github.com/sponsors/isaacs"
 
1092
  "node": ">= 6"
1093
  }
1094
  },
1095
+ "node_modules/glob/node_modules/brace-expansion": {
1096
+ "version": "2.0.1",
1097
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1098
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1099
+ "dependencies": {
1100
+ "balanced-match": "^1.0.0"
1101
+ }
1102
+ },
1103
+ "node_modules/glob/node_modules/minimatch": {
1104
+ "version": "9.0.3",
1105
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
1106
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
1107
+ "dependencies": {
1108
+ "brace-expansion": "^2.0.1"
1109
+ },
1110
+ "engines": {
1111
+ "node": ">=16 || 14 >=14.17"
1112
+ },
1113
+ "funding": {
1114
+ "url": "https://github.com/sponsors/isaacs"
1115
+ }
1116
+ },
1117
  "node_modules/gopd": {
1118
  "version": "1.0.1",
1119
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
 
1304
  "node": ">=0.12.0"
1305
  }
1306
  },
1307
+ "node_modules/isexe": {
1308
+ "version": "2.0.0",
1309
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1310
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
1311
+ },
1312
+ "node_modules/jackspeak": {
1313
+ "version": "2.3.6",
1314
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
1315
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
1316
+ "dependencies": {
1317
+ "@isaacs/cliui": "^8.0.2"
1318
+ },
1319
+ "engines": {
1320
+ "node": ">=14"
1321
+ },
1322
+ "funding": {
1323
+ "url": "https://github.com/sponsors/isaacs"
1324
+ },
1325
+ "optionalDependencies": {
1326
+ "@pkgjs/parseargs": "^0.11.0"
1327
+ }
1328
+ },
1329
  "node_modules/joi": {
1330
  "version": "17.11.0",
1331
  "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz",
 
1847
  "node": ">=0.10.0"
1848
  }
1849
  },
1850
+ "node_modules/path-key": {
1851
+ "version": "3.1.1",
1852
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1853
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1854
+ "engines": {
1855
+ "node": ">=8"
1856
+ }
1857
+ },
1858
+ "node_modules/path-scurry": {
1859
+ "version": "1.10.1",
1860
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
1861
+ "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
1862
+ "dependencies": {
1863
+ "lru-cache": "^9.1.1 || ^10.0.0",
1864
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
1865
+ },
1866
+ "engines": {
1867
+ "node": ">=16 || 14 >=14.17"
1868
+ },
1869
+ "funding": {
1870
+ "url": "https://github.com/sponsors/isaacs"
1871
+ }
1872
+ },
1873
+ "node_modules/path-scurry/node_modules/lru-cache": {
1874
+ "version": "10.1.0",
1875
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
1876
+ "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
1877
+ "engines": {
1878
+ "node": "14 || >=16.14"
1879
+ }
1880
+ },
1881
  "node_modules/path-to-regexp": {
1882
  "version": "0.1.7",
1883
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 
1990
  "url": "https://github.com/sponsors/isaacs"
1991
  }
1992
  },
1993
+ "node_modules/rimraf/node_modules/glob": {
1994
+ "version": "7.2.3",
1995
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
1996
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
1997
+ "dependencies": {
1998
+ "fs.realpath": "^1.0.0",
1999
+ "inflight": "^1.0.4",
2000
+ "inherits": "2",
2001
+ "minimatch": "^3.1.1",
2002
+ "once": "^1.3.0",
2003
+ "path-is-absolute": "^1.0.0"
2004
+ },
2005
+ "engines": {
2006
+ "node": "*"
2007
+ },
2008
+ "funding": {
2009
+ "url": "https://github.com/sponsors/isaacs"
2010
+ }
2011
+ },
2012
  "node_modules/safe-buffer": {
2013
  "version": "5.2.1",
2014
  "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
 
2126
  "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
2127
  "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
2128
  },
2129
+ "node_modules/shebang-command": {
2130
+ "version": "2.0.0",
2131
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2132
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2133
+ "dependencies": {
2134
+ "shebang-regex": "^3.0.0"
2135
+ },
2136
+ "engines": {
2137
+ "node": ">=8"
2138
+ }
2139
+ },
2140
+ "node_modules/shebang-regex": {
2141
+ "version": "3.0.0",
2142
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2143
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2144
+ "engines": {
2145
+ "node": ">=8"
2146
+ }
2147
+ },
2148
  "node_modules/side-channel": {
2149
  "version": "1.0.4",
2150
  "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
 
2217
  "node": ">=8"
2218
  }
2219
  },
2220
+ "node_modules/string-width-cjs": {
2221
+ "name": "string-width",
2222
+ "version": "4.2.3",
2223
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2224
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2225
+ "dependencies": {
2226
+ "emoji-regex": "^8.0.0",
2227
+ "is-fullwidth-code-point": "^3.0.0",
2228
+ "strip-ansi": "^6.0.1"
2229
+ },
2230
+ "engines": {
2231
+ "node": ">=8"
2232
+ }
2233
+ },
2234
  "node_modules/strip-ansi": {
2235
  "version": "6.0.1",
2236
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 
2242
  "node": ">=8"
2243
  }
2244
  },
2245
+ "node_modules/strip-ansi-cjs": {
2246
+ "name": "strip-ansi",
2247
+ "version": "6.0.1",
2248
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2249
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2250
+ "dependencies": {
2251
+ "ansi-regex": "^5.0.1"
2252
+ },
2253
+ "engines": {
2254
+ "node": ">=8"
2255
+ }
2256
+ },
2257
  "node_modules/supports-color": {
2258
  "version": "5.5.0",
2259
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 
2472
  "node": ">=12"
2473
  }
2474
  },
2475
+ "node_modules/which": {
2476
+ "version": "2.0.2",
2477
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2478
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2479
+ "dependencies": {
2480
+ "isexe": "^2.0.0"
2481
+ },
2482
+ "bin": {
2483
+ "node-which": "bin/node-which"
2484
+ },
2485
+ "engines": {
2486
+ "node": ">= 8"
2487
+ }
2488
+ },
2489
  "node_modules/wide-align": {
2490
  "version": "1.1.5",
2491
  "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
 
2494
  "string-width": "^1.0.2 || 2 || 3 || 4"
2495
  }
2496
  },
2497
+ "node_modules/wrap-ansi": {
2498
+ "version": "8.1.0",
2499
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
2500
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
2501
+ "dependencies": {
2502
+ "ansi-styles": "^6.1.0",
2503
+ "string-width": "^5.0.1",
2504
+ "strip-ansi": "^7.0.1"
2505
+ },
2506
+ "engines": {
2507
+ "node": ">=12"
2508
+ },
2509
+ "funding": {
2510
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2511
+ }
2512
+ },
2513
+ "node_modules/wrap-ansi-cjs": {
2514
+ "name": "wrap-ansi",
2515
+ "version": "7.0.0",
2516
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
2517
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
2518
+ "dependencies": {
2519
+ "ansi-styles": "^4.0.0",
2520
+ "string-width": "^4.1.0",
2521
+ "strip-ansi": "^6.0.0"
2522
+ },
2523
+ "engines": {
2524
+ "node": ">=10"
2525
+ },
2526
+ "funding": {
2527
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2528
+ }
2529
+ },
2530
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
2531
+ "version": "4.3.0",
2532
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2533
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2534
+ "dependencies": {
2535
+ "color-convert": "^2.0.1"
2536
+ },
2537
+ "engines": {
2538
+ "node": ">=8"
2539
+ },
2540
+ "funding": {
2541
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2542
+ }
2543
+ },
2544
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
2545
+ "version": "6.0.1",
2546
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
2547
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
2548
+ "engines": {
2549
+ "node": ">=12"
2550
+ },
2551
+ "funding": {
2552
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
2553
+ }
2554
+ },
2555
+ "node_modules/wrap-ansi/node_modules/emoji-regex": {
2556
+ "version": "9.2.2",
2557
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
2558
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
2559
+ },
2560
+ "node_modules/wrap-ansi/node_modules/string-width": {
2561
+ "version": "5.1.2",
2562
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
2563
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
2564
+ "dependencies": {
2565
+ "eastasianwidth": "^0.2.0",
2566
+ "emoji-regex": "^9.2.2",
2567
+ "strip-ansi": "^7.0.1"
2568
+ },
2569
+ "engines": {
2570
+ "node": ">=12"
2571
+ },
2572
+ "funding": {
2573
+ "url": "https://github.com/sponsors/sindresorhus"
2574
+ }
2575
+ },
2576
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
2577
+ "version": "7.1.0",
2578
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
2579
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
2580
+ "dependencies": {
2581
+ "ansi-regex": "^6.0.1"
2582
+ },
2583
+ "engines": {
2584
+ "node": ">=12"
2585
+ },
2586
+ "funding": {
2587
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
2588
+ }
2589
+ },
2590
  "node_modules/wrappy": {
2591
  "version": "1.0.2",
2592
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
package.json CHANGED
@@ -18,10 +18,12 @@
18
  "typescript": "^5.3.3"
19
  },
20
  "dependencies": {
 
21
  "bcrypt": "^5.1.1",
22
  "cors": "^2.8.5",
23
  "dotenv": "^16.3.1",
24
  "express": "^4.18.2",
 
25
  "http": "^0.0.1-security",
26
  "joi": "^17.11.0",
27
  "jsonwebtoken": "^9.0.2",
 
18
  "typescript": "^5.3.3"
19
  },
20
  "dependencies": {
21
+ "@types/glob": "^8.1.0",
22
  "bcrypt": "^5.1.1",
23
  "cors": "^2.8.5",
24
  "dotenv": "^16.3.1",
25
  "express": "^4.18.2",
26
+ "glob": "^10.3.10",
27
  "http": "^0.0.1-security",
28
  "joi": "^17.11.0",
29
  "jsonwebtoken": "^9.0.2",
src/index.route.ts DELETED
@@ -1,20 +0,0 @@
1
- import express from "express";
2
-
3
- import { userRoutes } from "./modules/user/index.route";
4
- import { adminRouter } from "./modules/console/index.route";
5
-
6
- const mainRouter = express.Router();
7
-
8
- mainRouter.use("/user", userRoutes);
9
- mainRouter.use("/admin", adminRouter);
10
-
11
- mainRouter.get("/health", (_req: any, res: any) => {
12
- res.status(200).json({ success: true, message: "Server is up!", code: 200 });
13
- });
14
-
15
- // catch non existing routes
16
- mainRouter.all("*", (_req: any, res: any) => {
17
- res.status(404).json({ success: false, message: "Invalid URL!", code: 404 });
18
- });
19
-
20
- export { mainRouter };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/index.ts CHANGED
@@ -2,7 +2,7 @@ import express from "express";
2
  import cors from "cors";
3
  import { connectDatabase } from "./configs/database";
4
  import { config } from "./configs/config";
5
- import { mainRouter } from "./index.route";
6
 
7
  const main = async () => {
8
  // set up database connection
@@ -17,7 +17,7 @@ const main = async () => {
17
  app.use(express.json());
18
 
19
  // set up routes
20
- app.use("/api/v1", mainRouter);
21
 
22
  // start server
23
  app.listen(config.port, () => {
 
2
  import cors from "cors";
3
  import { connectDatabase } from "./configs/database";
4
  import { config } from "./configs/config";
5
+ import { setAppRoutes } from "./routes";
6
 
7
  const main = async () => {
8
  // set up database connection
 
17
  app.use(express.json());
18
 
19
  // set up routes
20
+ await setAppRoutes(app);
21
 
22
  // start server
23
  app.listen(config.port, () => {
src/lib/controllers/controller.base.ts ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
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
+ }
src/modules/common/decorators/prefix.decorator.ts ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ 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
+ };
src/modules/user/users/controllers/auth.controller.ts CHANGED
@@ -1,46 +1,70 @@
1
  import { usersService } from "../services/users.service";
2
  import { jwtHelper } from "../../../../helpers/jwt.helper";
 
 
 
 
 
3
 
4
- export class authController {
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- static async register(req, res) {
7
- try {
8
- let result = await usersService.create(req.body);
9
- return res.status(result.code).json(result);
10
- } catch (err) {
11
- console.log(`err.message`, err.message);
12
- return res.status(500).json({
13
- success: false,
14
- code: 500,
15
- error: err.message
16
- })
17
- }
18
  }
 
19
 
20
- static async login(req, res) {
21
- try {
22
- const { email, password } = req.body;
23
- let result: { success: boolean; code: number; record?: any; message?: string } = await usersService.comparePassword(email, password);
24
- if (!result.success) return res.status(result.code).json(result);
25
- let payload = {
26
- _id: result.record?._id, name: result.record?.name,
27
- email: result.record?.email,
28
- number: result.record?.number,
29
- role: result.record?.role
30
- }
31
- const token = jwtHelper.generateToken(payload);
32
- return res.status(result.code).json({
33
- success: result.success,
34
- token,
35
- code: result.code,
36
- record: result.record
37
- })
38
- } catch (err) {
39
- console.log(`err.message`, err.message);
40
- return res.status(500).json({
41
- success: false,
42
- message: err.message
43
- })
44
- }
 
 
 
 
 
45
  }
46
- }
 
 
1
  import { usersService } from "../services/users.service";
2
  import { jwtHelper } from "../../../../helpers/jwt.helper";
3
+ import { BaseController } from "../../../../lib/controllers/controller.base";
4
+ import { validator } from "../../../../helpers/validation.helper";
5
+ import { userValidation } from "../validation/user.Validation";
6
+ import { Router } from "express";
7
+ import { Prefix } from "../../../common/decorators/prefix.decorator";
8
 
9
+ @Prefix("/user")
10
+ export class AuthController extends BaseController {
11
+ static setRoutes(router: Router): void {
12
+ router.post(
13
+ "/register",
14
+ validator(userValidation.createValidation),
15
+ AuthController.register
16
+ );
17
+ router.post(
18
+ "/login",
19
+ validator(userValidation.loginValidation),
20
+ AuthController.login
21
+ );
22
+ }
23
 
24
+ static async register(req, res) {
25
+ try {
26
+ let result = await usersService.create(req.body);
27
+ return res.status(result.code).json(result);
28
+ } catch (err) {
29
+ console.log(`err.message`, err.message);
30
+ return res.status(500).json({
31
+ success: false,
32
+ code: 500,
33
+ error: err.message,
34
+ });
 
35
  }
36
+ }
37
 
38
+ static async login(req, res) {
39
+ try {
40
+ const { email, password } = req.body;
41
+ let result: {
42
+ success: boolean;
43
+ code: number;
44
+ record?: any;
45
+ message?: string;
46
+ } = await usersService.comparePassword(email, password);
47
+ if (!result.success) return res.status(result.code).json(result);
48
+ let payload = {
49
+ _id: result.record?._id,
50
+ name: result.record?.name,
51
+ email: result.record?.email,
52
+ number: result.record?.number,
53
+ role: result.record?.role,
54
+ };
55
+ const token = jwtHelper.generateToken(payload);
56
+ return res.status(result.code).json({
57
+ success: result.success,
58
+ token,
59
+ code: result.code,
60
+ record: result.record,
61
+ });
62
+ } catch (err) {
63
+ console.log(`err.message`, err.message);
64
+ return res.status(500).json({
65
+ success: false,
66
+ message: err.message,
67
+ });
68
  }
69
+ }
70
+ }
src/modules/user/users/routes/auth.route.ts CHANGED
@@ -1,12 +1,12 @@
1
  import express from "express";
2
- import { authController } from "../controllers/auth.controller";
3
  import { userValidation } from "../validation/user.Validation";
4
  import { validator } from "../../../../helpers/validation.helper";
5
 
6
  const app = express.Router();
7
 
8
- app.post("/register", validator(userValidation.createValidation), authController.register);
9
- app.post("/login", validator(userValidation.loginValidation), authController.login);
10
 
11
  export { app as authRoutes };
12
 
 
1
  import express from "express";
2
+ import { AuthController } from "../controllers/auth.controller";
3
  import { userValidation } from "../validation/user.Validation";
4
  import { validator } from "../../../../helpers/validation.helper";
5
 
6
  const app = express.Router();
7
 
8
+ // app.post("/register", validator(userValidation.createValidation), AuthController.register);
9
+ // app.post("/login", validator(userValidation.loginValidation), AuthController.login);
10
 
11
  export { app as authRoutes };
12
 
src/routes.ts ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Router, Express } from "express";
2
+
3
+ import { userRoutes } from "./modules/user/index.route";
4
+ import { adminRouter } from "./modules/console/index.route";
5
+
6
+ import * as glob from "glob";
7
+ import path from "path";
8
+ import { BaseController } from "./lib/controllers/controller.base";
9
+
10
+ export const setAppRoutes = async (app: Express) => {
11
+ const mainRouter = Router();
12
+
13
+ await importControllers(mainRouter);
14
+ setCustomRoutes(mainRouter);
15
+
16
+ app.use("/api/v1", mainRouter);
17
+ };
18
+
19
+ /* custom routes */
20
+
21
+ const setCustomRoutes = (router: Router) => {
22
+ router.use("/admin", adminRouter);
23
+
24
+ router.get("/health", (_req: any, res: any) => {
25
+ res
26
+ .status(200)
27
+ .json({ success: true, message: "Server is up!", code: 200 });
28
+ });
29
+
30
+ router.all("*", (_req: any, res: any) => {
31
+ res
32
+ .status(404)
33
+ .json({ success: false, message: "Invalid URL!", code: 404 });
34
+ });
35
+ };
36
+
37
+ /* importing all controllers */
38
+
39
+ const findControllerFiles = (): string[] => {
40
+ return glob.sync(path.join(__dirname, "**/*.controller.{ts,js}"));
41
+ };
42
+
43
+ const importControllers = async (router: Router) => {
44
+ const files = findControllerFiles();
45
+
46
+ await Promise.all(
47
+ files.map(async (file) => {
48
+ const controller = await importController(file);
49
+ if (!controller) return;
50
+ controller.setRoutes(controller.router);
51
+ router.use(controller.prefix, controller.router);
52
+ })
53
+ );
54
+ };
55
+
56
+ const importController = async (file: string) => {
57
+ const controllers = Object.values(await import(file));
58
+ return controllers.find(
59
+ (controller: { router?: Router }) => controller.router
60
+ ) as typeof BaseController;
61
+ };
tsconfig.json CHANGED
@@ -6,7 +6,8 @@
6
  "target": "es6",
7
  "moduleResolution": "node",
8
  "sourceMap": true,
9
- "outDir": "dist"
 
10
  },
11
  "lib": ["es2015"]
12
  }
 
6
  "target": "es6",
7
  "moduleResolution": "node",
8
  "sourceMap": true,
9
+ "outDir": "dist",
10
+ "experimentalDecorators": true,
11
  },
12
  "lib": ["es2015"]
13
  }