nodejs-quickstart-structure 2.0.1 → 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.
- package/CHANGELOG.md +14 -0
- package/README.md +43 -39
- package/bin/index.js +5 -2
- package/lib/generator.js +10 -4
- package/lib/modules/app-setup.js +76 -6
- package/lib/modules/auth-setup.js +143 -0
- package/lib/modules/caching-setup.js +8 -1
- package/lib/modules/database-setup.js +2 -1
- package/lib/modules/project-setup.js +1 -0
- package/lib/prompts.js +39 -0
- package/package.json +5 -4
- package/templates/clean-architecture/js/src/domain/models/User.js +3 -1
- package/templates/clean-architecture/js/src/index.js.ejs +2 -0
- package/templates/clean-architecture/js/src/infrastructure/config/env.js.ejs +12 -3
- package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.js.ejs +25 -2
- package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.spec.js.ejs +27 -0
- package/templates/clean-architecture/js/src/infrastructure/webserver/server.js.ejs +3 -0
- package/templates/clean-architecture/js/src/infrastructure/webserver/server.spec.js.ejs +49 -0
- package/templates/clean-architecture/js/src/infrastructure/webserver/swagger.spec.js.ejs +14 -0
- package/templates/clean-architecture/js/src/interfaces/controllers/userController.js.ejs +41 -4
- package/templates/clean-architecture/js/src/interfaces/controllers/userController.spec.js.ejs +69 -4
- package/templates/clean-architecture/js/src/interfaces/graphql/context.js.ejs +13 -6
- package/templates/clean-architecture/js/src/interfaces/graphql/context.spec.js.ejs +38 -21
- package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.js.ejs +10 -5
- package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.spec.js.ejs +32 -10
- package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/user.types.js.ejs +1 -1
- package/templates/clean-architecture/js/src/interfaces/routes/api.js.ejs +15 -0
- package/templates/clean-architecture/js/src/interfaces/routes/api.spec.js.ejs +4 -0
- package/templates/clean-architecture/js/src/usecases/CreateUser.js.ejs +34 -0
- package/templates/clean-architecture/js/src/usecases/CreateUser.spec.js.ejs +3 -2
- package/templates/clean-architecture/js/src/usecases/DeleteUser.js.ejs +27 -0
- package/templates/clean-architecture/js/src/usecases/GetAllUsers.js.ejs +36 -0
- package/templates/clean-architecture/js/src/usecases/GetAllUsers.spec.js.ejs +14 -0
- package/templates/clean-architecture/js/src/usecases/GetUserById.js.ejs +36 -0
- package/templates/clean-architecture/js/src/usecases/GetUserById.spec.js.ejs +48 -0
- package/templates/clean-architecture/js/src/usecases/UpdateUser.js.ejs +28 -0
- package/templates/clean-architecture/js/src/utils/errorMessages.js +1 -0
- package/templates/clean-architecture/js/src/utils/httpCodes.js +2 -0
- package/templates/clean-architecture/ts/src/config/env.ts.ejs +12 -3
- package/templates/clean-architecture/ts/src/domain/user.ts +3 -1
- package/templates/clean-architecture/ts/src/index.ts.ejs +4 -0
- package/templates/clean-architecture/ts/src/infrastructure/repositories/UserRepository.spec.ts.ejs +55 -9
- package/templates/clean-architecture/ts/src/infrastructure/repositories/userRepository.ts.ejs +32 -3
- package/templates/clean-architecture/ts/src/interfaces/controllers/userController.spec.ts.ejs +26 -6
- package/templates/clean-architecture/ts/src/interfaces/controllers/userController.ts.ejs +57 -15
- package/templates/clean-architecture/ts/src/interfaces/graphql/context.spec.ts.ejs +38 -23
- package/templates/clean-architecture/ts/src/interfaces/graphql/context.ts.ejs +14 -8
- package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.spec.ts.ejs +33 -10
- package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.ts.ejs +15 -5
- package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/user.types.ts.ejs +1 -1
- package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.spec.ts.ejs +9 -1
- package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.ts.ejs +16 -0
- package/templates/clean-architecture/ts/src/usecases/createUser.spec.ts.ejs +3 -2
- package/templates/clean-architecture/ts/src/usecases/createUser.ts.ejs +35 -0
- package/templates/clean-architecture/ts/src/usecases/deleteUser.spec.ts.ejs +1 -0
- package/templates/clean-architecture/ts/src/usecases/deleteUser.ts.ejs +24 -0
- package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts.ejs +21 -0
- package/templates/clean-architecture/ts/src/usecases/getUserById.spec.ts.ejs +47 -0
- package/templates/clean-architecture/ts/src/usecases/getUserById.ts.ejs +23 -0
- package/templates/clean-architecture/ts/src/usecases/updateUser.spec.ts.ejs +1 -0
- package/templates/clean-architecture/ts/src/usecases/updateUser.ts.ejs +25 -0
- package/templates/clean-architecture/ts/src/utils/errorMessages.ts +1 -0
- package/templates/clean-architecture/ts/src/utils/httpCodes.ts +1 -0
- package/templates/common/.cursorrules.ejs +9 -0
- package/templates/common/.env.example.ejs +17 -10
- package/templates/common/README.md.ejs +63 -18
- package/templates/common/auth/js/controllers/authController.js.ejs +168 -0
- package/templates/common/auth/js/controllers/authController.spec.js.ejs +148 -0
- package/templates/common/auth/js/middleware/authMiddleware.js.ejs +58 -0
- package/templates/common/auth/js/middleware/authMiddleware.spec.js.ejs +108 -0
- package/templates/common/auth/js/routes/authRoutes.js.ejs +16 -0
- package/templates/common/auth/js/services/jwtService.js.ejs +54 -0
- package/templates/common/auth/js/services/jwtService.spec.js.ejs +84 -0
- package/templates/common/auth/ts/controllers/authController.spec.ts.ejs +161 -0
- package/templates/common/auth/ts/controllers/authController.ts.ejs +165 -0
- package/templates/common/auth/ts/middleware/authMiddleware.spec.ts.ejs +128 -0
- package/templates/common/auth/ts/middleware/authMiddleware.ts.ejs +59 -0
- package/templates/common/auth/ts/routes/authRoutes.ts.ejs +20 -0
- package/templates/common/auth/ts/services/jwtService.spec.ts.ejs +89 -0
- package/templates/common/auth/ts/services/jwtService.ts.ejs +60 -0
- package/templates/common/caching/clean/js/CreateUser.js.ejs +14 -5
- package/templates/common/caching/clean/js/DeleteUser.js.ejs +2 -1
- package/templates/common/caching/clean/js/GetUserById.js.ejs +39 -0
- package/templates/common/caching/clean/js/UpdateUser.js.ejs +2 -1
- package/templates/common/caching/clean/ts/createUser.ts.ejs +14 -6
- package/templates/common/caching/clean/ts/deleteUser.ts.ejs +2 -1
- package/templates/common/caching/clean/ts/getUserById.ts.ejs +32 -0
- package/templates/common/caching/clean/ts/updateUser.ts.ejs +2 -1
- package/templates/common/database/js/models/User.js.ejs +14 -1
- package/templates/common/database/js/models/User.js.mongoose.ejs +7 -0
- package/templates/common/database/js/models/User.spec.js.ejs +12 -0
- package/templates/common/database/ts/models/User.spec.ts.ejs +10 -0
- package/templates/common/database/ts/models/User.ts.ejs +17 -0
- package/templates/common/database/ts/models/User.ts.mongoose.ejs +8 -0
- package/templates/common/docker-compose.yml.ejs +12 -0
- package/templates/common/ecosystem.config.js.ejs +9 -3
- package/templates/common/eslint.config.mjs.ejs +3 -0
- package/templates/common/jest.config.js.ejs +11 -9
- package/templates/common/kafka/js/messaging/baseConsumer.js.ejs +1 -1
- package/templates/common/kafka/js/services/kafkaService.js.ejs +1 -1
- package/templates/common/migrations/init.js.ejs +5 -4
- package/templates/common/package.json.ejs +8 -1
- package/templates/common/prompts/project-context.md.ejs +8 -1
- package/templates/common/src/tests/e2e/e2e.users.test.js.ejs +149 -107
- package/templates/common/src/tests/e2e/e2e.users.test.ts.ejs +88 -47
- package/templates/common/swagger.yml.ejs +148 -0
- package/templates/common/tsconfig.eslint.json +15 -0
- package/templates/common/tsconfig.json +2 -1
- package/templates/common/views/ejs/index.ejs +264 -30
- package/templates/common/views/ejs/login.ejs.ejs +244 -0
- package/templates/common/views/ejs/signup.ejs.ejs +282 -0
- package/templates/common/views/pug/index.pug +269 -38
- package/templates/common/views/pug/login.pug.ejs +195 -0
- package/templates/common/views/pug/signup.pug.ejs +241 -0
- package/templates/db/mysql/V1__Initial_Setup.sql.ejs +6 -0
- package/templates/db/postgres/V1__Initial_Setup.sql.ejs +6 -0
- package/templates/mvc/js/src/config/env.js.ejs +12 -3
- package/templates/mvc/js/src/controllers/userController.js.ejs +29 -5
- package/templates/mvc/js/src/controllers/userController.spec.js.ejs +27 -12
- package/templates/mvc/js/src/graphql/context.js.ejs +14 -3
- package/templates/mvc/js/src/graphql/context.spec.js.ejs +36 -21
- package/templates/mvc/js/src/graphql/resolvers/user.resolvers.js.ejs +10 -5
- package/templates/mvc/js/src/graphql/resolvers/user.resolvers.spec.js.ejs +32 -10
- package/templates/mvc/js/src/graphql/typeDefs/user.types.js.ejs +1 -1
- package/templates/mvc/js/src/index.js.ejs +16 -3
- package/templates/mvc/js/src/routes/api.js.ejs +14 -0
- package/templates/mvc/js/src/routes/api.spec.js.ejs +3 -0
- package/templates/mvc/js/src/utils/errorMessages.js +1 -0
- package/templates/mvc/js/src/utils/httpCodes.js +1 -0
- package/templates/mvc/ts/src/config/env.ts.ejs +12 -3
- package/templates/mvc/ts/src/controllers/userController.spec.ts.ejs +95 -7
- package/templates/mvc/ts/src/controllers/userController.ts.ejs +68 -11
- package/templates/mvc/ts/src/graphql/context.spec.ts.ejs +36 -23
- package/templates/mvc/ts/src/graphql/context.ts.ejs +15 -6
- package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.spec.ts.ejs +32 -10
- package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.ts.ejs +15 -5
- package/templates/mvc/ts/src/graphql/typeDefs/user.types.ts.ejs +1 -1
- package/templates/mvc/ts/src/index.ts.ejs +15 -3
- package/templates/mvc/ts/src/routes/api.spec.ts.ejs +6 -0
- package/templates/mvc/ts/src/routes/api.ts.ejs +15 -0
- package/templates/mvc/ts/src/utils/errorMessages.ts +1 -0
- package/templates/mvc/ts/src/utils/httpCodes.ts +1 -0
- package/templates/clean-architecture/js/src/interfaces/routes/api.js +0 -12
- package/templates/clean-architecture/js/src/usecases/CreateUser.js +0 -14
- package/templates/clean-architecture/js/src/usecases/DeleteUser.js +0 -11
- package/templates/clean-architecture/js/src/usecases/GetAllUsers.js +0 -12
- package/templates/clean-architecture/js/src/usecases/UpdateUser.js +0 -11
- package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.ts +0 -13
- package/templates/clean-architecture/ts/src/usecases/createUser.ts +0 -13
- package/templates/clean-architecture/ts/src/usecases/deleteUser.ts +0 -9
- package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts +0 -10
- package/templates/clean-architecture/ts/src/usecases/updateUser.ts +0 -9
- package/templates/mvc/js/src/routes/api.js +0 -10
- 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
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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(
|
|
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
|
|
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 (
|
|
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: '
|
|
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',
|
|
@@ -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,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 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;
|