Merge pull request '첫 충전 이벤트 - 본인인증한 전체 계정 중 첫 충전 시에만 첫충전 이벤트 적용' (#15) from test into main

Reviewed-on: #15
This commit is contained in:
klaus 2023-08-24 16:26:54 +00:00
commit 99bf829c88
3 changed files with 53 additions and 6 deletions

View File

@ -17,7 +17,7 @@ interface ChargeRepository : JpaRepository<Charge, Long>, ChargeQueryRepository
interface ChargeQueryRepository { interface ChargeQueryRepository {
fun getOldestChargeWhereRewardCanGreaterThan0(chargeId: Long, memberId: Long, container: String): Charge? fun getOldestChargeWhereRewardCanGreaterThan0(chargeId: Long, memberId: Long, container: String): Charge?
fun getOldestChargeWhereChargeCanGreaterThan0(chargeId: Long, memberId: Long, container: String): Charge? fun getOldestChargeWhereChargeCanGreaterThan0(chargeId: Long, memberId: Long, container: String): Charge?
fun getChargeCountAfterDate(date: LocalDateTime): Int fun getChargeCountAfterDate(memberId: Long, date: LocalDateTime): Int
} }
class ChargeQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : ChargeQueryRepository { class ChargeQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : ChargeQueryRepository {
@ -61,8 +61,19 @@ class ChargeQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Cha
.fetchFirst() .fetchFirst()
} }
override fun getChargeCountAfterDate(date: LocalDateTime): Int { override fun getChargeCountAfterDate(memberId: Long, date: LocalDateTime): Int {
return 0 return queryFactory
.select(charge.id)
.from(charge)
.innerJoin(charge.payment, payment)
.where(
charge.member.id.eq(memberId)
.and(charge.createdAt.after(date))
.and(charge.status.eq(ChargeStatus.CHARGE))
.and(payment.status.`in`(PaymentStatus.COMPLETE, PaymentStatus.RETURN))
)
.fetch()
.size
} }
private fun getPaymentGatewayCondition(container: String): BooleanExpression? { private fun getPaymentGatewayCondition(container: String): BooleanExpression? {

View File

@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.fcm.FcmEvent import kr.co.vividnext.sodalive.fcm.FcmEvent
import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.fcm.FcmEventType
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.auth.AuthRepository
import org.springframework.context.ApplicationEventPublisher import org.springframework.context.ApplicationEventPublisher
import org.springframework.data.repository.findByIdOrNull import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@ -20,6 +21,7 @@ import kotlin.math.round
@Service @Service
class ChargeEventService( class ChargeEventService(
private val repository: ChargeEventRepository, private val repository: ChargeEventRepository,
private val authRepository: AuthRepository,
private val chargeRepository: ChargeRepository, private val chargeRepository: ChargeRepository,
private val chargeEventRepository: ChargeEventRepository, private val chargeEventRepository: ChargeEventRepository,
private val applicationEventPublisher: ApplicationEventPublisher private val applicationEventPublisher: ApplicationEventPublisher
@ -30,8 +32,13 @@ class ChargeEventService(
?: throw SodaException("이벤트가 적용되지 않았습니다.") ?: throw SodaException("이벤트가 적용되지 않았습니다.")
if (member.auth != null) { if (member.auth != null) {
val authDate = member.auth!!.createdAt!! val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di)
val chargeCount = chargeRepository.getChargeCountAfterDate(authDate) val memberIds = authRepository.getMemberIdsByDi(member.auth!!.di)
var chargeCount = 0
for (memberId in memberIds) {
chargeCount += chargeRepository.getChargeCountAfterDate(memberId = memberId, authDate)
}
if (chargeCount > 0) { if (chargeCount > 0) {
applyOtherEvent(charge, member) applyOtherEvent(charge, member)

View File

@ -1,7 +1,36 @@
package kr.co.vividnext.sodalive.member.auth package kr.co.vividnext.sodalive.member.auth
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.member.QMember.member
import kr.co.vividnext.sodalive.member.auth.QAuth.auth
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
import java.time.LocalDateTime
@Repository @Repository
interface AuthRepository : JpaRepository<Auth, Long> interface AuthRepository : JpaRepository<Auth, Long>, AuthQueryRepository
interface AuthQueryRepository {
fun getOldestCreatedAtByDi(di: String): LocalDateTime
fun getMemberIdsByDi(di: String): List<Long>
}
class AuthQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : AuthQueryRepository {
override fun getOldestCreatedAtByDi(di: String): LocalDateTime {
return queryFactory
.select(auth.createdAt)
.from(auth)
.where(auth.di.eq(di))
.orderBy(auth.createdAt.asc())
.fetchFirst()
}
override fun getMemberIdsByDi(di: String): List<Long> {
return queryFactory
.select(member.id)
.from(member)
.leftJoin(member.auth, auth)
.where(auth.di.eq(di))
.fetch()
}
}