From 9851cf15ad89de2fa912411a652634a8b6b68940 Mon Sep 17 00:00:00 2001 From: Pieter Van Eeckhout Date: Mon, 26 Jun 2023 17:45:55 +0200 Subject: [PATCH] #39 - adding mybatis mappers --- docker-compose-localdev.yml | 17 ++++++ docker-compose.yml | 15 +++++ env/.env_usermodule | 6 ++ user-module/build.gradle | 17 +----- .../application/model/EdpnUserDetails.java | 61 +++++++++++++++++++ .../service/EdpnUserDetailsService.java | 21 +++++++ .../backend/user/domain/model/ApiGrant.java | 13 ++++ .../backend/user/domain/model/ApiKey.java | 2 +- .../backend/user/domain/model/ApiRole.java | 2 +- .../backend/user/domain/model/EdpnUser.java | 4 +- .../backend/user/domain/model/UserGrant.java | 13 ++++ .../backend/user/domain/model/UserRole.java | 2 +- .../persistence/entity/ApiGrantEntity.java | 20 ++++++ .../entity/ApiKeyEntity.java | 5 +- .../entity/ApiRoleEntity.java | 4 +- .../entity/EdpnUserEntity.java | 7 +-- .../entity/PricingPlanEntity.java | 2 +- .../persistence/entity/UserGrantEntity.java | 20 ++++++ .../entity/UserRoleEntity.java | 9 ++- .../mappers/entity/ApiGrantMapper.java | 23 +++++++ .../mappers/entity}/ApiKeyMapper.java | 9 +-- .../mappers/entity}/ApiRoleMapper.java | 13 ++-- .../mappers/entity/EdpnUserMapper.java} | 17 +++--- .../mappers/entity}/PricingPlanMapper.java | 4 +- .../mappers/entity/UserGrantMapper.java | 23 +++++++ .../mappers/entity}/UserRoleMapper.java | 11 ++-- .../mappers/mybatis/ApiGrantEntityMapper.java | 47 ++++++++++++++ .../mappers/mybatis/ApiKeyEntityMapper.java | 47 ++++++++++++++ .../mappers/mybatis/ApiRoleEntityMapper.java | 45 ++++++++++++++ .../mappers/mybatis/EdpnUserEntityMapper.java | 59 ++++++++++++++++++ .../mybatis/PricingPlanEntityMapper.java | 32 ++++++++++ .../mybatis/UserGrantEntityMapper.java | 40 ++++++++++++ .../mappers/mybatis/UserRoleEntityMapper.java | 48 +++++++++++++++ .../repostory/MybatisUserRepository.java | 17 ++++++ user-module/src/main/java/module-info.java | 1 + .../resources/application-local.properties | 10 +++ .../src/main/resources/application.properties | 6 ++ .../db/changelog/changelog-master.xml | 12 ++++ .../db/changelog/create_api_grant_table.xml | 22 +++++++ .../create_api_key_api_grant_map_table.xml | 23 +++++++ .../create_api_key_api_role_map_table.xml | 23 +++++++ .../db/changelog/create_api_key_table.xml | 42 +++++++++++++ .../create_api_role_api_grant_map_table.xml | 23 +++++++ .../db/changelog/create_api_role_table.xml | 22 +++++++ .../db/changelog/create_edpn_user_table.xml | 37 +++++++++++ .../create_edpn_user_user_grant_map_table.xml | 25 ++++++++ .../create_edpn_user_user_role_map_table.xml | 25 ++++++++ .../changelog/create_pricing_plan_table.xml | 25 ++++++++ .../db/changelog/create_user_grant_table.xml | 22 +++++++ .../db/changelog/create_user_role_table.xml | 22 +++++++ .../create_user_role_user_grant_map_table.xml | 23 +++++++ 51 files changed, 981 insertions(+), 57 deletions(-) create mode 100644 env/.env_usermodule create mode 100644 user-module/src/main/java/io/edpn/backend/user/application/model/EdpnUserDetails.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/application/service/EdpnUserDetailsService.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/domain/model/ApiGrant.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/domain/model/UserGrant.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiGrantEntity.java rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{ => persistence}/entity/ApiKeyEntity.java (80%) rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{ => persistence}/entity/ApiRoleEntity.java (77%) rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{ => persistence}/entity/EdpnUserEntity.java (78%) rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{ => persistence}/entity/PricingPlanEntity.java (85%) create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/UserGrantEntity.java rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{ => persistence}/entity/UserRoleEntity.java (77%) create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiGrantMapper.java rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{mapper => persistence/mappers/entity}/ApiKeyMapper.java (72%) rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{mapper => persistence/mappers/entity}/ApiRoleMapper.java (54%) rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{mapper/EdpnMapper.java => persistence/mappers/entity/EdpnUserMapper.java} (71%) rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{mapper => persistence/mappers/entity}/PricingPlanMapper.java (81%) create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/UserGrantMapper.java rename user-module/src/main/java/io/edpn/backend/user/infrastructure/{mapper => persistence/mappers/entity}/UserRoleMapper.java (54%) create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiGrantEntityMapper.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiKeyEntityMapper.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiRoleEntityMapper.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/EdpnUserEntityMapper.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/PricingPlanEntityMapper.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/UserGrantEntityMapper.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/UserRoleEntityMapper.java create mode 100644 user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/repostory/MybatisUserRepository.java create mode 100644 user-module/src/main/resources/application-local.properties create mode 100644 user-module/src/main/resources/application.properties create mode 100644 user-module/src/main/resources/db/changelog/changelog-master.xml create mode 100644 user-module/src/main/resources/db/changelog/create_api_grant_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_api_key_api_grant_map_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_api_key_api_role_map_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_api_key_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_api_role_api_grant_map_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_api_role_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_edpn_user_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_edpn_user_user_grant_map_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_edpn_user_user_role_map_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_pricing_plan_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_user_grant_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_user_role_table.xml create mode 100644 user-module/src/main/resources/db/changelog/create_user_role_user_grant_map_table.xml diff --git a/docker-compose-localdev.yml b/docker-compose-localdev.yml index baa012aa..43534e00 100644 --- a/docker-compose-localdev.yml +++ b/docker-compose-localdev.yml @@ -55,6 +55,23 @@ services: timeout: 5s retries: 5 + trademodule_postgres: + image: "postgres:15-alpine" + restart: on-failure + environment: + - POSTGRES_USER=edpn_usermodule + - POSTGRES_PASSWORD=MSDVq372rNk3AwRq + - POSTGRES_DB=usermodule + volumes: + - "usermodule_postgres:/var/lib/postgresql/data" + ports: + - "54322:5432" + healthcheck: + test: pg_isready + interval: 10s + timeout: 5s + retries: 5 + volumes: zookeeper: driver: local diff --git a/docker-compose.yml b/docker-compose.yml index ccf90987..219b50d2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,6 +49,19 @@ services: timeout: 5s retries: 5 + usermodule_postgres: + image: "postgres:15-alpine" + restart: on-failure + env_file: + - env/.env_usermodule + volumes: + - "usermodule_postgres:/var/lib/postgresql/data" + healthcheck: + test: pg_isready + interval: 10s + timeout: 5s + retries: 5 + eddn-message-listener: image: nexus.edpn.io/edpn/backend/eddn-message-listener:0.0.1-SNAPSHOT restart: on-failure @@ -92,3 +105,5 @@ volumes: driver: local trademodule_postgres: driver: local + usermodule_postgres: + driver: local diff --git a/env/.env_usermodule b/env/.env_usermodule new file mode 100644 index 00000000..c5ec4244 --- /dev/null +++ b/env/.env_usermodule @@ -0,0 +1,6 @@ +# .env_usermodule file + +# PostgreSQL +POSTGRES_USER=edpn_usermodule +POSTGRES_PASSWORD=hvWYDHqG3yXCKReH +POSTGRES_DB=usermodule diff --git a/user-module/build.gradle b/user-module/build.gradle index 39f137ff..8e3aa965 100644 --- a/user-module/build.gradle +++ b/user-module/build.gradle @@ -1,4 +1,5 @@ dependencies { + implementation 'io.edpn.backend:backend-mybatis-util' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-security' @@ -18,24 +19,8 @@ dependencies { extraJavaModuleInfo { automaticModule("dependency-management-plugin-1.1.0.jar","dependency.management.plugin") - //automaticModule("tomlj-1.0.0.jar","tomlj") automaticModule("jsr305-3.0.2.jar","jsr305") automaticModule("snappy-java-1.1.8.4.jar","snappy.java") automaticModule("liquibase-core-4.17.2.jar","liquibase.core") automaticModule("jjwt-0.9.1.jar", "io.jsonwebtoken") - /* - automaticModule("jersey-media-json-jackson-3.1.1.jar", "jersy.jackson") - automaticModule("jersey-container-servlet-3.1.1.jar", "jersy.jackson") - automaticModule("jersey-spring6-3.1.1.jar", "jersy.jackson") - automaticModule("jersey-container-servlet-core-3.1.1.jar", "jersy.jackson") - automaticModule("jersey-bean-validation-3.1.1.jar", "jersy.jackson") - automaticModule("jersey-server-3.1.1.jar", "jersy.jackson") - automaticModule("jersey-client-3.1.1.jar", "jersy.jackson") - automaticModule("jersey-hk2-3.1.1.jar", "jersy.jackson") - automaticModule("hk2-3.0.3.jar", "jersy.jackson") - automaticModule("jersey-entity-filtering-3.1.1.jar", "jersy.jackson") - automaticModule("osgi-resource-locator-1.0.3.jar", "jersy.jackson") - automaticModule("javassist-3.29.0-GA.jar", "jersy.jackson") - automaticModule("jersey-common-3.1.1.jar", "jersy.jackson")*/ - } diff --git a/user-module/src/main/java/io/edpn/backend/user/application/model/EdpnUserDetails.java b/user-module/src/main/java/io/edpn/backend/user/application/model/EdpnUserDetails.java new file mode 100644 index 00000000..d1c20cb8 --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/application/model/EdpnUserDetails.java @@ -0,0 +1,61 @@ +package io.edpn.backend.user.application.model; + +import io.edpn.backend.user.domain.model.EdpnUser; +import io.edpn.backend.user.domain.model.UserRole; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +@Data +@RequiredArgsConstructor +public class EdpnUserDetails implements UserDetails { + + private final EdpnUser user; + + @Override + public Collection getAuthorities() { + return Stream.concat(user.getRoles().stream().map(UserRole::getName).map("ROLE_"::concat), + Stream.concat(user.getRoles().stream().map(UserRole::getGrants).flatMap(Set::stream), + user.getGrants().stream().map("GRANT_"::concat))) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toUnmodifiableSet()); + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getEmail(); + } + + @Override + public boolean isAccountNonExpired() { + return Optional.ofNullable(user.getAccountExpiryTimestamp()).map(ts -> LocalDateTime.now().isBefore(ts)).orElse(false); + } + + @Override + public boolean isAccountNonLocked() { + return !user.isLocked(); + } + + @Override + public boolean isCredentialsNonExpired() { + return Optional.ofNullable(user.getPasswordExpiryTimestamp()).map(ts -> LocalDateTime.now().isBefore(ts)).orElse(false); + } + + @Override + public boolean isEnabled() { + return user.isEnabled(); + } +} diff --git a/user-module/src/main/java/io/edpn/backend/user/application/service/EdpnUserDetailsService.java b/user-module/src/main/java/io/edpn/backend/user/application/service/EdpnUserDetailsService.java new file mode 100644 index 00000000..79921a3a --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/application/service/EdpnUserDetailsService.java @@ -0,0 +1,21 @@ +package io.edpn.backend.user.application.service; + +import io.edpn.backend.user.application.model.EdpnUserDetails; +import io.edpn.backend.user.domain.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +@RequiredArgsConstructor +public class EdpnUserDetailsService implements UserDetailsService { + + private final UserRepository userRepository; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + return userRepository.findByUsername(username) + .map(EdpnUserDetails::new) + .orElseThrow(() -> new UsernameNotFoundException("User not found")); + } +} diff --git a/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiGrant.java b/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiGrant.java new file mode 100644 index 00000000..784cd06c --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiGrant.java @@ -0,0 +1,13 @@ +package io.edpn.backend.user.domain.model; + +import java.util.UUID; +import lombok.Builder; +import lombok.Value; + +@Value +@Builder +public class ApiGrant { + + UUID id; + String name; +} diff --git a/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiKey.java b/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiKey.java index c3617791..5f171311 100644 --- a/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiKey.java +++ b/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiKey.java @@ -16,7 +16,7 @@ public class ApiKey { String keyHash; String name; Set roles; - Set grants; + Set grants; LocalDateTime expiryTimestamp; boolean enabled; diff --git a/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiRole.java b/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiRole.java index 00894928..14964b1e 100644 --- a/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiRole.java +++ b/user-module/src/main/java/io/edpn/backend/user/domain/model/ApiRole.java @@ -12,5 +12,5 @@ public class ApiRole { UUID id; String name; - Set grants; + Set grants; } diff --git a/user-module/src/main/java/io/edpn/backend/user/domain/model/EdpnUser.java b/user-module/src/main/java/io/edpn/backend/user/domain/model/EdpnUser.java index 7034f847..c1ce772e 100644 --- a/user-module/src/main/java/io/edpn/backend/user/domain/model/EdpnUser.java +++ b/user-module/src/main/java/io/edpn/backend/user/domain/model/EdpnUser.java @@ -3,7 +3,6 @@ import java.time.LocalDateTime; import java.util.Set; import java.util.UUID; - import lombok.Builder; import lombok.Value; @@ -19,6 +18,7 @@ public class EdpnUser { boolean enabled; boolean locked; Set roles; - Set grants; + Set grants; Set apiKeys; + PricingPlan pricingPlan; } diff --git a/user-module/src/main/java/io/edpn/backend/user/domain/model/UserGrant.java b/user-module/src/main/java/io/edpn/backend/user/domain/model/UserGrant.java new file mode 100644 index 00000000..d568194e --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/domain/model/UserGrant.java @@ -0,0 +1,13 @@ +package io.edpn.backend.user.domain.model; + +import java.util.UUID; +import lombok.Builder; +import lombok.Value; + +@Value +@Builder +public class UserGrant { + + UUID id; + String name; +} diff --git a/user-module/src/main/java/io/edpn/backend/user/domain/model/UserRole.java b/user-module/src/main/java/io/edpn/backend/user/domain/model/UserRole.java index 45170fa1..40a2e8d5 100644 --- a/user-module/src/main/java/io/edpn/backend/user/domain/model/UserRole.java +++ b/user-module/src/main/java/io/edpn/backend/user/domain/model/UserRole.java @@ -12,5 +12,5 @@ public class UserRole { UUID id; String name; - Set grants; + Set grants; } diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiGrantEntity.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiGrantEntity.java new file mode 100644 index 00000000..189d747d --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiGrantEntity.java @@ -0,0 +1,20 @@ +package io.edpn.backend.user.infrastructure.persistence.entity; + +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ApiGrantEntity { + private UUID id; + private String name; +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/ApiKeyEntity.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiKeyEntity.java similarity index 80% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/ApiKeyEntity.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiKeyEntity.java index 73e12b30..8a6b3ccf 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/ApiKeyEntity.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiKeyEntity.java @@ -1,6 +1,5 @@ -package io.edpn.backend.user.infrastructure.entity; +package io.edpn.backend.user.infrastructure.persistence.entity; -import io.edpn.backend.user.domain.model.ApiRole; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -25,7 +24,7 @@ public class ApiKeyEntity { private String keyHash; private String name; private Set roles; - private Set grants; + private Set grants; private LocalDateTime expiryTimestamp; private boolean enabled; diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/ApiRoleEntity.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiRoleEntity.java similarity index 77% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/ApiRoleEntity.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiRoleEntity.java index 4134629c..8a6eef29 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/ApiRoleEntity.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/ApiRoleEntity.java @@ -1,4 +1,4 @@ -package io.edpn.backend.user.infrastructure.entity; +package io.edpn.backend.user.infrastructure.persistence.entity; import lombok.AllArgsConstructor; import lombok.Builder; @@ -20,5 +20,5 @@ public class ApiRoleEntity { private UUID id; private String name; - private Set grants; + private Set grants; } diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/EdpnUserEntity.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/EdpnUserEntity.java similarity index 78% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/EdpnUserEntity.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/EdpnUserEntity.java index 967f8b13..663211dc 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/EdpnUserEntity.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/EdpnUserEntity.java @@ -1,7 +1,5 @@ -package io.edpn.backend.user.infrastructure.entity; +package io.edpn.backend.user.infrastructure.persistence.entity; -import io.edpn.backend.user.domain.model.ApiKey; -import io.edpn.backend.user.domain.model.UserRole; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -29,6 +27,7 @@ public class EdpnUserEntity { private boolean enabled; private boolean locked; private Set roles; - private Set grants; + private Set grants; private Set apiKeys; + private PricingPlanEntity pricingPlan; } diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/PricingPlanEntity.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/PricingPlanEntity.java similarity index 85% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/PricingPlanEntity.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/PricingPlanEntity.java index 8fbecc81..689a3de9 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/PricingPlanEntity.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/PricingPlanEntity.java @@ -1,4 +1,4 @@ -package io.edpn.backend.user.infrastructure.entity; +package io.edpn.backend.user.infrastructure.persistence.entity; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/UserGrantEntity.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/UserGrantEntity.java new file mode 100644 index 00000000..e72fea2e --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/UserGrantEntity.java @@ -0,0 +1,20 @@ +package io.edpn.backend.user.infrastructure.persistence.entity; + +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserGrantEntity { + private UUID id; + private String name; +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/UserRoleEntity.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/UserRoleEntity.java similarity index 77% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/UserRoleEntity.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/UserRoleEntity.java index f1c4ea92..4d9ef284 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/entity/UserRoleEntity.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/entity/UserRoleEntity.java @@ -1,5 +1,7 @@ -package io.edpn.backend.user.infrastructure.entity; +package io.edpn.backend.user.infrastructure.persistence.entity; +import java.util.Set; +import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -7,9 +9,6 @@ import lombok.Setter; import lombok.ToString; -import java.util.Set; -import java.util.UUID; - @Getter @Setter @ToString @@ -20,5 +19,5 @@ public class UserRoleEntity { private UUID id; private String name; - private Set grants; + private Set grants; } diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiGrantMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiGrantMapper.java new file mode 100644 index 00000000..bcbad9a5 --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiGrantMapper.java @@ -0,0 +1,23 @@ +package io.edpn.backend.user.infrastructure.persistence.mappers.entity; + +import io.edpn.backend.user.domain.model.ApiGrant; +import io.edpn.backend.user.infrastructure.persistence.entity.ApiGrantEntity; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class ApiGrantMapper { + + public ApiGrant map(ApiGrantEntity entity) { + return ApiGrant.builder() + .id(entity.getId()) + .name(entity.getName()) + .build(); + } + + public ApiGrantEntity map(ApiGrant key) { + return ApiGrantEntity.builder() + .id(key.getId()) + .name(key.getName()) + .build(); + } +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/ApiKeyMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiKeyMapper.java similarity index 72% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/ApiKeyMapper.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiKeyMapper.java index da3c1e6c..fef96722 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/ApiKeyMapper.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiKeyMapper.java @@ -1,7 +1,7 @@ -package io.edpn.backend.user.infrastructure.mapper; +package io.edpn.backend.user.infrastructure.persistence.mappers.entity; import io.edpn.backend.user.domain.model.ApiKey; -import io.edpn.backend.user.infrastructure.entity.ApiKeyEntity; +import io.edpn.backend.user.infrastructure.persistence.entity.ApiKeyEntity; import lombok.RequiredArgsConstructor; import java.util.stream.Collectors; @@ -10,6 +10,7 @@ public class ApiKeyMapper { private final ApiRoleMapper apiRoleMapper; + private final ApiGrantMapper apiGrantMapper; public ApiKey map(ApiKeyEntity entity) { return ApiKey.builder() @@ -18,7 +19,7 @@ public ApiKey map(ApiKeyEntity entity) { .prefix(entity.getPrefix()) .keyHash(entity.getKeyHash()) .roles(entity.getRoles().stream().map(apiRoleMapper::map).collect(Collectors.toSet())) - .grants(entity.getGrants()) + .grants(entity.getGrants().stream().map(apiGrantMapper::map).collect(Collectors.toSet())) .expiryTimestamp(entity.getExpiryTimestamp()) .build(); } @@ -30,7 +31,7 @@ public ApiKeyEntity map(ApiKey key) { .prefix(key.getPrefix()) .keyHash(key.getKeyHash()) .roles(key.getRoles().stream().map(apiRoleMapper::map).collect(Collectors.toSet())) - .grants(key.getGrants()) + .grants(key.getGrants().stream().map(apiGrantMapper::map).collect(Collectors.toSet())) .expiryTimestamp(key.getExpiryTimestamp()) .build(); } diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/ApiRoleMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiRoleMapper.java similarity index 54% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/ApiRoleMapper.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiRoleMapper.java index 1b3f5f2e..a144e1b1 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/ApiRoleMapper.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/ApiRoleMapper.java @@ -1,24 +1,29 @@ -package io.edpn.backend.user.infrastructure.mapper; +package io.edpn.backend.user.infrastructure.persistence.mappers.entity; import io.edpn.backend.user.domain.model.ApiRole; -import io.edpn.backend.user.infrastructure.entity.ApiRoleEntity; +import io.edpn.backend.user.infrastructure.persistence.entity.ApiRoleEntity; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class ApiRoleMapper { + private final ApiGrantMapper apiGrantMapper; + + public ApiRole map(ApiRoleEntity entity) { return ApiRole.builder() .id(entity.getId()) .name(entity.getName()) - .grants(entity.getGrants()) + .grants(entity.getGrants().stream().map(apiGrantMapper::map).collect(Collectors.toSet())) .build(); } + public ApiRoleEntity map(ApiRole role) { return ApiRoleEntity.builder() .id(role.getId()) .name(role.getName()) - .grants(role.getGrants()) + .grants(role.getGrants().stream().map(apiGrantMapper::map).collect(Collectors.toSet())) .build(); } } diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/EdpnMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/EdpnUserMapper.java similarity index 71% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/EdpnMapper.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/EdpnUserMapper.java index 8b48f7ec..d8d95b5a 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/EdpnMapper.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/EdpnUserMapper.java @@ -1,16 +1,17 @@ -package io.edpn.backend.user.infrastructure.mapper; +package io.edpn.backend.user.infrastructure.persistence.mappers.entity; import io.edpn.backend.user.domain.model.EdpnUser; -import io.edpn.backend.user.infrastructure.entity.EdpnUserEntity; -import lombok.RequiredArgsConstructor; - +import io.edpn.backend.user.infrastructure.persistence.entity.EdpnUserEntity; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public class EdpnMapper { +public class EdpnUserMapper { private final UserRoleMapper userRoleMapper; private final ApiKeyMapper apiKeyMapper; + private final UserGrantMapper userGrantMapper; + private final PricingPlanMapper pricingPlanMapper; public EdpnUser map(EdpnUserEntity entity) { return EdpnUser.builder() @@ -22,8 +23,9 @@ public EdpnUser map(EdpnUserEntity entity) { .enabled(entity.isEnabled()) .locked(entity.isLocked()) .roles(entity.getRoles().stream().map(userRoleMapper::map).collect(Collectors.toSet())) - .grants(entity.getGrants()) + .grants(entity.getGrants().stream().map(userGrantMapper::map).collect(Collectors.toSet())) .apiKeys(entity.getApiKeys().stream().map(apiKeyMapper::map).collect(Collectors.toSet())) + .pricingPlan(pricingPlanMapper.map(entity.getPricingPlan())) .build(); } @@ -37,8 +39,9 @@ public EdpnUserEntity map(EdpnUser user) { .enabled(user.isEnabled()) .locked(user.isLocked()) .roles(user.getRoles().stream().map(userRoleMapper::map).collect(Collectors.toSet())) - .grants(user.getGrants()) + .grants(user.getGrants().stream().map(userGrantMapper::map).collect(Collectors.toSet())) .apiKeys(user.getApiKeys().stream().map(apiKeyMapper::map).collect(Collectors.toSet())) + .pricingPlan(pricingPlanMapper.map(user.getPricingPlan())) .build(); } } diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/PricingPlanMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/PricingPlanMapper.java similarity index 81% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/PricingPlanMapper.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/PricingPlanMapper.java index 13e07eb1..a9929829 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/PricingPlanMapper.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/PricingPlanMapper.java @@ -1,7 +1,7 @@ -package io.edpn.backend.user.infrastructure.mapper; +package io.edpn.backend.user.infrastructure.persistence.mappers.entity; import io.edpn.backend.user.domain.model.PricingPlan; -import io.edpn.backend.user.infrastructure.entity.PricingPlanEntity; +import io.edpn.backend.user.infrastructure.persistence.entity.PricingPlanEntity; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/UserGrantMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/UserGrantMapper.java new file mode 100644 index 00000000..5e4e7164 --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/UserGrantMapper.java @@ -0,0 +1,23 @@ +package io.edpn.backend.user.infrastructure.persistence.mappers.entity; + +import io.edpn.backend.user.domain.model.UserGrant; +import io.edpn.backend.user.infrastructure.persistence.entity.UserGrantEntity; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class UserGrantMapper { + + public UserGrant map(UserGrantEntity entity) { + return UserGrant.builder() + .id(entity.getId()) + .name(entity.getName()) + .build(); + } + + public UserGrantEntity map(UserGrant key) { + return UserGrantEntity.builder() + .id(key.getId()) + .name(key.getName()) + .build(); + } +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/UserRoleMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/UserRoleMapper.java similarity index 54% rename from user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/UserRoleMapper.java rename to user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/UserRoleMapper.java index b9720b8b..fb681f89 100644 --- a/user-module/src/main/java/io/edpn/backend/user/infrastructure/mapper/UserRoleMapper.java +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/entity/UserRoleMapper.java @@ -1,17 +1,20 @@ -package io.edpn.backend.user.infrastructure.mapper; +package io.edpn.backend.user.infrastructure.persistence.mappers.entity; import io.edpn.backend.user.domain.model.UserRole; -import io.edpn.backend.user.infrastructure.entity.UserRoleEntity; +import io.edpn.backend.user.infrastructure.persistence.entity.UserRoleEntity; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class UserRoleMapper { + private final UserGrantMapper userGrantMapper; + public UserRole map(UserRoleEntity entity) { return UserRole.builder() .id(entity.getId()) .name(entity.getName()) - .grants(entity.getGrants()) + .grants(entity.getGrants().stream().map(userGrantMapper::map).collect(Collectors.toSet())) .build(); } @@ -19,7 +22,7 @@ public UserRoleEntity map(UserRole userRole) { return UserRoleEntity.builder() .id(userRole.getId()) .name(userRole.getName()) - .grants(userRole.getGrants()) + .grants(userRole.getGrants().stream().map(userGrantMapper::map).collect(Collectors.toSet())) .build(); } } diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiGrantEntityMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiGrantEntityMapper.java new file mode 100644 index 00000000..3ae1f9d5 --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiGrantEntityMapper.java @@ -0,0 +1,47 @@ +package io.edpn.backend.user.infrastructure.persistence.mappers.mybatis; + +import io.edpn.backend.mybatisutil.UuidTypeHandler; +import io.edpn.backend.user.infrastructure.persistence.entity.ApiGrantEntity; +import java.util.Collection; +import java.util.Optional; +import java.util.UUID; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +public interface ApiGrantEntityMapper { + @Results(id = "ApiGrantResultMap", value = { + @Result(property = "id", column = "id", javaType = UUID.class, typeHandler = UuidTypeHandler.class), + @Result(property = "name", column = "name") + }) + @Select("SELECT * FROM api_grant WHERE id = #{id}") + Optional findById(@Param("id") UUID id); + + @ResultMap("ApiGrantResultMap") + @Select({"SELECT ag* ", + "FROM api_role_api_grant_map rgm ", + "INNER JOIN api_grant ag ON rgm.grant = ag.id", + "WHERE rgm.role = #{apiRoleId}"}) + Collection findByApiRoleId(@Param("apiRoleId") UUID apiRoleId); + + @ResultMap("ApiGrantResultMap") + @Select({"SELECT ag.* ", + "FROM api_key_api_grant_map kgm ", + "INNER JOIN api_grant ag ON kgm.grant = ag.id", + "WHERE kgm.key = #{apiKeyId}"}) + Collection findByApiKeyId(@Param("apiRoleId") UUID apiKeyId); + + @Insert("INSERT INTO api_grant(id, name) VALUES(#{id}, #{name})") + void insert(ApiGrantEntity apiGrant); + + @Update("UPDATE api_grant SET name = #{name} WHERE id = #{id}") + void update(ApiGrantEntity apiGrant); + + @Delete("DELETE FROM api_grant WHERE id = #{id}") + void delete(UUID id); +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiKeyEntityMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiKeyEntityMapper.java new file mode 100644 index 00000000..29cd3331 --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiKeyEntityMapper.java @@ -0,0 +1,47 @@ +package io.edpn.backend.user.infrastructure.persistence.mappers.mybatis; + +import io.edpn.backend.mybatisutil.UuidTypeHandler; +import io.edpn.backend.user.infrastructure.persistence.entity.ApiKeyEntity; +import java.util.Collection; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Many; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +public interface ApiKeyEntityMapper { + @Results(id = "ApiKeyResultMap", value = { + @Result(property = "id", column = "id", javaType = UUID.class, typeHandler = UuidTypeHandler.class), + @Result(property = "prefix", column = "prefix"), + @Result(property = "keyHash", column = "key_hash"), + @Result(property = "name", column = "name"), + @Result(property = "expiryTimestamp", column = "expiry_timestamp"), + @Result(property = "enabled", column = "enabled"), + @Result(property = "roles", column = "id", javaType = Set.class, + many = @Many(select = "io.edpn.backend.user.infrastructure.persitence.mappers.mybatis.ApiRoleEntityMapper.findByApiKeyId")), + @Result(property = "grants", column = "id", javaType = Set.class, + many = @Many(select = "io.edpn.backend.user.infrastructure.persitence.mappers.mybatis.ApiGrantEntityMapper.findByApiKeyId")) + }) + @Select("SELECT * FROM api_key WHERE id = #{id}") + Optional findById(@Param("id") UUID id); + + @ResultMap("ApiKeyResultMap") + @Select("SELECT * FROM api_key WHERE edpn_user = #{edpnUserId}") + Collection findByEdpnUserId(@Param("edpnUserId") UUID edpnUserId); + + @Insert("INSERT INTO api_key(id, prefix, key_hash, name, expiry_timestamp, enabled, edpn_user) VALUES(#{apiKey.id}, #{apiKey.prefix}, #{apiKey.keyHash}, #{apiKey.name}, #{apiKey.expiryTimestamp}, #{apiKey.enabled}, #{user_id})") + void insert(@Param("userId") UUID userId, @Param("apiKey") ApiKeyEntity apiKey); + + @Update("UPDATE api_key SET name = #{apiKey.name}, expiry_timestamp = #{apiKey.expiryTimestamp}, enabled = #{apiKey.enabled}, edpn_user = #{edpnUser} WHERE id = #{id}") + void update(@Param("userId") UUID userId, @Param("apiKey") ApiKeyEntity apiKey); + + @Delete("DELETE FROM api_key WHERE id = #{id}") + void delete(UUID id); +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiRoleEntityMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiRoleEntityMapper.java new file mode 100644 index 00000000..d4ee5ff6 --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/ApiRoleEntityMapper.java @@ -0,0 +1,45 @@ +package io.edpn.backend.user.infrastructure.persistence.mappers.mybatis; + +import io.edpn.backend.mybatisutil.UuidTypeHandler; +import io.edpn.backend.user.infrastructure.persistence.entity.ApiRoleEntity; +import java.util.Collection; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Many; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +public interface ApiRoleEntityMapper { + + @Insert("INSERT INTO api_role(id, name) VALUES(#{id}, #{name})") + void insertApiRole(ApiRoleEntity apiRole); + + @Update("UPDATE api_role SET name = #{name} WHERE id = #{id}") + void updateApiRole(ApiRoleEntity apiRole); + + @Delete("DELETE FROM api_role WHERE id = #{id}") + void deleteApiRole(UUID id); + + @Results(id = "ApiRoleResultMap", value = { + @Result(property = "id", column = "id", javaType = UUID.class, typeHandler = UuidTypeHandler.class), + @Result(property = "name", column = "name"), + @Result(property = "grants", column = "id", javaType = Set.class, + many = @Many(select = "io.edpn.backend.user.infrastructure.persitence.mappers.mybatis.ApiGrantEntityMapper.findByApiRoleId")) + + }) + @Select("SELECT * FROM api_role WHERE id = #{id}") + Optional findById(UUID id); + + @ResultMap("ApiRoleResultMap") + @Select({"SELECT ar.* ", + "FROM api_key_api_role_map kgm ", + "INNER JOIN api_role ar ON kgm.role = ar.id", + "WHERE kgm.key = #{apiKeyId}"}) + Collection findByApiKeyId(UUID apiKeyId); +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/EdpnUserEntityMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/EdpnUserEntityMapper.java new file mode 100644 index 00000000..0647602e --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/EdpnUserEntityMapper.java @@ -0,0 +1,59 @@ +package io.edpn.backend.user.infrastructure.persistence.mappers.mybatis; + +import io.edpn.backend.user.infrastructure.persistence.entity.ApiGrantEntity; +import io.edpn.backend.user.infrastructure.persistence.entity.EdpnUserEntity; +import io.edpn.backend.user.infrastructure.persistence.entity.PricingPlanEntity; +import java.time.LocalDateTime; +import java.util.Set; +import java.util.UUID; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Many; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +public interface EdpnUserEntityMapper { + + @Results(id = "edpnUserResultMap", value = { + @Result(property = "id", column = "id", javaType = UUID.class), + @Result(property = "email", column = "email", javaType = String.class), + @Result(property = "password", column = "password", javaType = String.class), + @Result(property = "accountExpiryTimestamp", column = "account_expiry_timestamp", javaType = LocalDateTime.class), + @Result(property = "passwordExpiryTimestamp", column = "password_expiry_timestamp", javaType = LocalDateTime.class), + @Result(property = "enabled", column = "enabled", javaType = boolean.class), + @Result(property = "locked", column = "locked", javaType = boolean.class), + @Result(property = "roles", column = "id", javaType = Set.class, + many = @Many(select = "io.edpn.backend.user.infrastructure.persistence.mapper.UserRoleEntityMapper.findByEdpnUserId")), + @Result(property = "grants", column = "id", javaType = Set.class, + many = @Many(select = "io.edpn.backend.user.infrastructure.persistence.mapper.UserGrantEntityMapper.findByEdpnUserId")), + @Result(property = "apiKeys", column = "id", javaType = Set.class, + many = @Many(select = "io.edpn.backend.user.infrastructure.persistence.mapper.ApiKeyEntityMapper.findByEdpnUserId")), + @Result(property = "pricingPlan", column = "pricing_plan", javaType = PricingPlanEntity.class) + }) + @Select("SELECT * FROM edpn_user WHERE id = #{id}") + EdpnUserEntity findById(UUID id); + + @Insert({ + "INSERT INTO edpn_user(id, email, password, account_expiry_timestamp, password_expiry_timestamp, enabled, locked, pricing_plan)", + "VALUES(#{id}, #{email}, #{password}, #{accountExpiryTimestamp}, #{passwordExpiryTimestamp}, #{enabled}, #{locked}, #{pricing_plan})"}) + void insert(EdpnUserEntity edpnUser); + + @Update({ + "UPDATE edpn_user", + "SET email = #{email},", + "password = #{password},", + "account_expiry_timestamp = #{accountExpiryTimestamp},", + "password_expiry_timestamp = #{passwordExpiryTimestamp},", + "enabled = #{enabled},", + "locked = #{locked},", + "pricing_plan = #{pricing_plan}", + "WHERE id = #{id}" + }) + void update(EdpnUserEntity edpnUser); + + @Delete("DELETE FROM edpn_user WHERE id = #{id}") + void delete(UUID id); + +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/PricingPlanEntityMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/PricingPlanEntityMapper.java new file mode 100644 index 00000000..5fead57e --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/PricingPlanEntityMapper.java @@ -0,0 +1,32 @@ +package io.edpn.backend.user.infrastructure.persistence.mappers.mybatis; + +import io.edpn.backend.mybatisutil.UuidTypeHandler; +import io.edpn.backend.user.infrastructure.persistence.entity.PricingPlanEntity; +import java.util.Optional; +import java.util.UUID; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +public interface PricingPlanEntityMapper { + @Results({ + @Result(property = "id", column = "id", javaType = UUID.class, typeHandler = UuidTypeHandler.class), + @Result(property = "name", column = "name"), + @Result(property = "capacityPerMinute", column = "capacity_per_minute") + }) + @Select("SELECT * FROM pricing_plan WHERE id = #{id}") + Optional findById(@Param("id") UUID id); + + @Insert("INSERT INTO pricing_plan(id, name, capacity_per_minute) VALUES(#{id}, #{name}, #{capacityPerMinute})") + void insert(PricingPlanEntity pricingPlan); + + @Update("UPDATE pricing_plan SET name = #{name}, capacity_per_minute = #{capacityPerMinute}, currency = #{currency} WHERE id = #{id}") + void update(PricingPlanEntity pricingPlan); + + @Delete("DELETE FROM pricing_plan WHERE id = #{id}") + void delete(UUID id); +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/UserGrantEntityMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/UserGrantEntityMapper.java new file mode 100644 index 00000000..83c22428 --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/UserGrantEntityMapper.java @@ -0,0 +1,40 @@ +package io.edpn.backend.user.infrastructure.persistence.mappers.mybatis; + +import io.edpn.backend.mybatisutil.UuidTypeHandler; +import io.edpn.backend.user.infrastructure.persistence.entity.UserGrantEntity; +import java.util.Collection; +import java.util.Optional; +import java.util.UUID; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +public interface UserGrantEntityMapper { + @Results(id = "UserGrantResultMap", value = { + @Result(property = "id", column = "id", javaType = UUID.class, typeHandler = UuidTypeHandler.class), + @Result(property = "name", column = "name") + }) + @Select("SELECT * FROM user_grant WHERE id = #{id}") + Optional findById(@Param("id") UUID id); + + @ResultMap("UserGrantResultMap") + @Select({"SELECT rg.* ", + "FROM user_role_user_grant_map rgm ", + "INNER JOIN user_grant rg ON rgm.grant = rg.id", + "WHERE rgm.role = #{userRoleId}"}) + Collection findByUserRoleId(@Param("userRoleId") UUID userRoleId); + + @Insert("INSERT INTO user_grant(id, name) VALUES(#{id}, #{name})") + void insert(UserGrantEntity userGrant); + + @Update("UPDATE user_grant SET name = #{name} WHERE id = #{id}") + void update(UserGrantEntity userGrant); + + @Delete("DELETE FROM user_grant WHERE id = #{id}") + void delete(UUID id); +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/UserRoleEntityMapper.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/UserRoleEntityMapper.java new file mode 100644 index 00000000..cf7f836a --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/mappers/mybatis/UserRoleEntityMapper.java @@ -0,0 +1,48 @@ +package io.edpn.backend.user.infrastructure.persistence.mappers.mybatis; + +import io.edpn.backend.mybatisutil.UuidTypeHandler; +import io.edpn.backend.user.infrastructure.persistence.entity.ApiRoleEntity; +import io.edpn.backend.user.infrastructure.persistence.entity.UserRoleEntity; +import java.util.Collection; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Many; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +public interface UserRoleEntityMapper { + + @Results(id = "UserRoleResultMap", value = { + @Result(property = "id", column = "id", javaType = UUID.class, typeHandler = UuidTypeHandler.class), + @Result(property = "name", column = "name"), + @Result(property = "grants", column = "id", javaType = Set.class, + many = @Many(select = "io.edpn.backend.user.infrastructure.persitence.mappers.mybatis.UserGrantEntityMapper.findByUserRoleId")) + + }) + @Select("SELECT * FROM user_role WHERE id = #{id}") + Optional findById(UUID id); + + @ResultMap("UserRoleResultMap") + + @Select({"SELECT ag.* ", + "FROM user_role_user_grant_map urm ", + "INNER JOIN user_role ur ON urm.grant = ur.id", + "WHERE kgm.key = #{edpnUserId}"}) + Collection findByEdpnUserId(@Param("edpnUserId") UUID edpnUserId); + + @Insert("INSERT INTO user_role(id, name) VALUES(#{id}, #{name})") + void insertUserRole(UserRoleEntity userRole); + + @Update("UPDATE user_role SET name = #{name} WHERE id = #{id}") + void updateUserRole(UserRoleEntity userRole); + + @Delete("DELETE FROM user_role WHERE id = #{id}") + void deleteUserRole(UUID id); +} diff --git a/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/repostory/MybatisUserRepository.java b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/repostory/MybatisUserRepository.java new file mode 100644 index 00000000..244e537a --- /dev/null +++ b/user-module/src/main/java/io/edpn/backend/user/infrastructure/persistence/repostory/MybatisUserRepository.java @@ -0,0 +1,17 @@ +package io.edpn.backend.user.infrastructure.persistence.repostory; + +import io.edpn.backend.user.domain.model.EdpnUser; +import io.edpn.backend.user.domain.repository.UserRepository; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class MybatisUserRepository implements UserRepository { + + @Override + public Optional findByUsername(String email) { + return Optional.empty(); + } +} diff --git a/user-module/src/main/java/module-info.java b/user-module/src/main/java/module-info.java index 4218d54a..2794e28b 100644 --- a/user-module/src/main/java/module-info.java +++ b/user-module/src/main/java/module-info.java @@ -15,6 +15,7 @@ requires spring.boot.starter.security; requires io.github.bucket4j.core; requires spring.security.core; + requires io.edpn.backend.mybatis.util; exports io.edpn.backend.user.application.controller; exports io.edpn.backend.user.application.dto; diff --git a/user-module/src/main/resources/application-local.properties b/user-module/src/main/resources/application-local.properties new file mode 100644 index 00000000..0edd9c2c --- /dev/null +++ b/user-module/src/main/resources/application-local.properties @@ -0,0 +1,10 @@ +spring.liquibase.enabled=true +spring.liquibase.change-log=classpath:db/changelog/changelog-master.xml + +spring.datasource.url=jdbc:postgresql://localhost:54322/user +spring.datasource.username=edpn_usermodule +spring.datasource.password=hvWYDHqG3yXCKReH +spring.datasource.driver-class-name=org.postgresql.Driver + +spring.kafka.bootstrap-servers=localhost:9092 +spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer diff --git a/user-module/src/main/resources/application.properties b/user-module/src/main/resources/application.properties new file mode 100644 index 00000000..3f402ce7 --- /dev/null +++ b/user-module/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.liquibase.enabled=true +spring.liquibase.change-log=classpath:db/changelog/changelog-master.xml + +spring.datasource.url=${USERMODULE_DB_URL} +spring.datasource.username=${USERMODULE_DB_USERNAME} +spring.datasource.password=${USERMODULE_DB_PASSWORD} diff --git a/user-module/src/main/resources/db/changelog/changelog-master.xml b/user-module/src/main/resources/db/changelog/changelog-master.xml new file mode 100644 index 00000000..92925675 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/changelog-master.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/user-module/src/main/resources/db/changelog/create_api_grant_table.xml b/user-module/src/main/resources/db/changelog/create_api_grant_table.xml new file mode 100644 index 00000000..82ebe740 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_api_grant_table.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + name + + + + diff --git a/user-module/src/main/resources/db/changelog/create_api_key_api_grant_map_table.xml b/user-module/src/main/resources/db/changelog/create_api_key_api_grant_map_table.xml new file mode 100644 index 00000000..1ac3307b --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_api_key_api_grant_map_table.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/user-module/src/main/resources/db/changelog/create_api_key_api_role_map_table.xml b/user-module/src/main/resources/db/changelog/create_api_key_api_role_map_table.xml new file mode 100644 index 00000000..6ea8ff17 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_api_key_api_role_map_table.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/user-module/src/main/resources/db/changelog/create_api_key_table.xml b/user-module/src/main/resources/db/changelog/create_api_key_table.xml new file mode 100644 index 00000000..7c6cbacd --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_api_key_table.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + prefix + key_hash + + + + + edpn_user + + + + diff --git a/user-module/src/main/resources/db/changelog/create_api_role_api_grant_map_table.xml b/user-module/src/main/resources/db/changelog/create_api_role_api_grant_map_table.xml new file mode 100644 index 00000000..dfc85154 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_api_role_api_grant_map_table.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/user-module/src/main/resources/db/changelog/create_api_role_table.xml b/user-module/src/main/resources/db/changelog/create_api_role_table.xml new file mode 100644 index 00000000..2fb46671 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_api_role_table.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + name + + + + diff --git a/user-module/src/main/resources/db/changelog/create_edpn_user_table.xml b/user-module/src/main/resources/db/changelog/create_edpn_user_table.xml new file mode 100644 index 00000000..fee7d906 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_edpn_user_table.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + name + + + + diff --git a/user-module/src/main/resources/db/changelog/create_edpn_user_user_grant_map_table.xml b/user-module/src/main/resources/db/changelog/create_edpn_user_user_grant_map_table.xml new file mode 100644 index 00000000..65619927 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_edpn_user_user_grant_map_table.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/user-module/src/main/resources/db/changelog/create_edpn_user_user_role_map_table.xml b/user-module/src/main/resources/db/changelog/create_edpn_user_user_role_map_table.xml new file mode 100644 index 00000000..360f2e4e --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_edpn_user_user_role_map_table.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/user-module/src/main/resources/db/changelog/create_pricing_plan_table.xml b/user-module/src/main/resources/db/changelog/create_pricing_plan_table.xml new file mode 100644 index 00000000..6c73beb4 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_pricing_plan_table.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + name + + + + diff --git a/user-module/src/main/resources/db/changelog/create_user_grant_table.xml b/user-module/src/main/resources/db/changelog/create_user_grant_table.xml new file mode 100644 index 00000000..7e5a47ad --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_user_grant_table.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + name + + + + diff --git a/user-module/src/main/resources/db/changelog/create_user_role_table.xml b/user-module/src/main/resources/db/changelog/create_user_role_table.xml new file mode 100644 index 00000000..52ddbf70 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_user_role_table.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + name + + + + diff --git a/user-module/src/main/resources/db/changelog/create_user_role_user_grant_map_table.xml b/user-module/src/main/resources/db/changelog/create_user_role_user_grant_map_table.xml new file mode 100644 index 00000000..8fde7426 --- /dev/null +++ b/user-module/src/main/resources/db/changelog/create_user_role_user_grant_map_table.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + +