Merge pull request '첫 충전 이벤트 - 본인인증한 전체 계정 중 첫 충전 시에만 첫충전 이벤트 적용' (#15) from test into main
Reviewed-on: #15
This commit is contained in:
		| @@ -17,7 +17,7 @@ interface ChargeRepository : JpaRepository<Charge, Long>, ChargeQueryRepository | ||||
| interface ChargeQueryRepository { | ||||
|     fun getOldestChargeWhereRewardCanGreaterThan0(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 { | ||||
| @@ -61,8 +61,19 @@ class ChargeQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Cha | ||||
|             .fetchFirst() | ||||
|     } | ||||
|  | ||||
|     override fun getChargeCountAfterDate(date: LocalDateTime): Int { | ||||
|         return 0 | ||||
|     override fun getChargeCountAfterDate(memberId: Long, date: LocalDateTime): Int { | ||||
|         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? { | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.common.SodaException | ||||
| import kr.co.vividnext.sodalive.fcm.FcmEvent | ||||
| import kr.co.vividnext.sodalive.fcm.FcmEventType | ||||
| import kr.co.vividnext.sodalive.member.Member | ||||
| import kr.co.vividnext.sodalive.member.auth.AuthRepository | ||||
| import org.springframework.context.ApplicationEventPublisher | ||||
| import org.springframework.data.repository.findByIdOrNull | ||||
| import org.springframework.stereotype.Service | ||||
| @@ -20,6 +21,7 @@ import kotlin.math.round | ||||
| @Service | ||||
| class ChargeEventService( | ||||
|     private val repository: ChargeEventRepository, | ||||
|     private val authRepository: AuthRepository, | ||||
|     private val chargeRepository: ChargeRepository, | ||||
|     private val chargeEventRepository: ChargeEventRepository, | ||||
|     private val applicationEventPublisher: ApplicationEventPublisher | ||||
| @@ -30,8 +32,13 @@ class ChargeEventService( | ||||
|             ?: throw SodaException("이벤트가 적용되지 않았습니다.") | ||||
|  | ||||
|         if (member.auth != null) { | ||||
|             val authDate = member.auth!!.createdAt!! | ||||
|             val chargeCount = chargeRepository.getChargeCountAfterDate(authDate) | ||||
|             val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di) | ||||
|             val memberIds = authRepository.getMemberIdsByDi(member.auth!!.di) | ||||
|  | ||||
|             var chargeCount = 0 | ||||
|             for (memberId in memberIds) { | ||||
|                 chargeCount += chargeRepository.getChargeCountAfterDate(memberId = memberId, authDate) | ||||
|             } | ||||
|  | ||||
|             if (chargeCount > 0) { | ||||
|                 applyOtherEvent(charge, member) | ||||
|   | ||||
| @@ -1,7 +1,36 @@ | ||||
| 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.stereotype.Repository | ||||
| import java.time.LocalDateTime | ||||
|  | ||||
| @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() | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user