nodejs-quickstart-structure 2.0.0 → 2.1.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 (161) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +44 -40
  3. package/bin/index.js +6 -3
  4. package/lib/generator.js +10 -4
  5. package/lib/modules/app-setup.js +76 -6
  6. package/lib/modules/auth-setup.js +143 -0
  7. package/lib/modules/caching-setup.js +8 -1
  8. package/lib/modules/config-files.js +10 -0
  9. package/lib/modules/database-setup.js +2 -1
  10. package/lib/modules/project-setup.js +1 -0
  11. package/lib/prompts.js +40 -1
  12. package/package.json +5 -4
  13. package/templates/clean-architecture/js/src/domain/models/User.js +3 -1
  14. package/templates/clean-architecture/js/src/index.js.ejs +2 -0
  15. package/templates/clean-architecture/js/src/infrastructure/config/env.js.ejs +12 -3
  16. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.js.ejs +25 -2
  17. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.spec.js.ejs +27 -0
  18. package/templates/clean-architecture/js/src/infrastructure/webserver/server.js.ejs +3 -0
  19. package/templates/clean-architecture/js/src/infrastructure/webserver/server.spec.js.ejs +49 -0
  20. package/templates/clean-architecture/js/src/infrastructure/webserver/swagger.spec.js.ejs +14 -0
  21. package/templates/clean-architecture/js/src/interfaces/controllers/userController.js.ejs +41 -4
  22. package/templates/clean-architecture/js/src/interfaces/controllers/userController.spec.js.ejs +69 -4
  23. package/templates/clean-architecture/js/src/interfaces/graphql/context.js.ejs +13 -6
  24. package/templates/clean-architecture/js/src/interfaces/graphql/context.spec.js.ejs +38 -21
  25. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.js.ejs +10 -5
  26. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.spec.js.ejs +32 -10
  27. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/user.types.js.ejs +1 -1
  28. package/templates/clean-architecture/js/src/interfaces/routes/api.js.ejs +15 -0
  29. package/templates/clean-architecture/js/src/interfaces/routes/api.spec.js.ejs +4 -0
  30. package/templates/clean-architecture/js/src/usecases/CreateUser.js.ejs +34 -0
  31. package/templates/clean-architecture/js/src/usecases/CreateUser.spec.js.ejs +3 -2
  32. package/templates/clean-architecture/js/src/usecases/DeleteUser.js.ejs +27 -0
  33. package/templates/clean-architecture/js/src/usecases/GetAllUsers.js.ejs +36 -0
  34. package/templates/clean-architecture/js/src/usecases/GetAllUsers.spec.js.ejs +14 -0
  35. package/templates/clean-architecture/js/src/usecases/GetUserById.js.ejs +36 -0
  36. package/templates/clean-architecture/js/src/usecases/GetUserById.spec.js.ejs +48 -0
  37. package/templates/clean-architecture/js/src/usecases/UpdateUser.js.ejs +28 -0
  38. package/templates/clean-architecture/js/src/utils/errorMessages.js +1 -0
  39. package/templates/clean-architecture/js/src/utils/httpCodes.js +2 -0
  40. package/templates/clean-architecture/ts/src/config/env.ts.ejs +12 -3
  41. package/templates/clean-architecture/ts/src/domain/user.ts +3 -1
  42. package/templates/clean-architecture/ts/src/index.ts.ejs +4 -0
  43. package/templates/clean-architecture/ts/src/infrastructure/repositories/UserRepository.spec.ts.ejs +55 -9
  44. package/templates/clean-architecture/ts/src/infrastructure/repositories/userRepository.ts.ejs +32 -3
  45. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.spec.ts.ejs +26 -6
  46. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.ts.ejs +57 -15
  47. package/templates/clean-architecture/ts/src/interfaces/graphql/context.spec.ts.ejs +38 -23
  48. package/templates/clean-architecture/ts/src/interfaces/graphql/context.ts.ejs +14 -8
  49. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.spec.ts.ejs +33 -10
  50. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.ts.ejs +15 -5
  51. package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/user.types.ts.ejs +1 -1
  52. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.spec.ts.ejs +9 -1
  53. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.ts.ejs +16 -0
  54. package/templates/clean-architecture/ts/src/usecases/createUser.spec.ts.ejs +3 -2
  55. package/templates/clean-architecture/ts/src/usecases/createUser.ts.ejs +35 -0
  56. package/templates/clean-architecture/ts/src/usecases/deleteUser.spec.ts.ejs +1 -0
  57. package/templates/clean-architecture/ts/src/usecases/deleteUser.ts.ejs +24 -0
  58. package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts.ejs +21 -0
  59. package/templates/clean-architecture/ts/src/usecases/getUserById.spec.ts.ejs +47 -0
  60. package/templates/clean-architecture/ts/src/usecases/getUserById.ts.ejs +23 -0
  61. package/templates/clean-architecture/ts/src/usecases/updateUser.spec.ts.ejs +1 -0
  62. package/templates/clean-architecture/ts/src/usecases/updateUser.ts.ejs +25 -0
  63. package/templates/clean-architecture/ts/src/utils/errorMessages.ts +1 -0
  64. package/templates/clean-architecture/ts/src/utils/httpCodes.ts +1 -0
  65. package/templates/common/.cursorrules.ejs +9 -0
  66. package/templates/common/.env.example.ejs +17 -10
  67. package/templates/common/.gitlab-ci.yml.ejs +3 -1
  68. package/templates/common/Jenkinsfile.ejs +10 -1
  69. package/templates/common/README.md.ejs +64 -19
  70. package/templates/common/_circleci/config.yml.ejs +96 -0
  71. package/templates/common/_github/workflows/ci.yml.ejs +1 -1
  72. package/templates/common/auth/js/controllers/authController.js.ejs +168 -0
  73. package/templates/common/auth/js/controllers/authController.spec.js.ejs +148 -0
  74. package/templates/common/auth/js/middleware/authMiddleware.js.ejs +58 -0
  75. package/templates/common/auth/js/middleware/authMiddleware.spec.js.ejs +108 -0
  76. package/templates/common/auth/js/routes/authRoutes.js.ejs +16 -0
  77. package/templates/common/auth/js/services/jwtService.js.ejs +54 -0
  78. package/templates/common/auth/js/services/jwtService.spec.js.ejs +84 -0
  79. package/templates/common/auth/ts/controllers/authController.spec.ts.ejs +161 -0
  80. package/templates/common/auth/ts/controllers/authController.ts.ejs +165 -0
  81. package/templates/common/auth/ts/middleware/authMiddleware.spec.ts.ejs +128 -0
  82. package/templates/common/auth/ts/middleware/authMiddleware.ts.ejs +59 -0
  83. package/templates/common/auth/ts/routes/authRoutes.ts.ejs +20 -0
  84. package/templates/common/auth/ts/services/jwtService.spec.ts.ejs +89 -0
  85. package/templates/common/auth/ts/services/jwtService.ts.ejs +60 -0
  86. package/templates/common/bitbucket-pipelines.yml.ejs +60 -0
  87. package/templates/common/caching/clean/js/CreateUser.js.ejs +14 -5
  88. package/templates/common/caching/clean/js/DeleteUser.js.ejs +2 -1
  89. package/templates/common/caching/clean/js/GetUserById.js.ejs +39 -0
  90. package/templates/common/caching/clean/js/UpdateUser.js.ejs +2 -1
  91. package/templates/common/caching/clean/ts/createUser.ts.ejs +14 -6
  92. package/templates/common/caching/clean/ts/deleteUser.ts.ejs +2 -1
  93. package/templates/common/caching/clean/ts/getUserById.ts.ejs +32 -0
  94. package/templates/common/caching/clean/ts/updateUser.ts.ejs +2 -2
  95. package/templates/common/database/js/models/User.js.ejs +14 -1
  96. package/templates/common/database/js/models/User.js.mongoose.ejs +7 -0
  97. package/templates/common/database/js/models/User.spec.js.ejs +12 -0
  98. package/templates/common/database/ts/models/User.spec.ts.ejs +10 -0
  99. package/templates/common/database/ts/models/User.ts.ejs +17 -0
  100. package/templates/common/database/ts/models/User.ts.mongoose.ejs +8 -0
  101. package/templates/common/docker-compose.yml.ejs +14 -0
  102. package/templates/common/ecosystem.config.js.ejs +9 -3
  103. package/templates/common/eslint.config.mjs.ejs +3 -0
  104. package/templates/common/jest.config.js.ejs +11 -9
  105. package/templates/common/kafka/js/messaging/baseConsumer.js.ejs +1 -1
  106. package/templates/common/kafka/js/services/kafkaService.js.ejs +1 -1
  107. package/templates/common/migrations/init.js.ejs +5 -4
  108. package/templates/common/package.json.ejs +10 -2
  109. package/templates/common/prompts/project-context.md.ejs +8 -1
  110. package/templates/common/scripts/run-e2e.js.ejs +26 -10
  111. package/templates/common/src/tests/e2e/e2e.users.test.js.ejs +149 -107
  112. package/templates/common/src/tests/e2e/e2e.users.test.ts.ejs +88 -47
  113. package/templates/common/swagger.yml.ejs +148 -0
  114. package/templates/common/tsconfig.eslint.json +15 -0
  115. package/templates/common/tsconfig.json +2 -1
  116. package/templates/common/views/ejs/index.ejs +264 -30
  117. package/templates/common/views/ejs/login.ejs.ejs +244 -0
  118. package/templates/common/views/ejs/signup.ejs.ejs +282 -0
  119. package/templates/common/views/pug/index.pug +269 -38
  120. package/templates/common/views/pug/login.pug.ejs +195 -0
  121. package/templates/common/views/pug/signup.pug.ejs +241 -0
  122. package/templates/db/mysql/V1__Initial_Setup.sql.ejs +6 -0
  123. package/templates/db/postgres/V1__Initial_Setup.sql.ejs +6 -0
  124. package/templates/mvc/js/src/config/env.js.ejs +12 -3
  125. package/templates/mvc/js/src/controllers/userController.js.ejs +29 -5
  126. package/templates/mvc/js/src/controllers/userController.spec.js.ejs +27 -12
  127. package/templates/mvc/js/src/graphql/context.js.ejs +14 -3
  128. package/templates/mvc/js/src/graphql/context.spec.js.ejs +36 -21
  129. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.js.ejs +10 -5
  130. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.spec.js.ejs +32 -10
  131. package/templates/mvc/js/src/graphql/typeDefs/user.types.js.ejs +1 -1
  132. package/templates/mvc/js/src/index.js.ejs +16 -3
  133. package/templates/mvc/js/src/routes/api.js.ejs +14 -0
  134. package/templates/mvc/js/src/routes/api.spec.js.ejs +3 -0
  135. package/templates/mvc/js/src/utils/errorMessages.js +1 -0
  136. package/templates/mvc/js/src/utils/httpCodes.js +1 -0
  137. package/templates/mvc/ts/src/config/env.ts.ejs +12 -3
  138. package/templates/mvc/ts/src/controllers/userController.spec.ts.ejs +95 -7
  139. package/templates/mvc/ts/src/controllers/userController.ts.ejs +68 -11
  140. package/templates/mvc/ts/src/graphql/context.spec.ts.ejs +36 -23
  141. package/templates/mvc/ts/src/graphql/context.ts.ejs +15 -6
  142. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.spec.ts.ejs +32 -10
  143. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.ts.ejs +15 -5
  144. package/templates/mvc/ts/src/graphql/typeDefs/user.types.ts.ejs +1 -1
  145. package/templates/mvc/ts/src/index.ts.ejs +15 -3
  146. package/templates/mvc/ts/src/routes/api.spec.ts.ejs +6 -0
  147. package/templates/mvc/ts/src/routes/api.ts.ejs +15 -0
  148. package/templates/mvc/ts/src/utils/errorMessages.ts +1 -0
  149. package/templates/mvc/ts/src/utils/httpCodes.ts +1 -0
  150. package/templates/clean-architecture/js/src/interfaces/routes/api.js +0 -12
  151. package/templates/clean-architecture/js/src/usecases/CreateUser.js +0 -14
  152. package/templates/clean-architecture/js/src/usecases/DeleteUser.js +0 -11
  153. package/templates/clean-architecture/js/src/usecases/GetAllUsers.js +0 -12
  154. package/templates/clean-architecture/js/src/usecases/UpdateUser.js +0 -11
  155. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.ts +0 -13
  156. package/templates/clean-architecture/ts/src/usecases/createUser.ts +0 -13
  157. package/templates/clean-architecture/ts/src/usecases/deleteUser.ts +0 -9
  158. package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts +0 -10
  159. package/templates/clean-architecture/ts/src/usecases/updateUser.ts +0 -9
  160. package/templates/mvc/js/src/routes/api.js +0 -10
  161. package/templates/mvc/ts/src/routes/api.ts +0 -12
@@ -1,12 +1,21 @@
1
1
  import { Request } from 'express';
2
+ <% if (auth.includes('JWT')) { %>import { JwtService } from '../services/jwtService';<% } %>
2
3
 
3
4
  export interface MyContext {
4
- token?: string;
5
- // user?: User;
5
+ token?: string; // Kept for backward compatibility
6
+ user?: unknown;
6
7
  }
7
8
 
8
- export const gqlContext = async ({ req }: { req: Request }): Promise<MyContext> => {
9
- // Setup authorization or context here
10
- const token = req.headers.authorization || '';
11
- return { token };
9
+ export const gqlContext = async ({ req: <% if (auth.includes('JWT')) { %>req<% } else { %>_req<% } %> }: { req: Request }): Promise<MyContext> => {
10
+ const context: MyContext = {};
11
+ <% if (auth.includes('JWT')) { %>
12
+ const authHeader = req.headers.authorization || '';
13
+ if (authHeader.startsWith('Bearer ')) {
14
+ const token = authHeader.split(' ')[1];
15
+ const user = JwtService.verifyToken(token);
16
+ if (user) {
17
+ context.user = user;
18
+ }
19
+ }<% } %>
20
+ return context;
12
21
  };
@@ -15,40 +15,62 @@ jest.mock('@/controllers/userController', () => {
15
15
  });
16
16
 
17
17
  describe('User Resolvers', () => {
18
+ const mockContext = {
19
+ <% if (auth.includes('JWT')) { %>user: { id: 'admin', email: 'admin@test.com' }<% } %>
20
+ };
21
+
18
22
  afterEach(() => {
19
23
  jest.clearAllMocks();
20
24
  });
21
25
 
22
26
  describe('Query.getAllUsers', () => {
23
- it('should return all users', async () => {
24
- const result = await userResolvers.Query.getAllUsers();
27
+ it('should return all users when authorized', async () => {
28
+ const result = await userResolvers.Query.getAllUsers(null, null, mockContext);
25
29
  expect(result).toEqual([{ id: '1', name: 'John Doe', email: 'john@example.com' }]);
26
30
  expect(mockGetUsers).toHaveBeenCalledTimes(1);
27
31
  });
32
+
33
+ <% if (auth.includes('JWT')) { %>
34
+ it('should throw error when unauthorized', async () => {
35
+ await expect(userResolvers.Query.getAllUsers(null, null, {})).rejects.toThrow('Unauthorized');
36
+ });
37
+ <% } %>
28
38
  });
29
39
 
30
40
  describe('Mutation.createUser', () => {
31
- it('should create and return a new user', async () => {
32
- const result = await userResolvers.Mutation.createUser(null, { name: 'Jane', email: 'jane@example.com' });
41
+ it('should create and return a new user (Public)', async () => {
42
+ const payload = { name: 'Jane', email: 'jane@example.com'<% if (auth.some(a => a !=='None')) { %>, password: 'password123'<% } %> };
43
+ const result = await userResolvers.Mutation.createUser(null, payload);
33
44
  expect(result).toEqual({ id: '1', name: 'Jane', email: 'jane@example.com' });
34
- expect(mockCreateUser).toHaveBeenCalledWith({ name: 'Jane', email: 'jane@example.com' });
35
- expect(mockCreateUser).toHaveBeenCalledTimes(1);
45
+ expect(mockCreateUser).toHaveBeenCalledWith(payload);
36
46
  });
37
47
  });
38
48
 
39
49
  describe('Mutation.updateUser', () => {
40
- it('should update and return the user', async () => {
50
+ it('should update and return the user when authorized', async () => {
41
51
  const payload = { name: 'Updated' };
42
- const result = await userResolvers.Mutation.updateUser(null, { id: '1', ...payload });
52
+ const result = await userResolvers.Mutation.updateUser(null, { id: '1', ...payload }, mockContext);
43
53
  expect(result).toMatchObject(payload);
44
54
  });
55
+
56
+ <% if (auth.includes('JWT')) { %>
57
+ it('should throw error when unauthorized', async () => {
58
+ await expect(userResolvers.Mutation.updateUser(null, { id: '1', name: 'N' }, {})).rejects.toThrow('Unauthorized');
59
+ });
60
+ <% } %>
45
61
  });
46
62
 
47
63
  describe('Mutation.deleteUser', () => {
48
- it('should delete and return true', async () => {
49
- const result = await userResolvers.Mutation.deleteUser(null, { id: '1' });
64
+ it('should delete and return true when authorized', async () => {
65
+ const result = await userResolvers.Mutation.deleteUser(null, { id: '1' }, mockContext);
50
66
  expect(result).toBe(true);
51
67
  });
68
+
69
+ <% if (auth.includes('JWT')) { %>
70
+ it('should throw error when unauthorized', async () => {
71
+ await expect(userResolvers.Mutation.deleteUser(null, { id: '1' }, {})).rejects.toThrow('Unauthorized');
72
+ });
73
+ <% } %>
52
74
  });
53
75
  <%_ if (database === 'MongoDB') { -%>
54
76
  describe('User.id', () => {
@@ -1,24 +1,34 @@
1
1
  import { UserController } from '@/controllers/userController';
2
+ import { MyContext } from '@/graphql/context';
2
3
 
3
4
  const userController = new UserController();
4
5
 
5
6
  export const userResolvers = {
6
7
  Query: {
7
- getAllUsers: async () => {
8
+ getAllUsers: async (_: unknown, __: unknown, <% if (auth.includes('JWT')) { %>context<% } else { %>_context<% } %>: MyContext) => {
9
+ <%_ if (auth.includes('JWT')) { -%>
10
+ if (!context.user) throw new Error('Unauthorized');
11
+ <%_ } -%>
8
12
  const users = await userController.getUsers();
9
13
  return users;
10
14
  }
11
15
  },
12
16
  Mutation: {
13
- createUser: async (_: unknown, { name, email }: { name: string, email: string }) => {
14
- const user = await userController.createUser({ name, email });
17
+ createUser: async (_: unknown, { name, email<% if (auth.some(a => a !=='None')) { %>, password<% } %> }: { name: string, email: string<% if (auth.some(a => a !=='None')) { %>, password: string<% } %> }) => {
18
+ const user = await userController.createUser({ name, email<% if (auth.some(a => a !=='None')) { %>, password<% } %> });
15
19
  return user;
16
20
  },
17
- updateUser: async (_: unknown, { id, name, email }: { id: string, name?: string, email?: string }) => {
21
+ updateUser: async (_: unknown, { id, name, email }: { id: string, name?: string, email?: string }, <% if (auth.includes('JWT')) { %>context<% } else { %>_context<% } %>: MyContext) => {
22
+ <%_ if (auth.includes('JWT')) { -%>
23
+ if (!context.user) throw new Error('Unauthorized');
24
+ <%_ } -%>
18
25
  const user = await userController.updateUser(id, { name, email });
19
26
  return user;
20
27
  },
21
- deleteUser: async (_: unknown, { id }: { id: string }) => {
28
+ deleteUser: async (_: unknown, { id }: { id: string }, <% if (auth.includes('JWT')) { %>context<% } else { %>_context<% } %>: MyContext) => {
29
+ <%_ if (auth.includes('JWT')) { -%>
30
+ if (!context.user) throw new Error('Unauthorized');
31
+ <%_ } -%>
22
32
  const result = await userController.deleteUser(id);
23
33
  return result;
24
34
  }
@@ -10,7 +10,7 @@ export const userTypes = `#graphql
10
10
  }
11
11
 
12
12
  type Mutation {
13
- createUser(name: String!, email: String!): User
13
+ createUser(name: String!, email: String!<%_ if (auth.some(a => a !=='None')) { _%>, password: String!<%_ } _%>): User
14
14
  updateUser(id: ID!, name: String, email: String): User
15
15
  deleteUser(id: ID!): Boolean
16
16
  }
@@ -12,6 +12,7 @@ import morgan from 'morgan';
12
12
  import { errorMiddleware } from '@/utils/errorMiddleware';
13
13
  import { setupGracefulShutdown } from '@/utils/gracefulShutdown';
14
14
  import healthRoutes from '@/routes/healthRoute';
15
+ <%_ if (auth.includes('JWT')) { -%>import authRoutes from '@/routes/authRoutes';<%_ } -%>
15
16
  <%_ if (communication === 'REST APIs' || communication === 'Kafka') { -%>
16
17
  import apiRoutes from '@/routes/api';
17
18
  import swaggerUi from 'swagger-ui-express';
@@ -52,6 +53,7 @@ const limiter = rateLimit({ windowMs: 10 * 60 * 1000, max: 100 });
52
53
  app.use(limiter);
53
54
 
54
55
  app.use(express.json());
56
+ app.use(express.urlencoded({ extended: true }));
55
57
  app.use(morgan('combined', { stream: { write: (message) => logger.info(message.trim()) } }));
56
58
  <%_ if (communication === 'REST APIs' || communication === 'Kafka') { -%>
57
59
  app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpecs));
@@ -64,15 +66,25 @@ app.set('view engine', '<%= viewEngine.toLowerCase() %>');
64
66
  app.use(express.static(path.join(__dirname, '../public')));<%_ } %>
65
67
  <%_ if (communication === 'REST APIs' || communication === 'Kafka') { -%>
66
68
  app.use('/api', apiRoutes);
67
- <%_ } -%><% if (viewEngine && viewEngine !== 'None') { -%>
69
+ <%_ } -%><%_ if (auth.includes('JWT')) { -%>
70
+ app.use('/api/auth', authRoutes);
71
+ <%_ } -%>
72
+
73
+ <% if (viewEngine && viewEngine !== 'None') { -%>
68
74
  app.get('/', (req: Request, res: Response) => {
69
75
  res.render('index', {
70
- projectName: 'NodeJS Service',
76
+ projectName: '<%= projectName %>',
71
77
  architecture: 'MVC',
72
78
  database: '<%= database %>',
73
- communication: '<%= communication %>'
79
+ communication: '<%= communication %>',
80
+ auth: <%- JSON.stringify(auth) %>
74
81
  });
75
82
  });
83
+
84
+ <%_ if (auth.includes('JWT')) { %>
85
+ app.get('/login', (req: Request, res: Response) => res.render('login', { projectName: '<%= projectName %>' }));
86
+ app.get('/signup', (req: Request, res: Response) => res.render('signup', { projectName: '<%= projectName %>' }));
87
+ <% } -%>
76
88
  <% } -%>
77
89
  app.use('/health', healthRoutes);
78
90
 
@@ -2,6 +2,12 @@ import request from 'supertest';
2
2
  import express, { Express } from 'express';
3
3
  import router from '@/routes/api';
4
4
 
5
+ <%_ if (auth.includes('JWT')) { _%>
6
+ jest.mock('@/middleware/authMiddleware', () => ({
7
+ authMiddleware: jest.fn((req, res, next) => next())
8
+ }));
9
+ <%_ } _%>
10
+
5
11
  const mockGetUsers = jest.fn().mockImplementation((req, res) => res.status(200).json([{ id: '1', name: 'John Doe' }]));
6
12
  const mockCreateUser = jest.fn().mockImplementation((req, res) => res.status(201).json({ id: '1', name: 'Test' }));
7
13
  const mockUpdateUser = jest.fn().mockImplementation((req, res) => res.status(200).json({ id: '1', name: 'Updated' }));
@@ -0,0 +1,15 @@
1
+ import { Router, Request, Response, NextFunction } from 'express';
2
+ import { UserController } from '@/controllers/userController';
3
+ <%_ if (auth.includes('JWT')) { _%>
4
+ import { authMiddleware } from '@/middleware/authMiddleware';
5
+ <%_ } _%>
6
+ const router = Router();
7
+ const userController = new UserController();
8
+
9
+ router.get('/users', <% if (auth.includes('JWT')) { %>authMiddleware, <% } %>(req: Request, res: Response, next: NextFunction) => userController.getUsers(req, res, next));
10
+ router.get('/users/:id', <% if (auth.includes('JWT')) { %>authMiddleware, <% } %>(req: Request, res: Response, next: NextFunction) => userController.getUserById(req, res, next));
11
+ router.post('/users', (req: Request, res: Response, next: NextFunction) => userController.createUser(req, res, next));
12
+ router.patch('/users/:id', <% if (auth.includes('JWT')) { %>authMiddleware, <% } %>(req: Request, res: Response, next: NextFunction) => userController.updateUser(req, res, next));
13
+ router.delete('/users/:id', <% if (auth.includes('JWT')) { %>authMiddleware, <% } %>(req: Request, res: Response, next: NextFunction) => userController.deleteUser(req, res, next));
14
+
15
+ export default router;
@@ -5,6 +5,7 @@ export const ERROR_MESSAGES = {
5
5
  INTERNAL_SERVER_ERROR: 'Internal Server Error',
6
6
  BAD_REQUEST: 'Bad Request',
7
7
  FETCH_USERS_ERROR: 'Error fetching users',
8
+ FETCH_USER_ERROR: 'Error fetching user',
8
9
  CREATE_USER_ERROR: 'Error creating user',
9
10
  UPDATE_USER_ERROR: 'Error updating user',
10
11
  DELETE_USER_ERROR: 'Error deleting user',
@@ -2,6 +2,7 @@ export const HTTP_STATUS = {
2
2
  OK: 200,
3
3
  CREATED: 201,
4
4
  BAD_REQUEST: 400,
5
+ UNAUTHORIZED: 401,
5
6
  NOT_FOUND: 404,
6
7
  INTERNAL_SERVER_ERROR: 500
7
8
  } as const;
@@ -1,12 +0,0 @@
1
- const express = require('express');
2
- const router = express.Router();
3
- const UserController = require('../controllers/userController');
4
-
5
- const userController = new UserController();
6
-
7
- router.post('/users', (req, res, next) => userController.createUser(req, res, next));
8
- router.get('/users', (req, res, next) => userController.getUsers(req, res, next));
9
- router.patch('/users/:id', (req, res, next) => userController.updateUser(req, res, next));
10
- router.delete('/users/:id', (req, res, next) => userController.deleteUser(req, res, next));
11
-
12
- module.exports = router;
@@ -1,14 +0,0 @@
1
- const User = require('../domain/models/User');
2
-
3
- class CreateUser {
4
- constructor(userRepository) {
5
- this.userRepository = userRepository;
6
- }
7
-
8
- async execute(name, email) {
9
- const user = new User(null, name, email);
10
- return await this.userRepository.save(user);
11
- }
12
- }
13
-
14
- module.exports = CreateUser;
@@ -1,11 +0,0 @@
1
- class DeleteUser {
2
- constructor(userRepository) {
3
- this.userRepository = userRepository;
4
- }
5
-
6
- async execute(id) {
7
- return this.userRepository.delete(id);
8
- }
9
- }
10
-
11
- module.exports = DeleteUser;
@@ -1,12 +0,0 @@
1
-
2
- class GetAllUsers {
3
- constructor(userRepository) {
4
- this.userRepository = userRepository;
5
- }
6
-
7
- async execute() {
8
- return await this.userRepository.getUsers();
9
- }
10
- }
11
-
12
- module.exports = GetAllUsers;
@@ -1,11 +0,0 @@
1
- class UpdateUser {
2
- constructor(userRepository) {
3
- this.userRepository = userRepository;
4
- }
5
-
6
- async execute(id, data) {
7
- return this.userRepository.update(id, data);
8
- }
9
- }
10
-
11
- module.exports = UpdateUser;
@@ -1,13 +0,0 @@
1
- import { Router, Request, Response, NextFunction } from 'express';
2
- import { UserController } from '@/interfaces/controllers/userController';
3
-
4
- const router = Router();
5
- const userController = new UserController();
6
-
7
- router.post('/', (req: Request, res: Response, next: NextFunction) => userController.createUser(req, res, next));
8
- router.get('/', (req: Request, res: Response, next: NextFunction) => userController.getUsers(req, res, next));
9
- router.patch('/:id', (req: Request, res: Response, next: NextFunction) => userController.updateUser(req, res, next));
10
- router.delete('/:id', (req: Request, res: Response, next: NextFunction) => userController.deleteUser(req, res, next));
11
-
12
- export default router;
13
-
@@ -1,13 +0,0 @@
1
- import { User } from '@/domain/user';
2
-
3
- import { UserRepository } from '@/infrastructure/repositories/UserRepository';
4
-
5
- export default class CreateUser {
6
- constructor(private userRepository: UserRepository) {}
7
-
8
- async execute(name: string, email: string) {
9
- const user = new User(null, name, email);
10
- return this.userRepository.save(user);
11
- }
12
- }
13
-
@@ -1,9 +0,0 @@
1
- import { UserRepository } from '@/infrastructure/repositories/UserRepository';
2
-
3
- export default class DeleteUser {
4
- constructor(private userRepository: UserRepository) {}
5
-
6
- async execute(id: number | string) {
7
- return this.userRepository.delete(id);
8
- }
9
- }
@@ -1,10 +0,0 @@
1
- import { UserRepository } from '@/infrastructure/repositories/UserRepository';
2
-
3
- export default class GetAllUsers {
4
- constructor(private userRepository: UserRepository) {}
5
-
6
- async execute() {
7
- return this.userRepository.getUsers();
8
- }
9
- }
10
-
@@ -1,9 +0,0 @@
1
- import { UserRepository } from '@/infrastructure/repositories/UserRepository';
2
-
3
- export default class UpdateUser {
4
- constructor(private userRepository: UserRepository) {}
5
-
6
- async execute(id: number | string, data: { name?: string, email?: string }) {
7
- return this.userRepository.update(id, data);
8
- }
9
- }
@@ -1,10 +0,0 @@
1
- const express = require('express');
2
- const router = express.Router();
3
- const userController = require('../controllers/userController');
4
-
5
- router.get('/users', userController.getUsers);
6
- router.post('/users', userController.createUser);
7
- router.patch('/users/:id', userController.updateUser);
8
- router.delete('/users/:id', userController.deleteUser);
9
-
10
- module.exports = router;
@@ -1,12 +0,0 @@
1
- import { Router, Request, Response, NextFunction } from 'express';
2
- import { UserController } from '@/controllers/userController';
3
-
4
- const router = Router();
5
- const userController = new UserController();
6
-
7
- router.get('/users', (req: Request, res: Response, next: NextFunction) => userController.getUsers(req, res, next));
8
- router.post('/users', (req: Request, res: Response, next: NextFunction) => userController.createUser(req, res, next));
9
- router.patch('/users/:id', (req: Request, res: Response, next: NextFunction) => userController.updateUser(req, res, next));
10
- router.delete('/users/:id', (req: Request, res: Response, next: NextFunction) => userController.deleteUser(req, res, next));
11
-
12
- export default router;