44 lines
1.2 KiB
Kotlin
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
|
|
}
|