kybernus 2.0.10 → 2.1.1

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 (208) hide show
  1. package/node_modules/{@isaacs/balanced-match → balanced-match}/README.md +7 -10
  2. package/node_modules/{@isaacs/balanced-match → balanced-match}/package.json +5 -16
  3. package/node_modules/{@isaacs/brace-expansion → brace-expansion}/README.md +2 -5
  4. package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/index.js +1 -1
  5. package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/index.js.map +1 -1
  6. package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/index.js +1 -1
  7. package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/index.js.map +1 -1
  8. package/node_modules/{@isaacs/brace-expansion → brace-expansion}/package.json +9 -5
  9. package/node_modules/glob/dist/commonjs/glob.d.ts +8 -0
  10. package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
  11. package/node_modules/glob/dist/commonjs/glob.js +2 -1
  12. package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
  13. package/node_modules/glob/dist/commonjs/index.min.js +4 -0
  14. package/node_modules/glob/dist/commonjs/index.min.js.map +7 -0
  15. package/node_modules/glob/dist/commonjs/pattern.d.ts +3 -0
  16. package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
  17. package/node_modules/glob/dist/commonjs/pattern.js +4 -0
  18. package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
  19. package/node_modules/glob/dist/esm/glob.d.ts +8 -0
  20. package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
  21. package/node_modules/glob/dist/esm/glob.js +2 -1
  22. package/node_modules/glob/dist/esm/glob.js.map +1 -1
  23. package/node_modules/glob/dist/esm/index.min.js +4 -0
  24. package/node_modules/glob/dist/esm/index.min.js.map +7 -0
  25. package/node_modules/glob/dist/esm/pattern.d.ts +3 -0
  26. package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
  27. package/node_modules/glob/dist/esm/pattern.js +4 -0
  28. package/node_modules/glob/dist/esm/pattern.js.map +1 -1
  29. package/node_modules/glob/package.json +30 -10
  30. package/node_modules/lru-cache/package.json +7 -7
  31. package/node_modules/minimatch/README.md +3 -1
  32. package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -1
  33. package/node_modules/minimatch/dist/commonjs/ast.js +37 -27
  34. package/node_modules/minimatch/dist/commonjs/ast.js.map +1 -1
  35. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -1
  36. package/node_modules/minimatch/dist/commonjs/brace-expressions.js +2 -4
  37. package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -1
  38. package/node_modules/minimatch/dist/commonjs/escape.js +4 -4
  39. package/node_modules/minimatch/dist/commonjs/escape.js.map +1 -1
  40. package/node_modules/minimatch/dist/commonjs/index.d.ts +50 -0
  41. package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -1
  42. package/node_modules/minimatch/dist/commonjs/index.js +37 -31
  43. package/node_modules/minimatch/dist/commonjs/index.js.map +1 -1
  44. package/node_modules/minimatch/dist/commonjs/unescape.js +4 -4
  45. package/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -1
  46. package/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -1
  47. package/node_modules/minimatch/dist/esm/ast.js +37 -27
  48. package/node_modules/minimatch/dist/esm/ast.js.map +1 -1
  49. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -1
  50. package/node_modules/minimatch/dist/esm/brace-expressions.js +2 -4
  51. package/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -1
  52. package/node_modules/minimatch/dist/esm/escape.js +4 -4
  53. package/node_modules/minimatch/dist/esm/escape.js.map +1 -1
  54. package/node_modules/minimatch/dist/esm/index.d.ts +50 -0
  55. package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -1
  56. package/node_modules/minimatch/dist/esm/index.js +37 -31
  57. package/node_modules/minimatch/dist/esm/index.js.map +1 -1
  58. package/node_modules/minimatch/dist/esm/unescape.js +4 -4
  59. package/node_modules/minimatch/dist/esm/unescape.js.map +1 -1
  60. package/node_modules/minimatch/package.json +3 -3
  61. package/node_modules/minipass/LICENSE.md +55 -0
  62. package/node_modules/minipass/dist/commonjs/index.d.ts +12 -16
  63. package/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -1
  64. package/node_modules/minipass/dist/commonjs/index.js +13 -3
  65. package/node_modules/minipass/dist/commonjs/index.js.map +1 -1
  66. package/node_modules/minipass/dist/esm/index.d.ts +12 -16
  67. package/node_modules/minipass/dist/esm/index.d.ts.map +1 -1
  68. package/node_modules/minipass/dist/esm/index.js +3 -1
  69. package/node_modules/minipass/dist/esm/index.js.map +1 -1
  70. package/node_modules/minipass/package.json +9 -14
  71. package/node_modules/rimraf/README.md +29 -0
  72. package/node_modules/rimraf/dist/commonjs/fs.d.ts +9 -8
  73. package/node_modules/rimraf/dist/commonjs/fs.d.ts.map +1 -1
  74. package/node_modules/rimraf/dist/commonjs/index.d.ts.map +1 -1
  75. package/node_modules/rimraf/dist/commonjs/index.js +9 -3
  76. package/node_modules/rimraf/dist/commonjs/index.js.map +1 -1
  77. package/node_modules/rimraf/dist/commonjs/opt-arg.d.ts.map +1 -1
  78. package/node_modules/rimraf/dist/commonjs/opt-arg.js +2 -1
  79. package/node_modules/rimraf/dist/commonjs/opt-arg.js.map +1 -1
  80. package/node_modules/rimraf/dist/commonjs/path-arg.d.ts.map +1 -1
  81. package/node_modules/rimraf/dist/commonjs/path-arg.js +2 -1
  82. package/node_modules/rimraf/dist/commonjs/path-arg.js.map +1 -1
  83. package/node_modules/rimraf/dist/commonjs/readdir-or-error.d.ts +2 -2
  84. package/node_modules/rimraf/dist/commonjs/readdir-or-error.d.ts.map +1 -1
  85. package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.d.ts.map +1 -1
  86. package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.js.map +1 -1
  87. package/node_modules/rimraf/dist/commonjs/rimraf-posix.d.ts.map +1 -1
  88. package/node_modules/rimraf/dist/commonjs/rimraf-posix.js +1 -2
  89. package/node_modules/rimraf/dist/commonjs/rimraf-posix.js.map +1 -1
  90. package/node_modules/rimraf/dist/commonjs/rimraf-windows.d.ts.map +1 -1
  91. package/node_modules/rimraf/dist/commonjs/rimraf-windows.js.map +1 -1
  92. package/node_modules/rimraf/dist/esm/bin.mjs.map +1 -1
  93. package/node_modules/rimraf/dist/esm/fs.d.ts +9 -8
  94. package/node_modules/rimraf/dist/esm/fs.d.ts.map +1 -1
  95. package/node_modules/rimraf/dist/esm/index.d.ts.map +1 -1
  96. package/node_modules/rimraf/dist/esm/index.js +10 -4
  97. package/node_modules/rimraf/dist/esm/index.js.map +1 -1
  98. package/node_modules/rimraf/dist/esm/opt-arg.d.ts.map +1 -1
  99. package/node_modules/rimraf/dist/esm/opt-arg.js +2 -1
  100. package/node_modules/rimraf/dist/esm/opt-arg.js.map +1 -1
  101. package/node_modules/rimraf/dist/esm/path-arg.d.ts.map +1 -1
  102. package/node_modules/rimraf/dist/esm/path-arg.js +2 -1
  103. package/node_modules/rimraf/dist/esm/path-arg.js.map +1 -1
  104. package/node_modules/rimraf/dist/esm/readdir-or-error.d.ts +2 -2
  105. package/node_modules/rimraf/dist/esm/readdir-or-error.d.ts.map +1 -1
  106. package/node_modules/rimraf/dist/esm/rimraf-move-remove.d.ts.map +1 -1
  107. package/node_modules/rimraf/dist/esm/rimraf-move-remove.js +1 -1
  108. package/node_modules/rimraf/dist/esm/rimraf-move-remove.js.map +1 -1
  109. package/node_modules/rimraf/dist/esm/rimraf-posix.d.ts.map +1 -1
  110. package/node_modules/rimraf/dist/esm/rimraf-posix.js +1 -2
  111. package/node_modules/rimraf/dist/esm/rimraf-posix.js.map +1 -1
  112. package/node_modules/rimraf/dist/esm/rimraf-windows.d.ts.map +1 -1
  113. package/node_modules/rimraf/dist/esm/rimraf-windows.js +1 -1
  114. package/node_modules/rimraf/dist/esm/rimraf-windows.js.map +1 -1
  115. package/node_modules/rimraf/package.json +4 -19
  116. package/package.json +1 -1
  117. package/templates/java-spring/clean/src/main/java/{{packagePath}}/infrastructure/persistence/PostgresUserRepository.java.hbs +40 -0
  118. package/templates/java-spring/clean/src/main/resources/application.properties.hbs +18 -0
  119. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{infrastructure/web/controller → adapters/inbound/web}/AuthController.java.hbs +4 -5
  120. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/adapters/outbound/persistence/JpaUserAdapter.java.hbs +40 -0
  121. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/adapters/outbound/persistence/entity/UserEntity.java.hbs +61 -0
  122. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/adapters/outbound/persistence/repository/JpaUserRepository.java.hbs +11 -0
  123. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{infrastructure/security/SecurityAdapters.java.hbs → adapters/outbound/security/SecurityAdapter.java.hbs} +14 -14
  124. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{domain/entity → core/domain}/User.java.hbs +2 -2
  125. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{domain/usecase → core/ports/inbound}/LoginUserUseCase.java.hbs +8 -8
  126. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{domain/usecase → core/ports/inbound}/RegisterUserUseCase.java.hbs +7 -8
  127. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{domain/repository → core/ports/outbound}/UserRepository.java.hbs +4 -4
  128. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{application → core}/service/AuthService.java.hbs +9 -9
  129. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{{projectNamePascalCase}}Application.java.hbs +2 -2
  130. package/templates/java-spring/hexagonal/src/main/resources/application.properties.hbs +18 -0
  131. package/templates/nestjs/clean/package.json.hbs +9 -3
  132. package/templates/nestjs/clean/prisma/schema.prisma.hbs +20 -0
  133. package/templates/nestjs/clean/src/app.module.ts.hbs +17 -0
  134. package/templates/nestjs/clean/src/auth.module.ts.hbs +12 -10
  135. package/templates/nestjs/clean/src/infrastructure/database/prisma.service.ts.hbs +13 -0
  136. package/templates/nestjs/clean/src/infrastructure/database/repositories/prisma.user.repository.ts.hbs +32 -0
  137. package/templates/nestjs/clean/src/main.ts.hbs +11 -0
  138. package/templates/nestjs/hexagonal/package.json.hbs +9 -3
  139. package/templates/nestjs/hexagonal/prisma/schema.prisma +20 -0
  140. package/templates/nestjs/hexagonal/src/adapters/outbound/persistence/prisma.service.ts.hbs +13 -0
  141. package/templates/nestjs/hexagonal/src/adapters/outbound/persistence/prisma.user.adapter.ts.hbs +32 -0
  142. package/templates/nestjs/hexagonal/src/app.module.ts.hbs +17 -0
  143. package/templates/nestjs/hexagonal/src/auth.module.ts.hbs +15 -13
  144. package/templates/nestjs/hexagonal/src/main.ts.hbs +11 -0
  145. package/templates/nextjs/mvc/package.json.hbs +35 -32
  146. package/templates/nextjs/mvc/prisma/schema.prisma.hbs +12 -9
  147. package/templates/nextjs/mvc/src/lib/db.ts +15 -0
  148. package/templates/nodejs-express/clean/docker-compose.yml.hbs +5 -6
  149. package/templates/nodejs-express/clean/package.json.hbs +14 -8
  150. package/templates/nodejs-express/clean/prisma/schema.prisma +20 -0
  151. package/templates/nodejs-express/clean/src/config/index.ts +27 -0
  152. package/templates/nodejs-express/clean/src/index.ts.hbs +20 -24
  153. package/templates/nodejs-express/clean/src/infrastructure/database/PrismaUserRepository.ts.hbs +61 -0
  154. package/templates/nodejs-express/clean/src/infrastructure/database/prisma.ts.hbs +5 -0
  155. package/templates/nodejs-express/clean/src/infrastructure/http/controllers/AuthController.ts.hbs +24 -40
  156. package/templates/nodejs-express/clean/src/infrastructure/http/middlewares/errorHandler.ts +24 -0
  157. package/templates/nodejs-express/clean/tsconfig.json.hbs +8 -17
  158. package/templates/nodejs-express/hexagonal/docker-compose.yml.hbs +5 -6
  159. package/templates/nodejs-express/hexagonal/package.json.hbs +14 -8
  160. package/templates/nodejs-express/hexagonal/prisma/schema.prisma +20 -0
  161. package/templates/nodejs-express/hexagonal/src/adapters/inbound/http/AuthController.ts.hbs +29 -44
  162. package/templates/nodejs-express/hexagonal/src/adapters/inbound/http/middlewares/errorHandler.ts +24 -0
  163. package/templates/nodejs-express/hexagonal/src/adapters/outbound/persistence/PrismaUserAdapter.ts.hbs +61 -0
  164. package/templates/nodejs-express/hexagonal/src/adapters/outbound/persistence/prisma.ts +5 -0
  165. package/templates/nodejs-express/hexagonal/src/config/index.ts +27 -0
  166. package/templates/nodejs-express/hexagonal/src/index.ts.hbs +24 -27
  167. package/templates/nodejs-express/hexagonal/tsconfig.json.hbs +8 -17
  168. package/templates/python-fastapi/clean/app/application/services/__init__.py +0 -0
  169. package/templates/python-fastapi/clean/app/application/services/user_service.py.hbs +20 -0
  170. package/templates/python-fastapi/clean/app/config.py.hbs +24 -0
  171. package/templates/python-fastapi/clean/app/infrastructure/database/models.py.hbs +24 -0
  172. package/templates/python-fastapi/clean/app/infrastructure/database/postgres_repository.py.hbs +62 -0
  173. package/templates/python-fastapi/clean/app/infrastructure/database/session.py.hbs +27 -0
  174. package/templates/python-fastapi/clean/app/infrastructure/http/auth_controller.py.hbs +14 -8
  175. package/templates/python-fastapi/clean/app/main.py.hbs +25 -3
  176. package/templates/python-fastapi/clean/requirements.txt.hbs +3 -1
  177. package/templates/python-fastapi/hexagonal/app/adapters/inbound/http_adapter.py.hbs +41 -17
  178. package/templates/python-fastapi/hexagonal/app/adapters/outbound/postgres_user_repository.py.hbs +50 -0
  179. package/templates/python-fastapi/hexagonal/app/config.py.hbs +20 -0
  180. package/templates/python-fastapi/hexagonal/app/infrastructure/database/models.py.hbs +24 -0
  181. package/templates/python-fastapi/hexagonal/app/infrastructure/database/session.py.hbs +20 -0
  182. package/templates/python-fastapi/hexagonal/app/main.py.hbs +22 -14
  183. package/templates/python-fastapi/hexagonal/requirements.txt.hbs +3 -1
  184. package/node_modules/minipass/LICENSE +0 -15
  185. package/templates/java-spring/clean/src/main/java/{{packagePath}}/infrastructure/persistence/InMemoryUserRepository.java.hbs +0 -41
  186. package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/infrastructure/persistence/InMemoryUserRepository.java.hbs +0 -41
  187. package/templates/nestjs/clean/src/infrastructure/database/in-memory.repository.ts.hbs +0 -17
  188. package/templates/nodejs-express/clean/src/infrastructure/database/InMemoryUserRepository.ts.hbs +0 -46
  189. package/templates/nodejs-express/hexagonal/src/adapters/outbound/persistence/InMemoryUserAdapter.ts.hbs +0 -38
  190. /package/node_modules/{@isaacs/balanced-match → balanced-match}/LICENSE.md +0 -0
  191. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/index.d.ts +0 -0
  192. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/index.d.ts.map +0 -0
  193. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/index.js +0 -0
  194. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/index.js.map +0 -0
  195. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/package.json +0 -0
  196. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/index.d.ts +0 -0
  197. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/index.d.ts.map +0 -0
  198. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/index.js +0 -0
  199. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/index.js.map +0 -0
  200. /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/package.json +0 -0
  201. /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/LICENSE +0 -0
  202. /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/index.d.ts +0 -0
  203. /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/index.d.ts.map +0 -0
  204. /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/package.json +0 -0
  205. /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/index.d.ts +0 -0
  206. /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/index.d.ts.map +0 -0
  207. /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/package.json +0 -0
  208. /package/templates/python-fastapi/hexagonal/app/core/{ports.py.hbs → ports/ports.py.hbs} +0 -0
@@ -1,10 +1,10 @@
1
- package {{packageName}}.domain.usecase;
1
+ package {{packageName}}.core.ports.inbound;
2
2
 
3
- import {{packageName}}.domain.entity.User;
4
- import {{packageName}}.domain.repository.UserRepository;
3
+ import {{packageName}}.core.domain.User;
4
+ import {{packageName}}.core.ports.outbound.UserRepository;
5
5
 
6
6
  /**
7
- * Login User Use Case - Domain Layer
7
+ * Login User Use Case - Inbound Port
8
8
  */
9
9
  public class LoginUserUseCase {
10
10
  private final UserRepository userRepository;
@@ -12,8 +12,8 @@ public class LoginUserUseCase {
12
12
  private final RegisterUserUseCase.TokenGenerator tokenGenerator;
13
13
 
14
14
  public LoginUserUseCase(UserRepository userRepository,
15
- RegisterUserUseCase.PasswordEncoder passwordEncoder,
16
- RegisterUserUseCase.TokenGenerator tokenGenerator) {
15
+ RegisterUserUseCase.PasswordEncoder passwordEncoder,
16
+ RegisterUserUseCase.TokenGenerator tokenGenerator) {
17
17
  this.userRepository = userRepository;
18
18
  this.passwordEncoder = passwordEncoder;
19
19
  this.tokenGenerator = tokenGenerator;
@@ -24,7 +24,7 @@ public class LoginUserUseCase {
24
24
 
25
25
  public Output execute(Input input) {
26
26
  User user = userRepository.findByEmail(input.email())
27
- .orElseThrow(() -> new IllegalArgumentException("Invalid credentials"));
27
+ .orElseThrow(() -> new IllegalArgumentException("Invalid credentials"));
28
28
 
29
29
  if (!passwordEncoder.matches(input.password(), user.getPassword())) {
30
30
  throw new IllegalArgumentException("Invalid credentials");
@@ -33,4 +33,4 @@ public class LoginUserUseCase {
33
33
  String token = tokenGenerator.generate(user.getId(), user.getEmail());
34
34
  return new Output(user, token);
35
35
  }
36
- }
36
+ }
@@ -1,18 +1,17 @@
1
- package {{packageName}}.domain.usecase;
1
+ package {{packageName}}.core.ports.inbound;
2
2
 
3
- import {{packageName}}.domain.entity.User;
4
- import {{packageName}}.domain.repository.UserRepository;
3
+ import {{packageName}}.core.domain.User;
4
+ import {{packageName}}.core.ports.outbound.UserRepository;
5
5
 
6
6
  /**
7
- * Register User Use Case - Domain Layer
7
+ * Register User Use Case - Inbound Port
8
8
  */
9
9
  public class RegisterUserUseCase {
10
10
  private final UserRepository userRepository;
11
11
  private final PasswordEncoder passwordEncoder;
12
12
  private final TokenGenerator tokenGenerator;
13
13
 
14
- public RegisterUserUseCase(UserRepository userRepository, PasswordEncoder passwordEncoder, TokenGenerator
15
- tokenGenerator) {
14
+ public RegisterUserUseCase(UserRepository userRepository, PasswordEncoder passwordEncoder, TokenGenerator tokenGenerator) {
16
15
  this.userRepository = userRepository;
17
16
  this.passwordEncoder = passwordEncoder;
18
17
  this.tokenGenerator = tokenGenerator;
@@ -34,7 +33,7 @@ public class RegisterUserUseCase {
34
33
  return new Output(savedUser, token);
35
34
  }
36
35
 
37
- // Port interfaces
36
+ // Port interfaces for needed services
38
37
  public interface PasswordEncoder {
39
38
  String encode(String rawPassword);
40
39
  boolean matches(String rawPassword, String encodedPassword);
@@ -43,4 +42,4 @@ public class RegisterUserUseCase {
43
42
  public interface TokenGenerator {
44
43
  String generate(String userId, String email);
45
44
  }
46
- }
45
+ }
@@ -1,10 +1,10 @@
1
- package {{packageName}}.domain.repository;
1
+ package {{packageName}}.core.ports.outbound;
2
2
 
3
- import {{packageName}}.domain.entity.User;
3
+ import {{packageName}}.core.domain.User;
4
4
  import java.util.Optional;
5
5
 
6
6
  /**
7
- * User Repository Interface - Domain Layer
7
+ * User Repository Port - Outbound
8
8
  * Defines the contract for user persistence
9
9
  */
10
10
  public interface UserRepository {
@@ -12,4 +12,4 @@ public interface UserRepository {
12
12
  Optional<User> findByEmail(String email);
13
13
  User save(User user);
14
14
  void delete(String id);
15
- }
15
+ }
@@ -1,13 +1,13 @@
1
- package {{packageName}}.application.service;
1
+ package {{packageName}}.core.service;
2
2
 
3
- import {{packageName}}.domain.entity.User;
4
- import {{packageName}}.domain.repository.UserRepository;
5
- import {{packageName}}.domain.usecase.LoginUserUseCase;
6
- import {{packageName}}.domain.usecase.RegisterUserUseCase;
3
+ import {{packageName}}.core.domain.User;
4
+ import {{packageName}}.core.ports.outbound.UserRepository;
5
+ import {{packageName}}.core.ports.inbound.LoginUserUseCase;
6
+ import {{packageName}}.core.ports.inbound.RegisterUserUseCase;
7
7
  import org.springframework.stereotype.Service;
8
8
 
9
9
  /**
10
- * Auth Service - Application Layer
10
+ * Auth Service - Application Layer / Service
11
11
  * Orchestrates use cases
12
12
  */
13
13
  @Service
@@ -16,8 +16,8 @@ public class AuthService {
16
16
  private final LoginUserUseCase loginUserUseCase;
17
17
 
18
18
  public AuthService(UserRepository userRepository,
19
- RegisterUserUseCase.PasswordEncoder passwordEncoder,
20
- RegisterUserUseCase.TokenGenerator tokenGenerator) {
19
+ RegisterUserUseCase.PasswordEncoder passwordEncoder,
20
+ RegisterUserUseCase.TokenGenerator tokenGenerator) {
21
21
  this.registerUserUseCase = new RegisterUserUseCase(userRepository, passwordEncoder, tokenGenerator);
22
22
  this.loginUserUseCase = new LoginUserUseCase(userRepository, passwordEncoder, tokenGenerator);
23
23
  }
@@ -33,4 +33,4 @@ public class AuthService {
33
33
  var result = loginUserUseCase.execute(new LoginUserUseCase.Input(email, password));
34
34
  return new AuthResponse(result.token(), result.user().getId(), result.user().getEmail(), result.user().getName());
35
35
  }
36
- }
36
+ }
@@ -9,6 +9,6 @@ public class {{projectNamePascalCase}}Application {
9
9
  public static void main(String[] args) {
10
10
  SpringApplication.run({{projectNamePascalCase}}Application.class, args);
11
11
  System.out.println("🚀 {{projectNamePascalCase}} running!");
12
- System.out.println("📐 Architecture: Clean Architecture");
12
+ System.out.println("🔷 Architecture: Hexagonal Architecture");
13
13
  }
14
- }
14
+ }
@@ -0,0 +1,18 @@
1
+ spring.application.name={{projectNameKebabCase}}
2
+
3
+ # Database Configuration
4
+ spring.datasource.url=jdbc:postgresql://postgres:5432/{{projectNameKebabCase}}
5
+ spring.datasource.username=postgres
6
+ spring.datasource.password=postgres
7
+ spring.datasource.driver-class-name=org.postgresql.Driver
8
+
9
+ # JPA / Hibernate
10
+ spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
11
+ spring.jpa.hibernate.ddl-auto=update
12
+ spring.jpa.show-sql=true
13
+ spring.jpa.properties.hibernate.format_sql=true
14
+
15
+ # JWT
16
+ application.security.jwt.secret-key={{jwtSecretKey}}
17
+ application.security.jwt.expiration=86400000
18
+ application.security.jwt.refresh-token.expiration=604800000
@@ -7,7 +7,10 @@
7
7
  "build": "nest build",
8
8
  "start": "node dist/main.js",
9
9
  "lint": "eslint \"{src,test}/**/*.ts\"",
10
- "test": "jest"
10
+ "test": "jest",
11
+ "migrate:dev": "prisma migrate dev",
12
+ "migrate:deploy": "prisma migrate deploy",
13
+ "generate": "prisma generate"
11
14
  },
12
15
  "dependencies": {
13
16
  "@nestjs/common": "^10.3.0",
@@ -16,6 +19,7 @@
16
19
  "@nestjs/jwt": "^10.2.0",
17
20
  "@nestjs/passport": "^10.0.3",
18
21
  "@nestjs/platform-express": "^10.3.0",
22
+ "@prisma/client": "^5.10.2",
19
23
  "bcryptjs": "^2.4.3",
20
24
  "class-transformer": "^0.5.1",
21
25
  "class-validator": "^0.14.1",
@@ -32,6 +36,8 @@
32
36
  "@types/node": "^20.11.0",
33
37
  "@types/passport-jwt": "^4.0.0",
34
38
  "@types/uuid": "^9.0.7",
35
- "typescript": "^5.3.3"
39
+ "prisma": "^5.10.2",
40
+ "typescript": "^5.3.3",
41
+ "eslint": "^8.56.0"
36
42
  }
37
- }
43
+ }
@@ -0,0 +1,20 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ url = env("DATABASE_URL")
8
+ }
9
+
10
+ model User {
11
+ id String @id @default(uuid())
12
+ email String @unique
13
+ name String
14
+ password String
15
+ stripeCustomerId String? @map("stripe_customer_id")
16
+ createdAt DateTime @default(now()) @map("created_at")
17
+ updatedAt DateTime @updatedAt @map("updated_at")
18
+
19
+ @@map("users")
20
+ }
@@ -0,0 +1,17 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { ConfigModule } from '@nestjs/config';
3
+ import { AuthModule } from './auth.module';
4
+ import { PrismaService } from './infrastructure/database/prisma.service';
5
+
6
+ @Module({
7
+ imports: [
8
+ ConfigModule.forRoot({
9
+ isGlobal: true,
10
+ }),
11
+ AuthModule,
12
+ ],
13
+ controllers: [],
14
+ providers: [PrismaService],
15
+ exports: [PrismaService], // Export PrismaService if other modules need it
16
+ })
17
+ export class AppModule {}
@@ -1,17 +1,19 @@
1
1
  import { Module } from '@nestjs/common';
2
2
  import { RegisterUseCase } from './domain/use-cases/register.use-case';
3
3
  import { IUserRepository } from './domain/repositories/user.repository';
4
- import { InMemoryUserRepository } from './infrastructure/database/in-memory.repository';
4
+ import { PrismaUserRepository } from './infrastructure/database/repositories/prisma.user.repository';
5
+ import { PrismaService } from './infrastructure/database/prisma.service';
5
6
  import { AuthController } from './infrastructure/http/auth.controller';
6
7
 
7
8
  @Module({
8
- providers: [
9
- RegisterUseCase,
10
- {
11
- provide: IUserRepository,
12
- useClass: InMemoryUserRepository,
13
- },
14
- ],
15
- controllers: [AuthController],
9
+ providers: [
10
+ PrismaService,
11
+ RegisterUseCase,
12
+ {
13
+ provide: IUserRepository,
14
+ useClass: PrismaUserRepository,
15
+ },
16
+ ],
17
+ controllers: [AuthController],
16
18
  })
17
- export class AuthModule {}
19
+ export class AuthModule {}
@@ -0,0 +1,13 @@
1
+ import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2
+ import { PrismaClient } from '@prisma/client';
3
+
4
+ @Injectable()
5
+ export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
6
+ async onModuleInit() {
7
+ await this.$connect();
8
+ }
9
+
10
+ async onModuleDestroy() {
11
+ await this.$disconnect();
12
+ }
13
+ }
@@ -0,0 +1,32 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { IUserRepository } from '../../../../domain/repositories/user.repository';
3
+ import { User } from '../../../../domain/entities/user.entity';
4
+ import { PrismaService } from '../prisma.service';
5
+
6
+ @Injectable()
7
+ export class PrismaUserRepository implements IUserRepository {
8
+ constructor(private prisma: PrismaService) {}
9
+
10
+ async findByEmail(email: string): Promise<User | null> {
11
+ const user = await this.prisma.user.findUnique({ where: { email } });
12
+ if (!user) return null;
13
+ return new User(user.id, user.name, user.email, user.password);
14
+ }
15
+
16
+ async save(user: User): Promise<User> {
17
+ const savedUser = await this.prisma.user.upsert({
18
+ where: { email: user.email },
19
+ update: {
20
+ name: user.name,
21
+ password: user.password,
22
+ },
23
+ create: {
24
+ id: user.id,
25
+ name: user.name,
26
+ email: user.email,
27
+ password: user.password,
28
+ },
29
+ });
30
+ return new User(savedUser.id, savedUser.name, savedUser.email, savedUser.password);
31
+ }
32
+ }
@@ -0,0 +1,11 @@
1
+ import { NestFactory } from '@nestjs/core';
2
+ import { AppModule } from './app.module';
3
+ import { ValidationPipe } from '@nestjs/common';
4
+
5
+ async function bootstrap() {
6
+ const app = await NestFactory.create(AppModule);
7
+ app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
8
+ app.enableCors();
9
+ await app.listen(process.env.PORT || 3000);
10
+ }
11
+ bootstrap();
@@ -7,7 +7,10 @@
7
7
  "build": "nest build",
8
8
  "start": "node dist/main.js",
9
9
  "lint": "eslint \"{src,test}/**/*.ts\"",
10
- "test": "jest"
10
+ "test": "jest",
11
+ "migrate:dev": "prisma migrate dev",
12
+ "migrate:deploy": "prisma migrate deploy",
13
+ "generate": "prisma generate"
11
14
  },
12
15
  "dependencies": {
13
16
  "@nestjs/common": "^10.3.0",
@@ -16,6 +19,7 @@
16
19
  "@nestjs/jwt": "^10.2.0",
17
20
  "@nestjs/passport": "^10.0.3",
18
21
  "@nestjs/platform-express": "^10.3.0",
22
+ "@prisma/client": "^5.10.2",
19
23
  "bcryptjs": "^2.4.3",
20
24
  "class-transformer": "^0.5.1",
21
25
  "class-validator": "^0.14.1",
@@ -32,6 +36,8 @@
32
36
  "@types/node": "^20.11.0",
33
37
  "@types/passport-jwt": "^4.0.0",
34
38
  "@types/uuid": "^9.0.7",
35
- "typescript": "^5.3.3"
39
+ "prisma": "^5.10.2",
40
+ "typescript": "^5.3.3",
41
+ "eslint": "^8.56.0"
36
42
  }
37
- }
43
+ }
@@ -0,0 +1,20 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ url = env("DATABASE_URL")
8
+ }
9
+
10
+ model User {
11
+ id String @id @default(uuid())
12
+ email String @unique
13
+ name String
14
+ password String
15
+ stripeCustomerId String? @map("stripe_customer_id")
16
+ createdAt DateTime @default(now()) @map("created_at")
17
+ updatedAt DateTime @updatedAt @map("updated_at")
18
+
19
+ @@map("users")
20
+ }
@@ -0,0 +1,13 @@
1
+ import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2
+ import { PrismaClient } from '@prisma/client';
3
+
4
+ @Injectable()
5
+ export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
6
+ async onModuleInit() {
7
+ await this.$connect();
8
+ }
9
+
10
+ async onModuleDestroy() {
11
+ await this.$disconnect();
12
+ }
13
+ }
@@ -0,0 +1,32 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { IUserRepositoryPort } from '../../../../core/ports/ports';
3
+ import { User } from '../../../../core/domain/user.entity';
4
+ import { PrismaService } from './prisma.service';
5
+
6
+ @Injectable()
7
+ export class PrismaUserAdapter implements IUserRepositoryPort {
8
+ constructor(private prisma: PrismaService) {}
9
+
10
+ async findByEmail(email: string): Promise<User | null> {
11
+ const user = await this.prisma.user.findUnique({ where: { email } });
12
+ if (!user) return null;
13
+ return new User(user.id, user.name, user.email, user.password);
14
+ }
15
+
16
+ async save(user: User): Promise<User> {
17
+ const savedUser = await this.prisma.user.upsert({
18
+ where: { email: user.email },
19
+ update: {
20
+ name: user.name,
21
+ password: user.password,
22
+ },
23
+ create: {
24
+ id: user.id,
25
+ name: user.name,
26
+ email: user.email,
27
+ password: user.password,
28
+ },
29
+ });
30
+ return new User(savedUser.id, savedUser.name, savedUser.email, savedUser.password);
31
+ }
32
+ }
@@ -0,0 +1,17 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { ConfigModule } from '@nestjs/config';
3
+ import { AuthModule } from './auth.module';
4
+ import { PrismaService } from './adapters/outbound/persistence/prisma.service';
5
+
6
+ @Module({
7
+ imports: [
8
+ ConfigModule.forRoot({
9
+ isGlobal: true,
10
+ }),
11
+ AuthModule,
12
+ ],
13
+ controllers: [],
14
+ providers: [PrismaService],
15
+ exports: [PrismaService],
16
+ })
17
+ export class AppModule {}
@@ -1,19 +1,21 @@
1
1
  import { Module } from '@nestjs/common';
2
2
  import { AuthService } from './core/auth.service';
3
3
  import { HttpAdapter } from './adapters/inbound/http.adapter';
4
- import { PersistenceAdapter } from './adapters/outbound/persistence.adapter';
4
+ import { PrismaUserAdapter } from './adapters/outbound/persistence/prisma.user.adapter';
5
+ import { PrismaService } from './adapters/outbound/persistence/prisma.service';
5
6
 
6
7
  @Module({
7
- providers: [
8
- {
9
- provide: 'IAuthPort',
10
- useClass: AuthService,
11
- },
12
- {
13
- provide: 'IUserRepositoryPort',
14
- useClass: PersistenceAdapter,
15
- },
16
- ],
17
- controllers: [HttpAdapter],
8
+ providers: [
9
+ PrismaService,
10
+ {
11
+ provide: 'IAuthPort',
12
+ useClass: AuthService,
13
+ },
14
+ {
15
+ provide: 'IUserRepositoryPort',
16
+ useClass: PrismaUserAdapter,
17
+ },
18
+ ],
19
+ controllers: [HttpAdapter],
18
20
  })
19
- export class AuthModule {}
21
+ export class AuthModule {}
@@ -0,0 +1,11 @@
1
+ import { NestFactory } from '@nestjs/core';
2
+ import { AppModule } from './app.module';
3
+ import { ValidationPipe } from '@nestjs/common';
4
+
5
+ async function bootstrap() {
6
+ const app = await NestFactory.create(AppModule);
7
+ app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
8
+ app.enableCors();
9
+ await app.listen(process.env.PORT || 3000);
10
+ }
11
+ bootstrap();
@@ -1,34 +1,37 @@
1
1
  {
2
- "name": "{{kebabCase projectName}}",
3
- "version": "1.0.0",
4
- "private": true,
5
- "scripts": {
6
- "dev": "next dev",
7
- "build": "next build",
8
- "start": "next start",
9
- "lint": "next lint",
10
- "db:generate": "prisma generate",
11
- "db:push": "prisma db push",
12
- "db:studio": "prisma studio"
13
- },
14
- "dependencies": {
15
- "next": "^16.0.0",
16
- "react": "^19.0.0",
17
- "react-dom": "^19.0.0",
18
- "@prisma/client": "^5.9.0",
19
- "next-auth": "^4.24.5",
20
- "stripe": "^14.14.0"
21
- },
22
- "devDependencies": {
23
- "@types/node": "^20.11.0",
24
- "@types/react": "^19.0.0",
25
- "@types/react-dom": "^19.0.0",
26
- "autoprefixer": "^10.4.17",
27
- "eslint": "^9.0.0",
28
- "eslint-config-next": "^16.0.0",
29
- "postcss": "^8.4.33",
30
- "prisma": "^5.9.0",
31
- "tailwindcss": "^3.4.1",
32
- "typescript": "^5.3.3"
2
+ "name": "{{kebabCase projectName}}",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "lint": "next lint",
10
+ "db:generate": "prisma generate",
11
+ "db:push": "prisma db push",
12
+ "db:studio": "prisma studio"
13
+ },
14
+ "dependencies": {
15
+ "next": "^16.0.0",
16
+ "react": "^18.0.0",
17
+ "react-dom": "^18.0.0",
18
+ "@prisma/client": "^5.10.2",
19
+ "next-auth": "^4.24.6",
20
+ "stripe": "^14.14.0",
21
+ "zod": "^3.22.4",
22
+ "bcryptjs": "^2.4.3"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^20.11.19",
26
+ "@types/react": "^18.2.57",
27
+ "@types/react-dom": "^18.2.19",
28
+ "@types/bcryptjs": "^2.4.6",
29
+ "autoprefixer": "^10.4.17",
30
+ "eslint": "^8.56.0",
31
+ "eslint-config-next": "14.1.0",
32
+ "postcss": "^8.4.33",
33
+ "prisma": "^5.10.2",
34
+ "tailwindcss": "^3.4.1",
35
+ "typescript": "^5.3.3"
36
+ }
33
37
  }
34
- }
@@ -7,12 +7,15 @@ datasource db {
7
7
  url = env("DATABASE_URL")
8
8
  }
9
9
 
10
- // Add your models here
11
- // Example:
12
- // model User {
13
- // id Int @id @default(autoincrement())
14
- // email String @unique
15
- // name String?
16
- // createdAt DateTime @default(now())
17
- // updatedAt DateTime @updatedAt
18
- // }
10
+ model User {
11
+ id String @id @default(uuid())
12
+ email String @unique
13
+ name String?
14
+ password String? // Optional for OAuth, required for credentials
15
+ stripeCustomerId String? @map("stripe_customer_id")
16
+ image String?
17
+ createdAt DateTime @default(now()) @map("created_at")
18
+ updatedAt DateTime @updatedAt @map("updated_at")
19
+
20
+ @@map("users")
21
+ }
@@ -0,0 +1,15 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+
3
+ const prismaClientSingleton = () => {
4
+ return new PrismaClient();
5
+ };
6
+
7
+ type PrismaClientSingleton = ReturnType<typeof prismaClientSingleton>;
8
+
9
+ const globalForPrisma = globalThis as unknown as {
10
+ prisma: PrismaClientSingleton | undefined;
11
+ };
12
+
13
+ export const db = globalForPrisma.prisma ?? prismaClientSingleton();
14
+
15
+ if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = db;
@@ -1,18 +1,17 @@
1
1
  version: '3.8'
2
2
 
3
3
  services:
4
- postgres:
4
+ db:
5
5
  image: postgres:15-alpine
6
- container_name: {{kebabCase projectName}}-db
6
+ restart: always
7
7
  environment:
8
8
  POSTGRES_USER: postgres
9
- POSTGRES_PASSWORD: postgres
10
- POSTGRES_DB: {{snakeCase projectName}}
9
+ POSTGRES_PASSWORD: password
10
+ POSTGRES_DB: {{kebabCase projectName}}_db
11
11
  ports:
12
- - "5432:5432"
12
+ - '5432:5432'
13
13
  volumes:
14
14
  - postgres_data:/var/lib/postgresql/data
15
- restart: unless-stopped
16
15
 
17
16
  volumes:
18
17
  postgres_data: