feat(recommend): 홈 추천 점수 정책을 추가한다

This commit is contained in:
2026-05-30 17:44:59 +09:00
parent 2324483c87
commit 07bbc75844
2 changed files with 169 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
package kr.co.vividnext.sodalive.v2.recommend.domain
import java.time.LocalDateTime
import java.time.temporal.ChronoUnit
class RecommendationScorePolicy {
fun calculateCreatorNewBoost(debutAt: LocalDateTime, now: LocalDateTime): Double {
return calculateNewBoost(debutAt, now)
}
fun calculateAiCharacterNewBoost(createdAt: LocalDateTime, now: LocalDateTime): Double {
return calculateNewBoost(createdAt, now)
}
fun calculateDebutCreatorScore(
followIncrease: Long,
contentActivityScore: Long,
communicationScore: Long,
newBoost: Double
): Double {
return ((followIncrease * 0.35) + (contentActivityScore * 0.3) + (communicationScore * 0.2)) * newBoost
}
fun calculateAiChatScore(
recentChatCount: Long,
recentActiveUserCount: Long,
followIncrease: Long,
newBoost: Double
): Double {
return ((0.45 * recentChatCount) + (0.35 * recentActiveUserCount) + (0.20 * followIncrease)) * newBoost
}
fun calculateCheerScore(
donationAmount: Long,
fanTalkCount: Long,
donationCount: Long,
newBoost: Double
): Double {
return ((0.6 * donationAmount) + (0.3 * fanTalkCount) + (0.1 * donationCount)) * newBoost
}
fun calculateCommunityScore(
likeCount: Long,
commentCount: Long,
followerCount: Long,
newBoost: Double
): Double {
return ((0.5 * likeCount) + (0.5 * commentCount) + (0.1 * followerCount)) * newBoost
}
fun calculateFirstAudioRecencyScore(releaseDate: LocalDateTime, now: LocalDateTime): Int {
val days = ChronoUnit.DAYS.between(releaseDate.toLocalDate(), now.toLocalDate())
return when {
days <= 3 -> 100
days <= 7 -> 80
days <= 14 -> 60
days <= 21 -> 40
days <= 30 -> 20
else -> 0
}
}
private fun calculateNewBoost(baseAt: LocalDateTime, now: LocalDateTime): Double {
val days = ChronoUnit.DAYS.between(baseAt.toLocalDate(), now.toLocalDate())
return when {
days <= 10 -> 1.5
days <= 20 -> 1.3
days <= 30 -> 1.2
else -> 1.0
}
}
}