From 0414749d466063886fb0dba5f8f3ac37f46d1b1f Mon Sep 17 00:00:00 2001 From: Tran Gia Bao Date: Sun, 16 Feb 2025 13:01:53 +0700 Subject: [PATCH] feature: Move PAYOS from IDP to Enterprise --- sep490-enterprise/build.gradle | 1 + .../enterprise}/configs/PaymentConfig.java | 2 +- .../enterprise/dtos/CreditPurchaseDTO.java | 4 + .../services/impl/PaymentServiceImpl.java | 65 +++++++++++++++ .../src/main/resources/application.yml | 10 ++- sep490-idp/build.gradle | 1 - .../idp/service/PaymentService.java | 9 --- .../idp/service/impl/PaymentServiceImpl.java | 81 ------------------- sep490-idp/src/main/resources/application.yml | 8 -- 9 files changed, 80 insertions(+), 101 deletions(-) rename {sep490-idp/src/main/java/green_buildings/idp => sep490-enterprise/src/main/java/enterprise}/configs/PaymentConfig.java (96%) create mode 100644 sep490-enterprise/src/main/java/enterprise/dtos/CreditPurchaseDTO.java delete mode 100644 sep490-idp/src/main/java/green_buildings/idp/service/PaymentService.java delete mode 100644 sep490-idp/src/main/java/green_buildings/idp/service/impl/PaymentServiceImpl.java diff --git a/sep490-enterprise/build.gradle b/sep490-enterprise/build.gradle index 8cd75fbb..fca162e9 100644 --- a/sep490-enterprise/build.gradle +++ b/sep490-enterprise/build.gradle @@ -25,6 +25,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.kafka:spring-kafka' + implementation 'vn.payos:payos-java:1.0.3' // Testing testRuntimeOnly 'org.junit.platform:junit-platform-launcher' diff --git a/sep490-idp/src/main/java/green_buildings/idp/configs/PaymentConfig.java b/sep490-enterprise/src/main/java/enterprise/configs/PaymentConfig.java similarity index 96% rename from sep490-idp/src/main/java/green_buildings/idp/configs/PaymentConfig.java rename to sep490-enterprise/src/main/java/enterprise/configs/PaymentConfig.java index add68078..3223a271 100644 --- a/sep490-idp/src/main/java/green_buildings/idp/configs/PaymentConfig.java +++ b/sep490-enterprise/src/main/java/enterprise/configs/PaymentConfig.java @@ -1,4 +1,4 @@ -package green_buildings.idp.configs; +package enterprise.configs; import jakarta.annotation.PostConstruct; import org.apache.commons.lang3.StringUtils; diff --git a/sep490-enterprise/src/main/java/enterprise/dtos/CreditPurchaseDTO.java b/sep490-enterprise/src/main/java/enterprise/dtos/CreditPurchaseDTO.java new file mode 100644 index 00000000..e6315a90 --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/dtos/CreditPurchaseDTO.java @@ -0,0 +1,4 @@ +package enterprise.dtos; + +public record CreditPurchaseDTO(Long code, Integer amount, Integer price) { +} diff --git a/sep490-enterprise/src/main/java/enterprise/services/impl/PaymentServiceImpl.java b/sep490-enterprise/src/main/java/enterprise/services/impl/PaymentServiceImpl.java index 42d0b2df..e7137d00 100644 --- a/sep490-enterprise/src/main/java/enterprise/services/impl/PaymentServiceImpl.java +++ b/sep490-enterprise/src/main/java/enterprise/services/impl/PaymentServiceImpl.java @@ -1,17 +1,26 @@ package enterprise.services.impl; import commons.springfw.impl.utils.SecurityUtils; +import enterprise.dtos.CreditPurchaseDTO; import enterprise.dtos.PaymentCriteriaDTO; import enterprise.entities.PaymentEntity; import enterprise.repositories.PaymentRepository; import enterprise.services.PaymentService; import green_buildings.commons.api.dto.SearchCriteriaDTO; +import green_buildings.commons.api.exceptions.TechnicalException; +import jakarta.annotation.PostConstruct; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.web.util.UriComponentsBuilder; +import vn.payos.PayOS; +import vn.payos.type.CheckoutResponseData; +import vn.payos.type.ItemData; +import vn.payos.type.PaymentData; import java.util.UUID; @@ -21,10 +30,66 @@ @RequiredArgsConstructor public class PaymentServiceImpl implements PaymentService { private final PaymentRepository payRepo; + private final PayOS payOS; + + @Value("${payment.payos.returnPath}") + private String returnPath; + + @Value("${payment.payos.cancelPath}") + private String cancelPath; + + @Value("${spring.application.homepage}") + private String homepage; + + private String returnUrl; + private String cancelUrl; + + @PostConstruct + public void setUrls() { + returnUrl = UriComponentsBuilder.fromUriString(homepage) + .path(returnPath) + .build() + .toUriString(); + cancelUrl = UriComponentsBuilder.fromUriString(homepage) + .path(cancelPath) + .build() + .toUriString(); + } @Override public Page search(SearchCriteriaDTO searchCriteria, Pageable pageable) { UUID enterpriseId = SecurityUtils.getCurrentUserEnterpriseId().orElseThrow(); return payRepo.findByEnterpriseId(enterpriseId, pageable); } + + public CheckoutResponseData getCheckoutData(CreditPurchaseDTO creditPurchaseItem) { + try { + log.info("Creating payment link for item: {}", creditPurchaseItem); + PaymentData paymentData = createPaymentData(creditPurchaseItem); + log.debug("Generated PaymentData: {}", paymentData); + return payOS.createPaymentLink(paymentData); + } catch (Exception ex) { + log.error("Error creating payment link for item: {}", creditPurchaseItem); + throw new TechnicalException("Error creating payment link for item", ex); + } + } + + private PaymentData createPaymentData(CreditPurchaseDTO creditPurchaseItem) { + ItemData itemData = createItemData(creditPurchaseItem); + return PaymentData.builder() + .orderCode(creditPurchaseItem.code()) + .amount(creditPurchaseItem.price()) + .item(itemData) + .returnUrl(returnUrl) + .cancelUrl(cancelUrl) + .build(); + } + + private ItemData createItemData(CreditPurchaseDTO creditPurchaseItem) { + return ItemData.builder() + .name("Credit Purchase") + .quantity(creditPurchaseItem.amount()) + .price(creditPurchaseItem.price()) + .build(); + } } diff --git a/sep490-enterprise/src/main/resources/application.yml b/sep490-enterprise/src/main/resources/application.yml index 237cdaf9..f86c8af7 100644 --- a/sep490-enterprise/src/main/resources/application.yml +++ b/sep490-enterprise/src/main/resources/application.yml @@ -57,4 +57,12 @@ logging: SQL: ${HIBERNATE_SQL_LOG_LEVEL:TRACE} type: descriptor: - sql: ${HIBERNATE_SQL_PARAM_LOG_LEVEL:TRACE} \ No newline at end of file + sql: ${HIBERNATE_SQL_PARAM_LOG_LEVEL:TRACE} + +payment: + payos: + client_id: ${PAYOS_CLIENT_ID:not_a_real_key_to_prevent_null} + api_key: ${PAYOS_API_KEY:not_a_real_key_to_prevent_null} + checksum_key: ${PAYOS_CHECKSUM_KEY:not_a_real_key_to_prevent_null} + returnPath: /success-payment + cancelPath: /fail-payment \ No newline at end of file diff --git a/sep490-idp/build.gradle b/sep490-idp/build.gradle index 9bd437b8..dc682207 100644 --- a/sep490-idp/build.gradle +++ b/sep490-idp/build.gradle @@ -66,7 +66,6 @@ dependencies { implementation 'org.mapstruct:mapstruct:1.6.2' implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.boot:spring-boot-starter-freemarker' - implementation 'vn.payos:payos-java:1.0.3' } tasks.register('npmBuild', NpmTask) { diff --git a/sep490-idp/src/main/java/green_buildings/idp/service/PaymentService.java b/sep490-idp/src/main/java/green_buildings/idp/service/PaymentService.java deleted file mode 100644 index 54c829a4..00000000 --- a/sep490-idp/src/main/java/green_buildings/idp/service/PaymentService.java +++ /dev/null @@ -1,9 +0,0 @@ -package green_buildings.idp.service; - -import green_buildings.idp.dto.CreditPurchaseItem; -import vn.payos.type.CheckoutResponseData; - -public interface PaymentService { - public CheckoutResponseData getCheckoutData(CreditPurchaseItem creditPurchaseItem); - -} diff --git a/sep490-idp/src/main/java/green_buildings/idp/service/impl/PaymentServiceImpl.java b/sep490-idp/src/main/java/green_buildings/idp/service/impl/PaymentServiceImpl.java deleted file mode 100644 index 09b3ee38..00000000 --- a/sep490-idp/src/main/java/green_buildings/idp/service/impl/PaymentServiceImpl.java +++ /dev/null @@ -1,81 +0,0 @@ -package green_buildings.idp.service.impl; - -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.util.UriComponentsBuilder; -import green_buildings.commons.api.exceptions.TechnicalException; -import green_buildings.idp.dto.CreditPurchaseItem; -import green_buildings.idp.service.PaymentService; -import vn.payos.PayOS; -import vn.payos.type.CheckoutResponseData; -import vn.payos.type.ItemData; -import vn.payos.type.PaymentData; - - -@Service -@RequiredArgsConstructor -@Transactional(rollbackFor = Throwable.class) -@Slf4j -public class PaymentServiceImpl implements PaymentService { - - private final PayOS payOS; - - @Value("${payment.payos.returnPath}") - private String returnPath; - - @Value("${payment.payos.cancelPath}") - private String cancelPath; - - @Value("${spring.application.homepage}") - private String homepage; - - private String returnUrl; - private String cancelUrl; - - @PostConstruct - public void setUrls() { - returnUrl = UriComponentsBuilder.fromUriString(homepage) - .path(returnPath) - .build() - .toUriString(); - cancelUrl = UriComponentsBuilder.fromUriString(homepage) - .path(cancelPath) - .build() - .toUriString(); - } - - public CheckoutResponseData getCheckoutData(CreditPurchaseItem creditPurchaseItem) { - try { - log.info("Creating payment link for item: {}", creditPurchaseItem); - PaymentData paymentData = createPaymentData(creditPurchaseItem); - log.debug("Generated PaymentData: {}", paymentData); - return payOS.createPaymentLink(paymentData); - } catch (Exception ex) { - log.error("Error creating payment link for item: {}", creditPurchaseItem); - throw new TechnicalException("Error creating payment link for item", ex); - } - } - - private PaymentData createPaymentData(CreditPurchaseItem creditPurchaseItem) { - ItemData itemData = createItemData(creditPurchaseItem); - return PaymentData.builder() - .orderCode(creditPurchaseItem.code()) - .amount(creditPurchaseItem.price()) - .item(itemData) - .returnUrl(returnUrl) - .cancelUrl(cancelUrl) - .build(); - } - - private ItemData createItemData(CreditPurchaseItem creditPurchaseItem) { - return ItemData.builder() - .name("Credit Purchase") - .quantity(creditPurchaseItem.amount()) - .price(creditPurchaseItem.price()) - .build(); - } -} diff --git a/sep490-idp/src/main/resources/application.yml b/sep490-idp/src/main/resources/application.yml index de3e2c46..2d6eac12 100644 --- a/sep490-idp/src/main/resources/application.yml +++ b/sep490-idp/src/main/resources/application.yml @@ -82,11 +82,3 @@ logging: sql: ${HIBERNATE_SQL_PARAM_LOG_LEVEL:TRACE} server: port: 8180 - -payment: - payos: - client_id: ${PAYOS_CLIENT_ID:not_a_real_key_to_prevent_null} - api_key: ${PAYOS_API_KEY:not_a_real_key_to_prevent_null} - checksum_key: ${PAYOS_CHECKSUM_KEY:not_a_real_key_to_prevent_null} - returnPath: /success-payment - cancelPath: /fail-payment \ No newline at end of file