feat(recommend): 추천 크리에이터 동시 팔로우 서비스를 추가한다

This commit is contained in:
2026-06-01 10:19:38 +09:00
parent 82b2eb75d4
commit 8300b1875c
4 changed files with 294 additions and 1 deletions

View File

@@ -6,9 +6,19 @@ import javax.persistence.Entity
import javax.persistence.FetchType
import javax.persistence.JoinColumn
import javax.persistence.ManyToOne
import javax.persistence.Table
import javax.persistence.UniqueConstraint
@Entity
data class CreatorFollowing(
@Table(
uniqueConstraints = [
UniqueConstraint(
name = "uk_creator_following_member_creator",
columnNames = ["member_id", "creator_id"]
)
]
)
class CreatorFollowing(
var isNotify: Boolean = true,
var isActive: Boolean = true
) : BaseEntity() {

View File

@@ -0,0 +1,51 @@
package kr.co.vividnext.sodalive.v2.recommend.application
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRepository
import kr.co.vividnext.sodalive.member.following.CreatorFollowing
import kr.co.vividnext.sodalive.member.following.CreatorFollowingRepository
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
@Service
class RecommendedCreatorFollowService(
private val memberRepository: MemberRepository,
private val creatorFollowingRepository: CreatorFollowingRepository
) {
@Transactional
fun followCreators(member: Member, creatorIds: List<Long>) {
val distinctCreatorIds = creatorIds.distinct()
val creatorById = distinctCreatorIds
.filter { it != member.id }
.associateWith { creatorId ->
memberRepository.findCreatorByIdOrNull(creatorId)
?: throw SodaException(messageKey = "member.validation.creator_not_found")
}
distinctCreatorIds.forEach { creatorId ->
if (creatorId == member.id) {
return@forEach
}
val existingFollowing = creatorFollowingRepository.findByCreatorIdAndMemberId(
creatorId = creatorId,
memberId = member.id!!
)
if (existingFollowing != null) {
if (!existingFollowing.isActive) {
existingFollowing.isNotify = true
existingFollowing.isActive = true
}
return@forEach
}
creatorFollowingRepository.save(
CreatorFollowing().apply {
this.member = member
creator = creatorById.getValue(creatorId)
}
)
}
}
}