nestforge-generator 0.2.0 → 0.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 (156) hide show
  1. package/README.md +24 -7
  2. package/README.pt-BR.md +24 -7
  3. package/dist/features/auth-strategy.js +7 -7
  4. package/dist/features/database.js +35 -0
  5. package/dist/features/database.js.map +1 -1
  6. package/dist/features/dependencies.js +3 -3
  7. package/dist/features/language.js +1 -1
  8. package/dist/features/language.js.map +1 -1
  9. package/dist/features/markers.js +11 -11
  10. package/dist/features/markers.js.map +1 -1
  11. package/dist/generator.js +14 -2
  12. package/dist/generator.js.map +1 -1
  13. package/dist/index.js +8 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/project-name.js +50 -0
  16. package/dist/project-name.js.map +1 -0
  17. package/dist/prompts.js +15 -11
  18. package/dist/prompts.js.map +1 -1
  19. package/package.json +2 -1
  20. package/templates/drizzle/README.md +2 -0
  21. package/templates/drizzle/README.pt-BR.md +2 -0
  22. package/templates/drizzle/drizzle.config.ts +2 -2
  23. package/templates/drizzle/src/auth/auth.controller.ts +35 -35
  24. package/templates/drizzle/src/auth/auth.service.spec.ts +4 -4
  25. package/templates/drizzle/src/auth/auth.service.ts +9 -9
  26. package/templates/drizzle/src/auth/dto/forgot-password.dto.ts +2 -2
  27. package/templates/drizzle/src/auth/dto/login.dto.ts +3 -3
  28. package/templates/drizzle/src/auth/dto/register.dto.ts +4 -4
  29. package/templates/drizzle/src/auth/dto/reset-password.dto.ts +3 -3
  30. package/templates/drizzle/src/auth/guards/github-auth.guard.ts +2 -2
  31. package/templates/drizzle/src/auth/guards/google-auth.guard.ts +2 -2
  32. package/templates/drizzle/src/auth/guards/session-auth.guard.spec.ts +4 -4
  33. package/templates/drizzle/src/auth/guards/session-auth.guard.ts +2 -2
  34. package/templates/drizzle/src/auth/session.service.spec.ts +5 -5
  35. package/templates/drizzle/src/auth/session.service.ts +5 -5
  36. package/templates/drizzle/src/auth/strategies/github.strategy.ts +3 -3
  37. package/templates/drizzle/src/auth/token.service.ts +3 -3
  38. package/templates/drizzle/src/common/filters/http-exception.filter.ts +1 -1
  39. package/templates/drizzle/src/common/guards/permissions.guard.spec.ts +7 -7
  40. package/templates/drizzle/src/common/guards/roles.guard.spec.ts +4 -4
  41. package/templates/drizzle/src/common/middleware/csrf.middleware.spec.ts +5 -5
  42. package/templates/drizzle/src/common/middleware/csrf.middleware.ts +2 -2
  43. package/templates/drizzle/src/common/utils/avatar-storage.util.ts +2 -2
  44. package/templates/drizzle/src/config/env.validation.ts +1 -1
  45. package/templates/drizzle/src/database/seed.ts +4 -4
  46. package/templates/drizzle/src/health/health.controller.ts +2 -2
  47. package/templates/drizzle/src/health/indicators/drizzle-health.indicator.spec.ts +5 -5
  48. package/templates/drizzle/src/health/indicators/drizzle-health.indicator.ts +2 -2
  49. package/templates/drizzle/src/health/indicators/redis-health.indicator.spec.ts +5 -5
  50. package/templates/drizzle/src/health/indicators/redis-health.indicator.ts +3 -3
  51. package/templates/drizzle/src/mail/mail.processor.ts +4 -4
  52. package/templates/drizzle/src/mail/templates/email-templates.ts +7 -7
  53. package/templates/drizzle/src/metrics/metrics.service.ts +3 -3
  54. package/templates/drizzle/src/users/dto/create-user.dto.ts +5 -5
  55. package/templates/drizzle/src/users/dto/find-users-query.dto.ts +3 -3
  56. package/templates/drizzle/src/users/users.controller.ts +21 -21
  57. package/templates/drizzle/src/users/users.service.spec.ts +12 -12
  58. package/templates/drizzle/src/users/users.service.ts +4 -4
  59. package/templates/drizzle/test/auth.e2e-spec.ts +8 -8
  60. package/templates/drizzle/test/session-auth.e2e-spec.ts +9 -9
  61. package/templates/drizzle/test/users.e2e-spec.ts +18 -18
  62. package/templates/prisma/.github/workflows/ci.yml +24 -1
  63. package/templates/prisma/ARCHITECTURE.md +7 -1
  64. package/templates/prisma/ARCHITECTURE.pt-BR.md +7 -1
  65. package/templates/prisma/README.md +11 -7
  66. package/templates/prisma/README.pt-BR.md +11 -7
  67. package/templates/prisma/ROADMAP.md +5 -1
  68. package/templates/prisma/ROADMAP.pt-BR.md +5 -1
  69. package/templates/prisma/TESTING.md +25 -3
  70. package/templates/prisma/TESTING.pt-BR.md +25 -3
  71. package/templates/prisma/docker-compose.yml +29 -1
  72. package/templates/prisma/docs/adding-a-module.md +246 -230
  73. package/templates/prisma/docs/features-markers.md +11 -1
  74. package/templates/prisma/prisma/schema.prisma +4 -0
  75. package/templates/prisma/prisma/seed.ts +46 -46
  76. package/templates/prisma/src/auth/auth.controller.ts +35 -35
  77. package/templates/prisma/src/auth/auth.service.spec.ts +3 -3
  78. package/templates/prisma/src/auth/auth.service.ts +11 -11
  79. package/templates/prisma/src/auth/dto/forgot-password.dto.ts +2 -2
  80. package/templates/prisma/src/auth/dto/login.dto.ts +3 -3
  81. package/templates/prisma/src/auth/dto/register.dto.ts +4 -4
  82. package/templates/prisma/src/auth/dto/reset-password.dto.ts +3 -3
  83. package/templates/prisma/src/auth/guards/github-auth.guard.ts +10 -10
  84. package/templates/prisma/src/auth/guards/google-auth.guard.ts +10 -10
  85. package/templates/prisma/src/auth/guards/session-auth.guard.spec.ts +4 -4
  86. package/templates/prisma/src/auth/guards/session-auth.guard.ts +2 -2
  87. package/templates/prisma/src/auth/session.service.spec.ts +5 -5
  88. package/templates/prisma/src/auth/session.service.ts +5 -5
  89. package/templates/prisma/src/auth/strategies/github.strategy.ts +3 -3
  90. package/templates/prisma/src/auth/token.service.ts +14 -5
  91. package/templates/prisma/src/common/filters/http-exception.filter.ts +34 -34
  92. package/templates/prisma/src/common/guards/permissions.guard.spec.ts +7 -7
  93. package/templates/prisma/src/common/guards/roles.guard.spec.ts +4 -4
  94. package/templates/prisma/src/common/middleware/csrf.middleware.spec.ts +5 -5
  95. package/templates/prisma/src/common/middleware/csrf.middleware.ts +2 -2
  96. package/templates/prisma/src/common/utils/avatar-storage.util.ts +32 -32
  97. package/templates/prisma/src/config/env.validation.ts +1 -1
  98. package/templates/prisma/src/health/health.controller.ts +2 -2
  99. package/templates/prisma/src/health/indicators/prisma-health.indicator.spec.ts +39 -22
  100. package/templates/prisma/src/health/indicators/prisma-health.indicator.ts +24 -19
  101. package/templates/prisma/src/health/indicators/redis-health.indicator.spec.ts +5 -5
  102. package/templates/prisma/src/health/indicators/redis-health.indicator.ts +3 -3
  103. package/templates/prisma/src/mail/mail.processor.ts +4 -4
  104. package/templates/prisma/src/mail/templates/email-templates.ts +7 -7
  105. package/templates/prisma/src/metrics/metrics.service.ts +34 -34
  106. package/templates/prisma/src/users/dto/create-user.dto.ts +12 -12
  107. package/templates/prisma/src/users/dto/find-users-query.dto.ts +12 -12
  108. package/templates/prisma/src/users/users.controller.ts +21 -21
  109. package/templates/prisma/src/users/users.service.spec.ts +11 -11
  110. package/templates/prisma/src/users/users.service.ts +4 -4
  111. package/templates/prisma/test/auth.e2e-spec.ts +8 -8
  112. package/templates/prisma/test/session-auth.e2e-spec.ts +9 -9
  113. package/templates/prisma/test/users.e2e-spec.ts +14 -14
  114. package/templates/typeorm/README.md +2 -0
  115. package/templates/typeorm/README.pt-BR.md +2 -0
  116. package/templates/typeorm/src/auth/auth.controller.ts +35 -35
  117. package/templates/typeorm/src/auth/auth.service.spec.ts +4 -4
  118. package/templates/typeorm/src/auth/auth.service.ts +9 -9
  119. package/templates/typeorm/src/auth/dto/forgot-password.dto.ts +2 -2
  120. package/templates/typeorm/src/auth/dto/login.dto.ts +3 -3
  121. package/templates/typeorm/src/auth/dto/register.dto.ts +4 -4
  122. package/templates/typeorm/src/auth/dto/reset-password.dto.ts +3 -3
  123. package/templates/typeorm/src/auth/guards/github-auth.guard.ts +2 -2
  124. package/templates/typeorm/src/auth/guards/google-auth.guard.ts +2 -2
  125. package/templates/typeorm/src/auth/guards/session-auth.guard.spec.ts +4 -4
  126. package/templates/typeorm/src/auth/guards/session-auth.guard.ts +2 -2
  127. package/templates/typeorm/src/auth/session.service.spec.ts +5 -5
  128. package/templates/typeorm/src/auth/session.service.ts +5 -5
  129. package/templates/typeorm/src/auth/strategies/github.strategy.ts +3 -3
  130. package/templates/typeorm/src/auth/token.service.ts +3 -3
  131. package/templates/typeorm/src/common/filters/http-exception.filter.ts +1 -1
  132. package/templates/typeorm/src/common/guards/permissions.guard.spec.ts +7 -7
  133. package/templates/typeorm/src/common/guards/roles.guard.spec.ts +4 -4
  134. package/templates/typeorm/src/common/middleware/csrf.middleware.spec.ts +5 -5
  135. package/templates/typeorm/src/common/middleware/csrf.middleware.ts +2 -2
  136. package/templates/typeorm/src/common/utils/avatar-storage.util.ts +2 -2
  137. package/templates/typeorm/src/config/env.validation.ts +1 -1
  138. package/templates/typeorm/src/database/data-source.ts +2 -2
  139. package/templates/typeorm/src/database/seed.ts +3 -3
  140. package/templates/typeorm/src/database/typeorm-options.ts +2 -2
  141. package/templates/typeorm/src/health/health.controller.ts +2 -2
  142. package/templates/typeorm/src/health/indicators/redis-health.indicator.spec.ts +5 -5
  143. package/templates/typeorm/src/health/indicators/redis-health.indicator.ts +3 -3
  144. package/templates/typeorm/src/health/indicators/typeorm-health.indicator.spec.ts +4 -4
  145. package/templates/typeorm/src/health/indicators/typeorm-health.indicator.ts +2 -2
  146. package/templates/typeorm/src/mail/mail.processor.ts +4 -4
  147. package/templates/typeorm/src/mail/templates/email-templates.ts +7 -7
  148. package/templates/typeorm/src/metrics/metrics.service.ts +3 -3
  149. package/templates/typeorm/src/users/dto/create-user.dto.ts +5 -5
  150. package/templates/typeorm/src/users/dto/find-users-query.dto.ts +3 -3
  151. package/templates/typeorm/src/users/users.controller.ts +21 -21
  152. package/templates/typeorm/src/users/users.service.spec.ts +12 -12
  153. package/templates/typeorm/src/users/users.service.ts +4 -4
  154. package/templates/typeorm/test/auth.e2e-spec.ts +8 -8
  155. package/templates/typeorm/test/session-auth.e2e-spec.ts +9 -9
  156. package/templates/typeorm/test/users.e2e-spec.ts +18 -18
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nestforge-generator",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Interactive CLI for generating a NestJS project from a NestForge starter template",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -40,6 +40,7 @@
40
40
  "postgresql",
41
41
  "mysql",
42
42
  "sqlite",
43
+ "mongodb",
43
44
  "docker",
44
45
  "swagger",
45
46
  "api",
@@ -25,6 +25,8 @@ NestForge is a NestJS starter designed to accelerate the beginning of serious ba
25
25
  - 🐳 **Docker** — complete environment with a single command
26
26
  - ⚙️ **CI/CD** — GitHub Actions (build, lint, test)
27
27
 
28
+ > **MongoDB compatibility:** MongoDB is not available in this template because Drizzle does not currently provide an official MongoDB dialect. MongoDB generation is currently available through the Prisma template.
29
+
28
30
  ## 🧱 Stack
29
31
 
30
32
  | Layer | Technology |
@@ -25,6 +25,8 @@ NestForge é um boilerplate de NestJS pensado para acelerar o início de projeto
25
25
  - 🐳 **Docker** — ambiente completo com um comando
26
26
  - ⚙️ **CI/CD** — GitHub Actions (build, lint, test)
27
27
 
28
+ > **Compatibilidade com MongoDB:** o MongoDB não está disponível neste template porque o Drizzle não oferece atualmente um dialeto oficial para MongoDB. A geração com MongoDB está disponível atualmente por meio do template Prisma.
29
+
28
30
  ## 🧱 Stack
29
31
 
30
32
  | Camada | Tecnologia |
@@ -3,7 +3,7 @@ import { defineConfig } from 'drizzle-kit';
3
3
  const databaseUrl = process.env.DATABASE_URL;
4
4
 
5
5
  if (!databaseUrl) {
6
- throw new Error('DATABASE_URL não foi definida');
6
+ throw new Error('DATABASE_URL is not defined');
7
7
  }
8
8
 
9
9
  // nestforge:feature:database:postgres
@@ -46,4 +46,4 @@ export default defineConfig({
46
46
  verbose: true,
47
47
  strict: true,
48
48
  });
49
- // nestforge:feature:database:sqlite:end
49
+ // nestforge:feature:database:sqlite:end
@@ -52,10 +52,10 @@ export class AuthController {
52
52
  @Public()
53
53
  @Get('csrf-token')
54
54
  // nestforge:feature:swagger
55
- @ApiOperation({ summary: 'Emite um token CSRF vinculado à sessão' })
55
+ @ApiOperation({ summary: 'Issues a CSRF token bound to the session' })
56
56
  @ApiResponse({
57
57
  status: 200,
58
- description: 'Token CSRF emitido',
58
+ description: 'CSRF token issued',
59
59
  schema: {
60
60
  example: {
61
61
  csrfToken: 'a1b2c3d4e5f6...',
@@ -72,9 +72,9 @@ export class AuthController {
72
72
  @Public()
73
73
  @Post('register')
74
74
  // nestforge:feature:swagger
75
- @ApiOperation({ summary: 'Cria uma nova conta' })
76
- @ApiResponse({ status: 201, description: 'Conta criada com sucesso', schema: { example: TOKENS_EXAMPLE } })
77
- @ApiResponse({ status: 409, description: 'E-mail já cadastrado', schema: { example: { statusCode: 409, message: 'E-mail já cadastrado' } } })
75
+ @ApiOperation({ summary: 'Creates a new account' })
76
+ @ApiResponse({ status: 201, description: 'Account created successfully', schema: { example: TOKENS_EXAMPLE } })
77
+ @ApiResponse({ status: 409, description: 'Email already registered', schema: { example: { statusCode: 409, message: 'Email already registered' } } })
78
78
  // nestforge:feature:swagger:end
79
79
  async register(@Body() dto: RegisterDto) {
80
80
  const user = await this.authService.register(dto);
@@ -85,9 +85,9 @@ export class AuthController {
85
85
  @Post('login')
86
86
  @HttpCode(HttpStatus.OK)
87
87
  // nestforge:feature:swagger
88
- @ApiOperation({ summary: 'Autentica e retorna access/refresh token' })
89
- @ApiResponse({ status: 200, description: 'Login realizado com sucesso', schema: { example: TOKENS_EXAMPLE } })
90
- @ApiResponse({ status: 401, description: 'Credenciais inválidas', schema: { example: { statusCode: 401, message: 'Credenciais inválidas' } } })
88
+ @ApiOperation({ summary: 'Authenticates and returns access and refresh tokens' })
89
+ @ApiResponse({ status: 200, description: 'Login completed successfully', schema: { example: TOKENS_EXAMPLE } })
90
+ @ApiResponse({ status: 401, description: 'Invalid credentials', schema: { example: { statusCode: 401, message: 'Invalid credentials' } } })
91
91
  // nestforge:feature:swagger:end
92
92
  async login(@Body() dto: LoginDto) {
93
93
  const user = await this.authService.login(dto);
@@ -99,9 +99,9 @@ export class AuthController {
99
99
  @Public()
100
100
  @Post('register')
101
101
  // nestforge:feature:swagger
102
- @ApiOperation({ summary: 'Cria uma conta e inicia uma sessão' })
103
- @ApiResponse({ status: 201, description: 'Conta criada e sessão iniciada' })
104
- @ApiResponse({ status: 409, description: 'E-mail já cadastrado' })
102
+ @ApiOperation({ summary: 'Creates an account and starts a session' })
103
+ @ApiResponse({ status: 201, description: 'Account created and session started' })
104
+ @ApiResponse({ status: 409, description: 'Email already registered' })
105
105
  // nestforge:feature:swagger:end
106
106
  async registerWithSession(
107
107
  @Body() dto: RegisterDto,
@@ -115,9 +115,9 @@ export class AuthController {
115
115
  @Post('login')
116
116
  @HttpCode(HttpStatus.OK)
117
117
  // nestforge:feature:swagger
118
- @ApiOperation({ summary: 'Autentica e inicia uma sessão por cookie' })
119
- @ApiResponse({ status: 200, description: 'Sessão iniciada com sucesso' })
120
- @ApiResponse({ status: 401, description: 'Credenciais inválidas' })
118
+ @ApiOperation({ summary: 'Authenticates and starts a cookie-based session' })
119
+ @ApiResponse({ status: 200, description: 'Session started successfully' })
120
+ @ApiResponse({ status: 401, description: 'Invalid credentials' })
121
121
  // nestforge:feature:swagger:end
122
122
  async loginWithSession(
123
123
  @Body() dto: LoginDto,
@@ -130,8 +130,8 @@ export class AuthController {
130
130
  @Post('logout')
131
131
  @HttpCode(HttpStatus.OK)
132
132
  // nestforge:feature:swagger
133
- @ApiOperation({ summary: 'Encerra a sessão atual' })
134
- @ApiResponse({ status: 200, description: 'Sessão encerrada com sucesso' })
133
+ @ApiOperation({ summary: 'Ends the current session' })
134
+ @ApiResponse({ status: 200, description: 'Session ended successfully' })
135
135
  // nestforge:feature:swagger:end
136
136
  logoutSession(@Req() request: Request) {
137
137
  return this.sessionService.destroy(request);
@@ -143,9 +143,9 @@ export class AuthController {
143
143
  @Post('refresh')
144
144
  @HttpCode(HttpStatus.OK)
145
145
  // nestforge:feature:swagger
146
- @ApiOperation({ summary: 'Renova o access token usando o refresh token' })
147
- @ApiResponse({ status: 200, description: 'Novo par de tokens emitido', schema: { example: TOKENS_EXAMPLE } })
148
- @ApiResponse({ status: 401, description: 'Refresh token inválido, expirado ou já usado', schema: { example: { statusCode: 401, message: 'Refresh token inválido ou expirado' } } })
146
+ @ApiOperation({ summary: 'Renews the access token using the refresh token' })
147
+ @ApiResponse({ status: 200, description: 'New token pair issued', schema: { example: TOKENS_EXAMPLE } })
148
+ @ApiResponse({ status: 401, description: 'Invalid, expired, or already used refresh token', schema: { example: { statusCode: 401, message: 'Invalid or expired refresh token' } } })
149
149
  // nestforge:feature:swagger:end
150
150
  refresh(@Body() dto: RefreshTokenDto) {
151
151
  return this.tokenService.refresh(dto.refreshToken);
@@ -155,8 +155,8 @@ export class AuthController {
155
155
  @Post('logout')
156
156
  @HttpCode(HttpStatus.OK)
157
157
  // nestforge:feature:swagger
158
- @ApiOperation({ summary: 'Revoga o refresh token informado' })
159
- @ApiResponse({ status: 200, description: 'Logout realizado', schema: { example: { message: 'Logout realizado com sucesso' } } })
158
+ @ApiOperation({ summary: 'Revokes the provided refresh token' })
159
+ @ApiResponse({ status: 200, description: 'Logout completed', schema: { example: { message: 'Logout completed successfully' } } })
160
160
  // nestforge:feature:swagger:end
161
161
  logout(@Body() dto: RefreshTokenDto) {
162
162
  return this.tokenService.logout(dto.refreshToken);
@@ -168,11 +168,11 @@ export class AuthController {
168
168
  @Post('forgot-password')
169
169
  @HttpCode(HttpStatus.OK)
170
170
  // nestforge:feature:swagger
171
- @ApiOperation({ summary: 'Envia um e-mail com instruções para redefinir a senha' })
171
+ @ApiOperation({ summary: 'Sends an email with password reset instructions' })
172
172
  @ApiResponse({
173
173
  status: 200,
174
- description: 'Resposta genérica — sempre a mesma, exista ou não o e-mail (evita enumeração de contas)',
175
- schema: { example: { message: 'Se o e-mail existir, enviaremos instruções de redefinição de senha' } },
174
+ description: 'Generic response — always the same whether the email exists or not (prevents account enumeration)',
175
+ schema: { example: { message: 'If the email exists, password reset instructions will be sent' } },
176
176
  })
177
177
  // nestforge:feature:swagger:end
178
178
  forgotPassword(@Body() dto: ForgotPasswordDto) {
@@ -183,9 +183,9 @@ export class AuthController {
183
183
  @Post('reset-password')
184
184
  @HttpCode(HttpStatus.OK)
185
185
  // nestforge:feature:swagger
186
- @ApiOperation({ summary: 'Redefine a senha usando o token recebido por e-mail' })
187
- @ApiResponse({ status: 200, description: 'Senha redefinida', schema: { example: { message: 'Senha redefinida com sucesso' } } })
188
- @ApiResponse({ status: 401, description: 'Token inválido, expirado ou já usado', schema: { example: { statusCode: 401, message: 'Token de redefinição inválido ou expirado' } } })
186
+ @ApiOperation({ summary: 'Resets the password using the token received by email' })
187
+ @ApiResponse({ status: 200, description: 'Password reset', schema: { example: { message: 'Password reset successfully' } } })
188
+ @ApiResponse({ status: 401, description: 'Invalid, expired, or already used token', schema: { example: { statusCode: 401, message: 'Invalid or expired password reset token' } } })
189
189
  // nestforge:feature:swagger:end
190
190
  resetPassword(@Body() dto: ResetPasswordDto) {
191
191
  return this.authService.resetPassword(dto.token, dto.password);
@@ -194,9 +194,9 @@ export class AuthController {
194
194
  @Public()
195
195
  @Get('verify-email')
196
196
  // nestforge:feature:swagger
197
- @ApiOperation({ summary: 'Confirma o e-mail usando o token recebido' })
198
- @ApiResponse({ status: 200, description: 'E-mail verificado', schema: { example: { message: 'E-mail verificado com sucesso' } } })
199
- @ApiResponse({ status: 401, description: 'Token inválido, expirado ou já usado', schema: { example: { statusCode: 401, message: 'Token de verificação inválido ou expirado' } } })
197
+ @ApiOperation({ summary: 'Verifies the email using the received token' })
198
+ @ApiResponse({ status: 200, description: 'Email verified', schema: { example: { message: 'Email verified successfully' } } })
199
+ @ApiResponse({ status: 401, description: 'Invalid, expired, or already used token', schema: { example: { statusCode: 401, message: 'Invalid or expired verification token' } } })
200
200
  // nestforge:feature:swagger:end
201
201
  verifyEmail(@Query('token') token: string) {
202
202
  return this.authService.verifyEmail(token);
@@ -207,10 +207,10 @@ export class AuthController {
207
207
  @Get('google')
208
208
  @UseGuards(GoogleAuthGuard)
209
209
  // nestforge:feature:swagger
210
- @ApiOperation({ summary: 'Inicia o login via Google (redireciona)' })
210
+ @ApiOperation({ summary: 'Starts Google login (redirects)' })
211
211
  // nestforge:feature:swagger:end
212
212
  googleLogin() {
213
- // o guard redireciona para o consentimento do Google; nada a fazer aqui
213
+ // The guard redirects to Google's consent screen; nothing to do here.
214
214
  }
215
215
 
216
216
  // nestforge:feature:auth:token
@@ -246,10 +246,10 @@ export class AuthController {
246
246
  @Get('github')
247
247
  @UseGuards(GithubAuthGuard)
248
248
  // nestforge:feature:swagger
249
- @ApiOperation({ summary: 'Inicia o login via GitHub (redireciona)' })
249
+ @ApiOperation({ summary: 'Starts GitHub login (redirects)' })
250
250
  // nestforge:feature:swagger:end
251
251
  githubLogin() {
252
- // o guard redireciona para o consentimento do GitHub; nada a fazer aqui
252
+ // The guard redirects to GitHub's consent screen; nothing to do here.
253
253
  }
254
254
 
255
255
  // nestforge:feature:auth:token
@@ -280,4 +280,4 @@ export class AuthController {
280
280
  return this.sessionService.establish(request, user);
281
281
  }
282
282
  // nestforge:feature:auth:session:end
283
- }
283
+ }
@@ -64,7 +64,7 @@ describe('AuthService', () => {
64
64
  );
65
65
  });
66
66
 
67
- it('deve lançar ConflictException se o e-mail já existir', async () => {
67
+ it('throws ConflictException when the email already exists', async () => {
68
68
  database.select.mockReturnValueOnce(
69
69
  createSelectBuilder([
70
70
  {
@@ -85,7 +85,7 @@ describe('AuthService', () => {
85
85
  authService.register({
86
86
  name: 'Jeiel',
87
87
  email: 'jeiel@example.com',
88
- password: 'senhaForte123',
88
+ password: 'strongPassword123',
89
89
  }),
90
90
  ).rejects.toBeInstanceOf(
91
91
  ConflictException,
@@ -94,7 +94,7 @@ describe('AuthService', () => {
94
94
  expect(database.insert).not.toHaveBeenCalled();
95
95
  });
96
96
 
97
- it('deve lançar UnauthorizedException com credenciais inválidas', async () => {
97
+ it('throws UnauthorizedException for invalid credentials', async () => {
98
98
  database.select.mockReturnValueOnce(
99
99
  createSelectBuilder([]),
100
100
  );
@@ -108,4 +108,4 @@ describe('AuthService', () => {
108
108
  UnauthorizedException,
109
109
  );
110
110
  });
111
- });
111
+ });
@@ -60,7 +60,7 @@ export class AuthService {
60
60
 
61
61
  if (existing) {
62
62
  throw new ConflictException(
63
- 'E-mail já cadastrado',
63
+ 'Email already registered',
64
64
  );
65
65
  }
66
66
 
@@ -103,7 +103,7 @@ export class AuthService {
103
103
 
104
104
  if (!user || !user.passwordHash) {
105
105
  throw new UnauthorizedException(
106
- 'Credenciais inválidas',
106
+ 'Invalid credentials',
107
107
  );
108
108
  }
109
109
 
@@ -114,7 +114,7 @@ export class AuthService {
114
114
 
115
115
  if (!passwordMatches) {
116
116
  throw new UnauthorizedException(
117
- 'Credenciais inválidas',
117
+ 'Invalid credentials',
118
118
  );
119
119
  }
120
120
 
@@ -206,7 +206,7 @@ export class AuthService {
206
206
 
207
207
  const genericResponse = {
208
208
  message:
209
- 'Se o e-mail existir, enviaremos instruções de redefinição de senha',
209
+ 'If the email exists, password reset instructions will be sent',
210
210
  };
211
211
 
212
212
  if (!user) {
@@ -264,7 +264,7 @@ export class AuthService {
264
264
  stored.expiresAt < new Date()
265
265
  ) {
266
266
  throw new UnauthorizedException(
267
- 'Token de redefinição inválido ou expirado',
267
+ 'Invalid or expired password reset token',
268
268
  );
269
269
  }
270
270
 
@@ -433,7 +433,7 @@ export class AuthService {
433
433
  // nestforge:feature:database:sqlite:end
434
434
 
435
435
  return {
436
- message: 'Senha redefinida com sucesso',
436
+ message: 'Password reset successfully',
437
437
  };
438
438
  }
439
439
 
@@ -457,7 +457,7 @@ export class AuthService {
457
457
  stored.expiresAt < new Date()
458
458
  ) {
459
459
  throw new UnauthorizedException(
460
- 'Token de verificação inválido ou expirado',
460
+ 'Invalid or expired verification token',
461
461
  );
462
462
  }
463
463
 
@@ -563,7 +563,7 @@ export class AuthService {
563
563
  // nestforge:feature:database:sqlite:end
564
564
 
565
565
  return {
566
- message: 'E-mail verificado com sucesso',
566
+ message: 'Email verified successfully',
567
567
  };
568
568
  }
569
569
 
@@ -628,4 +628,4 @@ export class AuthService {
628
628
  .update(token)
629
629
  .digest('hex');
630
630
  }
631
- }
631
+ }
@@ -3,7 +3,7 @@ import { z } from 'zod';
3
3
  import { createZodDto } from 'nestjs-zod';
4
4
 
5
5
  export const forgotPasswordSchema = z.object({
6
- email: z.string().email().describe('E-mail da conta a ser recuperada'),
6
+ email: z.string().email().describe('Email of the account to recover'),
7
7
  });
8
8
 
9
- export class ForgotPasswordDto extends createZodDto(forgotPasswordSchema) { }
9
+ export class ForgotPasswordDto extends createZodDto(forgotPasswordSchema) { }
@@ -3,8 +3,8 @@ import { z } from 'zod';
3
3
  import { createZodDto } from 'nestjs-zod';
4
4
 
5
5
  export const loginSchema = z.object({
6
- email: z.string().email().describe('E-mail do usuário'),
7
- password: z.string().min(8).describe('Senha'),
6
+ email: z.string().email().describe('User email'),
7
+ password: z.string().min(8).describe('Password'),
8
8
  });
9
9
 
10
- export class LoginDto extends createZodDto(loginSchema) { }
10
+ export class LoginDto extends createZodDto(loginSchema) { }
@@ -3,9 +3,9 @@ import { z } from 'zod';
3
3
  import { createZodDto } from 'nestjs-zod';
4
4
 
5
5
  export const registerSchema = z.object({
6
- name: z.string().min(2).describe('Nome completo do usuário'),
7
- email: z.string().email().describe('E-mail do usuário'),
8
- password: z.string().min(8).describe('Senha (mínimo 8 caracteres)'),
6
+ name: z.string().min(2).describe('User full name'),
7
+ email: z.string().email().describe('User email'),
8
+ password: z.string().min(8).describe('Password (minimum 8 characters)'),
9
9
  });
10
10
 
11
- export class RegisterDto extends createZodDto(registerSchema) { }
11
+ export class RegisterDto extends createZodDto(registerSchema) { }
@@ -3,8 +3,8 @@ import { z } from 'zod';
3
3
  import { createZodDto } from 'nestjs-zod';
4
4
 
5
5
  export const resetPasswordSchema = z.object({
6
- token: z.string().describe('Token recebido por e-mail'),
7
- password: z.string().min(8).describe('Nova senha (mínimo 8 caracteres)'),
6
+ token: z.string().describe('Token received by email'),
7
+ password: z.string().min(8).describe('New password (minimum 8 characters)'),
8
8
  });
9
9
 
10
- export class ResetPasswordDto extends createZodDto(resetPasswordSchema) { }
10
+ export class ResetPasswordDto extends createZodDto(resetPasswordSchema) { }
@@ -4,7 +4,7 @@ import { AuthGuard } from '@nestjs/passport';
4
4
  @Injectable()
5
5
  export class GithubAuthGuard extends AuthGuard('github') {
6
6
  constructor() {
7
- // API stateless (Bearer token) — não usamos sessão do Passport/Express
7
+ // Stateless API (Bearer token) — Passport/Express sessions are not used.
8
8
  super({ session: false });
9
9
  }
10
- }
10
+ }
@@ -4,7 +4,7 @@ import { AuthGuard } from '@nestjs/passport';
4
4
  @Injectable()
5
5
  export class GoogleAuthGuard extends AuthGuard('google') {
6
6
  constructor() {
7
- // API stateless (Bearer token) — não usamos sessão do Passport/Express
7
+ // Stateless API (Bearer token) — Passport/Express sessions are not used.
8
8
  super({ session: false });
9
9
  }
10
- }
10
+ }
@@ -44,14 +44,14 @@ describe('SessionAuthGuard', () => {
44
44
  return { context, request };
45
45
  }
46
46
 
47
- it('permite acesso a rotas públicas sem sessão', () => {
47
+ it('allows access to public routes without a session', () => {
48
48
  reflector.getAllAndOverride.mockReturnValue(true);
49
49
  const { context } = createContext();
50
50
 
51
51
  expect(guard.canActivate(context)).toBe(true);
52
52
  });
53
53
 
54
- it('rejeita acesso quando não existe usuário na sessão', () => {
54
+ it('rejects access when the session has no user', () => {
55
55
  reflector.getAllAndOverride.mockReturnValue(false);
56
56
  const { context } = createContext();
57
57
 
@@ -60,7 +60,7 @@ describe('SessionAuthGuard', () => {
60
60
  );
61
61
  });
62
62
 
63
- it('permite acesso e disponibiliza o usuário autenticado', () => {
63
+ it('allows access and exposes the authenticated user', () => {
64
64
  reflector.getAllAndOverride.mockReturnValue(false);
65
65
 
66
66
  const user = {
@@ -74,4 +74,4 @@ describe('SessionAuthGuard', () => {
74
74
  expect(guard.canActivate(context)).toBe(true);
75
75
  expect(request.user).toEqual(user);
76
76
  });
77
- });
77
+ });
@@ -27,11 +27,11 @@ export class SessionAuthGuard implements CanActivate {
27
27
  const user = request.session?.user;
28
28
 
29
29
  if (!user) {
30
- throw new UnauthorizedException('Sessão inválida ou expirada');
30
+ throw new UnauthorizedException('Invalid or expired session');
31
31
  }
32
32
 
33
33
  request.user = user;
34
34
 
35
35
  return true;
36
36
  }
37
- }
37
+ }
@@ -31,7 +31,7 @@ describe('SessionService', () => {
31
31
  };
32
32
  }
33
33
 
34
- it('regenera, preenche e salva a sessão', async () => {
34
+ it('regenerates, populates, and saves the session', async () => {
35
35
  const { request, session } = createRequest();
36
36
  const user: SessionUser = {
37
37
  id: 'user-1',
@@ -51,7 +51,7 @@ describe('SessionService', () => {
51
51
  });
52
52
  });
53
53
 
54
- it('emite e salva um novo token CSRF', async () => {
54
+ it('issues and saves a new CSRF token', async () => {
55
55
  const { request, session } = createRequest();
56
56
 
57
57
  const result = await sessionService.issueCsrfToken(request);
@@ -61,14 +61,14 @@ describe('SessionService', () => {
61
61
  expect(session.save).toHaveBeenCalledOnce();
62
62
  });
63
63
 
64
- it('destrói a sessão atual', async () => {
64
+ it('destroys the current session', async () => {
65
65
  const { request, session } = createRequest();
66
66
 
67
67
  const result = await sessionService.destroy(request);
68
68
 
69
69
  expect(session.destroy).toHaveBeenCalledOnce();
70
70
  expect(result).toEqual({
71
- message: 'Logout realizado com sucesso',
71
+ message: 'Logout completed successfully',
72
72
  });
73
73
  });
74
- });
74
+ });
@@ -47,7 +47,7 @@ export class SessionService {
47
47
  if (error) {
48
48
  reject(
49
49
  new InternalServerErrorException(
50
- 'Não foi possível encerrar a sessão',
50
+ 'Unable to end the session',
51
51
  ),
52
52
  );
53
53
  return;
@@ -57,7 +57,7 @@ export class SessionService {
57
57
  });
58
58
  });
59
59
 
60
- return { message: 'Logout realizado com sucesso' };
60
+ return { message: 'Logout completed successfully' };
61
61
  }
62
62
 
63
63
  private async regenerate(request: Request): Promise<void> {
@@ -66,7 +66,7 @@ export class SessionService {
66
66
  if (error) {
67
67
  reject(
68
68
  new InternalServerErrorException(
69
- 'Não foi possível iniciar a sessão',
69
+ 'Unable to start the session',
70
70
  ),
71
71
  );
72
72
  return;
@@ -83,7 +83,7 @@ export class SessionService {
83
83
  if (error) {
84
84
  reject(
85
85
  new InternalServerErrorException(
86
- 'Não foi possível salvar a sessão',
86
+ 'Unable to save the session',
87
87
  ),
88
88
  );
89
89
  return;
@@ -93,4 +93,4 @@ export class SessionService {
93
93
  });
94
94
  });
95
95
  }
96
- }
96
+ }
@@ -25,7 +25,7 @@ export class GithubStrategy extends PassportStrategy(Strategy, 'github') {
25
25
  profile: Profile,
26
26
  done: (error: unknown, user?: OAuthProfile) => void,
27
27
  ) {
28
- // o e-mail pode vir vazio se o usuário deixou o e-mail privado no GitHub
28
+ // The email may be missing when the user keeps it private on GitHub.
29
29
  const email =
30
30
  profile.emails?.[0]?.value ?? `${profile.username}@users.noreply.github.com`;
31
31
 
@@ -33,9 +33,9 @@ export class GithubStrategy extends PassportStrategy(Strategy, 'github') {
33
33
  provider: 'github',
34
34
  providerUserId: profile.id,
35
35
  email,
36
- name: profile.displayName || profile.username || 'Usuário GitHub',
36
+ name: profile.displayName || profile.username || 'GitHub User',
37
37
  };
38
38
 
39
39
  done(null, oauthProfile);
40
40
  }
41
- }
41
+ }
@@ -120,7 +120,7 @@ export class TokenService {
120
120
  stored.expiresAt < new Date()
121
121
  ) {
122
122
  throw new UnauthorizedException(
123
- 'Refresh token inválido ou expirado',
123
+ 'Invalid or expired refresh token',
124
124
  );
125
125
  }
126
126
 
@@ -163,7 +163,7 @@ export class TokenService {
163
163
  );
164
164
 
165
165
  return {
166
- message: 'Logout realizado com sucesso',
166
+ message: 'Logout completed successfully',
167
167
  };
168
168
  }
169
169
 
@@ -172,4 +172,4 @@ export class TokenService {
172
172
  .update(token)
173
173
  .digest('hex');
174
174
  }
175
- }
175
+ }
@@ -22,7 +22,7 @@ export class HttpExceptionFilter implements ExceptionFilter {
22
22
  const message =
23
23
  exception instanceof HttpException
24
24
  ? exception.getResponse()
25
- : 'Erro interno do servidor';
25
+ : 'Internal server error';
26
26
 
27
27
  response.status(status).json({
28
28
  statusCode: status,