sodalive-backend-spring-boot/src/main/kotlin/kr/co/vividnext/sodalive/point/PointUsageService.kt

44 lines
1.2 KiB
Kotlin

package kr.co.vividnext.sodalive.point
import org.springframework.stereotype.Service
import java.time.LocalDateTime
@Service
class PointUsageService(
private val memberPointRepository: MemberPointRepository,
private val usePointRepository: UsePointRepository
) {
fun usePoint(memberId: Long, contentPrice: Int): Int {
val now = LocalDateTime.now()
val maxUsablePoint = contentPrice * 10
val points = memberPointRepository.findByMemberIdAndExpiresAtAfterOrderByExpiresAtAsc(
memberId = memberId,
expiresAt = now
)
val totalAvailable = points.sumOf { it.point }
val usablePoint = minOf(totalAvailable, maxUsablePoint).floorToNearest10()
var remaining = usablePoint
var used = 0
for (p in points) {
if (remaining <= 0) break
val usable = minOf(p.point, remaining)
p.point -= usable
remaining -= usable
used += usable
}
if (used > 0) {
memberPointRepository.saveAll(points)
usePointRepository.save(UsePoint(memberId = memberId, amount = used))
}
return used
}
private fun Int.floorToNearest10(): Int = (this / 10) * 10
}