67 lines
2.6 KiB
Kotlin
67 lines
2.6 KiB
Kotlin
package ru.soune
|
|
|
|
class ReferralService(
|
|
private val referralLevelProvider: ReferralLevelProvider,
|
|
private val referralRepo: ReferralRepo,
|
|
) {
|
|
|
|
fun onRegister(userId: String, inviterReferralLink: String?) {
|
|
val initialReferralLevel = referralLevelProvider.getInitialReferralLevelId()
|
|
val referralLink = referralRepo.getUserReferralLink(userId)
|
|
val inviter = inviterReferralLink?.let(referralRepo::getUserIdByLink)
|
|
|
|
val referral = object : Referral {
|
|
override val userId = userId
|
|
override val referralLink = referralLink
|
|
override val inviter = inviter
|
|
override val currentLevel = initialReferralLevel
|
|
override val totalIncome = 0
|
|
override val availableIncome = 0
|
|
override val holdBalance: Int = 0
|
|
override val active: Boolean = false
|
|
}
|
|
|
|
referralRepo.createReferralEntity(referral)
|
|
}
|
|
|
|
fun onUserAccountRefill(userId: String, transferAmount: Int) {
|
|
val wasActivated = referralRepo.activateUser(userId)
|
|
val inviterId = referralRepo.getInviterIdForUser(userId) ?: return
|
|
val currentInviterLevel = referralRepo.getReferralLevelForUser(inviterId)
|
|
.let { referralLevelProvider.getReferralLevelById(it) }
|
|
val reward = transferAmount * currentInviterLevel.share / 100
|
|
|
|
referralRepo.increaseIncome(inviterId, reward)
|
|
|
|
if (!wasActivated) return
|
|
|
|
val currentCount = referralRepo.getActiveInviteeForUser(inviterId)
|
|
val nextLevel = currentInviterLevel.next
|
|
|
|
if (currentCount + 1 > currentInviterLevel.maxInvitee && nextLevel != null) {
|
|
referralRepo.upgradeReferralLevelForUser(inviterId, nextLevel)
|
|
}
|
|
}
|
|
|
|
fun getReferralLevels(): List<ReferralLevel> =
|
|
referralLevelProvider.getAvailableReferralLevels()
|
|
|
|
|
|
fun getReferralLevelForUser(userId: String): ReferralLevel =
|
|
referralRepo.getReferralLevelForUser(userId)
|
|
.let { referralLevelProvider.getReferralLevelById(it) }
|
|
|
|
fun getReferralStatForUser(userId: String): ReferralStat {
|
|
var referral = referralRepo.getReferralByUserId(userId)
|
|
return ReferralStat(
|
|
totalInvitee = referralRepo.getTotalInviteeForUser(userId),
|
|
activeInvitee = referralRepo.getActiveInviteeForUser(userId),
|
|
totalIncome = referral.totalIncome,
|
|
availableIncome = referral.availableIncome,
|
|
holdBalance = referral.holdBalance,
|
|
)
|
|
}
|
|
|
|
fun getInviteeForUser(userId: String, pageSize: Int, pageNumber: Int): List<ReferralInvitee> =
|
|
referralRepo.getReferralInvitees(userId, pageSize, pageNumber)
|
|
} |