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.
- package/node_modules/{@isaacs/balanced-match → balanced-match}/README.md +7 -10
- package/node_modules/{@isaacs/balanced-match → balanced-match}/package.json +5 -16
- package/node_modules/{@isaacs/brace-expansion → brace-expansion}/README.md +2 -5
- package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/index.js +1 -1
- package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/index.js.map +1 -1
- package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/index.js +1 -1
- package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/index.js.map +1 -1
- package/node_modules/{@isaacs/brace-expansion → brace-expansion}/package.json +9 -5
- package/node_modules/glob/dist/commonjs/glob.d.ts +8 -0
- package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
- package/node_modules/glob/dist/commonjs/glob.js +2 -1
- package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
- package/node_modules/glob/dist/commonjs/index.min.js +4 -0
- package/node_modules/glob/dist/commonjs/index.min.js.map +7 -0
- package/node_modules/glob/dist/commonjs/pattern.d.ts +3 -0
- package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
- package/node_modules/glob/dist/commonjs/pattern.js +4 -0
- package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
- package/node_modules/glob/dist/esm/glob.d.ts +8 -0
- package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
- package/node_modules/glob/dist/esm/glob.js +2 -1
- package/node_modules/glob/dist/esm/glob.js.map +1 -1
- package/node_modules/glob/dist/esm/index.min.js +4 -0
- package/node_modules/glob/dist/esm/index.min.js.map +7 -0
- package/node_modules/glob/dist/esm/pattern.d.ts +3 -0
- package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
- package/node_modules/glob/dist/esm/pattern.js +4 -0
- package/node_modules/glob/dist/esm/pattern.js.map +1 -1
- package/node_modules/glob/package.json +30 -10
- package/node_modules/lru-cache/package.json +7 -7
- package/node_modules/minimatch/README.md +3 -1
- package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -1
- package/node_modules/minimatch/dist/commonjs/ast.js +37 -27
- package/node_modules/minimatch/dist/commonjs/ast.js.map +1 -1
- package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -1
- package/node_modules/minimatch/dist/commonjs/brace-expressions.js +2 -4
- package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -1
- package/node_modules/minimatch/dist/commonjs/escape.js +4 -4
- package/node_modules/minimatch/dist/commonjs/escape.js.map +1 -1
- package/node_modules/minimatch/dist/commonjs/index.d.ts +50 -0
- package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/minimatch/dist/commonjs/index.js +37 -31
- package/node_modules/minimatch/dist/commonjs/index.js.map +1 -1
- package/node_modules/minimatch/dist/commonjs/unescape.js +4 -4
- package/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -1
- package/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -1
- package/node_modules/minimatch/dist/esm/ast.js +37 -27
- package/node_modules/minimatch/dist/esm/ast.js.map +1 -1
- package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -1
- package/node_modules/minimatch/dist/esm/brace-expressions.js +2 -4
- package/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -1
- package/node_modules/minimatch/dist/esm/escape.js +4 -4
- package/node_modules/minimatch/dist/esm/escape.js.map +1 -1
- package/node_modules/minimatch/dist/esm/index.d.ts +50 -0
- package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -1
- package/node_modules/minimatch/dist/esm/index.js +37 -31
- package/node_modules/minimatch/dist/esm/index.js.map +1 -1
- package/node_modules/minimatch/dist/esm/unescape.js +4 -4
- package/node_modules/minimatch/dist/esm/unescape.js.map +1 -1
- package/node_modules/minimatch/package.json +3 -3
- package/node_modules/minipass/LICENSE.md +55 -0
- package/node_modules/minipass/dist/commonjs/index.d.ts +12 -16
- package/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/minipass/dist/commonjs/index.js +13 -3
- package/node_modules/minipass/dist/commonjs/index.js.map +1 -1
- package/node_modules/minipass/dist/esm/index.d.ts +12 -16
- package/node_modules/minipass/dist/esm/index.d.ts.map +1 -1
- package/node_modules/minipass/dist/esm/index.js +3 -1
- package/node_modules/minipass/dist/esm/index.js.map +1 -1
- package/node_modules/minipass/package.json +9 -14
- package/node_modules/rimraf/README.md +29 -0
- package/node_modules/rimraf/dist/commonjs/fs.d.ts +9 -8
- package/node_modules/rimraf/dist/commonjs/fs.d.ts.map +1 -1
- package/node_modules/rimraf/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/rimraf/dist/commonjs/index.js +9 -3
- package/node_modules/rimraf/dist/commonjs/index.js.map +1 -1
- package/node_modules/rimraf/dist/commonjs/opt-arg.d.ts.map +1 -1
- package/node_modules/rimraf/dist/commonjs/opt-arg.js +2 -1
- package/node_modules/rimraf/dist/commonjs/opt-arg.js.map +1 -1
- package/node_modules/rimraf/dist/commonjs/path-arg.d.ts.map +1 -1
- package/node_modules/rimraf/dist/commonjs/path-arg.js +2 -1
- package/node_modules/rimraf/dist/commonjs/path-arg.js.map +1 -1
- package/node_modules/rimraf/dist/commonjs/readdir-or-error.d.ts +2 -2
- package/node_modules/rimraf/dist/commonjs/readdir-or-error.d.ts.map +1 -1
- package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.d.ts.map +1 -1
- package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.js.map +1 -1
- package/node_modules/rimraf/dist/commonjs/rimraf-posix.d.ts.map +1 -1
- package/node_modules/rimraf/dist/commonjs/rimraf-posix.js +1 -2
- package/node_modules/rimraf/dist/commonjs/rimraf-posix.js.map +1 -1
- package/node_modules/rimraf/dist/commonjs/rimraf-windows.d.ts.map +1 -1
- package/node_modules/rimraf/dist/commonjs/rimraf-windows.js.map +1 -1
- package/node_modules/rimraf/dist/esm/bin.mjs.map +1 -1
- package/node_modules/rimraf/dist/esm/fs.d.ts +9 -8
- package/node_modules/rimraf/dist/esm/fs.d.ts.map +1 -1
- package/node_modules/rimraf/dist/esm/index.d.ts.map +1 -1
- package/node_modules/rimraf/dist/esm/index.js +10 -4
- package/node_modules/rimraf/dist/esm/index.js.map +1 -1
- package/node_modules/rimraf/dist/esm/opt-arg.d.ts.map +1 -1
- package/node_modules/rimraf/dist/esm/opt-arg.js +2 -1
- package/node_modules/rimraf/dist/esm/opt-arg.js.map +1 -1
- package/node_modules/rimraf/dist/esm/path-arg.d.ts.map +1 -1
- package/node_modules/rimraf/dist/esm/path-arg.js +2 -1
- package/node_modules/rimraf/dist/esm/path-arg.js.map +1 -1
- package/node_modules/rimraf/dist/esm/readdir-or-error.d.ts +2 -2
- package/node_modules/rimraf/dist/esm/readdir-or-error.d.ts.map +1 -1
- package/node_modules/rimraf/dist/esm/rimraf-move-remove.d.ts.map +1 -1
- package/node_modules/rimraf/dist/esm/rimraf-move-remove.js +1 -1
- package/node_modules/rimraf/dist/esm/rimraf-move-remove.js.map +1 -1
- package/node_modules/rimraf/dist/esm/rimraf-posix.d.ts.map +1 -1
- package/node_modules/rimraf/dist/esm/rimraf-posix.js +1 -2
- package/node_modules/rimraf/dist/esm/rimraf-posix.js.map +1 -1
- package/node_modules/rimraf/dist/esm/rimraf-windows.d.ts.map +1 -1
- package/node_modules/rimraf/dist/esm/rimraf-windows.js +1 -1
- package/node_modules/rimraf/dist/esm/rimraf-windows.js.map +1 -1
- package/node_modules/rimraf/package.json +4 -19
- package/package.json +1 -1
- package/templates/java-spring/clean/src/main/java/{{packagePath}}/infrastructure/persistence/PostgresUserRepository.java.hbs +40 -0
- package/templates/java-spring/clean/src/main/resources/application.properties.hbs +18 -0
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{infrastructure/web/controller → adapters/inbound/web}/AuthController.java.hbs +4 -5
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/adapters/outbound/persistence/JpaUserAdapter.java.hbs +40 -0
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/adapters/outbound/persistence/entity/UserEntity.java.hbs +61 -0
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/adapters/outbound/persistence/repository/JpaUserRepository.java.hbs +11 -0
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{infrastructure/security/SecurityAdapters.java.hbs → adapters/outbound/security/SecurityAdapter.java.hbs} +14 -14
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{domain/entity → core/domain}/User.java.hbs +2 -2
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{domain/usecase → core/ports/inbound}/LoginUserUseCase.java.hbs +8 -8
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{domain/usecase → core/ports/inbound}/RegisterUserUseCase.java.hbs +7 -8
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{domain/repository → core/ports/outbound}/UserRepository.java.hbs +4 -4
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{application → core}/service/AuthService.java.hbs +9 -9
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/{{projectNamePascalCase}}Application.java.hbs +2 -2
- package/templates/java-spring/hexagonal/src/main/resources/application.properties.hbs +18 -0
- package/templates/nestjs/clean/package.json.hbs +9 -3
- package/templates/nestjs/clean/prisma/schema.prisma.hbs +20 -0
- package/templates/nestjs/clean/src/app.module.ts.hbs +17 -0
- package/templates/nestjs/clean/src/auth.module.ts.hbs +12 -10
- package/templates/nestjs/clean/src/infrastructure/database/prisma.service.ts.hbs +13 -0
- package/templates/nestjs/clean/src/infrastructure/database/repositories/prisma.user.repository.ts.hbs +32 -0
- package/templates/nestjs/clean/src/main.ts.hbs +11 -0
- package/templates/nestjs/hexagonal/package.json.hbs +9 -3
- package/templates/nestjs/hexagonal/prisma/schema.prisma +20 -0
- package/templates/nestjs/hexagonal/src/adapters/outbound/persistence/prisma.service.ts.hbs +13 -0
- package/templates/nestjs/hexagonal/src/adapters/outbound/persistence/prisma.user.adapter.ts.hbs +32 -0
- package/templates/nestjs/hexagonal/src/app.module.ts.hbs +17 -0
- package/templates/nestjs/hexagonal/src/auth.module.ts.hbs +15 -13
- package/templates/nestjs/hexagonal/src/main.ts.hbs +11 -0
- package/templates/nextjs/mvc/package.json.hbs +35 -32
- package/templates/nextjs/mvc/prisma/schema.prisma.hbs +12 -9
- package/templates/nextjs/mvc/src/lib/db.ts +15 -0
- package/templates/nodejs-express/clean/docker-compose.yml.hbs +5 -6
- package/templates/nodejs-express/clean/package.json.hbs +14 -8
- package/templates/nodejs-express/clean/prisma/schema.prisma +20 -0
- package/templates/nodejs-express/clean/src/config/index.ts +27 -0
- package/templates/nodejs-express/clean/src/index.ts.hbs +20 -24
- package/templates/nodejs-express/clean/src/infrastructure/database/PrismaUserRepository.ts.hbs +61 -0
- package/templates/nodejs-express/clean/src/infrastructure/database/prisma.ts.hbs +5 -0
- package/templates/nodejs-express/clean/src/infrastructure/http/controllers/AuthController.ts.hbs +24 -40
- package/templates/nodejs-express/clean/src/infrastructure/http/middlewares/errorHandler.ts +24 -0
- package/templates/nodejs-express/clean/tsconfig.json.hbs +8 -17
- package/templates/nodejs-express/hexagonal/docker-compose.yml.hbs +5 -6
- package/templates/nodejs-express/hexagonal/package.json.hbs +14 -8
- package/templates/nodejs-express/hexagonal/prisma/schema.prisma +20 -0
- package/templates/nodejs-express/hexagonal/src/adapters/inbound/http/AuthController.ts.hbs +29 -44
- package/templates/nodejs-express/hexagonal/src/adapters/inbound/http/middlewares/errorHandler.ts +24 -0
- package/templates/nodejs-express/hexagonal/src/adapters/outbound/persistence/PrismaUserAdapter.ts.hbs +61 -0
- package/templates/nodejs-express/hexagonal/src/adapters/outbound/persistence/prisma.ts +5 -0
- package/templates/nodejs-express/hexagonal/src/config/index.ts +27 -0
- package/templates/nodejs-express/hexagonal/src/index.ts.hbs +24 -27
- package/templates/nodejs-express/hexagonal/tsconfig.json.hbs +8 -17
- package/templates/python-fastapi/clean/app/application/services/__init__.py +0 -0
- package/templates/python-fastapi/clean/app/application/services/user_service.py.hbs +20 -0
- package/templates/python-fastapi/clean/app/config.py.hbs +24 -0
- package/templates/python-fastapi/clean/app/infrastructure/database/models.py.hbs +24 -0
- package/templates/python-fastapi/clean/app/infrastructure/database/postgres_repository.py.hbs +62 -0
- package/templates/python-fastapi/clean/app/infrastructure/database/session.py.hbs +27 -0
- package/templates/python-fastapi/clean/app/infrastructure/http/auth_controller.py.hbs +14 -8
- package/templates/python-fastapi/clean/app/main.py.hbs +25 -3
- package/templates/python-fastapi/clean/requirements.txt.hbs +3 -1
- package/templates/python-fastapi/hexagonal/app/adapters/inbound/http_adapter.py.hbs +41 -17
- package/templates/python-fastapi/hexagonal/app/adapters/outbound/postgres_user_repository.py.hbs +50 -0
- package/templates/python-fastapi/hexagonal/app/config.py.hbs +20 -0
- package/templates/python-fastapi/hexagonal/app/infrastructure/database/models.py.hbs +24 -0
- package/templates/python-fastapi/hexagonal/app/infrastructure/database/session.py.hbs +20 -0
- package/templates/python-fastapi/hexagonal/app/main.py.hbs +22 -14
- package/templates/python-fastapi/hexagonal/requirements.txt.hbs +3 -1
- package/node_modules/minipass/LICENSE +0 -15
- package/templates/java-spring/clean/src/main/java/{{packagePath}}/infrastructure/persistence/InMemoryUserRepository.java.hbs +0 -41
- package/templates/java-spring/hexagonal/src/main/java/{{packagePath}}/infrastructure/persistence/InMemoryUserRepository.java.hbs +0 -41
- package/templates/nestjs/clean/src/infrastructure/database/in-memory.repository.ts.hbs +0 -17
- package/templates/nodejs-express/clean/src/infrastructure/database/InMemoryUserRepository.ts.hbs +0 -46
- package/templates/nodejs-express/hexagonal/src/adapters/outbound/persistence/InMemoryUserAdapter.ts.hbs +0 -38
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/LICENSE.md +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/index.d.ts +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/index.js +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/index.js.map +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/commonjs/package.json +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/index.d.ts +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/index.js +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/index.js.map +0 -0
- /package/node_modules/{@isaacs/balanced-match → balanced-match}/dist/esm/package.json +0 -0
- /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/LICENSE +0 -0
- /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/index.d.ts +0 -0
- /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/commonjs/package.json +0 -0
- /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/index.d.ts +0 -0
- /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs/brace-expansion → brace-expansion}/dist/esm/package.json +0 -0
- /package/templates/python-fastapi/hexagonal/app/core/{ports.py.hbs → ports/ports.py.hbs} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
package {{packageName}}.
|
|
1
|
+
package {{packageName}}.core.ports.inbound;
|
|
2
2
|
|
|
3
|
-
import {{packageName}}.domain.
|
|
4
|
-
import {{packageName}}.
|
|
3
|
+
import {{packageName}}.core.domain.User;
|
|
4
|
+
import {{packageName}}.core.ports.outbound.UserRepository;
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Login User Use Case -
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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}}.
|
|
1
|
+
package {{packageName}}.core.ports.inbound;
|
|
2
2
|
|
|
3
|
-
import {{packageName}}.domain.
|
|
4
|
-
import {{packageName}}.
|
|
3
|
+
import {{packageName}}.core.domain.User;
|
|
4
|
+
import {{packageName}}.core.ports.outbound.UserRepository;
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Register User Use Case -
|
|
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}}.
|
|
1
|
+
package {{packageName}}.core.ports.outbound;
|
|
2
2
|
|
|
3
|
-
import {{packageName}}.domain.
|
|
3
|
+
import {{packageName}}.core.domain.User;
|
|
4
4
|
import java.util.Optional;
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* User Repository
|
|
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}}.
|
|
1
|
+
package {{packageName}}.core.service;
|
|
2
2
|
|
|
3
|
-
import {{packageName}}.domain.
|
|
4
|
-
import {{packageName}}.
|
|
5
|
-
import {{packageName}}.
|
|
6
|
-
import {{packageName}}.
|
|
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
|
-
|
|
20
|
-
|
|
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("
|
|
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
|
-
"
|
|
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 {
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
"
|
|
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
|
+
}
|
package/templates/nestjs/hexagonal/src/adapters/outbound/persistence/prisma.user.adapter.ts.hbs
ADDED
|
@@ -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 {
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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": "^
|
|
17
|
-
"react-dom": "^
|
|
18
|
-
"@prisma/client": "^5.
|
|
19
|
-
"next-auth": "^4.24.
|
|
20
|
-
"stripe": "^14.14.0"
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
"@types/
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
4
|
+
db:
|
|
5
5
|
image: postgres:15-alpine
|
|
6
|
-
|
|
6
|
+
restart: always
|
|
7
7
|
environment:
|
|
8
8
|
POSTGRES_USER: postgres
|
|
9
|
-
POSTGRES_PASSWORD:
|
|
10
|
-
POSTGRES_DB: {{
|
|
9
|
+
POSTGRES_PASSWORD: password
|
|
10
|
+
POSTGRES_DB: {{kebabCase projectName}}_db
|
|
11
11
|
ports:
|
|
12
|
-
-
|
|
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:
|