feat(content): 콘텐츠 상세 조회 이력을 기록한다

This commit is contained in:
2026-05-31 18:20:07 +09:00
parent 43179de810
commit 209d32da2f
2 changed files with 17 additions and 0 deletions

View File

@@ -39,6 +39,7 @@ import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
import kr.co.vividnext.sodalive.member.contentpreference.isAdultVisibleByPolicy import kr.co.vividnext.sodalive.member.contentpreference.isAdultVisibleByPolicy
import kr.co.vividnext.sodalive.utils.generateFileName import kr.co.vividnext.sodalive.utils.generateFileName
import kr.co.vividnext.sodalive.v2.recommend.application.CreatorContentViewHistoryService
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.cache.annotation.Cacheable import org.springframework.cache.annotation.Cacheable
import org.springframework.context.ApplicationEventPublisher import org.springframework.context.ApplicationEventPublisher
@@ -63,6 +64,7 @@ class AudioContentService(
private val limitedEditionOrderRepository: LimitedEditionOrderRepository, private val limitedEditionOrderRepository: LimitedEditionOrderRepository,
private val themeQueryRepository: AudioContentThemeQueryRepository, private val themeQueryRepository: AudioContentThemeQueryRepository,
private val playbackTrackingRepository: PlaybackTrackingRepository, private val playbackTrackingRepository: PlaybackTrackingRepository,
private val creatorContentViewHistoryService: CreatorContentViewHistoryService,
private val commentRepository: AudioContentCommentRepository, private val commentRepository: AudioContentCommentRepository,
private val audioContentLikeRepository: AudioContentLikeRepository, private val audioContentLikeRepository: AudioContentLikeRepository,
private val pinContentRepository: PinContentRepository, private val pinContentRepository: PinContentRepository,
@@ -813,6 +815,13 @@ class AudioContentService(
} }
} }
runCatching {
creatorContentViewHistoryService.recordView(
memberId = member.id!!,
contentId = audioContent.id!!
)
}
return GetAudioContentDetailResponse( return GetAudioContentDetailResponse(
contentId = audioContent.id!!, contentId = audioContent.id!!,
title = audioContent.title, title = audioContent.title,

View File

@@ -21,6 +21,7 @@ import kr.co.vividnext.sodalive.i18n.SodaMessageSource
import kr.co.vividnext.sodalive.i18n.translation.ResourceTranslationJobScheduler import kr.co.vividnext.sodalive.i18n.translation.ResourceTranslationJobScheduler
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
import kr.co.vividnext.sodalive.v2.recommend.application.CreatorContentViewHistoryService
import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Assertions.assertThrows import org.junit.jupiter.api.Assertions.assertThrows
@@ -41,6 +42,7 @@ class AudioContentServiceTest {
private lateinit var limitedEditionOrderRepository: LimitedEditionOrderRepository private lateinit var limitedEditionOrderRepository: LimitedEditionOrderRepository
private lateinit var themeQueryRepository: AudioContentThemeQueryRepository private lateinit var themeQueryRepository: AudioContentThemeQueryRepository
private lateinit var playbackTrackingRepository: PlaybackTrackingRepository private lateinit var playbackTrackingRepository: PlaybackTrackingRepository
private lateinit var creatorContentViewHistoryService: CreatorContentViewHistoryService
private lateinit var commentRepository: AudioContentCommentRepository private lateinit var commentRepository: AudioContentCommentRepository
private lateinit var audioContentLikeRepository: AudioContentLikeRepository private lateinit var audioContentLikeRepository: AudioContentLikeRepository
private lateinit var pinContentRepository: PinContentRepository private lateinit var pinContentRepository: PinContentRepository
@@ -63,6 +65,7 @@ class AudioContentServiceTest {
limitedEditionOrderRepository = Mockito.mock(LimitedEditionOrderRepository::class.java) limitedEditionOrderRepository = Mockito.mock(LimitedEditionOrderRepository::class.java)
themeQueryRepository = Mockito.mock(AudioContentThemeQueryRepository::class.java) themeQueryRepository = Mockito.mock(AudioContentThemeQueryRepository::class.java)
playbackTrackingRepository = Mockito.mock(PlaybackTrackingRepository::class.java) playbackTrackingRepository = Mockito.mock(PlaybackTrackingRepository::class.java)
creatorContentViewHistoryService = Mockito.mock(CreatorContentViewHistoryService::class.java)
commentRepository = Mockito.mock(AudioContentCommentRepository::class.java) commentRepository = Mockito.mock(AudioContentCommentRepository::class.java)
audioContentLikeRepository = Mockito.mock(AudioContentLikeRepository::class.java) audioContentLikeRepository = Mockito.mock(AudioContentLikeRepository::class.java)
pinContentRepository = Mockito.mock(PinContentRepository::class.java) pinContentRepository = Mockito.mock(PinContentRepository::class.java)
@@ -82,6 +85,7 @@ class AudioContentServiceTest {
limitedEditionOrderRepository = limitedEditionOrderRepository, limitedEditionOrderRepository = limitedEditionOrderRepository,
themeQueryRepository = themeQueryRepository, themeQueryRepository = themeQueryRepository,
playbackTrackingRepository = playbackTrackingRepository, playbackTrackingRepository = playbackTrackingRepository,
creatorContentViewHistoryService = creatorContentViewHistoryService,
commentRepository = commentRepository, commentRepository = commentRepository,
audioContentLikeRepository = audioContentLikeRepository, audioContentLikeRepository = audioContentLikeRepository,
pinContentRepository = pinContentRepository, pinContentRepository = pinContentRepository,
@@ -230,6 +234,10 @@ class AudioContentServiceTest {
Mockito.verify(repository, Mockito.never()).findSeriesIdByContentId(audioContent.id!!, false) Mockito.verify(repository, Mockito.never()).findSeriesIdByContentId(audioContent.id!!, false)
Mockito.verifyNoInteractions(commentRepository) Mockito.verifyNoInteractions(commentRepository)
val recordViewInvocation = Mockito.mockingDetails(creatorContentViewHistoryService).invocations
.single { it.method.name == "recordView" }
assertEquals(viewer.id!!, recordViewInvocation.arguments[0])
assertEquals(audioContent.id!!, recordViewInvocation.arguments[1])
} }
private fun createMember(id: Long, nickname: String): Member { private fun createMember(id: Long, nickname: String): Member {