@ifecodes/backend-template 1.1.8 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +423 -365
  3. package/bin/cli.js +1276 -836
  4. package/bin/lib/microservice-config.js +155 -150
  5. package/bin/lib/prompts.js +277 -241
  6. package/bin/lib/readme-generator.js +364 -335
  7. package/bin/lib/service-setup.js +901 -679
  8. package/package.json +64 -55
  9. package/template/base/js/.env.example +5 -5
  10. package/template/base/js/.eslintrc.json +10 -13
  11. package/template/base/js/.husky/pre-commit +1 -7
  12. package/template/base/js/.prettierrc +7 -7
  13. package/template/base/js/eslint.config.js +33 -31
  14. package/template/base/js/package.json +29 -28
  15. package/template/base/js/src/app.js +20 -15
  16. package/template/base/js/src/config/env.js +32 -2
  17. package/template/base/js/src/config/index.js +2 -2
  18. package/template/base/js/src/docs/index.js +5 -0
  19. package/template/base/js/src/docs/route-registry.js +63 -0
  20. package/template/base/js/src/middlewares/error-handler.middleware.js +22 -0
  21. package/template/base/js/src/middlewares/index.js +9 -3
  22. package/template/base/js/src/middlewares/method-not-allowed.middleware.js +8 -2
  23. package/template/base/js/src/middlewares/not-found.middleware.js +4 -1
  24. package/template/base/js/src/middlewares/observability.middleware.js +24 -0
  25. package/template/base/js/src/middlewares/root.middleware.js +7 -5
  26. package/template/base/js/src/middlewares/validation.middleware.js +39 -0
  27. package/template/base/js/src/modules/index.js +8 -8
  28. package/template/base/js/src/modules/v1/health/health.controller.auth.js +29 -0
  29. package/template/base/js/src/modules/v1/health/health.controller.js +4 -4
  30. package/template/base/js/src/modules/v1/health/health.route.js +70 -5
  31. package/template/base/js/src/modules/v1/health/index.js +1 -1
  32. package/template/base/js/src/modules/v1/index.js +3 -3
  33. package/template/base/js/src/routes.js +13 -6
  34. package/template/base/js/src/server.js +18 -18
  35. package/template/base/js/src/utils/http-error.js +27 -6
  36. package/template/base/js/src/utils/index.js +28 -22
  37. package/template/base/js/src/utils/logger.js +57 -67
  38. package/template/base/ts/.eslintrc.json +13 -17
  39. package/template/base/ts/.prettierrc +7 -7
  40. package/template/base/ts/eslint.config.js +33 -33
  41. package/template/base/ts/package.json +41 -39
  42. package/template/base/ts/src/app.ts +20 -15
  43. package/template/base/ts/src/config/db.ts +4 -4
  44. package/template/base/ts/src/config/env.ts +40 -10
  45. package/template/base/ts/src/config/index.ts +2 -2
  46. package/template/base/ts/src/docs/index.ts +3 -0
  47. package/template/base/ts/src/docs/route-registry.ts +98 -0
  48. package/template/base/ts/src/middlewares/error-handler.middleware.ts +26 -0
  49. package/template/base/ts/src/middlewares/index.ts +6 -3
  50. package/template/base/ts/src/middlewares/method-not-allowed.middleware.ts +23 -16
  51. package/template/base/ts/src/middlewares/not-found.middleware.ts +10 -8
  52. package/template/base/ts/src/middlewares/observability.middleware.ts +25 -0
  53. package/template/base/ts/src/middlewares/root.middleware.ts +16 -14
  54. package/template/base/ts/src/middlewares/validation.middleware.ts +46 -0
  55. package/template/base/ts/src/modules/index.ts +8 -8
  56. package/template/base/ts/src/modules/v1/health/health.controller.auth.ts +26 -0
  57. package/template/base/ts/src/modules/v1/health/health.controller.ts +18 -18
  58. package/template/base/ts/src/modules/v1/health/health.route.ts +68 -9
  59. package/template/base/ts/src/modules/v1/health/index.ts +1 -1
  60. package/template/base/ts/src/modules/v1/index.ts +8 -8
  61. package/template/base/ts/src/routes.ts +23 -15
  62. package/template/base/ts/src/server.ts +19 -19
  63. package/template/base/ts/src/utils/http-error.ts +63 -45
  64. package/template/base/ts/src/utils/index.ts +14 -11
  65. package/template/base/ts/src/utils/logger.ts +58 -68
  66. package/template/base/ts/tsconfig.json +21 -22
  67. package/template/features/auth/argon2/inject.js +50 -50
  68. package/template/features/auth/base/health-openapi.ts +62 -0
  69. package/template/features/auth/base/inject.js +174 -172
  70. package/template/features/auth/bcrypt/inject.js +40 -40
  71. package/template/features/auth/models/user.model.js +24 -24
  72. package/template/features/auth/models/user.model.ts +1 -1
  73. package/template/features/auth/modules/auth.controller.js +21 -21
  74. package/template/features/auth/modules/auth.controller.ts +28 -20
  75. package/template/features/auth/modules/auth.routes.js +89 -10
  76. package/template/features/auth/modules/auth.routes.ts +86 -11
  77. package/template/features/auth/modules/auth.service.js +29 -29
  78. package/template/features/auth/modules/auth.service.ts +38 -38
  79. package/template/features/auth/modules/index.js +1 -1
  80. package/template/features/auth/utils/hash.ts +20 -20
  81. package/template/features/auth/utils/jwt.js +12 -12
  82. package/template/features/cors/inject.js +14 -13
  83. package/template/features/helmet/inject.js +7 -6
  84. package/template/features/morgan/inject.js +8 -7
  85. package/template/features/rate-limit/inject.js +7 -6
  86. package/template/gateway/js/app.js +42 -42
  87. package/template/gateway/js/inject.js +33 -31
  88. package/template/gateway/js/server.js +19 -19
  89. package/template/gateway/ts/app.ts +43 -43
  90. package/template/gateway/ts/inject.js +33 -33
  91. package/template/gateway/ts/server.ts +19 -19
  92. package/template/microservice/docker/docker-compose.yml +5 -5
  93. package/template/microservice/nodocker/pm2.config.js +3 -3
@@ -1,11 +1,86 @@
1
- import { Router } from "express";
2
- import { register, login } from "./auth.controller";
3
- import { methodNotAllowedHandler } from "@/middlewares";
4
-
5
- const router = Router();
6
- router.use(methodNotAllowedHandler(["POST"]));
7
- router.post("/login", login);
8
- router.post("/register", register);
9
-
10
- export default router;
11
-
1
+ import { Router } from "express";
2
+ import { register, login } from "./auth.controller";
3
+ import { methodNotAllowedHandler, validateRequest } from "@/middlewares";
4
+ import { z } from "zod";
5
+ import { routeRegistry } from "@/docs";
6
+
7
+ const router = Router();
8
+
9
+ // Define request schemas for validation
10
+ const registerSchema = z
11
+ .object({
12
+ username: z.string().min(3, "Username must be at least 3 characters"),
13
+ password: z.string().min(6, "Password must be at least 6 characters"),
14
+ })
15
+ .strict();
16
+
17
+ const loginSchema = z
18
+ .object({
19
+ username: z.string().min(1, "Username is required"),
20
+ password: z.string().min(1, "Password is required"),
21
+ })
22
+ .strict();
23
+
24
+ router.use(methodNotAllowedHandler(["POST"]));
25
+ // Register route docs for auto OpenAPI generation
26
+ routeRegistry.register({
27
+ method: "POST",
28
+ path: "/api/v1/auth/login",
29
+ handler: login,
30
+ docs: {
31
+ tags: ["Auth"],
32
+ summary: "User login",
33
+ requestBody: {
34
+ required: true,
35
+ content: {
36
+ "application/json": {
37
+ schema: {
38
+ type: "object",
39
+ properties: {
40
+ username: { type: "string" },
41
+ password: { type: "string" },
42
+ },
43
+ },
44
+ },
45
+ },
46
+ },
47
+ responses: {
48
+ 200: { description: "Successful login" },
49
+ 400: { description: "Invalid request" },
50
+ 401: { description: "Unauthorized" },
51
+ },
52
+ },
53
+ });
54
+
55
+ routeRegistry.register({
56
+ method: "POST",
57
+ path: "/api/v1/auth/register",
58
+ handler: register,
59
+ docs: {
60
+ tags: ["Auth"],
61
+ summary: "Register new user",
62
+ requestBody: {
63
+ required: true,
64
+ content: {
65
+ "application/json": {
66
+ schema: {
67
+ type: "object",
68
+ properties: {
69
+ username: { type: "string" },
70
+ password: { type: "string" },
71
+ },
72
+ },
73
+ },
74
+ },
75
+ },
76
+ responses: {
77
+ 201: { description: "User created" },
78
+ 400: { description: "Invalid request" },
79
+ },
80
+ },
81
+ });
82
+
83
+ router.post("/login", validateRequest({ body: loginSchema }), login);
84
+ router.post("/register", validateRequest({ body: registerSchema }), register);
85
+
86
+ export default router;
@@ -1,29 +1,29 @@
1
- const { generateToken } = require("../../../utils/jwt");
2
- const { UserModel } = require("../../../models/user.model");
3
- const { hashPassword, verifyPassword } = require("../../../utils/hash");
4
- const {
5
- UnauthorizedError,
6
- ConflictError,
7
- } = require("../../../utils/http-error");
8
-
9
- async function loginService({ email, password }) {
10
- const user = await UserModel.findOne({ email }).exec();
11
- if (!user) throw new UnauthorizedError("User not found");
12
-
13
- const match = await verifyPassword(user.password, password);
14
- if (!match) throw new UnauthorizedError("Invalid credentials");
15
-
16
- return generateToken({ email: user.email });
17
- }
18
-
19
- async function registerService({ email, password, fullName }) {
20
- const exists = await UserModel.findOne({ email }).exec();
21
- if (exists) throw new ConflictError("Email already registered");
22
-
23
- const hashed = await hashPassword(password);
24
- const user = await UserModel.create({ email, password: hashed, fullName });
25
-
26
- return generateToken({ email: user.email });
27
- }
28
-
29
- module.exports = { loginService, registerService };
1
+ const { generateToken } = require("../../../utils/jwt");
2
+ const { UserModel } = require("../../../models/user.model");
3
+ const { hashPassword, verifyPassword } = require("../../../utils/hash");
4
+ const {
5
+ UnauthorizedError,
6
+ ConflictError,
7
+ } = require("../../../utils/http-error");
8
+
9
+ async function loginService({ email, password }) {
10
+ const user = await UserModel.findOne({ email }).exec();
11
+ if (!user) throw new UnauthorizedError("User not found");
12
+
13
+ const match = await verifyPassword(user.password, password);
14
+ if (!match) throw new UnauthorizedError("Invalid credentials");
15
+
16
+ return generateToken({ email: user.email });
17
+ }
18
+
19
+ async function registerService({ email, password, fullName }) {
20
+ const exists = await UserModel.findOne({ email }).exec();
21
+ if (exists) throw new ConflictError("Email already registered");
22
+
23
+ const hashed = await hashPassword(password);
24
+ const user = await UserModel.create({ email, password: hashed, fullName });
25
+
26
+ return generateToken({ email: user.email });
27
+ }
28
+
29
+ module.exports = { loginService, registerService };
@@ -1,38 +1,38 @@
1
- import { generateToken } from "@/utils";
2
- import { UserModel } from "@/models/user.model";
3
- import { hashPassword, verifyPassword } from "@/utils";
4
- import { UnauthorizedError, ConflictError } from "@/utils";
5
-
6
- export const loginService = async ({
7
- email,
8
- password,
9
- }: {
10
- email: string;
11
- password: string;
12
- }) => {
13
- const user = await UserModel.findOne({ email }).exec();
14
- if (!user) throw new UnauthorizedError("User not found");
15
-
16
- const match = await verifyPassword(user.password, password);
17
- if (!match) throw new UnauthorizedError("Invalid credentials");
18
-
19
- return generateToken({ email: user.email });
20
- };
21
-
22
- export const registerService = async ({
23
- email,
24
- password,
25
- fullName,
26
- }: {
27
- email: string;
28
- password: string;
29
- fullName: string;
30
- }) => {
31
- const exists = await UserModel.findOne({ email }).exec();
32
- if (exists) throw new ConflictError("Email already registered");
33
-
34
- const hashed = await hashPassword(password);
35
- const user = await UserModel.create({ email, password: hashed, fullName });
36
-
37
- return generateToken({ email: user.email });
38
- };
1
+ import { generateToken } from "@/utils";
2
+ import { UserModel } from "@/models/user.model";
3
+ import { hashPassword, verifyPassword } from "@/utils";
4
+ import { UnauthorizedError, ConflictError } from "@/utils";
5
+
6
+ export const loginService = async ({
7
+ email,
8
+ password,
9
+ }: {
10
+ email: string;
11
+ password: string;
12
+ }) => {
13
+ const user = await UserModel.findOne({ email }).exec();
14
+ if (!user) throw new UnauthorizedError("User not found");
15
+
16
+ const match = await verifyPassword(user.password, password);
17
+ if (!match) throw new UnauthorizedError("Invalid credentials");
18
+
19
+ return generateToken({ email: user.email });
20
+ };
21
+
22
+ export const registerService = async ({
23
+ email,
24
+ password,
25
+ fullName,
26
+ }: {
27
+ email: string;
28
+ password: string;
29
+ fullName: string;
30
+ }) => {
31
+ const exists = await UserModel.findOne({ email }).exec();
32
+ if (exists) throw new ConflictError("Email already registered");
33
+
34
+ const hashed = await hashPassword(password);
35
+ const user = await UserModel.create({ email, password: hashed, fullName });
36
+
37
+ return generateToken({ email: user.email });
38
+ };
@@ -1 +1 @@
1
- module.exports = { authRoutes: require("./auth.routes") };
1
+ module.exports = { authRoutes: require("./auth.routes") };
@@ -1,20 +1,20 @@
1
- /**
2
- * This base hash utility defines generic hashing function signatures.
3
- * The actual implementation will be replaced by bcrypt or argon2 depending
4
- * on user selection during template generation.
5
- */
6
-
7
- export async function hashPassword(_password: string): Promise<string> {
8
- throw new Error(
9
- "hashPassword() not implemented — hashing method not selected (bcrypt or argon2)"
10
- );
11
- }
12
-
13
- export async function verifyPassword(
14
- _hashed: string,
15
- _password: string
16
- ): Promise<boolean> {
17
- throw new Error(
18
- "verifyPassword() not implemented — hashing method not selected (bcrypt or argon2)"
19
- );
20
- }
1
+ /**
2
+ * This base hash utility defines generic hashing function signatures.
3
+ * The actual implementation will be replaced by bcrypt or argon2 depending
4
+ * on user selection during template generation.
5
+ */
6
+
7
+ export async function hashPassword(_password: string): Promise<string> {
8
+ throw new Error(
9
+ "hashPassword() not implemented — hashing method not selected (bcrypt or argon2)"
10
+ );
11
+ }
12
+
13
+ export async function verifyPassword(
14
+ _hashed: string,
15
+ _password: string
16
+ ): Promise<boolean> {
17
+ throw new Error(
18
+ "verifyPassword() not implemented — hashing method not selected (bcrypt or argon2)"
19
+ );
20
+ }
@@ -1,12 +1,12 @@
1
- const jwt = require("jsonwebtoken");
2
- const { ENV } = require("../config");
3
-
4
- async function generateToken(payload) {
5
- return jwt.sign(payload, ENV.JWT_SECRET, { expiresIn: "7d" });
6
- }
7
-
8
- function verifyToken(token) {
9
- return jwt.verify(token, ENV.JWT_SECRET);
10
- }
11
-
12
- module.exports = { generateToken, verifyToken };
1
+ const jwt = require("jsonwebtoken");
2
+ const { ENV } = require("../config");
3
+
4
+ async function generateToken(payload) {
5
+ return jwt.sign(payload, ENV.JWT_SECRET, { expiresIn: "7d" });
6
+ }
7
+
8
+ function verifyToken(token) {
9
+ return jwt.verify(token, ENV.JWT_SECRET);
10
+ }
11
+
12
+ module.exports = { generateToken, verifyToken };
@@ -1,13 +1,14 @@
1
- export const deps = ["cors"];
2
- export const devDeps = ["@types/cors"];
3
- export const getImports = (language) => language === "javascript"
4
- ? `const cors = require("cors");\nconst { ENV } = require("./config");`
5
- : `import cors from "cors";\nimport { ENV } from "@/config";`;
6
- export const imports = getImports("typescript");
7
- export const middleware = `
8
- const corsOptions = {
9
- origin: ENV.ALLOWED_ORIGIN,
10
- credentials: true,
11
- };
12
-
13
- app.use(cors(corsOptions));`;
1
+ export const deps = ["cors"];
2
+ export const devDeps = ["@types/cors"];
3
+ export const getImports = (language) =>
4
+ language === "javascript"
5
+ ? `const cors = require("cors");\nconst { ENV } = require("./config");`
6
+ : `import cors from "cors";\nimport { ENV } from "@/config";`;
7
+ export const imports = getImports("typescript");
8
+ export const middleware = `
9
+ const corsOptions = {
10
+ origin: ENV.ALLOWED_ORIGIN,
11
+ credentials: true,
12
+ };
13
+
14
+ app.use(cors(corsOptions));`;
@@ -1,6 +1,7 @@
1
- export const deps = ["helmet"];
2
- export const getImports = (language) => language === "javascript"
3
- ? `const helmet = require("helmet");`
4
- : `import helmet from "helmet";`;
5
- export const imports = getImports("typescript");
6
- export const middleware = `app.use(helmet());`;
1
+ export const deps = ["helmet"];
2
+ export const getImports = (language) =>
3
+ language === "javascript"
4
+ ? `const helmet = require("helmet");`
5
+ : `import helmet from "helmet";`;
6
+ export const imports = getImports("typescript");
7
+ export const middleware = `app.use(helmet());`;
@@ -1,7 +1,8 @@
1
- export const deps = ["morgan"];
2
- export const devDeps = ["@types/morgan"];
3
- export const getImports = (language) => language === "javascript"
4
- ? `const morgan = require("morgan");`
5
- : `import morgan from "morgan";`;
6
- export const imports = getImports("typescript");
7
- export const middleware = `app.use(morgan("dev"));`;
1
+ export const deps = ["morgan"];
2
+ export const devDeps = ["@types/morgan"];
3
+ export const getImports = (language) =>
4
+ language === "javascript"
5
+ ? `const morgan = require("morgan");`
6
+ : `import morgan from "morgan";`;
7
+ export const imports = getImports("typescript");
8
+ export const middleware = `app.use(morgan("dev"));`;
@@ -1,6 +1,7 @@
1
- export const deps = ["express-rate-limit"];
2
- export const getImports = (language) => language === "javascript"
3
- ? `const rateLimit = require("express-rate-limit");`
4
- : `import rateLimit from "express-rate-limit";`;
5
- export const imports = getImports("typescript");
6
- export const middleware = `app.use(rateLimit({ windowMs: 15*60*1000, max: 100 }));`;
1
+ export const deps = ["express-rate-limit"];
2
+ export const getImports = (language) =>
3
+ language === "javascript"
4
+ ? `const rateLimit = require("express-rate-limit");`
5
+ : `import rateLimit from "express-rate-limit";`;
6
+ export const imports = getImports("typescript");
7
+ export const middleware = `app.use(rateLimit({ windowMs: 15*60*1000, max: 100 }));`;
@@ -1,42 +1,42 @@
1
- const express = require("express");
2
- const { createProxyMiddleware } = require("http-proxy-middleware");
3
- const { logger } = require("@/shared/utils");
4
-
5
- const app = express();
6
-
7
- // Root endpoint
8
- app.get("/", (_req, res) => {
9
- logger.info("Gateway", "Root endpoint accessed");
10
-
11
- res.json({
12
- status: "ok",
13
- service: "API Gateway",
14
- version: "1.0.0",
15
- endpoints: {
16
- health: "/health",
17
- healthService: "/api/v1/health",
18
- },
19
- });
20
- });
21
-
22
- // Health check for the gateway itself
23
- app.get("/health", (_req, res) => {
24
- logger.info("Gateway", "Health check accessed");
25
- res.json({ status: "ok", service: "gateway" });
26
- });
27
-
28
- // Service routes - will be dynamically configured
29
- /*__ROUTES__*/
30
-
31
- // 404 handler
32
- app.use((_req, res) => {
33
- res.status(404).json({ error: "Route not found" });
34
- });
35
-
36
- // Error handler
37
- app.use((err, _req, res, next) => {
38
- logger.error("Gateway error:", err);
39
- res.status(500).json({ error: "Internal gateway error" });
40
- });
41
-
42
- module.exports = app;
1
+ const express = require("express");
2
+ const { createProxyMiddleware } = require("http-proxy-middleware");
3
+ const { logger } = require("@/shared/utils");
4
+
5
+ const app = express();
6
+
7
+ // Root endpoint
8
+ app.get("/", (_req, res) => {
9
+ logger.info("Gateway", "Root endpoint accessed");
10
+
11
+ res.json({
12
+ status: "ok",
13
+ service: "API Gateway",
14
+ version: "1.0.0",
15
+ endpoints: {
16
+ health: "/health",
17
+ healthService: "/api/v1/health",
18
+ },
19
+ });
20
+ });
21
+
22
+ // Health check for the gateway itself
23
+ app.get("/health", (_req, res) => {
24
+ logger.info("Gateway", "Health check accessed");
25
+ res.json({ status: "ok", service: "gateway" });
26
+ });
27
+
28
+ // Service routes - will be dynamically configured
29
+ /*__ROUTES__*/
30
+
31
+ // 404 handler
32
+ app.use((_req, res) => {
33
+ res.status(404).json({ error: "Route not found" });
34
+ });
35
+
36
+ // Error handler
37
+ app.use((err, _req, res, next) => {
38
+ logger.error("Gateway error:", err);
39
+ res.status(500).json({ error: "Internal gateway error" });
40
+ });
41
+
42
+ module.exports = app;
@@ -1,31 +1,33 @@
1
- export const gatewayDeps = ["http-proxy-middleware"];
2
-
3
- export const generateGatewayRoutes = (services, mode = "docker") => {
4
- const routes = services
5
- .filter(s => s !== "gateway")
6
- .map((service, index) => {
7
- const port = 4001 + index; // Host port mapping: gateway=4000, services start at 4001
8
- const routePath = service.replace("-service", "");
9
-
10
- // Docker: use container name with internal port 4000
11
- // Non-docker: use localhost with mapped host port
12
- const host = mode === "docker" ? service : "localhost";
13
- const targetPort = mode === "docker" ? 4000 : port;
14
-
15
- return `
16
- // Proxy to ${service}
17
- app.use("/api", createProxyMiddleware({
18
- target: "http://${host}:${targetPort}/api",
19
- changeOrigin: true,
20
- on: {
21
- error: (err, req, res) => {
22
- logger.error(\`Proxy error for ${service}:\`, err);
23
- res.status(503).json({ error: "Service unavailable" });
24
- },
25
- },
26
- }));`;
27
- })
28
- .join("\n");
29
-
30
- return routes;
31
- };
1
+ export const gatewayDeps = ["http-proxy-middleware"];
2
+
3
+ export const generateGatewayRoutes = (services, mode = "docker") => {
4
+ const routes = services
5
+ .filter((s) => s !== "gateway")
6
+ .map((service, index) => {
7
+ const servicePort = `${service.toUpperCase().replace(/-/g, "_")}_PORT`;
8
+ const port = 4001 + index; // Host port mapping: gateway=4000, services start at 4001
9
+
10
+ // Docker: use container name with internal port 4000
11
+ // Non-docker: use localhost with mapped host port
12
+ const host = mode === "docker" ? service : "localhost";
13
+ // Build a placeholder that will render as ${SERVICE_PORT} in the generated code
14
+ const servicePortPlaceholder = "${" + servicePort + "}";
15
+
16
+ return `
17
+ // Proxy to ${service}
18
+ const ${servicePort} = ENV.${servicePort} || ${port}
19
+ app.use("/api", createProxyMiddleware({
20
+ target: \`http://${host}:${servicePortPlaceholder}/api\`,
21
+ changeOrigin: true,
22
+ on: {
23
+ error: (err, req, res) => {
24
+ logger.error(\`Proxy error for ${service}:\`, err);
25
+ res.status(503).json({ error: "Service unavailable" });
26
+ },
27
+ },
28
+ }));`;
29
+ })
30
+ .join("\n");
31
+
32
+ return routes;
33
+ };
@@ -1,19 +1,19 @@
1
- const http = require('http');
2
- const app = require('./app');
3
- const { logger } = require('@/shared/utils');
4
- const { ENV } = require('@/shared/config');
5
-
6
- const PORT = ENV.GATEWAY_PORT || 4000;
7
-
8
- const server = http.createServer(app);
9
-
10
- server.listen(PORT, () => {
11
- logger.info(`🚀 API Gateway running on port ${PORT}`);
12
- });
13
-
14
- process.on('SIGTERM', () => {
15
- logger.info('SIGTERM signal received: closing HTTP server');
16
- server.close(() => {
17
- logger.info('HTTP server closed');
18
- });
19
- });
1
+ const http = require("http");
2
+ const app = require("./app");
3
+ const { logger } = require("@/shared/utils");
4
+ const { ENV } = require("@/shared/config");
5
+
6
+ const PORT = ENV.GATEWAY_PORT || 4000;
7
+
8
+ const server = http.createServer(app);
9
+
10
+ server.listen(PORT, () => {
11
+ logger.info(`🚀 API Gateway running on port ${PORT}`);
12
+ });
13
+
14
+ process.on("SIGTERM", () => {
15
+ logger.info("SIGTERM signal received: closing HTTP server");
16
+ server.close(() => {
17
+ logger.info("HTTP server closed");
18
+ });
19
+ });