fix: 유저 행동 데이터 기록시 포인트 지급 조건 수정
- 지급유형(매일, 전체) 추가 - 참여가능 횟수 추가 - 주문한 콘텐츠에 댓글을 쓰면 포인트 지급을 위해 포인트 지급 이력에 orderId 추가
This commit is contained in:
@@ -2,5 +2,8 @@ package kr.co.vividnext.sodalive.useraction
|
||||
|
||||
enum class ActionType(val displayName: String) {
|
||||
SIGN_UP("회원가입"),
|
||||
USER_AUTHENTICATION("본인인증")
|
||||
USER_AUTHENTICATION("본인인증"),
|
||||
CONTENT_COMMENT("콘텐츠 댓글"),
|
||||
ORDER_CONTENT_COMMENT("구매한 콘텐츠 댓글"),
|
||||
LIVE_CONTINUOUS_LISTEN_30("라이브 연속 청취 30분")
|
||||
}
|
||||
|
@@ -0,0 +1,6 @@
|
||||
package kr.co.vividnext.sodalive.useraction
|
||||
|
||||
enum class PolicyType(val displayName: String) {
|
||||
DAILY("기간 내 매일"),
|
||||
TOTAL("기간 내 전체")
|
||||
}
|
@@ -24,23 +24,35 @@ class UserActionService(
|
||||
|
||||
private val coroutineScope = CoroutineScope(Dispatchers.IO)
|
||||
|
||||
fun recordAction(memberId: Long, actionType: ActionType, pushToken: String?) {
|
||||
fun recordAction(memberId: Long, actionType: ActionType, orderId: Long? = null, pushToken: String? = null) {
|
||||
coroutineScope.launch {
|
||||
val now = LocalDateTime.now()
|
||||
repository.save(UserActionLog(memberId, actionType))
|
||||
|
||||
val policy = policyRepository.findByActionTypeAndIsActiveTrue(actionType, now)
|
||||
if (policy != null) {
|
||||
val policyType = policy.policyType
|
||||
val todayAt15 = now.toLocalDate().atTime(15, 0)
|
||||
val policyTypeDailyStartDate = if (now.toLocalTime().isBefore(todayAt15.toLocalTime())) {
|
||||
now.toLocalDate().minusDays(1).atTime(15, 0)
|
||||
} else {
|
||||
todayAt15
|
||||
}
|
||||
|
||||
val actionCount = repository.countByMemberIdAndActionTypeAndCreatedAtBetween(
|
||||
memberId = memberId,
|
||||
actionType = actionType,
|
||||
startDate = policy.startDate,
|
||||
startDate = if (policyType == PolicyType.DAILY) policyTypeDailyStartDate else policy.startDate,
|
||||
endDate = policy.endDate ?: now
|
||||
)
|
||||
if (actionCount < policy.threshold) return@launch
|
||||
|
||||
val alreadyGranted = grantLogRepository.existsByMemberIdAndPolicyId(memberId, policy.id!!)
|
||||
if (alreadyGranted) return@launch
|
||||
val grantedCount = grantLogRepository.countByMemberIdAndPolicyIdAndStartDate(
|
||||
memberId,
|
||||
policy.id!!,
|
||||
startDate = if (policyType == PolicyType.DAILY) policyTypeDailyStartDate else policy.startDate
|
||||
)
|
||||
if (grantedCount >= policy.availableCount) return@launch
|
||||
|
||||
memberPointRepository.save(
|
||||
MemberPoint(
|
||||
@@ -56,7 +68,8 @@ class UserActionService(
|
||||
memberId = memberId,
|
||||
point = policy.pointAmount,
|
||||
actionType = actionType,
|
||||
policyId = policy.id!!
|
||||
policyId = policy.id!!,
|
||||
orderId = orderId
|
||||
)
|
||||
)
|
||||
|
||||
|
Reference in New Issue
Block a user