From b4ae9b71379b1c24ca861e00b78468b2e3a1df3c Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 26 Oct 2022 17:24:34 +0200 Subject: [PATCH 1/6] RED-5293: 500 for invalid tenant --- .../v1/server/service/TenantManagementService.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java index 756da76a7..af393cab2 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java @@ -15,6 +15,8 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.springframework.stereotype.Service; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.TenantEntity; import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; @@ -55,6 +57,10 @@ public class TenantManagementService { if (tenantRepository.findById(tenantRequest.getTenantId()).isEmpty()) { + if (tenantRequest.getDisplayName().isEmpty() || tenantRequest.getUser().isEmpty() || tenantRequest.getPassword().isBlank()) { + throw new BadRequestException("Bad request: fields have wrong format or required fields are empty"); + } + String encryptedPassword = encryptionService.encrypt(tenantRequest.getPassword()); try (Connection connection = DriverManager.getConnection(tenantRequest.getJdbcUrl(), tenantRequest.getUser(), tenantRequest.getPassword())) { @@ -71,6 +77,8 @@ public class TenantManagementService { .password(encryptedPassword) .build(); tenantRepository.save(tenantEntity); + } else { + throw new ConflictException("Conflict: tenant id already exists."); } } From eaa0a640d5367934577b496f06e72cbb5fb5366b Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Thu, 27 Oct 2022 17:00:42 +0200 Subject: [PATCH 2/6] RED-5293: 500 for invalid tenant --- persistence-service-v1/persistence-service-api-v1/pom.xml | 6 ++++++ .../service/v1/api/model/multitenancy/TenantRequest.java | 5 +++++ .../v1/processor/exception/ConflictException.java | 7 +++++++ .../peristence/v1/server/controller/TenantsController.java | 4 +++- .../v1/server/service/TenantManagementService.java | 7 +------ 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/persistence-service-v1/persistence-service-api-v1/pom.xml b/persistence-service-v1/persistence-service-api-v1/pom.xml index bf4454d55..1d7424a76 100644 --- a/persistence-service-v1/persistence-service-api-v1/pom.xml +++ b/persistence-service-v1/persistence-service-api-v1/pom.xml @@ -65,6 +65,12 @@ com.iqser.red.commons jackson-commons + + jakarta.validation + jakarta.validation-api + 2.0.2 + compile + diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java index 1141ce648..9f97b483c 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java @@ -1,5 +1,7 @@ package com.iqser.red.service.persistence.service.v1.api.model.multitenancy; +import javax.validation.constraints.NotBlank; + import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -12,10 +14,13 @@ import lombok.NoArgsConstructor; public class TenantRequest { private String tenantId; + @NotBlank private String displayName; private String guid; private String jdbcUrl; + @NotBlank private String user; + @NotBlank private String password; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/ConflictException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/ConflictException.java index f47430f66..7e268bf97 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/ConflictException.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/ConflictException.java @@ -7,4 +7,11 @@ public class ConflictException extends RuntimeException { super(message); } + + public static ConflictException withObjectName(String objectName) { + + return new ConflictException(String.format("An object of type %s already exists.", objectName)); + + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java index 611e9925f..e8ab470c1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java @@ -2,6 +2,8 @@ package com.iqser.red.service.peristence.v1.server.controller; import java.util.List; +import javax.validation.Valid; + import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -22,7 +24,7 @@ public class TenantsController implements TenantsResource { private final TenantManagementService tenantManagementService; private final DeploymentKeyService deploymentKeyService; - + @Valid public void createTenant(@RequestBody TenantRequest tenantRequest) { tenantManagementService.createTenant(tenantRequest); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java index af393cab2..a358c143b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java @@ -15,7 +15,6 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.springframework.stereotype.Service; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.TenantEntity; @@ -57,10 +56,6 @@ public class TenantManagementService { if (tenantRepository.findById(tenantRequest.getTenantId()).isEmpty()) { - if (tenantRequest.getDisplayName().isEmpty() || tenantRequest.getUser().isEmpty() || tenantRequest.getPassword().isBlank()) { - throw new BadRequestException("Bad request: fields have wrong format or required fields are empty"); - } - String encryptedPassword = encryptionService.encrypt(tenantRequest.getPassword()); try (Connection connection = DriverManager.getConnection(tenantRequest.getJdbcUrl(), tenantRequest.getUser(), tenantRequest.getPassword())) { @@ -78,7 +73,7 @@ public class TenantManagementService { .build(); tenantRepository.save(tenantEntity); } else { - throw new ConflictException("Conflict: tenant id already exists."); + throw ConflictException.withObjectName("tenant"); } } From a9f4c5f31ff646787b53ffbe280e05f121d7fafa Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Fri, 28 Oct 2022 15:02:54 +0200 Subject: [PATCH 3/6] RED-5293: 500 for invalid tenant --- .../service/v1/api/model/multitenancy/TenantRequest.java | 2 ++ .../peristence/v1/server/service/TenantManagementService.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java index 9f97b483c..8b3a1c525 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java @@ -1,6 +1,7 @@ package com.iqser.red.service.persistence.service.v1.api.model.multitenancy; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -13,6 +14,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor public class TenantRequest { + @NotNull private String tenantId; @NotBlank private String displayName; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java index a358c143b..1fee2e504 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java @@ -8,6 +8,7 @@ import java.util.stream.Collectors; import javax.sql.DataSource; +import org.postgresql.util.PSQLException; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -15,6 +16,7 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.springframework.stereotype.Service; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.TenantEntity; @@ -61,6 +63,8 @@ public class TenantManagementService { try (Connection connection = DriverManager.getConnection(tenantRequest.getJdbcUrl(), tenantRequest.getUser(), tenantRequest.getPassword())) { DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); runLiquibase(tenantDataSource); + } catch (PSQLException e) { + throw new BadRequestException("Could not connect to datbase", e); } TenantEntity tenantEntity = TenantEntity.builder() From 5ed25793629dd4136665ec1f37bb2c794571e59c Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Fri, 28 Oct 2022 16:46:36 +0200 Subject: [PATCH 4/6] RED-5293: 500 for invalid tenant --- .../persistence-service-api-v1/pom.xml | 18 +++++++++--------- .../persistence-service-server-v1/pom.xml | 4 ++++ .../service/TenantManagementService.java | 2 +- persistence-service-v1/pom.xml | 1 + 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/persistence-service-v1/persistence-service-api-v1/pom.xml b/persistence-service-v1/persistence-service-api-v1/pom.xml index 1d7424a76..4bdf0765f 100644 --- a/persistence-service-v1/persistence-service-api-v1/pom.xml +++ b/persistence-service-v1/persistence-service-api-v1/pom.xml @@ -56,22 +56,22 @@ - org.springframework - spring-web + org.springframework.boot + spring-boot-starter-web + compile + + org.springframework.boot + spring-boot-starter-validation + compile + + com.iqser.red.commons jackson-commons - - jakarta.validation - jakarta.validation-api - 2.0.2 - compile - - diff --git a/persistence-service-v1/persistence-service-server-v1/pom.xml b/persistence-service-v1/persistence-service-server-v1/pom.xml index 15ab8a5cd..6da55d426 100644 --- a/persistence-service-v1/persistence-service-server-v1/pom.xml +++ b/persistence-service-v1/persistence-service-server-v1/pom.xml @@ -125,6 +125,10 @@ org.slf4j slf4j-log4j12 + + org.springframework.boot + spring-boot-starter-web + com.iqser.red.commons spring-boot-starter-web-custom-commons diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java index 1fee2e504..9a287ab30 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java @@ -64,7 +64,7 @@ public class TenantManagementService { DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); runLiquibase(tenantDataSource); } catch (PSQLException e) { - throw new BadRequestException("Could not connect to datbase", e); + throw new BadRequestException("Could not connect to database", e); } TenantEntity tenantEntity = TenantEntity.builder() diff --git a/persistence-service-v1/pom.xml b/persistence-service-v1/pom.xml index b76a43926..daf8b5d84 100755 --- a/persistence-service-v1/pom.xml +++ b/persistence-service-v1/pom.xml @@ -68,6 +68,7 @@ + From 0dd7cb049d42443fc6096c6e72b02aec6c3608b6 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Fri, 28 Oct 2022 16:52:30 +0200 Subject: [PATCH 5/6] RED-5293: 500 for invalid tenant --- .../peristence/v1/server/controller/TenantsController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java index e8ab470c1..77550538b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java @@ -24,8 +24,8 @@ public class TenantsController implements TenantsResource { private final TenantManagementService tenantManagementService; private final DeploymentKeyService deploymentKeyService; - @Valid - public void createTenant(@RequestBody TenantRequest tenantRequest) { + + public void createTenant(@Valid @RequestBody TenantRequest tenantRequest) { tenantManagementService.createTenant(tenantRequest); } From 92326e82f572c62f275c98fc47d1848e47f2c2ea Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 2 Nov 2022 13:29:56 +0100 Subject: [PATCH 6/6] RED-5293: 500 for invalid tenant --- .../v1/server/controller/ControllerAdvice.java | 10 ++++++++++ .../v1/server/service/TenantManagementService.java | 2 -- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java index 5e47ec606..0a8515b48 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java @@ -5,6 +5,7 @@ import java.time.OffsetDateTime; import org.postgresql.util.PSQLException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; @@ -93,4 +94,13 @@ public class ControllerAdvice { } } + + @ResponseBody + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = MethodArgumentNotValidException.class) + public ErrorMessage handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + + return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java index 9a287ab30..a47fcedbc 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java @@ -63,8 +63,6 @@ public class TenantManagementService { try (Connection connection = DriverManager.getConnection(tenantRequest.getJdbcUrl(), tenantRequest.getUser(), tenantRequest.getPassword())) { DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); runLiquibase(tenantDataSource); - } catch (PSQLException e) { - throw new BadRequestException("Could not connect to database", e); } TenantEntity tenantEntity = TenantEntity.builder()