Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ class UserPersistenceAdapter(
?.let { userMapper.toModel(it) }
}

override fun findByReceiptCode(receiptCode: Long): User? {
return userRepository.findByReceiptCode(receiptCode)
?.let { userMapper.toModel(it) }
}

/**
* 전화번호로 사용자를 조회합니다.
* 전화번호를 암호화하여 데이터베이스에서 조회합니다.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,6 @@ interface UserRepository : JpaRepository<UserJpaEntity, UUID> {
* @return 삭제 대상 사용자 엔티티 목록
*/
fun findAllByActiveFalseAndWithdrawalAtBefore(cutoffDate: LocalDateTime): List<UserJpaEntity>

fun findByReceiptCode(receiptCode: Long): UserJpaEntity?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package hs.kr.entrydsm.user.domain.user.application.port.`in`

interface DeleteReceiptCodeUseCase {
fun deleteReceiptCode(receiptCode: Long)
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,6 @@ interface QueryUserPort {
* @return 사용자 존재 여부
*/
fun existsByPhoneNumber(phoneNumber: String): Boolean

fun findByReceiptCode(receiptCode: Long): User?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package hs.kr.entrydsm.user.domain.user.application.service

import hs.kr.entrydsm.user.domain.user.application.port.`in`.DeleteReceiptCodeUseCase
import hs.kr.entrydsm.user.domain.user.application.port.out.QueryUserPort
import hs.kr.entrydsm.user.domain.user.application.port.out.SaveUserPort
import hs.kr.entrydsm.user.domain.user.exception.UserNotFoundException
import jakarta.transaction.Transactional
import org.springframework.stereotype.Service

@Service
class DeleteReceiptCodeService(
private val queryUserPort: QueryUserPort,
private val saveUserPort: SaveUserPort,
) : DeleteReceiptCodeUseCase {

@Transactional
override fun deleteReceiptCode(receiptCode: Long) {
val user = queryUserPort.findByReceiptCode(receiptCode)
?: throw UserNotFoundException

val updatedUser = user.copy(receiptCode = null)
saveUserPort.save(updatedUser)

// registerAfterCommitCallback(receiptCode)
// try {
// val user = queryUserPort.findByReceiptCode(receiptCode)
//
// if (user == null) {
// userEventProducer.sendReceiptCodeDeleteFailed(
// receiptCode = receiptCode,
// reason = "User not found",
// )
// throw UserNotFoundException
// }
//
// val updatedUser = user.copy(receiptCode = null)
// saveUserPort.save(updatedUser)
//
// registerAfterCommitCallback(receiptCode)
// } catch (e: Exception) {
// if (e !is UserNotFoundException) {
// userEventProducer.sendReceiptCodeDeleteFailed(
// receiptCode = receiptCode,
// reason = e.message ?: "Unknown error",
// )
// }
// throw e // 예외 다시 던져서 롤백 발생
// }
}

// private fun registerAfterCommitCallback(
// receiptCode: Long
// ) {
// val callback =
// object : TransactionSynchronization {
// override fun afterCommit() {
// userEventProducer.sendReceiptCodeDeleteCompleted(receiptCode)
// }
// }
// TransactionSynchronizationManager.registerSynchronization(callback)
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,6 @@ object KafkaTopics {
* 원서 서비스에서 이 이벤트를 수신하면 보상 트랜잭션을 수행함
*/
const val USER_RECEIPT_CODE_UPDATE_FAILED = "user-receipt-code-update-failed"

const val CANCEL_SUBMITTED_APPLICATION = "cancel-submitted-application"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package hs.kr.entrydsm.user.infrastructure.kafka.consumer

import com.fasterxml.jackson.databind.ObjectMapper
import hs.kr.entrydsm.user.domain.user.application.port.`in`.DeleteReceiptCodeUseCase
import hs.kr.entrydsm.user.infrastructure.kafka.configuration.KafkaTopics
import org.springframework.kafka.annotation.KafkaListener
import org.springframework.stereotype.Component

@Component
class CancelApplicationConsumer(
private val mapper: ObjectMapper,
private val deleteReceiptCodeUseCase: DeleteReceiptCodeUseCase
) {

@KafkaListener(
topics = [KafkaTopics.CANCEL_SUBMITTED_APPLICATION],
groupId = "update-user",
containerFactory = "kafkaListenerContainerFactory",
)
fun execute(message: String) {
val receiptCode = mapper.readValue(message, Long::class.java)
deleteReceiptCodeUseCase.deleteReceiptCode(receiptCode)
}
}
Loading