diff --git a/compose.yaml b/compose.yaml deleted file mode 100644 index 6e7b4bb..0000000 --- a/compose.yaml +++ /dev/null @@ -1,41 +0,0 @@ -services: - database: - image: 'postgres:16.2' - ports: - - '15432:5432' - environment: - - 'POSTGRES_USER=root' - - 'POSTGRES_DB=mydatabase' - - 'POSTGRES_PASSWORD=password' - volumes: - - mydb:/var/lib/postgresql/data - - ./dev/create_keycloak_db.sh:/docker-entrypoint-initdb.d/create_second_db.sh - - keycloak: - healthcheck: - test: ["CMD", "curl", "-f", "http://0.0.0.0:28080/auth/"] - interval: 5s - timeout: 2s - retries: 15 - pid: "host" - depends_on: - - database - volumes: - - keycloak-data:/opt/keycloak/data/ - - ./dev/SWD_local_realm.json:/opt/keycloak/data/import/miw_test_realm_local.json - environment: - KEYCLOAK_ADMIN: admin - KEYCLOAK_ADMIN_PASSWORD: admin - DB_VENDOR: postgres - DB_ADDR: database - DB_DATABASE: auth - DB_USER: root - DB_PASSWORD: password - image: quay.io/keycloak/keycloak:24.0.2 - entrypoint: ["/opt/keycloak/bin/kc.sh", "start-dev", "--import-realm"] - ports: - - "28080:8080" - -volumes: - mydb: - keycloak-data: diff --git a/settings.gradle b/settings.gradle index 9d55eef..068f02d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -rootProject.name = 'ss-multi-module' +rootProject.name = 'front-facing-wizard' FileTree buildFiles = fileTree(rootDir) { include 'ss-web' diff --git a/ss-api/src/main/java/ss/mod/demo/api/constant/ContField.java b/ss-api/src/main/java/ss/ff/wizard/api/constant/ContField.java similarity index 97% rename from ss-api/src/main/java/ss/mod/demo/api/constant/ContField.java rename to ss-api/src/main/java/ss/ff/wizard/api/constant/ContField.java index 84b708e..74ce452 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/constant/ContField.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/constant/ContField.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.constant; +package ss.ff.wizard.api.constant; import lombok.experimental.UtilityClass; diff --git a/ss-api/src/main/java/ss/mod/demo/api/constant/ContMessage.java b/ss-api/src/main/java/ss/ff/wizard/api/constant/ContMessage.java similarity index 97% rename from ss-api/src/main/java/ss/mod/demo/api/constant/ContMessage.java rename to ss-api/src/main/java/ss/ff/wizard/api/constant/ContMessage.java index f956cba..1ad8f5d 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/constant/ContMessage.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/constant/ContMessage.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.constant; +package ss.ff.wizard.api.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; diff --git a/ss-api/src/main/java/ss/mod/demo/api/constant/ContURI.java b/ss-api/src/main/java/ss/ff/wizard/api/constant/ContURI.java similarity index 97% rename from ss-api/src/main/java/ss/mod/demo/api/constant/ContURI.java rename to ss-api/src/main/java/ss/ff/wizard/api/constant/ContURI.java index ea98e45..dd349bd 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/constant/ContURI.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/constant/ContURI.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.constant; +package ss.ff.wizard.api.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; diff --git a/ss-api/src/main/java/ss/mod/demo/api/constant/ContValue.java b/ss-api/src/main/java/ss/ff/wizard/api/constant/ContValue.java similarity index 96% rename from ss-api/src/main/java/ss/mod/demo/api/constant/ContValue.java rename to ss-api/src/main/java/ss/ff/wizard/api/constant/ContValue.java index 170790d..7e98349 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/constant/ContValue.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/constant/ContValue.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.constant; +package ss.ff.wizard.api.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; diff --git a/ss-api/src/main/java/ss/mod/demo/api/exception/BadDataException.java b/ss-api/src/main/java/ss/ff/wizard/api/exception/BadDataException.java similarity index 97% rename from ss-api/src/main/java/ss/mod/demo/api/exception/BadDataException.java rename to ss-api/src/main/java/ss/ff/wizard/api/exception/BadDataException.java index 245db97..f0eac6d 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/exception/BadDataException.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/exception/BadDataException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.exception; +package ss.ff.wizard.api.exception; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/ss-api/src/main/java/ss/mod/demo/api/model/BaseModel.java b/ss-api/src/main/java/ss/ff/wizard/api/model/BaseModel.java similarity index 96% rename from ss-api/src/main/java/ss/mod/demo/api/model/BaseModel.java rename to ss-api/src/main/java/ss/ff/wizard/api/model/BaseModel.java index 5ca4814..bd55479 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/model/BaseModel.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/model/BaseModel.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.model; +package ss.ff.wizard.api.model; import java.io.Serializable; diff --git a/ss-api/src/main/java/ss/ff/wizard/api/model/request/ParticipantRequest.java b/ss-api/src/main/java/ss/ff/wizard/api/model/request/ParticipantRequest.java new file mode 100644 index 0000000..88c3c73 --- /dev/null +++ b/ss-api/src/main/java/ss/ff/wizard/api/model/request/ParticipantRequest.java @@ -0,0 +1,30 @@ +/* + * Copyright 2024 smartSense Consulting Solutions Pvt. Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ss.ff.wizard.api.model.request; + +import jakarta.validation.constraints.NotEmpty; +import ss.ff.wizard.api.model.BaseModel; + +/** + * Participant Request + * + * @param legalName legalName of user + * @author Sunil Kanzar + * @since 14th feb 2024 + */ +public record ParticipantRequest( + @NotEmpty(message = "{please.enter.user.legal.name}") String legalName) implements BaseModel { +} diff --git a/ss-api/src/main/java/ss/mod/demo/api/model/response/PageResponse.java b/ss-api/src/main/java/ss/ff/wizard/api/model/response/PageResponse.java similarity index 98% rename from ss-api/src/main/java/ss/mod/demo/api/model/response/PageResponse.java rename to ss-api/src/main/java/ss/ff/wizard/api/model/response/PageResponse.java index 1d6d446..b7cd2b4 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/model/response/PageResponse.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/model/response/PageResponse.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ss.mod.demo.api.model.response; +package ss.ff.wizard.api.model.response; import com.smartsensesolutions.commons.dao.filter.FilterRequest; diff --git a/ss-api/src/main/java/ss/mod/demo/api/model/response/UserResponse.java b/ss-api/src/main/java/ss/ff/wizard/api/model/response/ParticipantResponse.java similarity index 67% rename from ss-api/src/main/java/ss/mod/demo/api/model/response/UserResponse.java rename to ss-api/src/main/java/ss/ff/wizard/api/model/response/ParticipantResponse.java index 3e3ddb1..3658615 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/model/response/UserResponse.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/model/response/ParticipantResponse.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package ss.mod.demo.api.model.response; +package ss.ff.wizard.api.model.response; -import ss.mod.demo.api.model.BaseModel; +import ss.ff.wizard.api.model.BaseModel; -public record UserResponse(String id, - String name, - Integer age, - String city, - String country) implements BaseModel { +import javax.xml.crypto.Data; + +public record ParticipantResponse(String id, + String name, + Data createdDate) implements BaseModel { } diff --git a/ss-api/src/main/java/ss/mod/demo/api/model/response/ResponseBody.java b/ss-api/src/main/java/ss/ff/wizard/api/model/response/ResponseBody.java similarity index 97% rename from ss-api/src/main/java/ss/mod/demo/api/model/response/ResponseBody.java rename to ss-api/src/main/java/ss/ff/wizard/api/model/response/ResponseBody.java index 5aee4b6..84d5f1c 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/model/response/ResponseBody.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/model/response/ResponseBody.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ss.mod.demo.api.model.response; +package ss.ff.wizard.api.model.response; import lombok.AllArgsConstructor; diff --git a/ss-api/src/main/java/ss/mod/demo/api/utils/DateUtil.java b/ss-api/src/main/java/ss/ff/wizard/api/utils/DateUtil.java similarity index 98% rename from ss-api/src/main/java/ss/mod/demo/api/utils/DateUtil.java rename to ss-api/src/main/java/ss/ff/wizard/api/utils/DateUtil.java index 89d6ee7..58fbf30 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/utils/DateUtil.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/utils/DateUtil.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.utils; +package ss.ff.wizard.api.utils; import lombok.experimental.UtilityClass; diff --git a/ss-api/src/main/java/ss/mod/demo/api/utils/MathUtil.java b/ss-api/src/main/java/ss/ff/wizard/api/utils/MathUtil.java similarity index 96% rename from ss-api/src/main/java/ss/mod/demo/api/utils/MathUtil.java rename to ss-api/src/main/java/ss/ff/wizard/api/utils/MathUtil.java index 3582e31..7de5b64 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/utils/MathUtil.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/utils/MathUtil.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.utils; +package ss.ff.wizard.api.utils; import lombok.experimental.UtilityClass; diff --git a/ss-api/src/main/java/ss/mod/demo/api/utils/Validate.java b/ss-api/src/main/java/ss/ff/wizard/api/utils/Validate.java similarity index 97% rename from ss-api/src/main/java/ss/mod/demo/api/utils/Validate.java rename to ss-api/src/main/java/ss/ff/wizard/api/utils/Validate.java index deed060..a717de7 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/utils/Validate.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/utils/Validate.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.utils; +package ss.ff.wizard.api.utils; -import ss.mod.demo.api.exception.BadDataException; +import ss.ff.wizard.api.exception.BadDataException; import java.util.Objects; import java.util.function.Function; diff --git a/ss-api/src/main/java/ss/mod/demo/api/validation/MultipartExtensionValidator.java b/ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartExtensionValidator.java similarity index 98% rename from ss-api/src/main/java/ss/mod/demo/api/validation/MultipartExtensionValidator.java rename to ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartExtensionValidator.java index 24d96d3..27acdcf 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/validation/MultipartExtensionValidator.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartExtensionValidator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.validation; +package ss.ff.wizard.api.validation; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; diff --git a/ss-api/src/main/java/ss/mod/demo/api/validation/MultipartFileExtension.java b/ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartFileExtension.java similarity index 97% rename from ss-api/src/main/java/ss/mod/demo/api/validation/MultipartFileExtension.java rename to ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartFileExtension.java index 2b8a719..a570c3c 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/validation/MultipartFileExtension.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartFileExtension.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.validation; +package ss.ff.wizard.api.validation; import jakarta.validation.Constraint; import jakarta.validation.Payload; diff --git a/ss-api/src/main/java/ss/mod/demo/api/validation/MultipartFileSize.java b/ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartFileSize.java similarity index 98% rename from ss-api/src/main/java/ss/mod/demo/api/validation/MultipartFileSize.java rename to ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartFileSize.java index b061a57..fcb0839 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/validation/MultipartFileSize.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartFileSize.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.validation; +package ss.ff.wizard.api.validation; import jakarta.validation.Constraint; import jakarta.validation.Payload; diff --git a/ss-api/src/main/java/ss/mod/demo/api/validation/MultipartFileSizeValidator.java b/ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartFileSizeValidator.java similarity index 97% rename from ss-api/src/main/java/ss/mod/demo/api/validation/MultipartFileSizeValidator.java rename to ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartFileSizeValidator.java index f8ea295..9695c89 100644 --- a/ss-api/src/main/java/ss/mod/demo/api/validation/MultipartFileSizeValidator.java +++ b/ss-api/src/main/java/ss/ff/wizard/api/validation/MultipartFileSizeValidator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.api.validation; +package ss.ff.wizard.api.validation; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; diff --git a/ss-api/src/main/java/ss/mod/demo/api/model/request/UserRequest.java b/ss-api/src/main/java/ss/mod/demo/api/model/request/UserRequest.java deleted file mode 100644 index 4c6b05b..0000000 --- a/ss-api/src/main/java/ss/mod/demo/api/model/request/UserRequest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2024 smartSense Consulting Solutions Pvt. Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package ss.mod.demo.api.model.request; - -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotEmpty; -import ss.mod.demo.api.model.BaseModel; - -/** - * User request - * - * @param name name of user - * @param age age of user - * @param city city of user - * @param country country of city - * @author Sunil Kanzar - * @since 14th feb 2024 - */ -public record UserRequest(@NotEmpty(message = "{please.enter.user.name}") String name, - @Min(value = 18, message = "{you.are.under.age}") Integer age, - @NotEmpty(message = "{please.enter.city}") String city, - @NotEmpty(message = "{please.enter.county}") String country) implements BaseModel { -} diff --git a/ss-dao/src/main/java/ss/mod/demo/dao/entity/BaseAuditEntity.java b/ss-dao/src/main/java/ss/ff/wizard/dao/entity/BaseAuditEntity.java similarity index 92% rename from ss-dao/src/main/java/ss/mod/demo/dao/entity/BaseAuditEntity.java rename to ss-dao/src/main/java/ss/ff/wizard/dao/entity/BaseAuditEntity.java index 81227b4..8c4865a 100644 --- a/ss-dao/src/main/java/ss/mod/demo/dao/entity/BaseAuditEntity.java +++ b/ss-dao/src/main/java/ss/ff/wizard/dao/entity/BaseAuditEntity.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.dao.entity; +package ss.ff.wizard.dao.entity; import com.smartsensesolutions.commons.dao.base.BaseEntity; import jakarta.persistence.Column; @@ -28,6 +28,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.util.Date; +import java.util.UUID; /** * Base auditable entity for common audit details @@ -43,9 +44,10 @@ public class BaseAuditEntity implements BaseEntity { @CreatedBy @Column(name = "created_by", updatable = false) - private String createdBy; + private UUID createdBy; @LastModifiedBy - private String updatedBy; + @Column(name = "updated_by") + private UUID updatedBy; @LastModifiedDate @Column(name = "updated_date") private Date updatedDate; diff --git a/ss-dao/src/main/java/ss/mod/demo/dao/entity/UserMaster.java b/ss-dao/src/main/java/ss/ff/wizard/dao/entity/Participant.java similarity index 67% rename from ss-dao/src/main/java/ss/mod/demo/dao/entity/UserMaster.java rename to ss-dao/src/main/java/ss/ff/wizard/dao/entity/Participant.java index 54c4549..7e70d55 100644 --- a/ss-dao/src/main/java/ss/mod/demo/dao/entity/UserMaster.java +++ b/ss-dao/src/main/java/ss/ff/wizard/dao/entity/Participant.java @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.dao.entity; +package ss.ff.wizard.dao.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.AllArgsConstructor; @@ -25,7 +26,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.hibernate.annotations.GenericGenerator; + +import java.util.UUID; /** * UserMaster Represent user @@ -39,23 +41,14 @@ @AllArgsConstructor @Builder @Entity -@Table(name = "user_master") -public class UserMaster extends BaseAuditEntity { +@Table(name = "participant", schema = "master") +public class Participant extends BaseAuditEntity { @Id - @GeneratedValue(generator = "uuid2") - @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator") - private String id; - - @Column(name = "name") - private String name; - - @Column(name = "age") - private Integer age; - - @Column(name = "city") - private String city; + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "id") + private UUID id; - @Column(name = "country") - private String country; + @Column(name = "legal_name") + private String legalName; } diff --git a/ss-dao/src/main/java/ss/mod/demo/dao/repository/UserMasterRepository.java b/ss-dao/src/main/java/ss/ff/wizard/dao/repository/ParticipantRepository.java similarity index 75% rename from ss-dao/src/main/java/ss/mod/demo/dao/repository/UserMasterRepository.java rename to ss-dao/src/main/java/ss/ff/wizard/dao/repository/ParticipantRepository.java index cd8e49f..77ec130 100644 --- a/ss-dao/src/main/java/ss/mod/demo/dao/repository/UserMasterRepository.java +++ b/ss-dao/src/main/java/ss/ff/wizard/dao/repository/ParticipantRepository.java @@ -13,19 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.dao.repository; +package ss.ff.wizard.dao.repository; import com.smartsensesolutions.commons.dao.base.BaseRepository; import org.springframework.stereotype.Repository; -import ss.mod.demo.dao.entity.UserMaster; +import ss.ff.wizard.dao.entity.Participant; /** - * Database operation related to {@link UserMaster} + * Database operation related to {@link Participant} * * @author Sunil Kanzar * @since 14th feb 2024 */ @Repository -public interface UserMasterRepository extends BaseRepository { - boolean existsByName(String name); +public interface ParticipantRepository extends BaseRepository { + boolean existsByLegalName(String legalName); } diff --git a/ss-service-impl/build.gradle b/ss-service-impl/build.gradle index 9e1d8a2..532fbde 100644 --- a/ss-service-impl/build.gradle +++ b/ss-service-impl/build.gradle @@ -13,6 +13,7 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation 'org.springframework.security:spring-security-oauth2-resource-server' implementation 'jakarta.servlet:jakarta.servlet-api' + implementation 'org.liquibase:liquibase-core:4.25.0' } diff --git a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/AuditorAwareImpl.java b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/AuditorAwareImpl.java similarity index 93% rename from ss-service-impl/src/main/java/ss/mod/demo/service/entity/AuditorAwareImpl.java rename to ss-service-impl/src/main/java/ss/ff/wizard/service/entity/AuditorAwareImpl.java index 5a4908a..806b3f0 100644 --- a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/AuditorAwareImpl.java +++ b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/AuditorAwareImpl.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.service.entity; +package ss.ff.wizard.service.entity; import org.springframework.data.domain.AuditorAware; -import ss.mod.demo.api.constant.ContValue; +import ss.ff.wizard.api.constant.ContValue; import java.util.Optional; diff --git a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/BaseEntityService.java b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/BaseEntityService.java similarity index 97% rename from ss-service-impl/src/main/java/ss/mod/demo/service/entity/BaseEntityService.java rename to ss-service-impl/src/main/java/ss/ff/wizard/service/entity/BaseEntityService.java index 56140c6..b426621 100644 --- a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/BaseEntityService.java +++ b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/BaseEntityService.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.service.entity; +package ss.ff.wizard.service.entity; import com.fasterxml.jackson.databind.ObjectMapper; import com.smartsensesolutions.commons.dao.base.BaseEntity; diff --git a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/BaseService.java b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/BaseService.java similarity index 97% rename from ss-service-impl/src/main/java/ss/mod/demo/service/entity/BaseService.java rename to ss-service-impl/src/main/java/ss/ff/wizard/service/entity/BaseService.java index 8fc3d6a..cd97829 100644 --- a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/BaseService.java +++ b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/BaseService.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.service.entity; +package ss.ff.wizard.service.entity; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; diff --git a/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/ParticipantService.java b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/ParticipantService.java new file mode 100644 index 0000000..4cec0b4 --- /dev/null +++ b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/ParticipantService.java @@ -0,0 +1,48 @@ +/* + * Copyright 2024 smartSense Consulting Solutions Pvt. Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ss.ff.wizard.service.entity; + +import com.smartsensesolutions.commons.dao.base.BaseRepository; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import ss.ff.wizard.api.constant.ContMessage; +import ss.ff.wizard.api.model.request.ParticipantRequest; +import ss.ff.wizard.api.utils.Validate; +import ss.ff.wizard.dao.entity.Participant; +import ss.ff.wizard.dao.repository.ParticipantRepository; + +/** + * User master entity Service + * + * @author Sunil Kanzar + * @since 14th feb 2024 + */ +@AllArgsConstructor +@Service +public class ParticipantService extends BaseEntityService { + + private final ParticipantRepository participantRepository; + + public Participant createParticipant(ParticipantRequest participantRequest) { + Validate.isTrue(participantRepository.existsByLegalName(participantRequest.legalName())).launch(ContMessage.VALIDATE_USER_CREATE_NAME_EXIST); + return create(toType(participantRequest, Participant.class)); + } + + @Override + protected BaseRepository getRepository() { + return participantRepository; + } +} diff --git a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/ServiceUtil.java b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/ServiceUtil.java similarity index 97% rename from ss-service-impl/src/main/java/ss/mod/demo/service/entity/ServiceUtil.java rename to ss-service-impl/src/main/java/ss/ff/wizard/service/entity/ServiceUtil.java index 41e83e3..4643e83 100644 --- a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/ServiceUtil.java +++ b/ss-service-impl/src/main/java/ss/ff/wizard/service/entity/ServiceUtil.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.service.entity; +package ss.ff.wizard.service.entity; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -24,8 +24,8 @@ import org.springframework.data.domain.Page; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import ss.mod.demo.api.constant.ContField; -import ss.mod.demo.api.model.response.PageResponse; +import ss.ff.wizard.api.constant.ContField; +import ss.ff.wizard.api.model.response.PageResponse; import java.io.File; import java.util.ArrayList; diff --git a/ss-service-impl/src/main/java/ss/ff/wizard/service/impl/ParticipantManagementServiceImpl.java b/ss-service-impl/src/main/java/ss/ff/wizard/service/impl/ParticipantManagementServiceImpl.java new file mode 100644 index 0000000..d437700 --- /dev/null +++ b/ss-service-impl/src/main/java/ss/ff/wizard/service/impl/ParticipantManagementServiceImpl.java @@ -0,0 +1,65 @@ +/* + * Copyright 2024 smartSense Consulting Solutions Pvt. Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ss.ff.wizard.service.impl; + +import com.smartsensesolutions.commons.dao.filter.FilterRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import ss.ff.wizard.api.model.request.ParticipantRequest; +import ss.ff.wizard.api.model.response.PageResponse; +import ss.ff.wizard.api.model.response.ParticipantResponse; +import ss.ff.wizard.dao.entity.Participant; +import ss.ff.wizard.service.ParticipantManagementService; +import ss.ff.wizard.service.entity.BaseService; +import ss.ff.wizard.service.entity.ParticipantService; +import ss.ff.wizard.tenant.DatabaseCred; +import ss.ff.wizard.tenant.TenantUtil; + +/** + * User management service Implementation + * + * @author Sunil Kanzar + * @since 14th feb 2024 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ParticipantManagementServiceImpl extends BaseService implements ParticipantManagementService { + + private final ParticipantService participantService; + private final DatabaseCred databaseCred; + + @Override + public ParticipantResponse getParticipantById(String id) { + return toType(participantService.get(id), ParticipantResponse.class); + } + + @Override + public ParticipantResponse participantCreate(ParticipantRequest participantRequest) { + ParticipantResponse participantResponse = toType(participantService.createParticipant(participantRequest), ParticipantResponse.class); + TenantUtil.createTenantSchema(participantResponse.id(), databaseCred); + TenantUtil.runTenantMigration(databaseCred); + return participantResponse; + } + + @Override + public PageResponse participantFilter(FilterRequest filterRequest) { + Page filter = participantService.filter(filterRequest); + return toPageResponse(filter, filterRequest, ParticipantResponse.class); + } +} diff --git a/ss-service-impl/src/main/java/ss/ff/wizard/tenant/CustomRoutingDataSource.java b/ss-service-impl/src/main/java/ss/ff/wizard/tenant/CustomRoutingDataSource.java new file mode 100644 index 0000000..932cb68 --- /dev/null +++ b/ss-service-impl/src/main/java/ss/ff/wizard/tenant/CustomRoutingDataSource.java @@ -0,0 +1,21 @@ +package ss.ff.wizard.tenant; + +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +@AllArgsConstructor +public class CustomRoutingDataSource extends AbstractRoutingDataSource { + + private final DatabaseCred databaseCred; + + @Override + protected Object determineCurrentLookupKey() { + afterPropertiesSet(); + String currentTenant = TenantContext.getCurrentTenant(); + if (StringUtils.isEmpty(currentTenant)) { + return databaseCred.masterTenant(); + } + return currentTenant; + } +} diff --git a/ss-service-impl/src/main/java/ss/ff/wizard/tenant/DatabaseCred.java b/ss-service-impl/src/main/java/ss/ff/wizard/tenant/DatabaseCred.java new file mode 100644 index 0000000..1140b2d --- /dev/null +++ b/ss-service-impl/src/main/java/ss/ff/wizard/tenant/DatabaseCred.java @@ -0,0 +1,34 @@ +/* + * Copyright 2024 smartSense Consulting Solutions Pvt. Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ss.ff.wizard.tenant; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Database Config + * + * @author Sunil Kanzar + * @since 10th Sep 2024 + */ +@ConfigurationProperties(prefix = "app.database") +public record DatabaseCred(String host, + String port, + String username, + String password, + String name, + String masterTenant, + Boolean useSSL) { +} diff --git a/ss-service-impl/src/main/java/ss/ff/wizard/tenant/TenantContext.java b/ss-service-impl/src/main/java/ss/ff/wizard/tenant/TenantContext.java new file mode 100644 index 0000000..d90b616 --- /dev/null +++ b/ss-service-impl/src/main/java/ss/ff/wizard/tenant/TenantContext.java @@ -0,0 +1,20 @@ +package ss.ff.wizard.tenant; + +public class TenantContext { + + public static String DEFAULT_SCHEMA = "public"; + + private static ThreadLocal currentTenant = new InheritableThreadLocal<>(); + + public static String getCurrentTenant() { + return currentTenant.get(); + } + + public static void setCurrentTenant(String tenantUUID) { + currentTenant.set(tenantUUID); + } + + public static void clear() { + currentTenant.set(null); + } +} diff --git a/ss-service-impl/src/main/java/ss/ff/wizard/tenant/TenantUtil.java b/ss-service-impl/src/main/java/ss/ff/wizard/tenant/TenantUtil.java new file mode 100644 index 0000000..f97fcf6 --- /dev/null +++ b/ss-service-impl/src/main/java/ss/ff/wizard/tenant/TenantUtil.java @@ -0,0 +1,69 @@ +package ss.ff.wizard.tenant; + +import liquibase.command.CommandScope; +import liquibase.command.core.UpdateCommandStep; +import liquibase.command.core.helpers.DbUrlConnectionCommandStep; +import liquibase.database.Database; +import liquibase.database.DatabaseFactory; +import liquibase.database.jvm.JdbcConnection; +import liquibase.exception.LiquibaseException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import javax.sql.DataSource; + +@Slf4j +public class TenantUtil { + public static void runTenantMigration(DatabaseCred databaseCred) { + try (Connection connection = getTenantDataSource(databaseCred).getConnection()) { + Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection)); + + new CommandScope(UpdateCommandStep.COMMAND_NAME) + .addArgumentValue("changelogFile", "db/tenant/changelog-master.xml") + .addArgumentValue(DbUrlConnectionCommandStep.DATABASE_ARG, database) + .execute(); + + } catch (LiquibaseException | SQLException e) { + log.error(e.getMessage(), e); + } + } + + public static void runMasterMigration(DatabaseCred databaseCred) { + try (Connection connection = getMasterDataSource(databaseCred).getConnection()) { + Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection)); + + new CommandScope(UpdateCommandStep.COMMAND_NAME) + .addArgumentValue("changelogFile", "db/master/changelog-master.xml") + .addArgumentValue(DbUrlConnectionCommandStep.DATABASE_ARG, database) + .execute(); + + } catch (LiquibaseException | SQLException e) { + log.error(e.getMessage(), e); + } + } + + public static void createTenantSchema(String schemaName, DatabaseCred databaseCred) { + DataSource dataSource = getMasterDataSource(databaseCred); + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement() + ) { + statement.execute("CREATE SCHEMA " + schemaName); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public static DataSource getMasterDataSource(DatabaseCred dc) { + DriverManagerDataSource ds = new DriverManagerDataSource("jdbc:postgresql://" + dc.host() + ":" + dc.port() + "/" + dc.name() + "?currentSchema=" + dc.masterTenant(), dc.username(), dc.password()); + return ds; + } + + public static DataSource getTenantDataSource(DatabaseCred dc) { + DriverManagerDataSource ds = new DriverManagerDataSource("jdbc:postgresql://" + dc.host() + ":" + dc.port() + "/" + dc.name(), dc.username(), dc.password()); + ds.setSchema(TenantContext.getCurrentTenant()); + return ds; + } +} diff --git a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/UserMasterService.java b/ss-service-impl/src/main/java/ss/mod/demo/service/entity/UserMasterService.java deleted file mode 100644 index 41ace28..0000000 --- a/ss-service-impl/src/main/java/ss/mod/demo/service/entity/UserMasterService.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2024 smartSense Consulting Solutions Pvt. Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package ss.mod.demo.service.entity; - -import com.smartsensesolutions.commons.dao.base.BaseRepository; -import com.smartsensesolutions.commons.dao.specification.SpecificationUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import ss.mod.demo.api.constant.ContMessage; -import ss.mod.demo.api.model.request.UserRequest; -import ss.mod.demo.api.utils.Validate; -import ss.mod.demo.dao.entity.UserMaster; -import ss.mod.demo.dao.repository.UserMasterRepository; - -/** - * User master entity Service - * - * @author Sunil Kanzar - * @since 14th feb 2024 - */ - -@Service -public class UserMasterService extends BaseEntityService { - - @Autowired - private UserMasterRepository userMasterRepository; - - @Autowired - private SpecificationUtil specificationUtil; - - public UserMaster createUser(UserRequest userRequest) { - Validate.isTrue(userMasterRepository.existsByName(userRequest.name())).launch(ContMessage.VALIDATE_USER_CREATE_NAME_EXIST); - return create(toType(userRequest, UserMaster.class)); - } - - @Override - protected BaseRepository getRepository() { - return userMasterRepository; - } - - @Override - protected SpecificationUtil getSpecificationUtil() { - return specificationUtil; - } -} diff --git a/ss-service-impl/src/main/java/ss/mod/demo/service/impl/UserManagementServiceImpl.java b/ss-service-impl/src/main/java/ss/mod/demo/service/impl/UserManagementServiceImpl.java deleted file mode 100644 index 9549b62..0000000 --- a/ss-service-impl/src/main/java/ss/mod/demo/service/impl/UserManagementServiceImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2024 smartSense Consulting Solutions Pvt. Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package ss.mod.demo.service.impl; - -import com.smartsensesolutions.commons.dao.filter.FilterRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.stereotype.Service; -import ss.mod.demo.api.model.request.UserRequest; -import ss.mod.demo.api.model.response.PageResponse; -import ss.mod.demo.api.model.response.UserResponse; -import ss.mod.demo.dao.entity.UserMaster; -import ss.mod.demo.service.UserManagementService; -import ss.mod.demo.service.entity.BaseService; -import ss.mod.demo.service.entity.UserMasterService; - -/** - * User management service Implementation - * - * @author Sunil Kanzar - * @since 14th feb 2024 - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class UserManagementServiceImpl extends BaseService implements UserManagementService { - - private final UserMasterService userMasterService; - - @Override - public UserResponse getUserById(String id) { - return toType(userMasterService.get(id), UserResponse.class); - } - - @Override - public UserResponse createUser(UserRequest userRequest) { - return toType(userMasterService.createUser(userRequest), UserResponse.class); - } - - @Override - public PageResponse userFilter(FilterRequest filterRequest) { - Page filter = userMasterService.filter(filterRequest); - return toPageResponse(filter, filterRequest, UserResponse.class); - } -} diff --git a/ss-service/src/main/java/ss/mod/demo/service/UserManagementService.java b/ss-service/src/main/java/ss/ff/wizard/service/ParticipantManagementService.java similarity index 62% rename from ss-service/src/main/java/ss/mod/demo/service/UserManagementService.java rename to ss-service/src/main/java/ss/ff/wizard/service/ParticipantManagementService.java index 349aa59..3a54c9f 100644 --- a/ss-service/src/main/java/ss/mod/demo/service/UserManagementService.java +++ b/ss-service/src/main/java/ss/ff/wizard/service/ParticipantManagementService.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.service; +package ss.ff.wizard.service; import com.smartsensesolutions.commons.dao.filter.FilterRequest; -import ss.mod.demo.api.model.request.UserRequest; -import ss.mod.demo.api.model.response.PageResponse; -import ss.mod.demo.api.model.response.UserResponse; +import ss.ff.wizard.api.model.request.ParticipantRequest; +import ss.ff.wizard.api.model.response.PageResponse; +import ss.ff.wizard.api.model.response.ParticipantResponse; /** * Abstract User management service @@ -26,10 +26,10 @@ * @author Sunil Kanzar * @since 14th feb 2024 */ -public interface UserManagementService { - UserResponse getUserById(String id); +public interface ParticipantManagementService { + ParticipantResponse getParticipantById(String id); - UserResponse createUser(UserRequest userRequest); + ParticipantResponse participantCreate(ParticipantRequest participantRequest); - PageResponse userFilter(FilterRequest filterRequest); + PageResponse participantFilter(FilterRequest filterRequest); } diff --git a/ss-web/build.gradle b/ss-web/build.gradle index 833aedd..9d800e9 100644 --- a/ss-web/build.gradle +++ b/ss-web/build.gradle @@ -44,9 +44,6 @@ dependencies { testImplementation "com.github.dasniko:testcontainers-keycloak:${keycloakTestContainerVersion}" testImplementation "org.testcontainers:postgresql" testImplementation "org.testcontainers:junit-jupiter" - - developmentOnly("org.springframework.boot:spring-boot-docker-compose") - } bootJar { diff --git a/ss-web/src/main/java/ss/mod/demo/MainApplication.java b/ss-web/src/main/java/ss/ff/wizard/MainApplication.java similarity index 94% rename from ss-web/src/main/java/ss/mod/demo/MainApplication.java rename to ss-web/src/main/java/ss/ff/wizard/MainApplication.java index 7c2493e..2533019 100644 --- a/ss-web/src/main/java/ss/mod/demo/MainApplication.java +++ b/ss-web/src/main/java/ss/ff/wizard/MainApplication.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo; +package ss.ff.wizard; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -29,7 +29,7 @@ * @author Sunil Kanzar * @since 14th feb 2024 */ -@SpringBootApplication(scanBasePackages = { "ss.mod.demo", "com.smartsensesolutions" }) +@SpringBootApplication(scanBasePackages = {"ss.ff.wizard", "com.smartsensesolutions" }) @ConfigurationPropertiesScan @EnableJpaAuditing(auditorAwareRef = "auditorAware") @EnableAsync diff --git a/ss-web/src/main/java/ss/ff/wizard/filter/TenantFilter.java b/ss-web/src/main/java/ss/ff/wizard/filter/TenantFilter.java new file mode 100644 index 0000000..faf8247 --- /dev/null +++ b/ss-web/src/main/java/ss/ff/wizard/filter/TenantFilter.java @@ -0,0 +1,49 @@ +package ss.ff.wizard.filter; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import ss.ff.wizard.tenant.DatabaseCred; +import ss.ff.wizard.tenant.TenantContext; +import ss.ff.wizard.tenant.TenantUtil; + +import java.io.IOException; +import java.util.Map; + +@Component +@Order(1) +@Slf4j +class TenantFilter implements Filter { + private final Map dataSourceMap; + private final DatabaseCred databaseCred; + + TenantFilter(@Qualifier("globalDatasource") Map dataSourceMap, + DatabaseCred databaseCred) { + this.dataSourceMap = dataSourceMap; + this.databaseCred = databaseCred; + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) servletRequest; + String tenantName = req.getHeader("X-TenantID"); + if (!StringUtils.hasText(tenantName)) { + filterChain.doFilter(servletRequest, servletResponse); + } + TenantContext.setCurrentTenant(tenantName); + if (!dataSourceMap.containsKey(tenantName)) { + dataSourceMap.put(tenantName, TenantUtil.getTenantDataSource(databaseCred)); + TenantUtil.runTenantMigration(databaseCred); + } + filterChain.doFilter(servletRequest, servletResponse); + } +} diff --git a/ss-web/src/main/java/ss/mod/demo/web/apidocs/UserManagementResourceApiDocs.java b/ss-web/src/main/java/ss/ff/wizard/web/apidocs/UserManagementResourceApiDocs.java similarity index 99% rename from ss-web/src/main/java/ss/mod/demo/web/apidocs/UserManagementResourceApiDocs.java rename to ss-web/src/main/java/ss/ff/wizard/web/apidocs/UserManagementResourceApiDocs.java index 72fc674..93f4fa4 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/apidocs/UserManagementResourceApiDocs.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/apidocs/UserManagementResourceApiDocs.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ss.mod.demo.web.apidocs; +package ss.ff.wizard.web.apidocs; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/AppConfig.java b/ss-web/src/main/java/ss/ff/wizard/web/config/AppConfig.java similarity index 79% rename from ss-web/src/main/java/ss/mod/demo/web/config/AppConfig.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/AppConfig.java index 518a296..684a6ef 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/AppConfig.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/AppConfig.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config; +package ss.ff.wizard.web.config; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -22,19 +22,25 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import feign.Retryer; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.data.domain.AuditorAware; -import ss.mod.demo.service.entity.AuditorAwareImpl; -import ss.mod.demo.web.config.feign.FeignProperties; -import ss.mod.demo.web.config.feign.retry.FeignRetryer; +import ss.ff.wizard.service.entity.AuditorAwareImpl; +import ss.ff.wizard.tenant.DatabaseCred; +import ss.ff.wizard.tenant.TenantUtil; +import ss.ff.wizard.web.config.feign.FeignProperties; +import ss.ff.wizard.web.config.feign.retry.FeignRetryer; import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import javax.sql.DataSource; /** * ApplicationConfig contains the configuration bean that will be used by the application. @@ -46,13 +52,14 @@ public class AppConfig { @Value("${messages.bundle.path}") private String resourceBundlePath; - private final FeignProperties feignProperties; + private final DatabaseCred databaseCred; @Autowired - public AppConfig(FeignProperties feignProperties) { + public AppConfig(FeignProperties feignProperties, DatabaseCred databaseCred) { this.feignProperties = feignProperties; + this.databaseCred = databaseCred; } /** @@ -71,6 +78,16 @@ public ObjectMapper objectMapper() { return objectMapper; } + @Bean + @Qualifier("globalDatasource") + public Map getDataSource() { + HashMap dataSourceMap = new HashMap<>(); + DataSource ds = TenantUtil.getMasterDataSource(databaseCred); + dataSourceMap.put("master", ds); + TenantUtil.runMasterMigration(databaseCred); + return dataSourceMap; + } + /** * Bean used for managing the I18n Support to the application. * Each messages will be load by the messageSource. diff --git a/ss-web/src/main/java/ss/ff/wizard/web/config/DataSourceConfig.java b/ss-web/src/main/java/ss/ff/wizard/web/config/DataSourceConfig.java new file mode 100644 index 0000000..a516636 --- /dev/null +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/DataSourceConfig.java @@ -0,0 +1,29 @@ +package ss.ff.wizard.web.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import ss.ff.wizard.tenant.CustomRoutingDataSource; +import ss.ff.wizard.tenant.DatabaseCred; + +import java.util.Map; +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfig { + @Autowired + @Qualifier("globalDatasource") + private Map dataSourceMap; + @Autowired + private DatabaseCred databaseCred; + + @Bean + @Primary + public DataSource dataSource() { + CustomRoutingDataSource customDataSource = new CustomRoutingDataSource(databaseCred); + customDataSource.setTargetDataSources(dataSourceMap); + return customDataSource; + } +} diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/RequestInterceptor.java b/ss-web/src/main/java/ss/ff/wizard/web/config/RequestInterceptor.java similarity index 97% rename from ss-web/src/main/java/ss/mod/demo/web/config/RequestInterceptor.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/RequestInterceptor.java index b3376b3..67866ae 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/RequestInterceptor.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/RequestInterceptor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config; +package ss.ff.wizard.web.config; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/WebMvcConfig.java b/ss-web/src/main/java/ss/ff/wizard/web/config/WebMvcConfig.java similarity index 93% rename from ss-web/src/main/java/ss/mod/demo/web/config/WebMvcConfig.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/WebMvcConfig.java index 75435dd..7cfd40e 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/WebMvcConfig.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/WebMvcConfig.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config; +package ss.ff.wizard.web.config; import lombok.AllArgsConstructor; import org.springdoc.core.properties.SwaggerUiConfigProperties; @@ -21,8 +21,8 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import ss.mod.demo.api.constant.ContURI; -import ss.mod.demo.api.constant.ContValue; +import ss.ff.wizard.api.constant.ContURI; +import ss.ff.wizard.api.constant.ContValue; /** * Web MVC Config diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/aop/LoggingAspect.java b/ss-web/src/main/java/ss/ff/wizard/web/config/aop/LoggingAspect.java similarity index 96% rename from ss-web/src/main/java/ss/mod/demo/web/config/aop/LoggingAspect.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/aop/LoggingAspect.java index 3843e76..b36c23a 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/aop/LoggingAspect.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/aop/LoggingAspect.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config.aop; +package ss.ff.wizard.web.config.aop; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; @@ -41,7 +41,7 @@ public class LoggingAspect { private final HttpServletRequest request; - @Pointcut("execution(* ss.mod.demo.resource.*.*(..))") + @Pointcut("execution(* ss.ff.wizard.resource.*.*(..))") public void printLogs() { } diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/appinfo/InfoConfiguration.java b/ss-web/src/main/java/ss/ff/wizard/web/config/appinfo/InfoConfiguration.java similarity index 95% rename from ss-web/src/main/java/ss/mod/demo/web/config/appinfo/InfoConfiguration.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/appinfo/InfoConfiguration.java index 561fda5..d8a7eac 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/appinfo/InfoConfiguration.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/appinfo/InfoConfiguration.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config.appinfo; +package ss.ff.wizard.web.config.appinfo; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/feign/FeignProperties.java b/ss-web/src/main/java/ss/ff/wizard/web/config/feign/FeignProperties.java similarity index 96% rename from ss-web/src/main/java/ss/mod/demo/web/config/feign/FeignProperties.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/feign/FeignProperties.java index 8bcdb8a..c6e1cbf 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/feign/FeignProperties.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/feign/FeignProperties.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config.feign; +package ss.ff.wizard.web.config.feign; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/feign/retry/FeignRetryer.java b/ss-web/src/main/java/ss/ff/wizard/web/config/feign/retry/FeignRetryer.java similarity index 97% rename from ss-web/src/main/java/ss/mod/demo/web/config/feign/retry/FeignRetryer.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/feign/retry/FeignRetryer.java index 471e3df..8dac059 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/feign/retry/FeignRetryer.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/feign/retry/FeignRetryer.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config.feign.retry; +package ss.ff.wizard.web.config.feign.retry; import feign.RetryableException; import feign.Retryer; diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/openapi/OpenApiConfig.java b/ss-web/src/main/java/ss/ff/wizard/web/config/openapi/OpenApiConfig.java similarity index 96% rename from ss-web/src/main/java/ss/mod/demo/web/config/openapi/OpenApiConfig.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/openapi/OpenApiConfig.java index 093a94a..ca20234 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/openapi/OpenApiConfig.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/openapi/OpenApiConfig.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config.openapi; +package ss.ff.wizard.web.config.openapi; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; @@ -26,8 +26,8 @@ import org.springdoc.core.models.GroupedOpenApi; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import ss.mod.demo.web.config.appinfo.InfoConfiguration; -import ss.mod.demo.web.config.security.SecurityConfigProperties; +import ss.ff.wizard.web.config.appinfo.InfoConfiguration; +import ss.ff.wizard.web.config.security.SecurityConfigProperties; import java.util.Collections; diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/security/AuthenticationConfig.java b/ss-web/src/main/java/ss/ff/wizard/web/config/security/AuthenticationConfig.java similarity index 96% rename from ss-web/src/main/java/ss/mod/demo/web/config/security/AuthenticationConfig.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/security/AuthenticationConfig.java index 32d315a..0d12a9d 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/security/AuthenticationConfig.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/security/AuthenticationConfig.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config.security; +package ss.ff.wizard.web.config.security; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -36,8 +36,8 @@ import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import ss.mod.demo.api.constant.ContURI; -import ss.mod.demo.api.constant.ContValue; +import ss.ff.wizard.api.constant.ContURI; +import ss.ff.wizard.api.constant.ContValue; import java.util.List; @@ -76,8 +76,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { auth.requestMatchers(new AntPathRequestMatcher(ContURI.CONTEXT_SWAGGER_IU_ALL)).permitAll(); auth.requestMatchers(new AntPathRequestMatcher(ContURI.CONTEXT_HEALTH_ALL)).permitAll(); auth.requestMatchers(new AntPathRequestMatcher(ContURI.CONTEXT_PRIVATE_ALL)).permitAll(); - auth.requestMatchers(new AntPathRequestMatcher(ContURI.CONTEXT_AUTHENTICATED_ALL)).hasRole("SWD_ADMIN"); - auth.requestMatchers(new AntPathRequestMatcher(ContURI.CONTEXT_AUTHENTICATED_WITH_NO_FILTER_ALL)).hasRole("SWD_ADMIN"); + auth.requestMatchers(new AntPathRequestMatcher(ContURI.CONTEXT_AUTHENTICATED_ALL)).hasRole("ADMIN"); + auth.requestMatchers(new AntPathRequestMatcher(ContURI.CONTEXT_AUTHENTICATED_WITH_NO_FILTER_ALL)).hasRole("ADMIN"); }).oauth2ResourceServer(oath -> oath.jwt(jwt -> jwt.jwtAuthenticationConverter(new CustomAuthenticationConverter(configProperties.roleClientId())))); return http.build(); } diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/security/CustomAuthenticationConverter.java b/ss-web/src/main/java/ss/ff/wizard/web/config/security/CustomAuthenticationConverter.java similarity index 96% rename from ss-web/src/main/java/ss/mod/demo/web/config/security/CustomAuthenticationConverter.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/security/CustomAuthenticationConverter.java index 78867aa..a17a540 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/security/CustomAuthenticationConverter.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/security/CustomAuthenticationConverter.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config.security; +package ss.ff.wizard.web.config.security; import jakarta.validation.constraints.NotNull; import org.springframework.core.convert.converter.Converter; @@ -23,8 +23,8 @@ import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter; -import ss.mod.demo.api.constant.ContField; -import ss.mod.demo.api.constant.ContValue; +import ss.ff.wizard.api.constant.ContField; +import ss.ff.wizard.api.constant.ContValue; import java.util.Collection; import java.util.HashSet; diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/security/SecurityConfigProperties.java b/ss-web/src/main/java/ss/ff/wizard/web/config/security/SecurityConfigProperties.java similarity index 97% rename from ss-web/src/main/java/ss/mod/demo/web/config/security/SecurityConfigProperties.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/security/SecurityConfigProperties.java index 0e1ee18..ab9955f 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/security/SecurityConfigProperties.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/security/SecurityConfigProperties.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config.security; +package ss.ff.wizard.web.config.security; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/ss-web/src/main/java/ss/mod/demo/web/config/security/SecurityEvents.java b/ss-web/src/main/java/ss/ff/wizard/web/config/security/SecurityEvents.java similarity index 98% rename from ss-web/src/main/java/ss/mod/demo/web/config/security/SecurityEvents.java rename to ss-web/src/main/java/ss/ff/wizard/web/config/security/SecurityEvents.java index 155ca18..25b165d 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/config/security/SecurityEvents.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/config/security/SecurityEvents.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.config.security; +package ss.ff.wizard.web.config.security; import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; diff --git a/ss-web/src/main/java/ss/mod/demo/web/handler/GlobalExceptionHandler.java b/ss-web/src/main/java/ss/ff/wizard/web/handler/GlobalExceptionHandler.java similarity index 97% rename from ss-web/src/main/java/ss/mod/demo/web/handler/GlobalExceptionHandler.java rename to ss-web/src/main/java/ss/ff/wizard/web/handler/GlobalExceptionHandler.java index 1466e10..acebb15 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/handler/GlobalExceptionHandler.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/handler/GlobalExceptionHandler.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.handler; +package ss.ff.wizard.web.handler; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; @@ -28,9 +28,9 @@ import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import ss.mod.demo.api.constant.ContField; -import ss.mod.demo.api.exception.BadDataException; -import ss.mod.demo.service.entity.BaseService; +import ss.ff.wizard.api.constant.ContField; +import ss.ff.wizard.api.exception.BadDataException; +import ss.ff.wizard.service.entity.BaseService; import java.util.HashMap; import java.util.List; diff --git a/ss-web/src/main/java/ss/mod/demo/web/resource/BaseResource.java b/ss-web/src/main/java/ss/ff/wizard/web/resource/BaseResource.java similarity index 91% rename from ss-web/src/main/java/ss/mod/demo/web/resource/BaseResource.java rename to ss-web/src/main/java/ss/ff/wizard/web/resource/BaseResource.java index 112f52f..c810817 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/resource/BaseResource.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/resource/BaseResource.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.resource; +package ss.ff.wizard.web.resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import ss.mod.demo.service.entity.BaseService; +import ss.ff.wizard.service.entity.BaseService; /** * BaseResource contains common methods which will used at controller level. diff --git a/ss-web/src/main/java/ss/mod/demo/web/resource/UserManagementResource.java b/ss-web/src/main/java/ss/ff/wizard/web/resource/UserManagementResource.java similarity index 61% rename from ss-web/src/main/java/ss/mod/demo/web/resource/UserManagementResource.java rename to ss-web/src/main/java/ss/ff/wizard/web/resource/UserManagementResource.java index d5d1c20..83a1477 100644 --- a/ss-web/src/main/java/ss/mod/demo/web/resource/UserManagementResource.java +++ b/ss-web/src/main/java/ss/ff/wizard/web/resource/UserManagementResource.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ss.mod.demo.web.resource; +package ss.ff.wizard.web.resource; import com.smartsensesolutions.commons.dao.filter.FilterRequest; import io.swagger.v3.oas.annotations.Operation; @@ -26,16 +26,16 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import ss.mod.demo.api.constant.ContField; -import ss.mod.demo.api.constant.ContMessage; -import ss.mod.demo.api.constant.ContURI; -import ss.mod.demo.api.model.request.UserRequest; -import ss.mod.demo.api.model.response.PageResponse; -import ss.mod.demo.api.model.response.ResponseBody; -import ss.mod.demo.api.model.response.UserResponse; -import ss.mod.demo.service.UserManagementService; -import ss.mod.demo.web.apidocs.UserManagementResourceApiDocs.Common500; -import ss.mod.demo.web.apidocs.UserManagementResourceApiDocs.CreateUserApiDocs; +import ss.ff.wizard.api.constant.ContField; +import ss.ff.wizard.api.constant.ContMessage; +import ss.ff.wizard.api.constant.ContURI; +import ss.ff.wizard.api.model.request.ParticipantRequest; +import ss.ff.wizard.api.model.response.PageResponse; +import ss.ff.wizard.api.model.response.ParticipantResponse; +import ss.ff.wizard.api.model.response.ResponseBody; +import ss.ff.wizard.service.ParticipantManagementService; +import ss.ff.wizard.web.apidocs.UserManagementResourceApiDocs.Common500; +import ss.ff.wizard.web.apidocs.UserManagementResourceApiDocs.CreateUserApiDocs; /** * Provide endpoint related to User management @@ -48,25 +48,25 @@ @Slf4j @Common500 public class UserManagementResource extends BaseResource { - private final UserManagementService userManagementService; + private final ParticipantManagementService participantManagementService; @CreateUserApiDocs @PostMapping(value = ContURI.USER, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - public ResponseBody createUser(@Valid @RequestBody UserRequest userRequest) { - UserResponse user = userManagementService.createUser(userRequest); + public ResponseBody createUser(@Valid @RequestBody ParticipantRequest participantRequest) { + ParticipantResponse user = participantManagementService.participantCreate(participantRequest); return ResponseBody.of(resolveMessage(ContMessage.USER_CREATED), user); } @Operation(summary = "Get User") @GetMapping(value = ContURI.USER_WITH_ID, produces = MediaType.APPLICATION_JSON_VALUE) - public UserResponse getUser(@PathVariable(ContField.USER_ID) String userId) { - return userManagementService.getUserById(userId); + public ParticipantResponse getUser(@PathVariable(ContField.USER_ID) String userId) { + return participantManagementService.getParticipantById(userId); } @Operation(summary = "User Filter") @PostMapping(value = ContURI.USER_FILTER, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - public PageResponse userFilter(@Valid @RequestBody FilterRequest filterRequest) { - return userManagementService.userFilter(filterRequest); + public PageResponse userFilter(@Valid @RequestBody FilterRequest filterRequest) { + return participantManagementService.participantFilter(filterRequest); } } diff --git a/ss-web/src/main/resources/application.yml b/ss-web/src/main/resources/application.yml index de97fd2..de4f75a 100644 --- a/ss-web/src/main/resources/application.yml +++ b/ss-web/src/main/resources/application.yml @@ -5,23 +5,24 @@ app: port: ${APP_PORT:8080} security: enabled: ${SECURITY_ENABLE:true} - realm: ${KEYCLOAK_REALM_NAME:SWD} + realm: ${KEYCLOAK_REALM_NAME:ff-wizard} clientId: ${KEYCLOAK_CLIENT_ID:pb_backend} roleClientId: ${KEYCLOAK_ROLE_CLIENT_ID:pv_backend} - auth-server-url: ${KEYCLOAK_AUTH_URL:http://localhost:28080} + auth-server-url: ${KEYCLOAK_AUTH_URL:http://localhost:8000} auth-url: ${app.security.auth-server-url}/realms/${app.security.realm}/protocol/openid-connect/auth token-url: ${app.security.auth-server-url}/realms/${app.security.realm}/protocol/openid-connect/token refresh-token-url: ${KEYCLOAK_TOKEN_URL} corsOrigins: "*" database: host: ${DB_HOST:localhost} - port: ${DB_PORT:15432} + port: ${DB_PORT:5400} name: ${DB_NAME:multi-module-demo} - username: ${DB_USER:root} - password: ${DB_PASSWORD:root} + username: ${DB_USER:postgres} + password: ${DB_PASSWORD:postgres} useSSL: ${USE_SSL:false} + master-tenant: ${MASTER_TENANT:master} swagger: - clientId: ${KEYCLOAK_CLIENT_ID:swd_public_client} + clientId: ${app.security.clientId} multipart: maxFileSize: ${MULTIPART_MAX_FILE_SIZE:50MB} maxRequestSize: ${MULTIPART_MAX_REQUEST_SIZE:51MB} @@ -87,7 +88,7 @@ spring: enabled: true jpa: hibernate: - ddl-auto: update + ddl-auto: none properties: hibernate: default_schema: public @@ -98,6 +99,7 @@ spring: username: ${app.database.username} password: ${app.database.password} driverClassName: org.postgresql.Driver + multitenancy: security: oauth2: resourceserver: @@ -110,7 +112,8 @@ spring: max-file-size: ${app.multipart.maxFileSize} max-request-size: ${app.multipart.maxRequestSize} liquibase: - change-log: classpath:/db/changelog/changelog-master.xml + change-log: classpath:/db/master/changelog-master.xml + enabled: false feign: default: diff --git a/ss-web/src/main/resources/db/changelog/changes/1-initial-table-structure.sql b/ss-web/src/main/resources/db/changelog/changes/1-initial-table-structure.sql deleted file mode 100644 index cfb03ef..0000000 --- a/ss-web/src/main/resources/db/changelog/changes/1-initial-table-structure.sql +++ /dev/null @@ -1,3 +0,0 @@ ---liquibase formatted sql - ---changeset sunil:1 diff --git a/ss-web/src/main/resources/db/changelog/changes/2-initial-data.sql b/ss-web/src/main/resources/db/changelog/changes/2-initial-data.sql deleted file mode 100644 index cfb03ef..0000000 --- a/ss-web/src/main/resources/db/changelog/changes/2-initial-data.sql +++ /dev/null @@ -1,3 +0,0 @@ ---liquibase formatted sql - ---changeset sunil:1 diff --git a/ss-web/src/main/resources/db/changelog/changelog-master.xml b/ss-web/src/main/resources/db/master/changelog-master.xml similarity index 82% rename from ss-web/src/main/resources/db/changelog/changelog-master.xml rename to ss-web/src/main/resources/db/master/changelog-master.xml index c19672a..8f277d7 100644 --- a/ss-web/src/main/resources/db/changelog/changelog-master.xml +++ b/ss-web/src/main/resources/db/master/changelog-master.xml @@ -3,4 +3,5 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> + diff --git a/ss-web/src/main/resources/db/master/changes/1-initial-table-structure.sql b/ss-web/src/main/resources/db/master/changes/1-initial-table-structure.sql new file mode 100644 index 0000000..9e3fb56 --- /dev/null +++ b/ss-web/src/main/resources/db/master/changes/1-initial-table-structure.sql @@ -0,0 +1,14 @@ +--liquibase formatted sql + +--changeset sunil:1 +CREATE TABLE participant +( + id uuid NOT NULL, + legal_name varchar NOT NULL, + created_by uuid NULL, + updated_by uuid NULL, + updated_date timestamp NULL, + created_date timestamp NULL, + CONSTRAINT participant_pk PRIMARY KEY (id), + CONSTRAINT participant_unique UNIQUE (legal_name) +); diff --git a/ss-web/src/main/resources/db/tenant/changelog-master.xml b/ss-web/src/main/resources/db/tenant/changelog-master.xml new file mode 100644 index 0000000..10cd6f6 --- /dev/null +++ b/ss-web/src/main/resources/db/tenant/changelog-master.xml @@ -0,0 +1,7 @@ + + + + diff --git a/ss-web/src/main/resources/db/tenant/changes/1-initial-table-structure.sql b/ss-web/src/main/resources/db/tenant/changes/1-initial-table-structure.sql new file mode 100644 index 0000000..577465e --- /dev/null +++ b/ss-web/src/main/resources/db/tenant/changes/1-initial-table-structure.sql @@ -0,0 +1,14 @@ +--liquibase formatted sql + +--changeset sunil:1 +CREATE TABLE service_offering +( + id uuid NOT NULL, + so_name varchar NOT NULL, + created_by uuid NULL, + updated_by uuid NULL, + updated_date timestamp NULL, + created_date timestamp NULL, + CONSTRAINT service_offering_pk PRIMARY KEY (id) +); + diff --git a/ss-web/src/main/resources/i18n/messages.properties b/ss-web/src/main/resources/i18n/messages.properties index 8e7d892..1bba802 100644 --- a/ss-web/src/main/resources/i18n/messages.properties +++ b/ss-web/src/main/resources/i18n/messages.properties @@ -1,10 +1,5 @@ #########################Success Message -user.created.successfully=User Created successfully #########################Validation Message -please.enter.user.name=Please Enter name -you.are.under.age=You are underage -please.enter.city=Please enter city -please.enter.county=Please enter country -validate.user.create.name.exist=User with this name already exist +please.enter.user.legal.name=Please Enter legal name #########################Error message -something.went.wrong=Something went wrong \ No newline at end of file +something.went.wrong=Something went wrong diff --git a/ss-web/src/test/java/ss/mod/demo/util/ContainerContextInitializer.java b/ss-web/src/test/java/ss/ff/wizard/util/ContainerContextInitializer.java similarity index 82% rename from ss-web/src/test/java/ss/mod/demo/util/ContainerContextInitializer.java rename to ss-web/src/test/java/ss/ff/wizard/util/ContainerContextInitializer.java index 5fd6495..1978232 100644 --- a/ss-web/src/test/java/ss/mod/demo/util/ContainerContextInitializer.java +++ b/ss-web/src/test/java/ss/ff/wizard/util/ContainerContextInitializer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ss.mod.demo.util; +package ss.ff.wizard.util; import dasniko.testcontainers.keycloak.KeycloakContainer; import org.keycloak.admin.client.KeycloakBuilder; @@ -26,15 +26,15 @@ import java.time.Duration; import java.time.temporal.ChronoUnit; -import static ss.mod.demo.util.constant.KeycloakTestConstant.BEARER; -import static ss.mod.demo.util.constant.KeycloakTestConstant.INVALID_USER_NAME; -import static ss.mod.demo.util.constant.KeycloakTestConstant.KEYCLOAK_ADMIN_USERNAME; -import static ss.mod.demo.util.constant.KeycloakTestConstant.KEYCLOAK_PRIVATE_CLIENT; -import static ss.mod.demo.util.constant.KeycloakTestConstant.KEYCLOAK_PUBLIC_CLIENT; -import static ss.mod.demo.util.constant.KeycloakTestConstant.KEYCLOAK_REALM; -import static ss.mod.demo.util.constant.KeycloakTestConstant.PASSWORD; -import static ss.mod.demo.util.constant.KeycloakTestConstant.REAL_FILE_PATH; -import static ss.mod.demo.util.constant.KeycloakTestConstant.VALID_USER_NAME; +import static ss.ff.wizard.util.constant.KeycloakTestConstant.BEARER; +import static ss.ff.wizard.util.constant.KeycloakTestConstant.INVALID_USER_NAME; +import static ss.ff.wizard.util.constant.KeycloakTestConstant.KEYCLOAK_ADMIN_USERNAME; +import static ss.ff.wizard.util.constant.KeycloakTestConstant.KEYCLOAK_PRIVATE_CLIENT; +import static ss.ff.wizard.util.constant.KeycloakTestConstant.KEYCLOAK_PUBLIC_CLIENT; +import static ss.ff.wizard.util.constant.KeycloakTestConstant.KEYCLOAK_REALM; +import static ss.ff.wizard.util.constant.KeycloakTestConstant.PASSWORD; +import static ss.ff.wizard.util.constant.KeycloakTestConstant.REAL_FILE_PATH; +import static ss.ff.wizard.util.constant.KeycloakTestConstant.VALID_USER_NAME; public class ContainerContextInitializer implements ApplicationContextInitializer { diff --git a/ss-web/src/test/java/ss/mod/demo/util/TestHelper.java b/ss-web/src/test/java/ss/ff/wizard/util/TestHelper.java similarity index 98% rename from ss-web/src/test/java/ss/mod/demo/util/TestHelper.java rename to ss-web/src/test/java/ss/ff/wizard/util/TestHelper.java index ae834b7..26e978c 100644 --- a/ss-web/src/test/java/ss/mod/demo/util/TestHelper.java +++ b/ss-web/src/test/java/ss/ff/wizard/util/TestHelper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ss.mod.demo.util; +package ss.ff.wizard.util; import org.springframework.beans.factory.annotation.Autowired; diff --git a/ss-web/src/test/java/ss/mod/demo/util/constant/KeycloakTestConstant.java b/ss-web/src/test/java/ss/ff/wizard/util/constant/KeycloakTestConstant.java similarity index 97% rename from ss-web/src/test/java/ss/mod/demo/util/constant/KeycloakTestConstant.java rename to ss-web/src/test/java/ss/ff/wizard/util/constant/KeycloakTestConstant.java index 3ef8335..2c056b1 100644 --- a/ss-web/src/test/java/ss/mod/demo/util/constant/KeycloakTestConstant.java +++ b/ss-web/src/test/java/ss/ff/wizard/util/constant/KeycloakTestConstant.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ss.mod.demo.util.constant; +package ss.ff.wizard.util.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; diff --git a/ss-web/src/test/java/ss/mod/demo/util/constant/TestConstant.java b/ss-web/src/test/java/ss/ff/wizard/util/constant/TestConstant.java similarity index 96% rename from ss-web/src/test/java/ss/mod/demo/util/constant/TestConstant.java rename to ss-web/src/test/java/ss/ff/wizard/util/constant/TestConstant.java index a5f1a15..ea2f440 100644 --- a/ss-web/src/test/java/ss/mod/demo/util/constant/TestConstant.java +++ b/ss-web/src/test/java/ss/ff/wizard/util/constant/TestConstant.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ss.mod.demo.util.constant; +package ss.ff.wizard.util.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; diff --git a/ss-web/src/test/java/ss/mod/demo/util/constant/TestDataUtil.java b/ss-web/src/test/java/ss/ff/wizard/util/constant/TestDataUtil.java similarity index 71% rename from ss-web/src/test/java/ss/mod/demo/util/constant/TestDataUtil.java rename to ss-web/src/test/java/ss/ff/wizard/util/constant/TestDataUtil.java index eaadbd1..73f6084 100644 --- a/ss-web/src/test/java/ss/mod/demo/util/constant/TestDataUtil.java +++ b/ss-web/src/test/java/ss/ff/wizard/util/constant/TestDataUtil.java @@ -14,15 +14,15 @@ * limitations under the License. */ -package ss.mod.demo.util.constant; +package ss.ff.wizard.util.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import ss.mod.demo.api.model.request.UserRequest; +import ss.ff.wizard.api.model.request.ParticipantRequest; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class TestDataUtil { - public static UserRequest getUserRequest() { - return new UserRequest(TestConstant.TEST_USER_NAME, TestConstant.TEST_USER_AGE, TestConstant.TEST_USER_CITY, TestConstant.TEST_USER_COUNTRY); + public static ParticipantRequest getUserRequest() { + return new ParticipantRequest(TestConstant.TEST_USER_NAME, TestConstant.TEST_USER_AGE, TestConstant.TEST_USER_CITY, TestConstant.TEST_USER_COUNTRY); } } diff --git a/ss-web/src/test/java/ss/mod/demo/web/UserManagementResourceTest.java b/ss-web/src/test/java/ss/ff/wizard/web/UserManagementResourceTest.java similarity index 75% rename from ss-web/src/test/java/ss/mod/demo/web/UserManagementResourceTest.java rename to ss-web/src/test/java/ss/ff/wizard/web/UserManagementResourceTest.java index cce03ad..18134ec 100644 --- a/ss-web/src/test/java/ss/mod/demo/web/UserManagementResourceTest.java +++ b/ss-web/src/test/java/ss/ff/wizard/web/UserManagementResourceTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ss.mod.demo.web; +package ss.ff.wizard.web; import com.fasterxml.jackson.databind.ObjectMapper; @@ -33,15 +33,15 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.transaction.BeforeTransaction; -import ss.mod.demo.MainApplication; -import ss.mod.demo.api.constant.ContURI; -import ss.mod.demo.api.model.request.UserRequest; -import ss.mod.demo.api.model.response.ResponseBody; -import ss.mod.demo.api.model.response.UserResponse; -import ss.mod.demo.dao.repository.UserMasterRepository; -import ss.mod.demo.util.ContainerContextInitializer; -import ss.mod.demo.util.TestHelper; -import ss.mod.demo.util.constant.TestDataUtil; +import ss.ff.wizard.MainApplication; +import ss.ff.wizard.api.constant.ContURI; +import ss.ff.wizard.api.model.request.ParticipantRequest; +import ss.ff.wizard.api.model.response.ParticipantResponse; +import ss.ff.wizard.api.model.response.ResponseBody; +import ss.ff.wizard.dao.repository.ParticipantRepository; +import ss.ff.wizard.util.ContainerContextInitializer; +import ss.ff.wizard.util.TestHelper; +import ss.ff.wizard.util.constant.TestDataUtil; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = { MainApplication.class }) @@ -52,7 +52,7 @@ class UserManagementResourceTest { @Autowired - UserMasterRepository userMasterRepository; + ParticipantRepository participantRepository; @Autowired private TestRestTemplate restTemplate; @Autowired @@ -70,12 +70,12 @@ public final void onlyOnce() { @BeforeEach @BeforeTransaction public final void before() { - userMasterRepository.deleteAll(); + participantRepository.deleteAll(); } @Test void createUser_200() { - ResponseEntity> responseEntity = createUser(TestDataUtil.getUserRequest()); + ResponseEntity> responseEntity = createUser(TestDataUtil.getUserRequest()); Assertions.assertNotNull(responseEntity); Assertions.assertTrue(responseEntity.getStatusCode().is2xxSuccessful()); Assertions.assertNotNull(responseEntity.getBody()); @@ -84,8 +84,8 @@ void createUser_200() { } - private ResponseEntity> createUser(UserRequest userRequest) { - return restTemplate.exchange(ContURI.USER, HttpMethod.POST, new HttpEntity<>(userRequest, TestHelper.prepareHeader(true)), + private ResponseEntity> createUser(ParticipantRequest participantRequest) { + return restTemplate.exchange(ContURI.USER, HttpMethod.POST, new HttpEntity<>(participantRequest, TestHelper.prepareHeader(true)), new ParameterizedTypeReference<>() { }); }