From c8661212bdbdbb6d91b9f23985df3570b5f51ecc Mon Sep 17 00:00:00 2001 From: gentledot Date: Sat, 15 Feb 2025 16:24:51 +0900 Subject: [PATCH] =?UTF-8?q?feat(170):=20=EB=AF=BC=EA=B0=90=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=A7=88=EC=8A=A4=ED=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - maskIt 라이브러리 사용 - 카드 번호 커스텀 설정에 버그가 있음을 확인 ㅠㅠㅠㅠㅠㅠㅠㅠ - userPaymentMethodException 신설 --- core/build.gradle.kts | 1 + .../circle/core/service/UserCardService.kt | 25 +++++++++++++++++-- .../exception/UserPaymentMethodException.kt | 24 ++++++++++++++++++ gradle/libs.versions.toml | 2 ++ 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 exception/src/main/kotlin/com/inner/circle/exception/UserPaymentMethodException.kt diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 8dd30575..61f7c0aa 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { implementation(libs.jwt) implementation(projects.infra) implementation(projects.exception) + implementation(libs.maskIt) implementation("org.springframework.boot:spring-boot-starter-security") compileOnly(libs.bundles.kotlinLogging) compileOnly(libs.bundles.kotlinxCoroutines) diff --git a/core/src/main/kotlin/com/inner/circle/core/service/UserCardService.kt b/core/src/main/kotlin/com/inner/circle/core/service/UserCardService.kt index 7d9ffa69..6d1f11c5 100644 --- a/core/src/main/kotlin/com/inner/circle/core/service/UserCardService.kt +++ b/core/src/main/kotlin/com/inner/circle/core/service/UserCardService.kt @@ -2,7 +2,11 @@ package com.inner.circle.core.service import com.inner.circle.core.service.dto.UserCardDto import com.inner.circle.core.usecase.UserCardUseCase +import com.inner.circle.exception.UserPaymentMethodException import com.inner.circle.infra.port.UserCardPort +import net.gentledot.maskit.DataMasking +import net.gentledot.maskit.applications.modules.MaskingModule +import net.gentledot.maskit.models.DataTypes import org.springframework.stereotype.Service import com.inner.circle.infra.adaptor.dto.UserCardDto as InfraUserCardDto @@ -26,20 +30,37 @@ internal class UserCardService( } override fun findByAccountId(accountId: Long): List { + val dataMasking = DataMasking.builder().build() + val cardMaskingModule = dataMasking.getModule(DataTypes.CREDIT_CARD) + val nameMaskingModule = dataMasking.getModule(DataTypes.NAME) val infraUserCardDtoList = userCardPort.findByAccountId(accountId) + return infraUserCardDtoList .map { infraUserCardDto -> + val maskedCardNumber = maskingCardNumber(cardMaskingModule, infraUserCardDto) UserCardDto( id = infraUserCardDto.id, accountId = infraUserCardDto.accountId, isRepresentative = infraUserCardDto.isRepresentative, - cardNumber = infraUserCardDto.cardNumber, + cardNumber = maskedCardNumber, expirationPeriod = infraUserCardDto.expirationPeriod, - cvc = infraUserCardDto.cvc + cvc = nameMaskingModule.mask(infraUserCardDto.cvc, 1, 2) ) }.toList() } + private fun maskingCardNumber( + cardMaskingModule: MaskingModule, + infraUserCardDto: com.inner.circle.infra.adaptor.dto.UserCardDto + ): String { + val cardNumber = infraUserCardDto.cardNumber + val split = cardNumber.split("-") + val masked = cardMaskingModule.mask(cardNumber) + if (split.size != 4) throw UserPaymentMethodException.InvalidCardNumberException(masked) + val firstNumberPart = split[0] + return """$firstNumberPart${masked.substring(4)}""" + } + override fun findAll(): List { val infraUserCardDtoList = userCardPort.findAll() return infraUserCardDtoList diff --git a/exception/src/main/kotlin/com/inner/circle/exception/UserPaymentMethodException.kt b/exception/src/main/kotlin/com/inner/circle/exception/UserPaymentMethodException.kt new file mode 100644 index 00000000..8f47f281 --- /dev/null +++ b/exception/src/main/kotlin/com/inner/circle/exception/UserPaymentMethodException.kt @@ -0,0 +1,24 @@ +package com.inner.circle.exception + +sealed class UserPaymentMethodException( + status: HttpStatus, + override val message: String, + override val cause: Throwable? = null +) : AppException(status, message, cause) { + data class InvalidCardNumberException( + val cardNumber: String, + override val message: String = "Invalid card number: $cardNumber", + override val cause: Throwable? = null + ) : UserPaymentMethodException(HttpStatus.BAD_REQUEST, message, cause) + + data class InvalidCVCException( + override val message: String = "Invalid CVC value.", + override val cause: Throwable? = null + ) : UserPaymentMethodException(HttpStatus.BAD_REQUEST, message, cause) + + data class InvalidExpirationDateException( + val expirationDate: String, + override val message: String = "Invalid expiration date: $expirationDate", + override val cause: Throwable? = null + ) : UserPaymentMethodException(HttpStatus.BAD_REQUEST, message, cause) +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6d22092a..248a4ee3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -82,6 +82,8 @@ jwt = {module = "io.jsonwebtoken:jjwt", version = "0.12.6"} logbackDiscordAppender = { module = "com.github.napstr:logback-discord-appender", version = "1.0.0" } retrofit = { module = "com.squareup.retrofit2:retrofit", version = "2.9.0" } okhttp = { module = "com.squareup.okhttp3:okhttp", version = "3.14.9" } +# maskit (beta) +maskIt = {module ="com.github.GentleDot:maskIt", version = "0.1.1"} [bundles] boms = ["kotlinxSerializationBom", "kotlinxCoroutinesBom", "kotestBom"]