From 157e3a39b659b01bf2303b736c87b74bb37acac5 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 22 Nov 2024 17:54:23 +0900 Subject: [PATCH 01/13] =?UTF-8?q?=EC=97=AC=EB=9F=AC=EB=8C=80=EC=9D=98=20Re?= =?UTF-8?q?dis=EC=99=80=20Valkey=EC=97=90=20=EC=97=B0=EA=B2=B0=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/calculate/AdminCalculateService.kt | 21 ------ .../vividnext/sodalive/configs/JpaConfig.kt | 18 +++++ .../vividnext/sodalive/configs/RedisConfig.kt | 74 ++++++------------- .../sodalive/configs/ValkeyConfig.kt | 66 +++++++++++++++++ .../sodalive/content/AudioContentService.kt | 6 -- .../content/main/AudioContentMainService.kt | 9 --- .../calculate/CreatorAdminCalculateService.kt | 24 ------ .../live/roulette/RedisIdGenerator.kt | 5 +- .../sodalive/v2/NewMemberTokenRepository.kt | 8 ++ src/main/resources/application.yml | 4 + 10 files changed, 122 insertions(+), 113 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/configs/JpaConfig.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt index 255d456..093db39 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt @@ -2,17 +2,12 @@ package kr.co.vividnext.sodalive.admin.calculate import kr.co.vividnext.sodalive.creator.admin.calculate.GetCreatorCalculateCommunityPostResponse import kr.co.vividnext.sodalive.extensions.convertLocalDateTime -import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @Service class AdminCalculateService(private val repository: AdminCalculateQueryRepository) { @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_hours"], - key = "'calculateLive:' + " + "#startDateStr + ':' + #endDateStr" - ) fun getCalculateLive(startDateStr: String, endDateStr: String): List { val startDate = startDateStr.convertLocalDateTime() val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) @@ -23,10 +18,6 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_hours"], - key = "'calculateContent:' + " + "#startDateStr + ':' + #endDateStr" - ) fun getCalculateContentList(startDateStr: String, endDateStr: String): List { val startDate = startDateStr.convertLocalDateTime() val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) @@ -37,10 +28,6 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_hours"], - key = "'cumulativeSalesByContent:' + " + "#offset + ':' + #limit" - ) fun getCumulativeSalesByContent(offset: Long, limit: Long): GetCumulativeSalesByContentResponse { val totalCount = repository.getCumulativeSalesByContentTotalCount() val items = repository @@ -51,10 +38,6 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_hours"], - key = "'calculateContentDonationList2:' + " + "#startDateStr + ':' + #endDateStr" - ) fun getCalculateContentDonationList( startDateStr: String, endDateStr: String @@ -68,10 +51,6 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_hours"], - key = "'calculateCommunityPost:' + " + "#startDateStr + ':' + #endDateStr + ':' + #offset" - ) fun getCalculateCommunityPost( startDateStr: String, endDateStr: String, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/JpaConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/JpaConfig.kt new file mode 100644 index 0000000..a6a41f6 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/JpaConfig.kt @@ -0,0 +1,18 @@ +package kr.co.vividnext.sodalive.configs + +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.FilterType +import org.springframework.data.jpa.repository.config.EnableJpaRepositories + +@Configuration +@EnableJpaRepositories( + basePackages = ["kr.co.vividnext.sodalive"], + includeFilters = [ + ComponentScan.Filter( + type = FilterType.ASSIGNABLE_TYPE, + classes = [org.springframework.data.jpa.repository.JpaRepository::class] + ) + ] +) +class JpaConfig diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index 09989bd..6cda146 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -1,32 +1,40 @@ package kr.co.vividnext.sodalive.configs import org.springframework.beans.factory.annotation.Value -import org.springframework.cache.annotation.EnableCaching import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.ComponentScan import org.springframework.context.annotation.Configuration -import org.springframework.data.redis.cache.RedisCacheConfiguration -import org.springframework.data.redis.cache.RedisCacheManager +import org.springframework.context.annotation.FilterType import org.springframework.data.redis.connection.RedisConnectionFactory import org.springframework.data.redis.connection.RedisStandaloneConfiguration import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory import org.springframework.data.redis.core.RedisTemplate +import org.springframework.data.redis.core.StringRedisTemplate import org.springframework.data.redis.repository.configuration.EnableRedisRepositories -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer -import org.springframework.data.redis.serializer.RedisSerializationContext -import org.springframework.data.redis.serializer.StringRedisSerializer -import java.time.Duration @Configuration -@EnableCaching -@EnableRedisRepositories +@EnableRedisRepositories( + basePackages = ["kr.co.vividnext.sodalive"], + redisTemplateRef = "redisTemplate", + excludeFilters = [ + ComponentScan.Filter( + type = FilterType.REGEX, + pattern = ["kr\\.co\\.vividnext\\.sodalive\\.v2\\..*"] + ), + ComponentScan.Filter( + type = FilterType.ASSIGNABLE_TYPE, + classes = [org.springframework.data.jpa.repository.JpaRepository::class] + ) + ] +) class RedisConfig( @Value("\${spring.redis.host}") private val host: String, @Value("\${spring.redis.port}") private val port: Int ) { - @Bean + @Bean(name = ["redisConnectionFactory"]) fun redisConnectionFactory(): RedisConnectionFactory { val clientConfiguration = LettuceClientConfiguration.builder() .useSsl() @@ -36,53 +44,15 @@ class RedisConfig( return LettuceConnectionFactory(RedisStandaloneConfiguration(host, port), clientConfiguration) } - @Bean + @Bean(name = ["redisTemplate"]) fun redisTemplate(): RedisTemplate<*, *> { val redisTemplate: RedisTemplate<*, *> = RedisTemplate() redisTemplate.setConnectionFactory(redisConnectionFactory()) return redisTemplate } - @Bean - fun cacheManager(redisConnectionFactory: RedisConnectionFactory): RedisCacheManager { - val defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofMinutes(30)) - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) - .serializeValuesWith( - RedisSerializationContext.SerializationPair.fromSerializer( - GenericJackson2JsonRedisSerializer() - ) - ) - - val cacheConfigMap = mutableMapOf() - cacheConfigMap["default"] = RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofMinutes(30)) - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) - .serializeValuesWith( - RedisSerializationContext.SerializationPair.fromSerializer( - GenericJackson2JsonRedisSerializer() - ) - ) - cacheConfigMap["cache_ttl_3_days"] = RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofDays(3)) - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) - .serializeValuesWith( - RedisSerializationContext.SerializationPair.fromSerializer( - GenericJackson2JsonRedisSerializer() - ) - ) - cacheConfigMap["cache_ttl_3_hours"] = RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofHours(3)) - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) - .serializeValuesWith( - RedisSerializationContext.SerializationPair.fromSerializer( - GenericJackson2JsonRedisSerializer() - ) - ) - - return RedisCacheManager.builder(redisConnectionFactory) - .cacheDefaults(defaultCacheConfig) - .withInitialCacheConfigurations(cacheConfigMap) - .build() + @Bean(name = ["redisStringRedisTemplate"]) + fun redisStringRedisTemplate(): StringRedisTemplate { + return StringRedisTemplate(redisConnectionFactory()) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt new file mode 100644 index 0000000..c8bfade --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt @@ -0,0 +1,66 @@ +package kr.co.vividnext.sodalive.configs + +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.FilterType +import org.springframework.data.redis.connection.RedisClusterConfiguration +import org.springframework.data.redis.connection.RedisConnectionFactory +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory +import org.springframework.data.redis.core.RedisTemplate +import org.springframework.data.redis.core.StringRedisTemplate +import org.springframework.data.redis.repository.configuration.EnableRedisRepositories +import java.time.Duration + +@Configuration +@EnableRedisRepositories( + basePackages = ["kr.co.vividnext.sodalive.v2"], + redisTemplateRef = "valkeyTemplate", + includeFilters = [ + ComponentScan.Filter( + type = FilterType.REGEX, + pattern = ["kr\\.co\\.vividnext\\.sodalive\\.v2\\..*"] + ) + ], + excludeFilters = [ + ComponentScan.Filter( + type = FilterType.ASSIGNABLE_TYPE, + classes = [org.springframework.data.jpa.repository.JpaRepository::class] + ) + ] +) +class ValkeyConfig( + @Value("\${spring.valkey.host}") + private val host: String, + @Value("\${spring.valkey.port}") + private val port: Int +) { + @Bean(name = ["valkeyConnectionFactory"]) + fun valkeyConnectionFactory(): RedisConnectionFactory { + val clusterConfig = RedisClusterConfiguration() + clusterConfig.clusterNode(host, port) + + val clientConfig = LettuceClientConfiguration.builder() + .commandTimeout(Duration.ofSeconds(5)) + .shutdownTimeout(Duration.ofSeconds(5)) + .useSsl() + .disablePeerVerification() + .build() + + return LettuceConnectionFactory(clusterConfig, clientConfig) + } + + @Bean(name = ["valkeyTemplate"]) + fun valkeyTemplate(): RedisTemplate<*, *> { + val redisTemplate: RedisTemplate<*, *> = RedisTemplate() + redisTemplate.setConnectionFactory(valkeyConnectionFactory()) + return redisTemplate + } + + @Bean(name = ["valkeyStringRedisTemplate"]) + fun valkeyStringRedisTemplate(): StringRedisTemplate { + return StringRedisTemplate(valkeyConnectionFactory()) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index 30d9b39..dcbe13e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -28,7 +28,6 @@ import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import kr.co.vividnext.sodalive.utils.generateFileName import org.springframework.beans.factory.annotation.Value -import org.springframework.cache.annotation.Cacheable import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @@ -717,11 +716,6 @@ class AudioContentService( } @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_days"], - key = "'contentRanking:' + ':' +" + - "#isAdult + ':' + #startDate + ':' + #endDate + ':' + #sortType + ':' + #offset + ':' + #limit" - ) fun getAudioContentRanking( isAdult: Boolean, startDate: LocalDateTime, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt index 598b8b2..ce37a1e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt @@ -10,7 +10,6 @@ import kr.co.vividnext.sodalive.event.EventItem import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import org.springframework.beans.factory.annotation.Value -import org.springframework.cache.annotation.Cacheable import org.springframework.data.domain.Pageable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -27,7 +26,6 @@ class AudioContentMainService( private val imageHost: String ) { @Transactional(readOnly = true) - @Cacheable(cacheNames = ["default"], key = "'themeList:' + ':' + #isAdult") fun getThemeList(isAdult: Boolean): List { return audioContentThemeRepository.getActiveThemeOfContent(isAdult = isAdult) } @@ -81,7 +79,6 @@ class AudioContentMainService( } @Transactional(readOnly = true) - @Cacheable(cacheNames = ["default"], key = "'newContentUploadCreatorList:' + #memberId + ':' + #isAdult") fun getNewContentUploadCreatorList(memberId: Long, isAdult: Boolean): List { return repository.getNewContentUploadCreatorList( cloudfrontHost = imageHost, @@ -93,7 +90,6 @@ class AudioContentMainService( } @Transactional(readOnly = true) - @Cacheable(cacheNames = ["default"], key = "'contentMainBannerList:' + #memberId + ':' + #isAdult") fun getAudioContentMainBannerList(memberId: Long, isAdult: Boolean) = repository.getAudioContentMainBannerList(isAdult = isAdult) .asSequence() @@ -156,11 +152,6 @@ class AudioContentMainService( .toList() @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["default"], - key = "'getAudioContentCurationListWithPaging:' + #memberId + ':' + #isAdult + ':' + #contentType" + - "+ ':' + #offset + ':' + #limit" - ) fun getAudioContentCurationListWithPaging( memberId: Long, isAdult: Boolean, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt index 46ea0f6..fe273f8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt @@ -4,17 +4,12 @@ import kr.co.vividnext.sodalive.admin.calculate.GetCalculateLiveResponse import kr.co.vividnext.sodalive.admin.calculate.GetCumulativeSalesByContentResponse import kr.co.vividnext.sodalive.extensions.convertLocalDateTime import kr.co.vividnext.sodalive.member.Member -import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @Service class CreatorAdminCalculateService(private val repository: CreatorAdminCalculateQueryRepository) { @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["default"], - key = "'creatorCalculateLive:v20240403_01:' + " + "#member + ':' + #startDateStr + ':' + #endDateStr" - ) fun getCalculateLive(startDateStr: String, endDateStr: String, member: Member): List { val startDate = startDateStr.convertLocalDateTime() val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) @@ -25,11 +20,6 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate } @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_hours"], - key = "'creatorCalculateContentList:v20240403_01:' + " + - "#startDateStr + ':' + #endDateStr + ':' + #memberId + ':' + #offset + ':' + #limit" - ) fun getCalculateContentList( startDateStr: String, endDateStr: String, @@ -48,10 +38,6 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate } @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_hours"], - key = "'creatorCumulativeSalesByContent:' + " + "#memberId + ':' + #offset + ':' + #limit" - ) fun getCumulativeSalesByContent(memberId: Long, offset: Long, limit: Long): GetCumulativeSalesByContentResponse { val totalCount = repository.getCumulativeSalesByContentTotalCount(memberId) val items = repository @@ -62,11 +48,6 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate } @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_hours"], - key = "'creatorCalculateContentDonationList2:' + " + - "#startDateStr + ':' + #endDateStr + ':' + #memberId + ':' + #offset + ':' + #limit" - ) fun getCalculateContentDonationList( startDateStr: String, endDateStr: String, @@ -86,11 +67,6 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate } @Transactional(readOnly = true) - @Cacheable( - cacheNames = ["cache_ttl_3_hours"], - key = "'creatorCalculateCommunityPost:' + " + - "#startDateStr + ':' + #endDateStr + ':' + #memberId + ':' + #offset + ':' + #limit" - ) fun getCalculateCommunityPost( startDateStr: String, endDateStr: String, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt index f6a31e1..12a7870 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt @@ -1,10 +1,13 @@ package kr.co.vividnext.sodalive.live.roulette +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.data.redis.core.StringRedisTemplate import org.springframework.stereotype.Service @Service -class RedisIdGenerator(private val stringRedisTemplate: StringRedisTemplate) { +class RedisIdGenerator( + @Qualifier("redisStringRedisTemplate") private val stringRedisTemplate: StringRedisTemplate +) { fun generateId(key: String): Long { return stringRedisTemplate.opsForValue().increment(key, 1) ?: 1L } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt new file mode 100644 index 0000000..14fe79d --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.v2 + +import kr.co.vividnext.sodalive.member.token.MemberToken +import org.springframework.data.repository.CrudRepository +import org.springframework.stereotype.Repository + +@Repository +interface NewMemberTokenRepository : CrudRepository diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6dc7c92..c1ed96d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -52,6 +52,10 @@ jwt: secret: ${JWT_SECRET} spring: + valkey: + host: ${VALKEY_HOST} + port: ${VALKEY_PORT} + redis: host: ${REDIS_HOST} port: ${REDIS_PORT} From 68472b234e2530f24234e4452e881cac5ed59157 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 22 Nov 2024 21:22:02 +0900 Subject: [PATCH 02/13] =?UTF-8?q?=ED=9A=8C=EC=9B=90=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20-=20Redis=20->=20Valkey=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EC=A0=84=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/member/CreatorAdminMemberService.kt | 27 +++++++++++++--- .../vividnext/sodalive/jwt/TokenProvider.kt | 25 ++++++++++++--- .../sodalive/member/MemberService.kt | 32 ++++++++++++++++--- ...pository.kt => MemberTokenRepositoryV2.kt} | 2 +- 4 files changed, 72 insertions(+), 14 deletions(-) rename src/main/kotlin/kr/co/vividnext/sodalive/v2/{NewMemberTokenRepository.kt => MemberTokenRepositoryV2.kt} (75%) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt index 3e193e9..f375108 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt @@ -7,7 +7,9 @@ import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.login.LoginRequest import kr.co.vividnext.sodalive.member.login.LoginResponse +import kr.co.vividnext.sodalive.member.token.MemberToken import kr.co.vividnext.sodalive.member.token.MemberTokenRepository +import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.security.authentication.UsernamePasswordAuthenticationToken @@ -22,6 +24,7 @@ import kotlin.concurrent.write class CreatorAdminMemberService( private val repository: MemberRepository, private val tokenRepository: MemberTokenRepository, + private val tokenRepositoryV2: MemberTokenRepositoryV2, private val tokenProvider: TokenProvider, private val authenticationManagerBuilder: AuthenticationManagerBuilder, @@ -47,14 +50,30 @@ class CreatorAdminMemberService( val lock = getOrCreateLock(memberId = memberId) lock.write { - val memberToken = tokenRepository.findByIdOrNull(memberId) - ?: throw SodaException("로그인 정보를 확인해주세요.") + val memberToken = saveAndGetTokenById(memberId) - memberToken.tokenSet.remove(token) - tokenRepository.save(memberToken) + if (memberToken != null) { + memberToken.tokenSet.remove(token) + tokenRepositoryV2.save(memberToken) + } } } + private fun saveAndGetTokenById(id: Long): MemberToken? { + var memberToken = tokenRepositoryV2.findByIdOrNull(id = id) + + if (memberToken == null) { + memberToken = tokenRepository.findByIdOrNull(id = id) + + if (memberToken != null) { + tokenRepositoryV2.save(memberToken) + tokenRepository.delete(memberToken) + } + } + + return memberToken + } + private fun login(email: String, password: String): LoginResponse { val member = repository.findByEmail(email = email) ?: throw SodaException("로그인 정보를 확인해주세요.") if (!member.isActive) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt b/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt index 0ec16ac..b436ebb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt @@ -13,6 +13,7 @@ import kr.co.vividnext.sodalive.member.MemberAdapter import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.token.MemberToken import kr.co.vividnext.sodalive.member.token.MemberTokenRepository +import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2 import org.slf4j.LoggerFactory import org.springframework.beans.factory.InitializingBean import org.springframework.beans.factory.annotation.Value @@ -35,7 +36,8 @@ class TokenProvider( @Value("\${jwt.token-validity-in-seconds}") private val tokenValidityInSeconds: Long, private val repository: MemberRepository, - private val tokenRepository: MemberTokenRepository + private val tokenRepository: MemberTokenRepository, + private val tokenRepositoryV2: MemberTokenRepositoryV2 ) : InitializingBean { private val logger = LoggerFactory.getLogger(TokenProvider::class.java) @@ -65,11 +67,11 @@ class TokenProvider( val lock = getOrCreateLock(memberId = memberId) lock.write { - val memberToken = tokenRepository.findByIdOrNull(memberId) + val memberToken = saveAndGetTokenById(memberId) ?: MemberToken(id = memberId) memberToken.tokenSet.add(token) - tokenRepository.save(memberToken) + tokenRepositoryV2.save(memberToken) } return token @@ -84,7 +86,7 @@ class TokenProvider( .body val authorities = claims[AUTHORITIES_KEY].toString().split(",").map { SimpleGrantedAuthority(it) } - val memberToken = tokenRepository.findByIdOrNull(id = claims.subject.toLong()) + val memberToken = saveAndGetTokenById(id = claims.subject.toLong()) ?: throw SodaException("로그인 정보를 확인해주세요.") if (!memberToken.tokenSet.contains(token)) throw SodaException("로그인 정보를 확인해주세요.") @@ -96,6 +98,21 @@ class TokenProvider( return UsernamePasswordAuthenticationToken(principal, token, authorities) } + private fun saveAndGetTokenById(id: Long): MemberToken? { + var memberToken = tokenRepositoryV2.findByIdOrNull(id = id) + + if (memberToken == null) { + memberToken = tokenRepository.findByIdOrNull(id = id) + + if (memberToken != null) { + tokenRepositoryV2.save(memberToken) + tokenRepository.delete(memberToken) + } + } + + return memberToken + } + fun validateToken(token: String): Boolean { try { Jwts.parserBuilder() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index 82896e4..678b499 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -35,9 +35,11 @@ import kr.co.vividnext.sodalive.member.stipulation.StipulationIds import kr.co.vividnext.sodalive.member.stipulation.StipulationRepository import kr.co.vividnext.sodalive.member.tag.MemberCreatorTag import kr.co.vividnext.sodalive.member.tag.MemberTagRepository +import kr.co.vividnext.sodalive.member.token.MemberToken import kr.co.vividnext.sodalive.member.token.MemberTokenRepository import kr.co.vividnext.sodalive.utils.generateFileName import kr.co.vividnext.sodalive.utils.generatePassword +import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.security.authentication.UsernamePasswordAuthenticationToken @@ -62,6 +64,7 @@ import kotlin.concurrent.write class MemberService( private val repository: MemberRepository, private val tokenRepository: MemberTokenRepository, + private val tokenRepositoryV2: MemberTokenRepositoryV2, private val stipulationRepository: StipulationRepository, private val stipulationAgreeRepository: StipulationAgreeRepository, private val creatorFollowingRepository: CreatorFollowingRepository, @@ -435,11 +438,12 @@ class MemberService( val lock = getOrCreateLock(memberId = memberId) lock.write { - val memberToken = tokenRepository.findByIdOrNull(memberId) - ?: throw SodaException("로그인 정보를 확인해주세요.") + val memberToken = saveAndGetTokenById(memberId) - memberToken.tokenSet.remove(token) - tokenRepository.save(memberToken) + if (memberToken != null) { + memberToken.tokenSet.remove(token) + tokenRepositoryV2.save(memberToken) + } } } @@ -451,7 +455,25 @@ class MemberService( member.pushToken = null val lock = getOrCreateLock(memberId = memberId) - lock.write { tokenRepository.deleteById(memberId) } + lock.write { + tokenRepository.deleteById(memberId) + tokenRepositoryV2.deleteById(memberId) + } + } + + private fun saveAndGetTokenById(id: Long): MemberToken? { + var memberToken = tokenRepositoryV2.findByIdOrNull(id = id) + + if (memberToken == null) { + memberToken = tokenRepository.findByIdOrNull(id = id) + + if (memberToken != null) { + tokenRepositoryV2.save(memberToken) + tokenRepository.delete(memberToken) + } + } + + return memberToken } @Transactional diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/MemberTokenRepositoryV2.kt similarity index 75% rename from src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/v2/MemberTokenRepositoryV2.kt index 14fe79d..61ae20c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/MemberTokenRepositoryV2.kt @@ -5,4 +5,4 @@ import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository @Repository -interface NewMemberTokenRepository : CrudRepository +interface MemberTokenRepositoryV2 : CrudRepository From 2d0492cafa48bfdf75c0232e52bde7fa55b40a56 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 23 Nov 2024 00:05:27 +0900 Subject: [PATCH 03/13] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=20-=20Redis=20->=20Valkey=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EC=A0=84=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/live/AdminLiveService.kt | 4 +- .../sodalive/live/room/LiveRoomService.kt | 66 ++++++---- .../sodalive/live/room/info/LiveRoomInfo.kt | 11 ++ .../room/kickout/LiveRoomKickOutService.kt | 23 +++- .../live/roulette/v2/RouletteService.kt | 23 +++- .../v2/LiveRoomInfoRedisRepositoryV2.kt | 5 + .../vividnext/sodalive/v2/LiveRoomInfoV2.kt | 123 ++++++++++++++++++ 7 files changed, 225 insertions(+), 30 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoRedisRepositoryV2.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoV2.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt index f1fc065..6e672bb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt @@ -20,9 +20,9 @@ import kr.co.vividnext.sodalive.live.recommend.RecommendLiveCreatorBannerReposit import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository import kr.co.vividnext.sodalive.live.room.cancel.LiveRoomCancel import kr.co.vividnext.sodalive.live.room.cancel.LiveRoomCancelRepository -import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.utils.generateFileName +import kr.co.vividnext.sodalive.v2.LiveRoomInfoRedisRepositoryV2 import org.springframework.beans.factory.annotation.Value import org.springframework.context.ApplicationEventPublisher import org.springframework.data.domain.Pageable @@ -37,7 +37,7 @@ import java.time.format.DateTimeFormatter @Service class AdminLiveService( private val recommendCreatorBannerRepository: RecommendLiveCreatorBannerRepository, - private val roomInfoRepository: LiveRoomInfoRedisRepository, + private val roomInfoRepository: LiveRoomInfoRedisRepositoryV2, private val roomCancelRepository: LiveRoomCancelRepository, private val repository: AdminLiveRoomQueryRepository, private val memberRepository: MemberRepository, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index 37ecf7b..51090ac 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -35,7 +35,6 @@ import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessage import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse import kr.co.vividnext.sodalive.live.room.info.GetRoomInfoResponse -import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfo import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember import kr.co.vividnext.sodalive.live.room.kickout.LiveRoomKickOutService @@ -55,6 +54,8 @@ import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import kr.co.vividnext.sodalive.utils.generateFileName +import kr.co.vividnext.sodalive.v2.LiveRoomInfoRedisRepositoryV2 +import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.beans.factory.annotation.Value import org.springframework.context.ApplicationEventPublisher import org.springframework.data.domain.Pageable @@ -79,6 +80,7 @@ class LiveRoomService( private val repository: LiveRoomRepository, private val rouletteRepository: NewRouletteRepository, private val roomInfoRepository: LiveRoomInfoRedisRepository, + private val roomInfoRepositoryV2: LiveRoomInfoRedisRepositoryV2, private val roomCancelRepository: LiveRoomCancelRepository, private val kickOutService: LiveRoomKickOutService, private val blockMemberRepository: BlockMemberRepository, @@ -113,6 +115,22 @@ class LiveRoomService( ) { private val tokenLocks: MutableMap = mutableMapOf() + private fun getLiveRoomInfo(roomId: Long): LiveRoomInfoV2? { + var roomInfoV2 = roomInfoRepositoryV2.findByIdOrNull(roomId) + + if (roomInfoV2 == null) { + val roomInfoV1 = roomInfoRepository.findByIdOrNull(roomId) + + if (roomInfoV1 != null) { + roomInfoV2 = roomInfoV1.convertRoomInfoV2() + roomInfoRepositoryV2.save(roomInfoV2) + roomInfoRepository.delete(roomInfoV1) + } + } + + return roomInfoV2 + } + fun getRoomList( dateString: String?, status: LiveRoomStatus, @@ -150,7 +168,7 @@ class LiveRoomService( return roomList .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.member!!.id!!) } .map { - val roomInfo = roomInfoRepository.findByIdOrNull(it.id!!) + val roomInfo = getLiveRoomInfo(it.id!!) val reservations = it.reservations .filter { reservation -> reservation.member!!.id!! == member.id!! && reservation.isActive } @@ -442,7 +460,7 @@ class LiveRoomService( response.manager = GetRoomDetailManager(room.member!!, cloudFrontHost = cloudFrontHost) if (!room.channelName.isNullOrBlank()) { - val roomInfo = roomInfoRepository.findByIdOrNull(roomId) + val roomInfo = getLiveRoomInfo(roomId) if (roomInfo != null) { response.isPaid = canRepository.isExistPaidLiveRoom( @@ -651,9 +669,9 @@ class LiveRoomService( val lock = getOrCreateLock(memberId = member.id!!) lock.write { - var roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) + var roomInfo = getLiveRoomInfo(request.roomId) if (roomInfo == null) { - roomInfo = roomInfoRepository.save(LiveRoomInfo(roomId = request.roomId)) + roomInfo = roomInfoRepositoryV2.save(LiveRoomInfoV2(roomId = request.roomId)) } if (roomInfo.speakerCount + roomInfo.listenerCount + roomInfo.managerCount >= room.numberOfPeople) { @@ -692,7 +710,7 @@ class LiveRoomService( roomInfo.addListener(member, cloudFrontHost) } - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) roomVisitService.roomVisit(room, member) } } @@ -789,7 +807,7 @@ class LiveRoomService( } fun getRoomInfo(roomId: Long, member: Member): GetRoomInfoResponse { - val roomInfo = roomInfoRepository.findByIdOrNull(roomId) + val roomInfo = getLiveRoomInfo(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val room = repository.findByIdOrNull(roomId) @@ -889,7 +907,7 @@ class LiveRoomService( val liveRoomCreatorId = repository.getLiveRoomCreatorId(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") - val roomInfo = roomInfoRepository.findByIdOrNull(roomId) + val roomInfo = getLiveRoomInfo(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") return if (liveRoomCreatorId != member.id!!) { @@ -910,18 +928,18 @@ class LiveRoomService( throw SodaException("잘못된 요청입니다.") } - val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) + val roomInfo = getLiveRoomInfo(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.removeDonationMessage(request.messageUUID) - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) } } fun getUserProfile(roomId: Long, userId: Long, member: Member): GetLiveRoomUserProfileResponse { val room = repository.getLiveRoom(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") - val roomInfo = roomInfoRepository.findByIdOrNull(roomId) + val roomInfo = getLiveRoomInfo(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val user = memberRepository.findByIdOrNull(userId) @@ -990,7 +1008,7 @@ class LiveRoomService( fun setSpeaker(request: SetManagerOrSpeakerOrAudienceRequest) { val lock = getOrCreateLock(memberId = request.memberId) lock.write { - val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) + val roomInfo = getLiveRoomInfo(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val member = memberRepository.findByIdOrNull(request.memberId) @@ -1004,14 +1022,14 @@ class LiveRoomService( roomInfo.removeManager(member) roomInfo.addSpeaker(member, cloudFrontHost) - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) } } fun setListener(request: SetManagerOrSpeakerOrAudienceRequest) { val lock = getOrCreateLock(memberId = request.memberId) lock.write { - val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) + val roomInfo = getLiveRoomInfo(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val member = memberRepository.findByIdOrNull(request.memberId) @@ -1021,7 +1039,7 @@ class LiveRoomService( roomInfo.removeManager(member) roomInfo.addListener(member, cloudFrontHost) - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) } } @@ -1034,7 +1052,7 @@ class LiveRoomService( } val user = memberRepository.findByIdOrNull(request.memberId) ?: throw SodaException("해당하는 유저가 없습니다.") - val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) + val roomInfo = getLiveRoomInfo(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val roomAccountResponse = LiveRoomMember(member = user, cloudFrontHost) @@ -1053,7 +1071,7 @@ class LiveRoomService( roomInfo.removeSpeaker(user) roomInfo.addManager(user, cloudFrontHost) - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) } } @@ -1080,7 +1098,7 @@ class LiveRoomService( if (request.message.isNotBlank()) { val lock = getOrCreateLock(memberId = member.id!!) lock.write { - val roomInfo = roomInfoRepository.findByIdOrNull(room.id!!) + val roomInfo = getLiveRoomInfo(room.id!!) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.addDonationMessage( @@ -1091,7 +1109,7 @@ class LiveRoomService( donationMessage = request.message ) - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) } } @@ -1126,7 +1144,7 @@ class LiveRoomService( if (request.message.isNotBlank()) { val lock = getOrCreateLock(memberId = member.id!!) lock.write { - val roomInfo = roomInfoRepository.findByIdOrNull(room.id!!) + val roomInfo = getLiveRoomInfo(room.id!!) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.addDonationMessage( @@ -1137,7 +1155,7 @@ class LiveRoomService( donationMessage = request.message ) - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) } } @@ -1216,12 +1234,12 @@ class LiveRoomService( val room = repository.getLiveRoom(roomId) val lock = getOrCreateLock(memberId = member.id!!) lock.write { - val roomInfo = roomInfoRepository.findByIdOrNull(roomId) + val roomInfo = getLiveRoomInfo(roomId) if (roomInfo != null) { if (room?.member != null && room.member!! == member) { room.isActive = false kickOutService.deleteKickOutData(roomId = room.id!!) - roomInfoRepository.deleteById(roomInfo.roomId) + roomInfoRepositoryV2.deleteById(roomInfo.roomId) val rouletteList = rouletteRepository.findByCreatorId(creatorId = member.id!!) if (rouletteList.isNotEmpty()) { @@ -1236,7 +1254,7 @@ class LiveRoomService( roomInfo.removeSpeaker(member) roomInfo.removeListener(member) roomInfo.removeManager(member) - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) } } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt index 6c366d8..d648b90 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.live.room.info import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessage import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.data.annotation.Id import org.springframework.data.redis.core.RedisHash @@ -118,4 +119,14 @@ data class LiveRoomInfo( fun removeDonationMessage(uuid: String) { (donationMessageList as MutableList).removeIf { it.uuid == uuid } } + + fun convertRoomInfoV2(): LiveRoomInfoV2 { + return LiveRoomInfoV2( + roomId = roomId, + speakerList = speakerList, + listenerList = listenerList, + managerList = managerList, + donationMessageList = donationMessageList + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt index b193a82..a702818 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt @@ -6,6 +6,8 @@ import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository +import kr.co.vividnext.sodalive.v2.LiveRoomInfoRedisRepositoryV2 +import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @@ -13,6 +15,7 @@ import org.springframework.stereotype.Service @Service class LiveRoomKickOutService( private val roomInfoRepository: LiveRoomInfoRedisRepository, + private val roomInfoRepositoryV2: LiveRoomInfoRedisRepositoryV2, private val repository: LiveRoomKickOutRedisRepository, private val memberRepository: MemberRepository, private val roomRepository: LiveRoomRepository, @@ -20,11 +23,27 @@ class LiveRoomKickOutService( @Value("\${cloud.aws.cloud-front.host}") private val cloudFrontHost: String ) { + private fun getLiveRoomInfo(roomId: Long): LiveRoomInfoV2? { + var roomInfoV2 = roomInfoRepositoryV2.findByIdOrNull(roomId) + + if (roomInfoV2 == null) { + val roomInfoV1 = roomInfoRepository.findByIdOrNull(roomId) + + if (roomInfoV1 != null) { + roomInfoV2 = roomInfoV1.convertRoomInfoV2() + roomInfoRepositoryV2.save(roomInfoV2) + roomInfoRepository.delete(roomInfoV1) + } + } + + return roomInfoV2 + } + fun kickOut(request: LiveRoomKickOutRequest, member: Member) { val room = roomRepository.findByIdOrNull(request.roomId) ?: throw SodaException("해당하는 라이브가 없습니다.") - val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) + val roomInfo = getLiveRoomInfo(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") if (room.member == null || room.member!!.id == null) { @@ -48,7 +67,7 @@ class LiveRoomKickOutService( roomInfo.removeSpeaker(kickOutUser) roomInfo.removeListener(kickOutUser) roomInfo.removeManager(kickOutUser) - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt index bcd5802..fabcc4b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt @@ -20,6 +20,8 @@ import kr.co.vividnext.sodalive.live.roulette.RouletteItem import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole +import kr.co.vividnext.sodalive.v2.LiveRoomInfoRedisRepositoryV2 +import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -38,10 +40,27 @@ class RouletteService( private val memberRepository: MemberRepository, private val chargeRepository: ChargeRepository, private val roomInfoRepository: LiveRoomInfoRedisRepository, + private val roomInfoRepositoryV2: LiveRoomInfoRedisRepositoryV2, private val useCanCalculateRepository: UseCanCalculateRepository ) { private val tokenLocks: MutableMap = mutableMapOf() + private fun getLiveRoomInfo(roomId: Long): LiveRoomInfoV2? { + var roomInfoV2 = roomInfoRepositoryV2.findByIdOrNull(roomId) + + if (roomInfoV2 == null) { + val roomInfoV1 = roomInfoRepository.findByIdOrNull(roomId) + + if (roomInfoV1 != null) { + roomInfoV2 = roomInfoV1.convertRoomInfoV2() + roomInfoRepositoryV2.save(roomInfoV2) + roomInfoRepository.delete(roomInfoV1) + } + } + + return roomInfoV2 + } + fun getAllRoulette(creatorId: Long, memberId: Long): List { if (creatorId != memberId) throw SodaException("잘못된 요청입니다.") @@ -158,7 +177,7 @@ class RouletteService( val lock = getOrCreateLock(memberId = member.id!!) lock.write { - val roomInfo = roomInfoRepository.findByIdOrNull(room.id!!) + val roomInfo = getLiveRoomInfo(room.id!!) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.addRouletteMessage( @@ -167,7 +186,7 @@ class RouletteService( donationMessage = "[$result] 당첨!" ) - roomInfoRepository.save(roomInfo) + roomInfoRepositoryV2.save(roomInfo) } return SpinRouletteResponse(can = roulette.can, result = result, items = itemList) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoRedisRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoRedisRepositoryV2.kt new file mode 100644 index 0000000..c98c39a --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoRedisRepositoryV2.kt @@ -0,0 +1,5 @@ +package kr.co.vividnext.sodalive.v2 + +import org.springframework.data.repository.CrudRepository + +interface LiveRoomInfoRedisRepositoryV2 : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoV2.kt new file mode 100644 index 0000000..b46dfa6 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoV2.kt @@ -0,0 +1,123 @@ +package kr.co.vividnext.sodalive.v2 + +import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessage +import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember +import kr.co.vividnext.sodalive.live.room.info.LiveRoomMemberRole +import kr.co.vividnext.sodalive.member.Member +import org.springframework.data.annotation.Id +import org.springframework.data.redis.core.RedisHash + +@RedisHash("LiveRoomInfo") +data class LiveRoomInfoV2( + @Id + val roomId: Long, + var speakerList: List = mutableListOf(), + var listenerList: List = mutableListOf(), + var managerList: List = mutableListOf(), + var donationMessageList: List = mutableListOf() +) { + var speakerCount = 0 + private set + + var listenerCount = 0 + private set + + var managerCount = 0 + private set + + fun addSpeaker(member: Member, cloudFrontHost: String) { + val liveRoomMember = LiveRoomMember(member, cloudFrontHost) + liveRoomMember.role = LiveRoomMemberRole.SPEAKER + + val speakerSet = speakerList.toMutableSet() + speakerSet.add(liveRoomMember) + speakerList = speakerSet.toList() + + setSpeakerCount() + } + + fun removeSpeaker(member: Member) { + (speakerList as MutableList).removeIf { it.id == member.id!! } + setSpeakerCount() + } + + private fun setSpeakerCount() { + speakerCount = speakerList.size + } + + fun addListener(member: Member, cloudFrontHost: String) { + val liveRoomMember = LiveRoomMember(member, cloudFrontHost) + liveRoomMember.role = LiveRoomMemberRole.LISTENER + + val listenerSet = listenerList.toMutableSet() + listenerSet.add(liveRoomMember) + listenerList = listenerSet.toList() + + setListenerCount() + } + + fun removeListener(member: Member) { + (listenerList as MutableList).removeIf { it.id == member.id!! } + setListenerCount() + } + + private fun setListenerCount() { + listenerCount = listenerList.size + } + + fun addManager(member: Member, cloudFrontHost: String) { + val liveRoomMember = LiveRoomMember(member, cloudFrontHost) + liveRoomMember.role = LiveRoomMemberRole.MANAGER + + val managerSet = managerList.toMutableSet() + managerSet.add(liveRoomMember) + managerList = managerSet.toList() + + setManagerCount() + } + + fun removeManager(member: Member) { + (managerList as MutableList).removeIf { it.id == member.id!! } + setManagerCount() + } + + private fun setManagerCount() { + managerCount = managerList.size + } + + fun addDonationMessage(memberId: Long, nickname: String, isSecret: Boolean, can: Int, donationMessage: String) { + val donationMessageSet = donationMessageList.toMutableSet() + donationMessageSet.add( + LiveRoomDonationMessage( + memberId = memberId, + nickname = nickname, + isSecret = isSecret, + canMessage = if (isSecret) { + "${can}캔으로 비밀미션을 보냈습니다." + } else { + "${can}캔을 후원하셨습니다." + }, + donationMessage = donationMessage + ) + ) + donationMessageList = donationMessageSet.toList() + } + + fun addRouletteMessage(memberId: Long, nickname: String, donationMessage: String) { + val donationMessageSet = donationMessageList.toMutableSet() + donationMessageSet.add( + LiveRoomDonationMessage( + memberId = memberId, + nickname = nickname, + isSecret = false, + canMessage = "", + donationMessage = donationMessage + ) + ) + donationMessageList = donationMessageSet.toList() + } + + fun removeDonationMessage(uuid: String) { + (donationMessageList as MutableList).removeIf { it.uuid == uuid } + } +} From 695ccf975bdc808f9fe47a292a5d390828543943 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 23 Nov 2024 00:25:45 +0900 Subject: [PATCH 04/13] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9?= =?UTF-8?q?=20=EA=B0=95=ED=87=B4=20=EC=A0=95=EB=B3=B4=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=EB=B0=8F=20=EC=A0=80=EC=9E=A5=20-=20Redis=20->=20Valkey?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EC=A0=84=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../live/room/kickout/LiveRoomKickOut.kt | 8 ++++++ .../room/kickout/LiveRoomKickOutService.kt | 25 ++++++++++++++++--- .../v2/LiveRoomKickOutRedisRepositoryV2.kt | 5 ++++ .../sodalive/v2/LiveRoomKickOutV2.kt | 24 ++++++++++++++++++ 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutRedisRepositoryV2.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutV2.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOut.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOut.kt index aa4bc54..0c2b82e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOut.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOut.kt @@ -1,5 +1,6 @@ package kr.co.vividnext.sodalive.live.room.kickout +import kr.co.vividnext.sodalive.v2.LiveRoomKickOutV2 import org.springframework.data.annotation.Id import org.springframework.data.redis.core.RedisHash @@ -20,6 +21,13 @@ data class LiveRoomKickOut( userList.removeIf { it.userId == userId } userList.add(liveRoomKickOutUser) } + + fun convertV2(): LiveRoomKickOutV2 { + return LiveRoomKickOutV2( + roomId = roomId, + userList = userList + ) + } } data class LiveRoomKickOutUser( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt index a702818..2a656b3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt @@ -8,6 +8,8 @@ import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.v2.LiveRoomInfoRedisRepositoryV2 import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 +import kr.co.vividnext.sodalive.v2.LiveRoomKickOutRedisRepositoryV2 +import kr.co.vividnext.sodalive.v2.LiveRoomKickOutV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @@ -17,6 +19,7 @@ class LiveRoomKickOutService( private val roomInfoRepository: LiveRoomInfoRedisRepository, private val roomInfoRepositoryV2: LiveRoomInfoRedisRepositoryV2, private val repository: LiveRoomKickOutRedisRepository, + private val repositoryV2: LiveRoomKickOutRedisRepositoryV2, private val memberRepository: MemberRepository, private val roomRepository: LiveRoomRepository, @@ -39,6 +42,22 @@ class LiveRoomKickOutService( return roomInfoV2 } + private fun getLiveRoomKickOut(roomId: Long): LiveRoomKickOutV2? { + var liveRoomKickOutV2 = repositoryV2.findByIdOrNull(roomId) + + if (liveRoomKickOutV2 == null) { + val liveRoomKickOutV1 = repository.findByIdOrNull(roomId) + + if (liveRoomKickOutV1 != null) { + liveRoomKickOutV2 = liveRoomKickOutV1.convertV2() + repositoryV2.save(liveRoomKickOutV2) + repository.delete(liveRoomKickOutV1) + } + } + + return liveRoomKickOutV2 + } + fun kickOut(request: LiveRoomKickOutRequest, member: Member) { val room = roomRepository.findByIdOrNull(request.roomId) ?: throw SodaException("해당하는 라이브가 없습니다.") @@ -54,13 +73,13 @@ class LiveRoomKickOutService( throw SodaException("권한이 없습니다.") } - var liveRoomKickOut = repository.findByIdOrNull(request.roomId) + var liveRoomKickOut = getLiveRoomKickOut(request.roomId) if (liveRoomKickOut == null) { - liveRoomKickOut = repository.save(LiveRoomKickOut(roomId = request.roomId)) + liveRoomKickOut = repositoryV2.save(LiveRoomKickOutV2(roomId = request.roomId)) } liveRoomKickOut.kickOut(request.userId) - repository.save(liveRoomKickOut) + repositoryV2.save(liveRoomKickOut) val kickOutUser = memberRepository.findByIdOrNull(request.userId) if (kickOutUser != null) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutRedisRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutRedisRepositoryV2.kt new file mode 100644 index 0000000..2ace0ad --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutRedisRepositoryV2.kt @@ -0,0 +1,5 @@ +package kr.co.vividnext.sodalive.v2 + +import org.springframework.data.repository.CrudRepository + +interface LiveRoomKickOutRedisRepositoryV2 : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutV2.kt new file mode 100644 index 0000000..fb48c29 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutV2.kt @@ -0,0 +1,24 @@ +package kr.co.vividnext.sodalive.v2 + +import kr.co.vividnext.sodalive.live.room.kickout.LiveRoomKickOutUser +import org.springframework.data.annotation.Id +import org.springframework.data.redis.core.RedisHash + +@RedisHash("LiveRoomKickOut") +data class LiveRoomKickOutV2( + @Id + val roomId: Long, + var userList: MutableList = mutableListOf() +) { + fun kickOut(userId: Long) { + var liveRoomKickOutUser = userList.find { it.userId == userId } + if (liveRoomKickOutUser == null) { + liveRoomKickOutUser = LiveRoomKickOutUser(userId) + } else { + liveRoomKickOutUser.plusCount() + } + + userList.removeIf { it.userId == userId } + userList.add(liveRoomKickOutUser) + } +} From 2f2437e14dfae997098801428038e1900263892d Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 23 Nov 2024 01:29:34 +0900 Subject: [PATCH 05/13] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9?= =?UTF-8?q?=20=EB=A9=94=EB=89=B4=20=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=20-=20Redis=20->=20Valkey=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EC=A0=84=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../live/room/menu/LiveRoomMenuService.kt | 53 +++++++++++++++---- .../live/roulette/RedisIdGenerator.kt | 2 +- .../sodalive/v2/LiveRoomMenuRepositoryV2.kt | 8 +++ 3 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomMenuRepositoryV2.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt index e9fc6ab..9b5d835 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt @@ -2,17 +2,48 @@ package kr.co.vividnext.sodalive.live.room.menu import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.live.roulette.RedisIdGenerator +import kr.co.vividnext.sodalive.v2.LiveRoomMenuRepositoryV2 import org.springframework.stereotype.Service @Service class LiveRoomMenuService( private val idGenerator: RedisIdGenerator, - private val repository: LiveRoomMenuRepository + private val repository: LiveRoomMenuRepository, + private val repositoryV2: LiveRoomMenuRepositoryV2 ) { + private fun findByCreatorId(creatorId: Long): List { + var liveRoomMenuList = repositoryV2.findByCreatorId(creatorId) + + if (liveRoomMenuList.isEmpty()) { + liveRoomMenuList = repository.findByCreatorId(creatorId) + + if (liveRoomMenuList.isNotEmpty()) { + val newLiveRoomMenuList = liveRoomMenuList.map { liveRoomMenu -> + val newLiveRoomMenu = LiveRoomMenu( + id = idGenerator.generateId(SEQUENCE_NAME), + creatorId = liveRoomMenu.creatorId, + isActive = liveRoomMenu.isActive, + menu = liveRoomMenu.menu + ) + repositoryV2.save(newLiveRoomMenu) + repository.delete(liveRoomMenu) + + newLiveRoomMenu + } + + return newLiveRoomMenuList + } else { + return emptyList() + } + } else { + return liveRoomMenuList + } + } + fun getAllLiveMenu(creatorId: Long, memberId: Long): List { if (creatorId != memberId) throw SodaException("잘못된 요청입니다.") - return repository.findByCreatorId(creatorId) + return findByCreatorId(creatorId) .sortedBy { it.id } .asSequence() .map { GetMenuPresetResponse(id = it.id, menu = it.menu, isActive = it.isActive) } @@ -22,7 +53,7 @@ class LiveRoomMenuService( fun createLiveMenu(memberId: Long, request: CreateLiveMenuRequest): Boolean { liveMenuValidate(menu = request.menu) - val menuList = repository.findByCreatorId(creatorId = memberId) + val menuList = findByCreatorId(creatorId = memberId) if (menuList.size >= 3) { throw SodaException("메뉴판의 최대개수는 3개입니다.") @@ -31,7 +62,7 @@ class LiveRoomMenuService( if (request.isActive) { menuList.forEach { it.isActive = false - repository.save(it) + repositoryV2.save(it) } } @@ -42,14 +73,14 @@ class LiveRoomMenuService( menu = request.menu ) - repository.save(menu) + repositoryV2.save(menu) return request.isActive } fun updateLiveMenu(memberId: Long, request: UpdateLiveMenuRequest) { liveMenuValidate(menu = request.menu) - val menuList = repository.findByCreatorId(creatorId = memberId) + val menuList = findByCreatorId(creatorId = memberId) if (menuList.isEmpty()) { throw SodaException("잘못된 요청입니다.") } @@ -58,16 +89,16 @@ class LiveRoomMenuService( if (it.id == request.id) { it.menu = request.menu it.isActive = request.isActive - repository.save(it) + repositoryV2.save(it) } else if (request.isActive) { it.isActive = false - repository.save(it) + repositoryV2.save(it) } } } fun getLiveMenu(creatorId: Long): GetMenuPresetResponse? { - val menuList = repository.findByCreatorId(creatorId = creatorId) + val menuList = findByCreatorId(creatorId = creatorId) var activeMenu: LiveRoomMenu? = null for (menu in menuList) { @@ -85,11 +116,11 @@ class LiveRoomMenuService( } fun deactivateAll(memberId: Long) { - val menuList = repository.findByCreatorId(creatorId = memberId) + val menuList = findByCreatorId(creatorId = memberId) menuList.forEach { it.isActive = false - repository.save(it) + repositoryV2.save(it) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt index 12a7870..a8504da 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt @@ -6,7 +6,7 @@ import org.springframework.stereotype.Service @Service class RedisIdGenerator( - @Qualifier("redisStringRedisTemplate") private val stringRedisTemplate: StringRedisTemplate + @Qualifier("valkeyStringRedisTemplate") private val stringRedisTemplate: StringRedisTemplate ) { fun generateId(key: String): Long { return stringRedisTemplate.opsForValue().increment(key, 1) ?: 1L diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomMenuRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomMenuRepositoryV2.kt new file mode 100644 index 0000000..5d48f0d --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomMenuRepositoryV2.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.v2 + +import kr.co.vividnext.sodalive.live.room.menu.LiveRoomMenu +import org.springframework.data.repository.CrudRepository + +interface LiveRoomMenuRepositoryV2 : CrudRepository { + fun findByCreatorId(creatorId: Long): List +} From 4dc0a13203225d806717e2dbcea4546d9df95ee1 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 23 Nov 2024 01:58:24 +0900 Subject: [PATCH 06/13] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9?= =?UTF-8?q?=20=EB=A3=B0=EB=A0=9B=20=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=20-=20Redis=20->=20Valkey=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EC=A0=84=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomService.kt | 23 +----- .../live/roulette/NewRouletteService.kt | 77 +++++++++++++++---- .../sodalive/v2/RouletteRepositoryV2.kt | 7 ++ .../kr/co/vividnext/sodalive/v2/RouletteV2.kt | 17 ++++ 4 files changed, 92 insertions(+), 32 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteRepositoryV2.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteV2.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index 51090ac..a337160 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -45,7 +45,7 @@ import kr.co.vividnext.sodalive.live.room.menu.CreateLiveMenuRequest import kr.co.vividnext.sodalive.live.room.menu.LiveRoomMenuService import kr.co.vividnext.sodalive.live.room.menu.UpdateLiveMenuRequest import kr.co.vividnext.sodalive.live.room.visit.LiveRoomVisitService -import kr.co.vividnext.sodalive.live.roulette.NewRouletteRepository +import kr.co.vividnext.sodalive.live.roulette.NewRouletteService import kr.co.vividnext.sodalive.live.signature.SignatureCanRepository import kr.co.vividnext.sodalive.live.tag.LiveTagRepository import kr.co.vividnext.sodalive.member.Gender @@ -76,9 +76,9 @@ import kotlin.concurrent.write @Transactional(readOnly = true) class LiveRoomService( private val menuService: LiveRoomMenuService, + private val rouletteService: NewRouletteService, private val repository: LiveRoomRepository, - private val rouletteRepository: NewRouletteRepository, private val roomInfoRepository: LiveRoomInfoRedisRepository, private val roomInfoRepositoryV2: LiveRoomInfoRedisRepositoryV2, private val roomCancelRepository: LiveRoomCancelRepository, @@ -835,15 +835,7 @@ class LiveRoomService( .getNotificationUserIds(room.member!!.id!!) .contains(member.id) - var isActiveRoulette = false - val rouletteList = rouletteRepository.findByCreatorId(creatorId = room.member!!.id!!) - - for (roulette in rouletteList) { - if (roulette.isActive) { - isActiveRoulette = true - break - } - } + val isActiveRoulette = rouletteService.hasActiveRoulette(creatorId = room.member!!.id!!) val donationRankingTop3UserIds = if (room.member!!.isVisibleDonationRank) { explorerQueryRepository @@ -1241,15 +1233,8 @@ class LiveRoomService( kickOutService.deleteKickOutData(roomId = room.id!!) roomInfoRepositoryV2.deleteById(roomInfo.roomId) - val rouletteList = rouletteRepository.findByCreatorId(creatorId = member.id!!) - if (rouletteList.isNotEmpty()) { - rouletteList.forEach { - it.isActive = false - rouletteRepository.save(it) - } - } - menuService.deactivateAll(memberId = member.id!!) + rouletteService.deactivateAll(creatorId = member.id!!) } else { roomInfo.removeSpeaker(member) roomInfo.removeListener(member) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt index 8d9b176..d17472f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt @@ -16,6 +16,8 @@ import kr.co.vividnext.sodalive.live.room.LiveRoomRepository import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole +import kr.co.vividnext.sodalive.v2.RouletteRepositoryV2 +import kr.co.vividnext.sodalive.v2.RouletteV2 import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -27,15 +29,43 @@ class NewRouletteService( private val canRepository: CanRepository, private val repository: NewRouletteRepository, + private val repositoryV2: RouletteRepositoryV2, private val roomRepository: LiveRoomRepository, private val memberRepository: MemberRepository, private val chargeRepository: ChargeRepository, private val useCanCalculateRepository: UseCanCalculateRepository ) { + private fun findByCreatorId(creatorId: Long): List { + var rouletteV2List = repositoryV2.findByCreatorId(creatorId) + + if (rouletteV2List.isEmpty()) { + val rouletteV1List = repository.findByCreatorId(creatorId) + + if (rouletteV1List.isNotEmpty()) { + rouletteV1List.forEach { rouletteV1 -> + val rouletteV2 = RouletteV2( + id = idGenerator.generateId(SEQUENCE_NAME), + creatorId = rouletteV1.creatorId, + can = rouletteV1.can, + isActive = rouletteV1.isActive, + items = rouletteV1.items + ) + + repositoryV2.save(rouletteV2) + repository.delete(rouletteV1) + } + + rouletteV2List = repositoryV2.findByCreatorId(creatorId) + } + } + + return rouletteV2List + } + fun getAllRoulette(creatorId: Long, memberId: Long): List { if (creatorId != memberId) throw SodaException("잘못된 요청입니다.") - val rouletteList = repository.findByCreatorId(creatorId) + val rouletteList = findByCreatorId(creatorId) return rouletteList.sortedBy { it.id } .map { @@ -52,14 +82,14 @@ class NewRouletteService( rouletteValidate(can = request.can, items = request.items) if (request.isActive) { - val rouletteList = repository.findByCreatorId(creatorId = memberId) + val rouletteList = findByCreatorId(creatorId = memberId) rouletteList.forEach { it.isActive = false - repository.save(it) + repositoryV2.save(it) } } - val roulette = NewRoulette( + val roulette = RouletteV2( id = idGenerator.generateId(SEQUENCE_NAME), creatorId = memberId, can = request.can, @@ -67,14 +97,14 @@ class NewRouletteService( items = request.items ) - repository.save(roulette) + repositoryV2.save(roulette) return request.isActive } fun updateRoulette(memberId: Long, request: UpdateNewRouletteRequest): Boolean { rouletteValidate(can = request.can, items = request.items) - val rouletteList = repository.findByCreatorId(creatorId = memberId) + val rouletteList = findByCreatorId(creatorId = memberId) if (rouletteList.isEmpty()) { throw SodaException("잘못된 요청입니다.") @@ -90,10 +120,10 @@ class NewRouletteService( it.can = request.can it.items = request.items it.isActive = request.isActive - repository.save(it) + repositoryV2.save(it) } else if (request.isActive) { it.isActive = false - repository.save(it) + repositoryV2.save(it) } } @@ -101,13 +131,13 @@ class NewRouletteService( } fun getRoulette(creatorId: Long, memberId: Long): GetRouletteResponse { - val rouletteList = repository.findByCreatorId(creatorId = creatorId) + val rouletteList = findByCreatorId(creatorId = creatorId) if (rouletteList.isEmpty()) { throw SodaException("룰렛을 사용할 수 없습니다.") } - var activeRoulette: NewRoulette? = null + var activeRoulette: RouletteV2? = null for (roulette in rouletteList) { if (roulette.isActive) { activeRoulette = roulette @@ -139,13 +169,13 @@ class NewRouletteService( } // STEP 2 - 룰렛 데이터 가져오기 - val rouletteList = repository.findByCreatorId(creatorId = host.id!!) + val rouletteList = findByCreatorId(creatorId = host.id!!) if (rouletteList.isEmpty()) { throw SodaException("룰렛을 사용할 수 없습니다.") } - var activeRoulette: NewRoulette? = null + var activeRoulette: RouletteV2? = null for (roulette in rouletteList) { if (roulette.isActive) { activeRoulette = roulette @@ -220,7 +250,28 @@ class NewRouletteService( } } + fun hasActiveRoulette(creatorId: Long): Boolean { + val rouletteList = findByCreatorId(creatorId) + + for (roulette in rouletteList) { + if (roulette.isActive) { + return true + } + } + + return false + } + + fun deactivateAll(creatorId: Long) { + val rouletteList = findByCreatorId(creatorId) + + rouletteList.forEach { + it.isActive = false + repositoryV2.save(it) + } + } + companion object { - const val SEQUENCE_NAME = "newRoulette:sequence" + const val SEQUENCE_NAME = "Roulette:sequence" } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteRepositoryV2.kt new file mode 100644 index 0000000..747f28e --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteRepositoryV2.kt @@ -0,0 +1,7 @@ +package kr.co.vividnext.sodalive.v2 + +import org.springframework.data.repository.CrudRepository + +interface RouletteRepositoryV2 : CrudRepository { + fun findByCreatorId(creatorId: Long): List +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteV2.kt new file mode 100644 index 0000000..59ecd35 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteV2.kt @@ -0,0 +1,17 @@ +package kr.co.vividnext.sodalive.v2 + +import kr.co.vividnext.sodalive.live.roulette.RouletteItem +import org.springframework.data.redis.core.RedisHash +import org.springframework.data.redis.core.index.Indexed +import javax.persistence.Id + +@RedisHash("Roulette") +data class RouletteV2( + @Id + val id: Long, + @Indexed + val creatorId: Long, + var can: Int, + var isActive: Boolean, + var items: List = mutableListOf() +) From e7232db2f36a1fac1116d6e40d783a391571a389 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 23 Nov 2024 21:15:14 +0900 Subject: [PATCH 07/13] =?UTF-8?q?Redis=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EB=B3=84=EB=8F=84=EB=A1=9C=20=EB=B6=84=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EB=8B=A4=EC=A4=91=20=EA=B5=AC=EC=84=B1=EC=9D=B4=20?= =?UTF-8?q?=EC=9A=A9=EC=9D=B4=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/vividnext/sodalive/admin/live/AdminLiveService.kt | 2 +- .../kr/co/vividnext/sodalive/configs/RedisConfig.kt | 6 +----- .../kr/co/vividnext/sodalive/configs/ValkeyConfig.kt | 8 +------- .../creator/admin/member/CreatorAdminMemberService.kt | 4 ++-- .../kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt | 4 ++-- .../kr/co/vividnext/sodalive/live/room/LiveRoomService.kt | 4 ++-- .../sodalive/live/room/kickout/LiveRoomKickOutService.kt | 7 ++++--- .../sodalive/live/room/menu/LiveRoomMenuService.kt | 3 ++- .../sodalive/live/roulette/NewRouletteService.kt | 3 ++- .../sodalive/live/roulette/v2/RouletteService.kt | 5 +++-- .../kr/co/vividnext/sodalive/member/MemberService.kt | 4 ++-- .../room/info => redis/v1}/LiveRoomInfoRedisRepository.kt | 3 ++- .../v1}/LiveRoomKickOutRedisRepository.kt | 3 ++- .../room/menu => redis/v1}/LiveRoomMenuRepository.kt | 3 ++- .../{member/token => redis/v1}/MemberTokenRepository.kt | 3 ++- .../{live/roulette => redis/v1}/NewRouletteRepository.kt | 3 ++- .../{live/roulette/v2 => redis/v1}/RouletteRepository.kt | 2 +- .../{ => redis}/v2/LiveRoomInfoRedisRepositoryV2.kt | 3 ++- .../{ => redis}/v2/LiveRoomKickOutRedisRepositoryV2.kt | 3 ++- .../sodalive/{ => redis}/v2/LiveRoomMenuRepositoryV2.kt | 2 +- .../sodalive/{ => redis}/v2/MemberTokenRepositoryV2.kt | 2 +- .../sodalive/{ => redis}/v2/RouletteRepositoryV2.kt | 3 ++- 22 files changed, 41 insertions(+), 39 deletions(-) rename src/main/kotlin/kr/co/vividnext/sodalive/{live/room/info => redis/v1}/LiveRoomInfoRedisRepository.kt (56%) rename src/main/kotlin/kr/co/vividnext/sodalive/{live/room/kickout => redis/v1}/LiveRoomKickOutRedisRepository.kt (56%) rename src/main/kotlin/kr/co/vividnext/sodalive/{live/room/menu => redis/v1}/LiveRoomMenuRepository.kt (65%) rename src/main/kotlin/kr/co/vividnext/sodalive/{member/token => redis/v1}/MemberTokenRepository.kt (65%) rename src/main/kotlin/kr/co/vividnext/sodalive/{live/roulette => redis/v1}/NewRouletteRepository.kt (65%) rename src/main/kotlin/kr/co/vividnext/sodalive/{live/roulette/v2 => redis/v1}/RouletteRepository.kt (86%) rename src/main/kotlin/kr/co/vividnext/sodalive/{ => redis}/v2/LiveRoomInfoRedisRepositoryV2.kt (60%) rename src/main/kotlin/kr/co/vividnext/sodalive/{ => redis}/v2/LiveRoomKickOutRedisRepositoryV2.kt (60%) rename src/main/kotlin/kr/co/vividnext/sodalive/{ => redis}/v2/LiveRoomMenuRepositoryV2.kt (85%) rename src/main/kotlin/kr/co/vividnext/sodalive/{ => redis}/v2/MemberTokenRepositoryV2.kt (85%) rename src/main/kotlin/kr/co/vividnext/sodalive/{ => redis}/v2/RouletteRepositoryV2.kt (68%) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt index 6e672bb..8d5d8ed 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt @@ -21,8 +21,8 @@ import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository import kr.co.vividnext.sodalive.live.room.cancel.LiveRoomCancel import kr.co.vividnext.sodalive.live.room.cancel.LiveRoomCancelRepository import kr.co.vividnext.sodalive.member.MemberRepository +import kr.co.vividnext.sodalive.redis.v2.LiveRoomInfoRedisRepositoryV2 import kr.co.vividnext.sodalive.utils.generateFileName -import kr.co.vividnext.sodalive.v2.LiveRoomInfoRedisRepositoryV2 import org.springframework.beans.factory.annotation.Value import org.springframework.context.ApplicationEventPublisher import org.springframework.data.domain.Pageable diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index 6cda146..016b09b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -15,13 +15,9 @@ import org.springframework.data.redis.repository.configuration.EnableRedisReposi @Configuration @EnableRedisRepositories( - basePackages = ["kr.co.vividnext.sodalive"], + basePackages = ["kr.co.vividnext.sodalive.redis.v1"], redisTemplateRef = "redisTemplate", excludeFilters = [ - ComponentScan.Filter( - type = FilterType.REGEX, - pattern = ["kr\\.co\\.vividnext\\.sodalive\\.v2\\..*"] - ), ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, classes = [org.springframework.data.jpa.repository.JpaRepository::class] diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt index c8bfade..e152ad0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt @@ -16,14 +16,8 @@ import java.time.Duration @Configuration @EnableRedisRepositories( - basePackages = ["kr.co.vividnext.sodalive.v2"], + basePackages = ["kr.co.vividnext.sodalive.redis.v2"], redisTemplateRef = "valkeyTemplate", - includeFilters = [ - ComponentScan.Filter( - type = FilterType.REGEX, - pattern = ["kr\\.co\\.vividnext\\.sodalive\\.v2\\..*"] - ) - ], excludeFilters = [ ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt index f375108..b1ca159 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt @@ -8,8 +8,8 @@ import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.login.LoginRequest import kr.co.vividnext.sodalive.member.login.LoginResponse import kr.co.vividnext.sodalive.member.token.MemberToken -import kr.co.vividnext.sodalive.member.token.MemberTokenRepository -import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2 +import kr.co.vividnext.sodalive.redis.v1.MemberTokenRepository +import kr.co.vividnext.sodalive.redis.v2.MemberTokenRepositoryV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.security.authentication.UsernamePasswordAuthenticationToken diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt b/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt index b436ebb..76edbf6 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt @@ -12,8 +12,8 @@ import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.MemberAdapter import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.token.MemberToken -import kr.co.vividnext.sodalive.member.token.MemberTokenRepository -import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2 +import kr.co.vividnext.sodalive.redis.v1.MemberTokenRepository +import kr.co.vividnext.sodalive.redis.v2.MemberTokenRepositoryV2 import org.slf4j.LoggerFactory import org.springframework.beans.factory.InitializingBean import org.springframework.beans.factory.annotation.Value diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index a337160..e66153a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -35,7 +35,6 @@ import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessage import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse import kr.co.vividnext.sodalive.live.room.info.GetRoomInfoResponse -import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember import kr.co.vividnext.sodalive.live.room.kickout.LiveRoomKickOutService import kr.co.vividnext.sodalive.live.room.like.GetLiveRoomHeartListResponse @@ -53,8 +52,9 @@ import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.block.BlockMemberRepository +import kr.co.vividnext.sodalive.redis.v1.LiveRoomInfoRedisRepository +import kr.co.vividnext.sodalive.redis.v2.LiveRoomInfoRedisRepositoryV2 import kr.co.vividnext.sodalive.utils.generateFileName -import kr.co.vividnext.sodalive.v2.LiveRoomInfoRedisRepositoryV2 import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.beans.factory.annotation.Value import org.springframework.context.ApplicationEventPublisher diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt index 2a656b3..101da97 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt @@ -2,13 +2,14 @@ package kr.co.vividnext.sodalive.live.room.kickout import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.live.room.LiveRoomRepository -import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository -import kr.co.vividnext.sodalive.v2.LiveRoomInfoRedisRepositoryV2 +import kr.co.vividnext.sodalive.redis.v1.LiveRoomInfoRedisRepository +import kr.co.vividnext.sodalive.redis.v1.LiveRoomKickOutRedisRepository +import kr.co.vividnext.sodalive.redis.v2.LiveRoomInfoRedisRepositoryV2 +import kr.co.vividnext.sodalive.redis.v2.LiveRoomKickOutRedisRepositoryV2 import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 -import kr.co.vividnext.sodalive.v2.LiveRoomKickOutRedisRepositoryV2 import kr.co.vividnext.sodalive.v2.LiveRoomKickOutV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt index 9b5d835..35a1821 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt @@ -2,7 +2,8 @@ package kr.co.vividnext.sodalive.live.room.menu import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.live.roulette.RedisIdGenerator -import kr.co.vividnext.sodalive.v2.LiveRoomMenuRepositoryV2 +import kr.co.vividnext.sodalive.redis.v1.LiveRoomMenuRepository +import kr.co.vividnext.sodalive.redis.v2.LiveRoomMenuRepositoryV2 import org.springframework.stereotype.Service @Service diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt index d17472f..93e50e8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt @@ -16,7 +16,8 @@ import kr.co.vividnext.sodalive.live.room.LiveRoomRepository import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole -import kr.co.vividnext.sodalive.v2.RouletteRepositoryV2 +import kr.co.vividnext.sodalive.redis.v1.NewRouletteRepository +import kr.co.vividnext.sodalive.redis.v2.RouletteRepositoryV2 import kr.co.vividnext.sodalive.v2.RouletteV2 import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt index fabcc4b..7260304 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt @@ -13,14 +13,15 @@ import kr.co.vividnext.sodalive.can.use.UseCanCalculateRepository import kr.co.vividnext.sodalive.can.use.UseCanCalculateStatus import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.live.room.LiveRoomRepository -import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.live.roulette.NewRoulette import kr.co.vividnext.sodalive.live.roulette.RedisIdGenerator import kr.co.vividnext.sodalive.live.roulette.RouletteItem import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole -import kr.co.vividnext.sodalive.v2.LiveRoomInfoRedisRepositoryV2 +import kr.co.vividnext.sodalive.redis.v1.LiveRoomInfoRedisRepository +import kr.co.vividnext.sodalive.redis.v1.RouletteRepository +import kr.co.vividnext.sodalive.redis.v2.LiveRoomInfoRedisRepositoryV2 import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index 678b499..9290896 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -36,10 +36,10 @@ import kr.co.vividnext.sodalive.member.stipulation.StipulationRepository import kr.co.vividnext.sodalive.member.tag.MemberCreatorTag import kr.co.vividnext.sodalive.member.tag.MemberTagRepository import kr.co.vividnext.sodalive.member.token.MemberToken -import kr.co.vividnext.sodalive.member.token.MemberTokenRepository +import kr.co.vividnext.sodalive.redis.v1.MemberTokenRepository +import kr.co.vividnext.sodalive.redis.v2.MemberTokenRepositoryV2 import kr.co.vividnext.sodalive.utils.generateFileName import kr.co.vividnext.sodalive.utils.generatePassword -import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.security.authentication.UsernamePasswordAuthenticationToken diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfoRedisRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomInfoRedisRepository.kt similarity index 56% rename from src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfoRedisRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomInfoRedisRepository.kt index a39c911..ead17cf 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfoRedisRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomInfoRedisRepository.kt @@ -1,5 +1,6 @@ -package kr.co.vividnext.sodalive.live.room.info +package kr.co.vividnext.sodalive.redis.v1 +import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfo import org.springframework.data.repository.CrudRepository interface LiveRoomInfoRedisRepository : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutRedisRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomKickOutRedisRepository.kt similarity index 56% rename from src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutRedisRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomKickOutRedisRepository.kt index fb01cd8..11c55d7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutRedisRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomKickOutRedisRepository.kt @@ -1,5 +1,6 @@ -package kr.co.vividnext.sodalive.live.room.kickout +package kr.co.vividnext.sodalive.redis.v1 +import kr.co.vividnext.sodalive.live.room.kickout.LiveRoomKickOut import org.springframework.data.repository.CrudRepository interface LiveRoomKickOutRedisRepository : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomMenuRepository.kt similarity index 65% rename from src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomMenuRepository.kt index 62c553f..9cdcfd3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomMenuRepository.kt @@ -1,5 +1,6 @@ -package kr.co.vividnext.sodalive.live.room.menu +package kr.co.vividnext.sodalive.redis.v1 +import kr.co.vividnext.sodalive.live.room.menu.LiveRoomMenu import org.springframework.data.repository.CrudRepository interface LiveRoomMenuRepository : CrudRepository { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/token/MemberTokenRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/MemberTokenRepository.kt similarity index 65% rename from src/main/kotlin/kr/co/vividnext/sodalive/member/token/MemberTokenRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/MemberTokenRepository.kt index 29808a2..0046e05 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/token/MemberTokenRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/MemberTokenRepository.kt @@ -1,5 +1,6 @@ -package kr.co.vividnext.sodalive.member.token +package kr.co.vividnext.sodalive.redis.v1 +import kr.co.vividnext.sodalive.member.token.MemberToken import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/NewRouletteRepository.kt similarity index 65% rename from src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/NewRouletteRepository.kt index f2043be..2808074 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/NewRouletteRepository.kt @@ -1,5 +1,6 @@ -package kr.co.vividnext.sodalive.live.roulette +package kr.co.vividnext.sodalive.redis.v1 +import kr.co.vividnext.sodalive.live.roulette.NewRoulette import org.springframework.data.repository.CrudRepository interface NewRouletteRepository : CrudRepository { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/RouletteRepository.kt similarity index 86% rename from src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/RouletteRepository.kt index 8755bdf..e2358a0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/RouletteRepository.kt @@ -1,4 +1,4 @@ -package kr.co.vividnext.sodalive.live.roulette.v2 +package kr.co.vividnext.sodalive.redis.v1 import kr.co.vividnext.sodalive.live.roulette.NewRoulette import org.springframework.data.repository.CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoRedisRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomInfoRedisRepositoryV2.kt similarity index 60% rename from src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoRedisRepositoryV2.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomInfoRedisRepositoryV2.kt index c98c39a..0e2acd7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoRedisRepositoryV2.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomInfoRedisRepositoryV2.kt @@ -1,5 +1,6 @@ -package kr.co.vividnext.sodalive.v2 +package kr.co.vividnext.sodalive.redis.v2 +import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.data.repository.CrudRepository interface LiveRoomInfoRedisRepositoryV2 : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutRedisRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomKickOutRedisRepositoryV2.kt similarity index 60% rename from src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutRedisRepositoryV2.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomKickOutRedisRepositoryV2.kt index 2ace0ad..af7401c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutRedisRepositoryV2.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomKickOutRedisRepositoryV2.kt @@ -1,5 +1,6 @@ -package kr.co.vividnext.sodalive.v2 +package kr.co.vividnext.sodalive.redis.v2 +import kr.co.vividnext.sodalive.v2.LiveRoomKickOutV2 import org.springframework.data.repository.CrudRepository interface LiveRoomKickOutRedisRepositoryV2 : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomMenuRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomMenuRepositoryV2.kt similarity index 85% rename from src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomMenuRepositoryV2.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomMenuRepositoryV2.kt index 5d48f0d..5d6a5a8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomMenuRepositoryV2.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomMenuRepositoryV2.kt @@ -1,4 +1,4 @@ -package kr.co.vividnext.sodalive.v2 +package kr.co.vividnext.sodalive.redis.v2 import kr.co.vividnext.sodalive.live.room.menu.LiveRoomMenu import org.springframework.data.repository.CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/MemberTokenRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/MemberTokenRepositoryV2.kt similarity index 85% rename from src/main/kotlin/kr/co/vividnext/sodalive/v2/MemberTokenRepositoryV2.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/MemberTokenRepositoryV2.kt index 61ae20c..62cae04 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/MemberTokenRepositoryV2.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/MemberTokenRepositoryV2.kt @@ -1,4 +1,4 @@ -package kr.co.vividnext.sodalive.v2 +package kr.co.vividnext.sodalive.redis.v2 import kr.co.vividnext.sodalive.member.token.MemberToken import org.springframework.data.repository.CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/RouletteRepositoryV2.kt similarity index 68% rename from src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteRepositoryV2.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/RouletteRepositoryV2.kt index 747f28e..ba768f8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteRepositoryV2.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/RouletteRepositoryV2.kt @@ -1,5 +1,6 @@ -package kr.co.vividnext.sodalive.v2 +package kr.co.vividnext.sodalive.redis.v2 +import kr.co.vividnext.sodalive.v2.RouletteV2 import org.springframework.data.repository.CrudRepository interface RouletteRepositoryV2 : CrudRepository { From ee0c99bec9c90effbe6ca83378f786311ad6ce43 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 23 Nov 2024 21:34:23 +0900 Subject: [PATCH 08/13] =?UTF-8?q?redis=20core,=20redis=20connection=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85=EB=A0=88=EB=B2=A8=20DEBUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c1ed96d..89e4a6a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -3,6 +3,8 @@ server: logging: level: + org.springframework.data.redis.core: DEBUG + org.springframework.data.redis.connection: DEBUG com: amazonaws: util: From 2ba798b60647e1195753544d1becd95748bf6d95 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 23 Nov 2024 23:02:49 +0900 Subject: [PATCH 09/13] =?UTF-8?q?=EC=98=AC=EB=B0=94=EB=A5=B4=EA=B2=8C=20Be?= =?UTF-8?q?an=EC=9D=B4=20=EC=84=A4=EC=A0=95=EB=90=98=EC=97=88=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/RedisBeanInspector.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/RedisBeanInspector.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/RedisBeanInspector.kt b/src/main/kotlin/kr/co/vividnext/sodalive/RedisBeanInspector.kt new file mode 100644 index 0000000..d4f4eeb --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/RedisBeanInspector.kt @@ -0,0 +1,21 @@ +package kr.co.vividnext.sodalive + +import org.springframework.boot.ApplicationArguments +import org.springframework.boot.ApplicationRunner +import org.springframework.context.ApplicationContext +import org.springframework.data.redis.core.RedisTemplate +import org.springframework.data.repository.CrudRepository +import org.springframework.stereotype.Component + +@Component +class RedisBeanInspector(val ctx: ApplicationContext) : ApplicationRunner { + override fun run(args: ApplicationArguments?) { + ctx.getBeansOfType(RedisTemplate::class.java).forEach { (name, bean) -> + println("RedisTemplate Bean: $name -> $bean") + } + + ctx.getBeansOfType(CrudRepository::class.java).forEach { (name, bean) -> + println("CrudRepository Bean: $name -> ${bean.javaClass}") + } + } +} From e38ed331b618c389e4d39e3b25fb926470dd3c59 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 24 Nov 2024 00:06:02 +0900 Subject: [PATCH 10/13] =?UTF-8?q?redis=20repository=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=20=EC=8A=A4=EC=BA=94=20=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/RedisBeanInspector.kt | 21 ------------------- src/main/resources/application.yml | 6 ++++-- 2 files changed, 4 insertions(+), 23 deletions(-) delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/RedisBeanInspector.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/RedisBeanInspector.kt b/src/main/kotlin/kr/co/vividnext/sodalive/RedisBeanInspector.kt deleted file mode 100644 index d4f4eeb..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/RedisBeanInspector.kt +++ /dev/null @@ -1,21 +0,0 @@ -package kr.co.vividnext.sodalive - -import org.springframework.boot.ApplicationArguments -import org.springframework.boot.ApplicationRunner -import org.springframework.context.ApplicationContext -import org.springframework.data.redis.core.RedisTemplate -import org.springframework.data.repository.CrudRepository -import org.springframework.stereotype.Component - -@Component -class RedisBeanInspector(val ctx: ApplicationContext) : ApplicationRunner { - override fun run(args: ApplicationArguments?) { - ctx.getBeansOfType(RedisTemplate::class.java).forEach { (name, bean) -> - println("RedisTemplate Bean: $name -> $bean") - } - - ctx.getBeansOfType(CrudRepository::class.java).forEach { (name, bean) -> - println("CrudRepository Bean: $name -> ${bean.javaClass}") - } - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 89e4a6a..f53882b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -3,8 +3,6 @@ server: logging: level: - org.springframework.data.redis.core: DEBUG - org.springframework.data.redis.connection: DEBUG com: amazonaws: util: @@ -54,6 +52,10 @@ jwt: secret: ${JWT_SECRET} spring: + data: + redis: + repositories: + enabled: false valkey: host: ${VALKEY_HOST} port: ${VALKEY_PORT} From b7d7afb8a5d21caa666baa2d19f1571365c5a98c Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 24 Nov 2024 01:23:41 +0900 Subject: [PATCH 11/13] =?UTF-8?q?redis=EB=A5=BC=20=EC=9D=B4=EC=A0=84?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=ED=96=88=EB=8D=98=20=EB=AA=A8=EB=93=A0=20=EC=BB=A4=EB=B0=8B=20?= =?UTF-8?q?Revert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/calculate/AdminCalculateService.kt | 21 +++ .../sodalive/admin/live/AdminLiveService.kt | 4 +- .../vividnext/sodalive/configs/JpaConfig.kt | 18 --- .../vividnext/sodalive/configs/RedisConfig.kt | 70 +++++++--- .../sodalive/configs/ValkeyConfig.kt | 60 --------- .../sodalive/content/AudioContentService.kt | 6 + .../content/main/AudioContentMainService.kt | 9 ++ .../calculate/CreatorAdminCalculateService.kt | 24 ++++ .../admin/member/CreatorAdminMemberService.kt | 29 +---- .../vividnext/sodalive/jwt/TokenProvider.kt | 27 +--- .../sodalive/live/room/LiveRoomService.kt | 91 +++++++------ .../sodalive/live/room/info/LiveRoomInfo.kt | 11 -- .../room/info}/LiveRoomInfoRedisRepository.kt | 3 +- .../live/room/kickout/LiveRoomKickOut.kt | 8 -- .../LiveRoomKickOutRedisRepository.kt | 3 +- .../room/kickout/LiveRoomKickOutService.kt | 51 +------- .../room/menu}/LiveRoomMenuRepository.kt | 3 +- .../live/room/menu/LiveRoomMenuService.kt | 54 ++------ .../roulette}/NewRouletteRepository.kt | 3 +- .../live/roulette/NewRouletteService.kt | 78 ++--------- .../live/roulette/RedisIdGenerator.kt | 5 +- .../roulette/v2}/RouletteRepository.kt | 2 +- .../live/roulette/v2/RouletteService.kt | 26 +--- .../sodalive/member/MemberService.kt | 34 +---- .../token}/MemberTokenRepository.kt | 3 +- .../redis/v2/LiveRoomInfoRedisRepositoryV2.kt | 6 - .../v2/LiveRoomKickOutRedisRepositoryV2.kt | 6 - .../redis/v2/LiveRoomMenuRepositoryV2.kt | 8 -- .../redis/v2/MemberTokenRepositoryV2.kt | 8 -- .../sodalive/redis/v2/RouletteRepositoryV2.kt | 8 -- .../vividnext/sodalive/v2/LiveRoomInfoV2.kt | 123 ------------------ .../sodalive/v2/LiveRoomKickOutV2.kt | 24 ---- .../kr/co/vividnext/sodalive/v2/RouletteV2.kt | 17 --- src/main/resources/application.yml | 8 -- 34 files changed, 214 insertions(+), 637 deletions(-) delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/configs/JpaConfig.kt delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt rename src/main/kotlin/kr/co/vividnext/sodalive/{redis/v1 => live/room/info}/LiveRoomInfoRedisRepository.kt (56%) rename src/main/kotlin/kr/co/vividnext/sodalive/{redis/v1 => live/room/kickout}/LiveRoomKickOutRedisRepository.kt (56%) rename src/main/kotlin/kr/co/vividnext/sodalive/{redis/v1 => live/room/menu}/LiveRoomMenuRepository.kt (65%) rename src/main/kotlin/kr/co/vividnext/sodalive/{redis/v1 => live/roulette}/NewRouletteRepository.kt (65%) rename src/main/kotlin/kr/co/vividnext/sodalive/{redis/v1 => live/roulette/v2}/RouletteRepository.kt (86%) rename src/main/kotlin/kr/co/vividnext/sodalive/{redis/v1 => member/token}/MemberTokenRepository.kt (65%) delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomInfoRedisRepositoryV2.kt delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomKickOutRedisRepositoryV2.kt delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomMenuRepositoryV2.kt delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/MemberTokenRepositoryV2.kt delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/RouletteRepositoryV2.kt delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoV2.kt delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutV2.kt delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteV2.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt index 093db39..255d456 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt @@ -2,12 +2,17 @@ package kr.co.vividnext.sodalive.admin.calculate import kr.co.vividnext.sodalive.creator.admin.calculate.GetCreatorCalculateCommunityPostResponse import kr.co.vividnext.sodalive.extensions.convertLocalDateTime +import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @Service class AdminCalculateService(private val repository: AdminCalculateQueryRepository) { @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'calculateLive:' + " + "#startDateStr + ':' + #endDateStr" + ) fun getCalculateLive(startDateStr: String, endDateStr: String): List { val startDate = startDateStr.convertLocalDateTime() val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) @@ -18,6 +23,10 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'calculateContent:' + " + "#startDateStr + ':' + #endDateStr" + ) fun getCalculateContentList(startDateStr: String, endDateStr: String): List { val startDate = startDateStr.convertLocalDateTime() val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) @@ -28,6 +37,10 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'cumulativeSalesByContent:' + " + "#offset + ':' + #limit" + ) fun getCumulativeSalesByContent(offset: Long, limit: Long): GetCumulativeSalesByContentResponse { val totalCount = repository.getCumulativeSalesByContentTotalCount() val items = repository @@ -38,6 +51,10 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'calculateContentDonationList2:' + " + "#startDateStr + ':' + #endDateStr" + ) fun getCalculateContentDonationList( startDateStr: String, endDateStr: String @@ -51,6 +68,10 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'calculateCommunityPost:' + " + "#startDateStr + ':' + #endDateStr + ':' + #offset" + ) fun getCalculateCommunityPost( startDateStr: String, endDateStr: String, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt index 8d5d8ed..f1fc065 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt @@ -20,8 +20,8 @@ import kr.co.vividnext.sodalive.live.recommend.RecommendLiveCreatorBannerReposit import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository import kr.co.vividnext.sodalive.live.room.cancel.LiveRoomCancel import kr.co.vividnext.sodalive.live.room.cancel.LiveRoomCancelRepository +import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.member.MemberRepository -import kr.co.vividnext.sodalive.redis.v2.LiveRoomInfoRedisRepositoryV2 import kr.co.vividnext.sodalive.utils.generateFileName import org.springframework.beans.factory.annotation.Value import org.springframework.context.ApplicationEventPublisher @@ -37,7 +37,7 @@ import java.time.format.DateTimeFormatter @Service class AdminLiveService( private val recommendCreatorBannerRepository: RecommendLiveCreatorBannerRepository, - private val roomInfoRepository: LiveRoomInfoRedisRepositoryV2, + private val roomInfoRepository: LiveRoomInfoRedisRepository, private val roomCancelRepository: LiveRoomCancelRepository, private val repository: AdminLiveRoomQueryRepository, private val memberRepository: MemberRepository, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/JpaConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/JpaConfig.kt deleted file mode 100644 index a6a41f6..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/JpaConfig.kt +++ /dev/null @@ -1,18 +0,0 @@ -package kr.co.vividnext.sodalive.configs - -import org.springframework.context.annotation.ComponentScan -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.FilterType -import org.springframework.data.jpa.repository.config.EnableJpaRepositories - -@Configuration -@EnableJpaRepositories( - basePackages = ["kr.co.vividnext.sodalive"], - includeFilters = [ - ComponentScan.Filter( - type = FilterType.ASSIGNABLE_TYPE, - classes = [org.springframework.data.jpa.repository.JpaRepository::class] - ) - ] -) -class JpaConfig diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index 016b09b..09989bd 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -1,36 +1,32 @@ package kr.co.vividnext.sodalive.configs import org.springframework.beans.factory.annotation.Value +import org.springframework.cache.annotation.EnableCaching import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.ComponentScan import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.FilterType +import org.springframework.data.redis.cache.RedisCacheConfiguration +import org.springframework.data.redis.cache.RedisCacheManager import org.springframework.data.redis.connection.RedisConnectionFactory import org.springframework.data.redis.connection.RedisStandaloneConfiguration import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory import org.springframework.data.redis.core.RedisTemplate -import org.springframework.data.redis.core.StringRedisTemplate import org.springframework.data.redis.repository.configuration.EnableRedisRepositories +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer +import org.springframework.data.redis.serializer.RedisSerializationContext +import org.springframework.data.redis.serializer.StringRedisSerializer +import java.time.Duration @Configuration -@EnableRedisRepositories( - basePackages = ["kr.co.vividnext.sodalive.redis.v1"], - redisTemplateRef = "redisTemplate", - excludeFilters = [ - ComponentScan.Filter( - type = FilterType.ASSIGNABLE_TYPE, - classes = [org.springframework.data.jpa.repository.JpaRepository::class] - ) - ] -) +@EnableCaching +@EnableRedisRepositories class RedisConfig( @Value("\${spring.redis.host}") private val host: String, @Value("\${spring.redis.port}") private val port: Int ) { - @Bean(name = ["redisConnectionFactory"]) + @Bean fun redisConnectionFactory(): RedisConnectionFactory { val clientConfiguration = LettuceClientConfiguration.builder() .useSsl() @@ -40,15 +36,53 @@ class RedisConfig( return LettuceConnectionFactory(RedisStandaloneConfiguration(host, port), clientConfiguration) } - @Bean(name = ["redisTemplate"]) + @Bean fun redisTemplate(): RedisTemplate<*, *> { val redisTemplate: RedisTemplate<*, *> = RedisTemplate() redisTemplate.setConnectionFactory(redisConnectionFactory()) return redisTemplate } - @Bean(name = ["redisStringRedisTemplate"]) - fun redisStringRedisTemplate(): StringRedisTemplate { - return StringRedisTemplate(redisConnectionFactory()) + @Bean + fun cacheManager(redisConnectionFactory: RedisConnectionFactory): RedisCacheManager { + val defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMinutes(30)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer( + GenericJackson2JsonRedisSerializer() + ) + ) + + val cacheConfigMap = mutableMapOf() + cacheConfigMap["default"] = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMinutes(30)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer( + GenericJackson2JsonRedisSerializer() + ) + ) + cacheConfigMap["cache_ttl_3_days"] = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofDays(3)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer( + GenericJackson2JsonRedisSerializer() + ) + ) + cacheConfigMap["cache_ttl_3_hours"] = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofHours(3)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer( + GenericJackson2JsonRedisSerializer() + ) + ) + + return RedisCacheManager.builder(redisConnectionFactory) + .cacheDefaults(defaultCacheConfig) + .withInitialCacheConfigurations(cacheConfigMap) + .build() } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt deleted file mode 100644 index e152ad0..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/ValkeyConfig.kt +++ /dev/null @@ -1,60 +0,0 @@ -package kr.co.vividnext.sodalive.configs - -import org.springframework.beans.factory.annotation.Value -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.ComponentScan -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.FilterType -import org.springframework.data.redis.connection.RedisClusterConfiguration -import org.springframework.data.redis.connection.RedisConnectionFactory -import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory -import org.springframework.data.redis.core.RedisTemplate -import org.springframework.data.redis.core.StringRedisTemplate -import org.springframework.data.redis.repository.configuration.EnableRedisRepositories -import java.time.Duration - -@Configuration -@EnableRedisRepositories( - basePackages = ["kr.co.vividnext.sodalive.redis.v2"], - redisTemplateRef = "valkeyTemplate", - excludeFilters = [ - ComponentScan.Filter( - type = FilterType.ASSIGNABLE_TYPE, - classes = [org.springframework.data.jpa.repository.JpaRepository::class] - ) - ] -) -class ValkeyConfig( - @Value("\${spring.valkey.host}") - private val host: String, - @Value("\${spring.valkey.port}") - private val port: Int -) { - @Bean(name = ["valkeyConnectionFactory"]) - fun valkeyConnectionFactory(): RedisConnectionFactory { - val clusterConfig = RedisClusterConfiguration() - clusterConfig.clusterNode(host, port) - - val clientConfig = LettuceClientConfiguration.builder() - .commandTimeout(Duration.ofSeconds(5)) - .shutdownTimeout(Duration.ofSeconds(5)) - .useSsl() - .disablePeerVerification() - .build() - - return LettuceConnectionFactory(clusterConfig, clientConfig) - } - - @Bean(name = ["valkeyTemplate"]) - fun valkeyTemplate(): RedisTemplate<*, *> { - val redisTemplate: RedisTemplate<*, *> = RedisTemplate() - redisTemplate.setConnectionFactory(valkeyConnectionFactory()) - return redisTemplate - } - - @Bean(name = ["valkeyStringRedisTemplate"]) - fun valkeyStringRedisTemplate(): StringRedisTemplate { - return StringRedisTemplate(valkeyConnectionFactory()) - } -} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index dcbe13e..30d9b39 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -28,6 +28,7 @@ import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import kr.co.vividnext.sodalive.utils.generateFileName import org.springframework.beans.factory.annotation.Value +import org.springframework.cache.annotation.Cacheable import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @@ -716,6 +717,11 @@ class AudioContentService( } @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_days"], + key = "'contentRanking:' + ':' +" + + "#isAdult + ':' + #startDate + ':' + #endDate + ':' + #sortType + ':' + #offset + ':' + #limit" + ) fun getAudioContentRanking( isAdult: Boolean, startDate: LocalDateTime, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt index ce37a1e..598b8b2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt @@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.event.EventItem import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import org.springframework.beans.factory.annotation.Value +import org.springframework.cache.annotation.Cacheable import org.springframework.data.domain.Pageable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -26,6 +27,7 @@ class AudioContentMainService( private val imageHost: String ) { @Transactional(readOnly = true) + @Cacheable(cacheNames = ["default"], key = "'themeList:' + ':' + #isAdult") fun getThemeList(isAdult: Boolean): List { return audioContentThemeRepository.getActiveThemeOfContent(isAdult = isAdult) } @@ -79,6 +81,7 @@ class AudioContentMainService( } @Transactional(readOnly = true) + @Cacheable(cacheNames = ["default"], key = "'newContentUploadCreatorList:' + #memberId + ':' + #isAdult") fun getNewContentUploadCreatorList(memberId: Long, isAdult: Boolean): List { return repository.getNewContentUploadCreatorList( cloudfrontHost = imageHost, @@ -90,6 +93,7 @@ class AudioContentMainService( } @Transactional(readOnly = true) + @Cacheable(cacheNames = ["default"], key = "'contentMainBannerList:' + #memberId + ':' + #isAdult") fun getAudioContentMainBannerList(memberId: Long, isAdult: Boolean) = repository.getAudioContentMainBannerList(isAdult = isAdult) .asSequence() @@ -152,6 +156,11 @@ class AudioContentMainService( .toList() @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["default"], + key = "'getAudioContentCurationListWithPaging:' + #memberId + ':' + #isAdult + ':' + #contentType" + + "+ ':' + #offset + ':' + #limit" + ) fun getAudioContentCurationListWithPaging( memberId: Long, isAdult: Boolean, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt index fe273f8..46ea0f6 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt @@ -4,12 +4,17 @@ import kr.co.vividnext.sodalive.admin.calculate.GetCalculateLiveResponse import kr.co.vividnext.sodalive.admin.calculate.GetCumulativeSalesByContentResponse import kr.co.vividnext.sodalive.extensions.convertLocalDateTime import kr.co.vividnext.sodalive.member.Member +import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @Service class CreatorAdminCalculateService(private val repository: CreatorAdminCalculateQueryRepository) { @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["default"], + key = "'creatorCalculateLive:v20240403_01:' + " + "#member + ':' + #startDateStr + ':' + #endDateStr" + ) fun getCalculateLive(startDateStr: String, endDateStr: String, member: Member): List { val startDate = startDateStr.convertLocalDateTime() val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) @@ -20,6 +25,11 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate } @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'creatorCalculateContentList:v20240403_01:' + " + + "#startDateStr + ':' + #endDateStr + ':' + #memberId + ':' + #offset + ':' + #limit" + ) fun getCalculateContentList( startDateStr: String, endDateStr: String, @@ -38,6 +48,10 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate } @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'creatorCumulativeSalesByContent:' + " + "#memberId + ':' + #offset + ':' + #limit" + ) fun getCumulativeSalesByContent(memberId: Long, offset: Long, limit: Long): GetCumulativeSalesByContentResponse { val totalCount = repository.getCumulativeSalesByContentTotalCount(memberId) val items = repository @@ -48,6 +62,11 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate } @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'creatorCalculateContentDonationList2:' + " + + "#startDateStr + ':' + #endDateStr + ':' + #memberId + ':' + #offset + ':' + #limit" + ) fun getCalculateContentDonationList( startDateStr: String, endDateStr: String, @@ -67,6 +86,11 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate } @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'creatorCalculateCommunityPost:' + " + + "#startDateStr + ':' + #endDateStr + ':' + #memberId + ':' + #offset + ':' + #limit" + ) fun getCalculateCommunityPost( startDateStr: String, endDateStr: String, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt index b1ca159..3e193e9 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt @@ -7,9 +7,7 @@ import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.login.LoginRequest import kr.co.vividnext.sodalive.member.login.LoginResponse -import kr.co.vividnext.sodalive.member.token.MemberToken -import kr.co.vividnext.sodalive.redis.v1.MemberTokenRepository -import kr.co.vividnext.sodalive.redis.v2.MemberTokenRepositoryV2 +import kr.co.vividnext.sodalive.member.token.MemberTokenRepository import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.security.authentication.UsernamePasswordAuthenticationToken @@ -24,7 +22,6 @@ import kotlin.concurrent.write class CreatorAdminMemberService( private val repository: MemberRepository, private val tokenRepository: MemberTokenRepository, - private val tokenRepositoryV2: MemberTokenRepositoryV2, private val tokenProvider: TokenProvider, private val authenticationManagerBuilder: AuthenticationManagerBuilder, @@ -50,30 +47,14 @@ class CreatorAdminMemberService( val lock = getOrCreateLock(memberId = memberId) lock.write { - val memberToken = saveAndGetTokenById(memberId) + val memberToken = tokenRepository.findByIdOrNull(memberId) + ?: throw SodaException("로그인 정보를 확인해주세요.") - if (memberToken != null) { - memberToken.tokenSet.remove(token) - tokenRepositoryV2.save(memberToken) - } + memberToken.tokenSet.remove(token) + tokenRepository.save(memberToken) } } - private fun saveAndGetTokenById(id: Long): MemberToken? { - var memberToken = tokenRepositoryV2.findByIdOrNull(id = id) - - if (memberToken == null) { - memberToken = tokenRepository.findByIdOrNull(id = id) - - if (memberToken != null) { - tokenRepositoryV2.save(memberToken) - tokenRepository.delete(memberToken) - } - } - - return memberToken - } - private fun login(email: String, password: String): LoginResponse { val member = repository.findByEmail(email = email) ?: throw SodaException("로그인 정보를 확인해주세요.") if (!member.isActive) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt b/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt index 76edbf6..0ec16ac 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt @@ -12,8 +12,7 @@ import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.MemberAdapter import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.token.MemberToken -import kr.co.vividnext.sodalive.redis.v1.MemberTokenRepository -import kr.co.vividnext.sodalive.redis.v2.MemberTokenRepositoryV2 +import kr.co.vividnext.sodalive.member.token.MemberTokenRepository import org.slf4j.LoggerFactory import org.springframework.beans.factory.InitializingBean import org.springframework.beans.factory.annotation.Value @@ -36,8 +35,7 @@ class TokenProvider( @Value("\${jwt.token-validity-in-seconds}") private val tokenValidityInSeconds: Long, private val repository: MemberRepository, - private val tokenRepository: MemberTokenRepository, - private val tokenRepositoryV2: MemberTokenRepositoryV2 + private val tokenRepository: MemberTokenRepository ) : InitializingBean { private val logger = LoggerFactory.getLogger(TokenProvider::class.java) @@ -67,11 +65,11 @@ class TokenProvider( val lock = getOrCreateLock(memberId = memberId) lock.write { - val memberToken = saveAndGetTokenById(memberId) + val memberToken = tokenRepository.findByIdOrNull(memberId) ?: MemberToken(id = memberId) memberToken.tokenSet.add(token) - tokenRepositoryV2.save(memberToken) + tokenRepository.save(memberToken) } return token @@ -86,7 +84,7 @@ class TokenProvider( .body val authorities = claims[AUTHORITIES_KEY].toString().split(",").map { SimpleGrantedAuthority(it) } - val memberToken = saveAndGetTokenById(id = claims.subject.toLong()) + val memberToken = tokenRepository.findByIdOrNull(id = claims.subject.toLong()) ?: throw SodaException("로그인 정보를 확인해주세요.") if (!memberToken.tokenSet.contains(token)) throw SodaException("로그인 정보를 확인해주세요.") @@ -98,21 +96,6 @@ class TokenProvider( return UsernamePasswordAuthenticationToken(principal, token, authorities) } - private fun saveAndGetTokenById(id: Long): MemberToken? { - var memberToken = tokenRepositoryV2.findByIdOrNull(id = id) - - if (memberToken == null) { - memberToken = tokenRepository.findByIdOrNull(id = id) - - if (memberToken != null) { - tokenRepositoryV2.save(memberToken) - tokenRepository.delete(memberToken) - } - } - - return memberToken - } - fun validateToken(token: String): Boolean { try { Jwts.parserBuilder() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index e66153a..37ecf7b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -35,6 +35,8 @@ import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessage import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse import kr.co.vividnext.sodalive.live.room.info.GetRoomInfoResponse +import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfo +import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember import kr.co.vividnext.sodalive.live.room.kickout.LiveRoomKickOutService import kr.co.vividnext.sodalive.live.room.like.GetLiveRoomHeartListResponse @@ -44,7 +46,7 @@ import kr.co.vividnext.sodalive.live.room.menu.CreateLiveMenuRequest import kr.co.vividnext.sodalive.live.room.menu.LiveRoomMenuService import kr.co.vividnext.sodalive.live.room.menu.UpdateLiveMenuRequest import kr.co.vividnext.sodalive.live.room.visit.LiveRoomVisitService -import kr.co.vividnext.sodalive.live.roulette.NewRouletteService +import kr.co.vividnext.sodalive.live.roulette.NewRouletteRepository import kr.co.vividnext.sodalive.live.signature.SignatureCanRepository import kr.co.vividnext.sodalive.live.tag.LiveTagRepository import kr.co.vividnext.sodalive.member.Gender @@ -52,10 +54,7 @@ import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.block.BlockMemberRepository -import kr.co.vividnext.sodalive.redis.v1.LiveRoomInfoRedisRepository -import kr.co.vividnext.sodalive.redis.v2.LiveRoomInfoRedisRepositoryV2 import kr.co.vividnext.sodalive.utils.generateFileName -import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.beans.factory.annotation.Value import org.springframework.context.ApplicationEventPublisher import org.springframework.data.domain.Pageable @@ -76,11 +75,10 @@ import kotlin.concurrent.write @Transactional(readOnly = true) class LiveRoomService( private val menuService: LiveRoomMenuService, - private val rouletteService: NewRouletteService, private val repository: LiveRoomRepository, + private val rouletteRepository: NewRouletteRepository, private val roomInfoRepository: LiveRoomInfoRedisRepository, - private val roomInfoRepositoryV2: LiveRoomInfoRedisRepositoryV2, private val roomCancelRepository: LiveRoomCancelRepository, private val kickOutService: LiveRoomKickOutService, private val blockMemberRepository: BlockMemberRepository, @@ -115,22 +113,6 @@ class LiveRoomService( ) { private val tokenLocks: MutableMap = mutableMapOf() - private fun getLiveRoomInfo(roomId: Long): LiveRoomInfoV2? { - var roomInfoV2 = roomInfoRepositoryV2.findByIdOrNull(roomId) - - if (roomInfoV2 == null) { - val roomInfoV1 = roomInfoRepository.findByIdOrNull(roomId) - - if (roomInfoV1 != null) { - roomInfoV2 = roomInfoV1.convertRoomInfoV2() - roomInfoRepositoryV2.save(roomInfoV2) - roomInfoRepository.delete(roomInfoV1) - } - } - - return roomInfoV2 - } - fun getRoomList( dateString: String?, status: LiveRoomStatus, @@ -168,7 +150,7 @@ class LiveRoomService( return roomList .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.member!!.id!!) } .map { - val roomInfo = getLiveRoomInfo(it.id!!) + val roomInfo = roomInfoRepository.findByIdOrNull(it.id!!) val reservations = it.reservations .filter { reservation -> reservation.member!!.id!! == member.id!! && reservation.isActive } @@ -460,7 +442,7 @@ class LiveRoomService( response.manager = GetRoomDetailManager(room.member!!, cloudFrontHost = cloudFrontHost) if (!room.channelName.isNullOrBlank()) { - val roomInfo = getLiveRoomInfo(roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(roomId) if (roomInfo != null) { response.isPaid = canRepository.isExistPaidLiveRoom( @@ -669,9 +651,9 @@ class LiveRoomService( val lock = getOrCreateLock(memberId = member.id!!) lock.write { - var roomInfo = getLiveRoomInfo(request.roomId) + var roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) if (roomInfo == null) { - roomInfo = roomInfoRepositoryV2.save(LiveRoomInfoV2(roomId = request.roomId)) + roomInfo = roomInfoRepository.save(LiveRoomInfo(roomId = request.roomId)) } if (roomInfo.speakerCount + roomInfo.listenerCount + roomInfo.managerCount >= room.numberOfPeople) { @@ -710,7 +692,7 @@ class LiveRoomService( roomInfo.addListener(member, cloudFrontHost) } - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) roomVisitService.roomVisit(room, member) } } @@ -807,7 +789,7 @@ class LiveRoomService( } fun getRoomInfo(roomId: Long, member: Member): GetRoomInfoResponse { - val roomInfo = getLiveRoomInfo(roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val room = repository.findByIdOrNull(roomId) @@ -835,7 +817,15 @@ class LiveRoomService( .getNotificationUserIds(room.member!!.id!!) .contains(member.id) - val isActiveRoulette = rouletteService.hasActiveRoulette(creatorId = room.member!!.id!!) + var isActiveRoulette = false + val rouletteList = rouletteRepository.findByCreatorId(creatorId = room.member!!.id!!) + + for (roulette in rouletteList) { + if (roulette.isActive) { + isActiveRoulette = true + break + } + } val donationRankingTop3UserIds = if (room.member!!.isVisibleDonationRank) { explorerQueryRepository @@ -899,7 +889,7 @@ class LiveRoomService( val liveRoomCreatorId = repository.getLiveRoomCreatorId(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") - val roomInfo = getLiveRoomInfo(roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") return if (liveRoomCreatorId != member.id!!) { @@ -920,18 +910,18 @@ class LiveRoomService( throw SodaException("잘못된 요청입니다.") } - val roomInfo = getLiveRoomInfo(request.roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.removeDonationMessage(request.messageUUID) - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) } } fun getUserProfile(roomId: Long, userId: Long, member: Member): GetLiveRoomUserProfileResponse { val room = repository.getLiveRoom(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") - val roomInfo = getLiveRoomInfo(roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val user = memberRepository.findByIdOrNull(userId) @@ -1000,7 +990,7 @@ class LiveRoomService( fun setSpeaker(request: SetManagerOrSpeakerOrAudienceRequest) { val lock = getOrCreateLock(memberId = request.memberId) lock.write { - val roomInfo = getLiveRoomInfo(request.roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val member = memberRepository.findByIdOrNull(request.memberId) @@ -1014,14 +1004,14 @@ class LiveRoomService( roomInfo.removeManager(member) roomInfo.addSpeaker(member, cloudFrontHost) - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) } } fun setListener(request: SetManagerOrSpeakerOrAudienceRequest) { val lock = getOrCreateLock(memberId = request.memberId) lock.write { - val roomInfo = getLiveRoomInfo(request.roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val member = memberRepository.findByIdOrNull(request.memberId) @@ -1031,7 +1021,7 @@ class LiveRoomService( roomInfo.removeManager(member) roomInfo.addListener(member, cloudFrontHost) - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) } } @@ -1044,7 +1034,7 @@ class LiveRoomService( } val user = memberRepository.findByIdOrNull(request.memberId) ?: throw SodaException("해당하는 유저가 없습니다.") - val roomInfo = getLiveRoomInfo(request.roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") val roomAccountResponse = LiveRoomMember(member = user, cloudFrontHost) @@ -1063,7 +1053,7 @@ class LiveRoomService( roomInfo.removeSpeaker(user) roomInfo.addManager(user, cloudFrontHost) - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) } } @@ -1090,7 +1080,7 @@ class LiveRoomService( if (request.message.isNotBlank()) { val lock = getOrCreateLock(memberId = member.id!!) lock.write { - val roomInfo = getLiveRoomInfo(room.id!!) + val roomInfo = roomInfoRepository.findByIdOrNull(room.id!!) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.addDonationMessage( @@ -1101,7 +1091,7 @@ class LiveRoomService( donationMessage = request.message ) - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) } } @@ -1136,7 +1126,7 @@ class LiveRoomService( if (request.message.isNotBlank()) { val lock = getOrCreateLock(memberId = member.id!!) lock.write { - val roomInfo = getLiveRoomInfo(room.id!!) + val roomInfo = roomInfoRepository.findByIdOrNull(room.id!!) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.addDonationMessage( @@ -1147,7 +1137,7 @@ class LiveRoomService( donationMessage = request.message ) - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) } } @@ -1226,20 +1216,27 @@ class LiveRoomService( val room = repository.getLiveRoom(roomId) val lock = getOrCreateLock(memberId = member.id!!) lock.write { - val roomInfo = getLiveRoomInfo(roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(roomId) if (roomInfo != null) { if (room?.member != null && room.member!! == member) { room.isActive = false kickOutService.deleteKickOutData(roomId = room.id!!) - roomInfoRepositoryV2.deleteById(roomInfo.roomId) + roomInfoRepository.deleteById(roomInfo.roomId) + + val rouletteList = rouletteRepository.findByCreatorId(creatorId = member.id!!) + if (rouletteList.isNotEmpty()) { + rouletteList.forEach { + it.isActive = false + rouletteRepository.save(it) + } + } menuService.deactivateAll(memberId = member.id!!) - rouletteService.deactivateAll(creatorId = member.id!!) } else { roomInfo.removeSpeaker(member) roomInfo.removeListener(member) roomInfo.removeManager(member) - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) } } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt index d648b90..6c366d8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt @@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.live.room.info import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessage import kr.co.vividnext.sodalive.member.Member -import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.data.annotation.Id import org.springframework.data.redis.core.RedisHash @@ -119,14 +118,4 @@ data class LiveRoomInfo( fun removeDonationMessage(uuid: String) { (donationMessageList as MutableList).removeIf { it.uuid == uuid } } - - fun convertRoomInfoV2(): LiveRoomInfoV2 { - return LiveRoomInfoV2( - roomId = roomId, - speakerList = speakerList, - listenerList = listenerList, - managerList = managerList, - donationMessageList = donationMessageList - ) - } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomInfoRedisRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfoRedisRepository.kt similarity index 56% rename from src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomInfoRedisRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfoRedisRepository.kt index ead17cf..a39c911 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomInfoRedisRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfoRedisRepository.kt @@ -1,6 +1,5 @@ -package kr.co.vividnext.sodalive.redis.v1 +package kr.co.vividnext.sodalive.live.room.info -import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfo import org.springframework.data.repository.CrudRepository interface LiveRoomInfoRedisRepository : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOut.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOut.kt index 0c2b82e..aa4bc54 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOut.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOut.kt @@ -1,6 +1,5 @@ package kr.co.vividnext.sodalive.live.room.kickout -import kr.co.vividnext.sodalive.v2.LiveRoomKickOutV2 import org.springframework.data.annotation.Id import org.springframework.data.redis.core.RedisHash @@ -21,13 +20,6 @@ data class LiveRoomKickOut( userList.removeIf { it.userId == userId } userList.add(liveRoomKickOutUser) } - - fun convertV2(): LiveRoomKickOutV2 { - return LiveRoomKickOutV2( - roomId = roomId, - userList = userList - ) - } } data class LiveRoomKickOutUser( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomKickOutRedisRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutRedisRepository.kt similarity index 56% rename from src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomKickOutRedisRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutRedisRepository.kt index 11c55d7..fb01cd8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomKickOutRedisRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutRedisRepository.kt @@ -1,6 +1,5 @@ -package kr.co.vividnext.sodalive.redis.v1 +package kr.co.vividnext.sodalive.live.room.kickout -import kr.co.vividnext.sodalive.live.room.kickout.LiveRoomKickOut import org.springframework.data.repository.CrudRepository interface LiveRoomKickOutRedisRepository : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt index 101da97..b193a82 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/kickout/LiveRoomKickOutService.kt @@ -2,15 +2,10 @@ package kr.co.vividnext.sodalive.live.room.kickout import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.live.room.LiveRoomRepository +import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository -import kr.co.vividnext.sodalive.redis.v1.LiveRoomInfoRedisRepository -import kr.co.vividnext.sodalive.redis.v1.LiveRoomKickOutRedisRepository -import kr.co.vividnext.sodalive.redis.v2.LiveRoomInfoRedisRepositoryV2 -import kr.co.vividnext.sodalive.redis.v2.LiveRoomKickOutRedisRepositoryV2 -import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 -import kr.co.vividnext.sodalive.v2.LiveRoomKickOutV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @@ -18,52 +13,18 @@ import org.springframework.stereotype.Service @Service class LiveRoomKickOutService( private val roomInfoRepository: LiveRoomInfoRedisRepository, - private val roomInfoRepositoryV2: LiveRoomInfoRedisRepositoryV2, private val repository: LiveRoomKickOutRedisRepository, - private val repositoryV2: LiveRoomKickOutRedisRepositoryV2, private val memberRepository: MemberRepository, private val roomRepository: LiveRoomRepository, @Value("\${cloud.aws.cloud-front.host}") private val cloudFrontHost: String ) { - private fun getLiveRoomInfo(roomId: Long): LiveRoomInfoV2? { - var roomInfoV2 = roomInfoRepositoryV2.findByIdOrNull(roomId) - - if (roomInfoV2 == null) { - val roomInfoV1 = roomInfoRepository.findByIdOrNull(roomId) - - if (roomInfoV1 != null) { - roomInfoV2 = roomInfoV1.convertRoomInfoV2() - roomInfoRepositoryV2.save(roomInfoV2) - roomInfoRepository.delete(roomInfoV1) - } - } - - return roomInfoV2 - } - - private fun getLiveRoomKickOut(roomId: Long): LiveRoomKickOutV2? { - var liveRoomKickOutV2 = repositoryV2.findByIdOrNull(roomId) - - if (liveRoomKickOutV2 == null) { - val liveRoomKickOutV1 = repository.findByIdOrNull(roomId) - - if (liveRoomKickOutV1 != null) { - liveRoomKickOutV2 = liveRoomKickOutV1.convertV2() - repositoryV2.save(liveRoomKickOutV2) - repository.delete(liveRoomKickOutV1) - } - } - - return liveRoomKickOutV2 - } - fun kickOut(request: LiveRoomKickOutRequest, member: Member) { val room = roomRepository.findByIdOrNull(request.roomId) ?: throw SodaException("해당하는 라이브가 없습니다.") - val roomInfo = getLiveRoomInfo(request.roomId) + val roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") if (room.member == null || room.member!!.id == null) { @@ -74,20 +35,20 @@ class LiveRoomKickOutService( throw SodaException("권한이 없습니다.") } - var liveRoomKickOut = getLiveRoomKickOut(request.roomId) + var liveRoomKickOut = repository.findByIdOrNull(request.roomId) if (liveRoomKickOut == null) { - liveRoomKickOut = repositoryV2.save(LiveRoomKickOutV2(roomId = request.roomId)) + liveRoomKickOut = repository.save(LiveRoomKickOut(roomId = request.roomId)) } liveRoomKickOut.kickOut(request.userId) - repositoryV2.save(liveRoomKickOut) + repository.save(liveRoomKickOut) val kickOutUser = memberRepository.findByIdOrNull(request.userId) if (kickOutUser != null) { roomInfo.removeSpeaker(kickOutUser) roomInfo.removeListener(kickOutUser) roomInfo.removeManager(kickOutUser) - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomMenuRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuRepository.kt similarity index 65% rename from src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomMenuRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuRepository.kt index 9cdcfd3..62c553f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/LiveRoomMenuRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuRepository.kt @@ -1,6 +1,5 @@ -package kr.co.vividnext.sodalive.redis.v1 +package kr.co.vividnext.sodalive.live.room.menu -import kr.co.vividnext.sodalive.live.room.menu.LiveRoomMenu import org.springframework.data.repository.CrudRepository interface LiveRoomMenuRepository : CrudRepository { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt index 35a1821..e9fc6ab 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/menu/LiveRoomMenuService.kt @@ -2,49 +2,17 @@ package kr.co.vividnext.sodalive.live.room.menu import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.live.roulette.RedisIdGenerator -import kr.co.vividnext.sodalive.redis.v1.LiveRoomMenuRepository -import kr.co.vividnext.sodalive.redis.v2.LiveRoomMenuRepositoryV2 import org.springframework.stereotype.Service @Service class LiveRoomMenuService( private val idGenerator: RedisIdGenerator, - private val repository: LiveRoomMenuRepository, - private val repositoryV2: LiveRoomMenuRepositoryV2 + private val repository: LiveRoomMenuRepository ) { - private fun findByCreatorId(creatorId: Long): List { - var liveRoomMenuList = repositoryV2.findByCreatorId(creatorId) - - if (liveRoomMenuList.isEmpty()) { - liveRoomMenuList = repository.findByCreatorId(creatorId) - - if (liveRoomMenuList.isNotEmpty()) { - val newLiveRoomMenuList = liveRoomMenuList.map { liveRoomMenu -> - val newLiveRoomMenu = LiveRoomMenu( - id = idGenerator.generateId(SEQUENCE_NAME), - creatorId = liveRoomMenu.creatorId, - isActive = liveRoomMenu.isActive, - menu = liveRoomMenu.menu - ) - repositoryV2.save(newLiveRoomMenu) - repository.delete(liveRoomMenu) - - newLiveRoomMenu - } - - return newLiveRoomMenuList - } else { - return emptyList() - } - } else { - return liveRoomMenuList - } - } - fun getAllLiveMenu(creatorId: Long, memberId: Long): List { if (creatorId != memberId) throw SodaException("잘못된 요청입니다.") - return findByCreatorId(creatorId) + return repository.findByCreatorId(creatorId) .sortedBy { it.id } .asSequence() .map { GetMenuPresetResponse(id = it.id, menu = it.menu, isActive = it.isActive) } @@ -54,7 +22,7 @@ class LiveRoomMenuService( fun createLiveMenu(memberId: Long, request: CreateLiveMenuRequest): Boolean { liveMenuValidate(menu = request.menu) - val menuList = findByCreatorId(creatorId = memberId) + val menuList = repository.findByCreatorId(creatorId = memberId) if (menuList.size >= 3) { throw SodaException("메뉴판의 최대개수는 3개입니다.") @@ -63,7 +31,7 @@ class LiveRoomMenuService( if (request.isActive) { menuList.forEach { it.isActive = false - repositoryV2.save(it) + repository.save(it) } } @@ -74,14 +42,14 @@ class LiveRoomMenuService( menu = request.menu ) - repositoryV2.save(menu) + repository.save(menu) return request.isActive } fun updateLiveMenu(memberId: Long, request: UpdateLiveMenuRequest) { liveMenuValidate(menu = request.menu) - val menuList = findByCreatorId(creatorId = memberId) + val menuList = repository.findByCreatorId(creatorId = memberId) if (menuList.isEmpty()) { throw SodaException("잘못된 요청입니다.") } @@ -90,16 +58,16 @@ class LiveRoomMenuService( if (it.id == request.id) { it.menu = request.menu it.isActive = request.isActive - repositoryV2.save(it) + repository.save(it) } else if (request.isActive) { it.isActive = false - repositoryV2.save(it) + repository.save(it) } } } fun getLiveMenu(creatorId: Long): GetMenuPresetResponse? { - val menuList = findByCreatorId(creatorId = creatorId) + val menuList = repository.findByCreatorId(creatorId = creatorId) var activeMenu: LiveRoomMenu? = null for (menu in menuList) { @@ -117,11 +85,11 @@ class LiveRoomMenuService( } fun deactivateAll(memberId: Long) { - val menuList = findByCreatorId(creatorId = memberId) + val menuList = repository.findByCreatorId(creatorId = memberId) menuList.forEach { it.isActive = false - repositoryV2.save(it) + repository.save(it) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/NewRouletteRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteRepository.kt similarity index 65% rename from src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/NewRouletteRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteRepository.kt index 2808074..f2043be 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/NewRouletteRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteRepository.kt @@ -1,6 +1,5 @@ -package kr.co.vividnext.sodalive.redis.v1 +package kr.co.vividnext.sodalive.live.roulette -import kr.co.vividnext.sodalive.live.roulette.NewRoulette import org.springframework.data.repository.CrudRepository interface NewRouletteRepository : CrudRepository { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt index 93e50e8..8d9b176 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt @@ -16,9 +16,6 @@ import kr.co.vividnext.sodalive.live.room.LiveRoomRepository import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole -import kr.co.vividnext.sodalive.redis.v1.NewRouletteRepository -import kr.co.vividnext.sodalive.redis.v2.RouletteRepositoryV2 -import kr.co.vividnext.sodalive.v2.RouletteV2 import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -30,43 +27,15 @@ class NewRouletteService( private val canRepository: CanRepository, private val repository: NewRouletteRepository, - private val repositoryV2: RouletteRepositoryV2, private val roomRepository: LiveRoomRepository, private val memberRepository: MemberRepository, private val chargeRepository: ChargeRepository, private val useCanCalculateRepository: UseCanCalculateRepository ) { - private fun findByCreatorId(creatorId: Long): List { - var rouletteV2List = repositoryV2.findByCreatorId(creatorId) - - if (rouletteV2List.isEmpty()) { - val rouletteV1List = repository.findByCreatorId(creatorId) - - if (rouletteV1List.isNotEmpty()) { - rouletteV1List.forEach { rouletteV1 -> - val rouletteV2 = RouletteV2( - id = idGenerator.generateId(SEQUENCE_NAME), - creatorId = rouletteV1.creatorId, - can = rouletteV1.can, - isActive = rouletteV1.isActive, - items = rouletteV1.items - ) - - repositoryV2.save(rouletteV2) - repository.delete(rouletteV1) - } - - rouletteV2List = repositoryV2.findByCreatorId(creatorId) - } - } - - return rouletteV2List - } - fun getAllRoulette(creatorId: Long, memberId: Long): List { if (creatorId != memberId) throw SodaException("잘못된 요청입니다.") - val rouletteList = findByCreatorId(creatorId) + val rouletteList = repository.findByCreatorId(creatorId) return rouletteList.sortedBy { it.id } .map { @@ -83,14 +52,14 @@ class NewRouletteService( rouletteValidate(can = request.can, items = request.items) if (request.isActive) { - val rouletteList = findByCreatorId(creatorId = memberId) + val rouletteList = repository.findByCreatorId(creatorId = memberId) rouletteList.forEach { it.isActive = false - repositoryV2.save(it) + repository.save(it) } } - val roulette = RouletteV2( + val roulette = NewRoulette( id = idGenerator.generateId(SEQUENCE_NAME), creatorId = memberId, can = request.can, @@ -98,14 +67,14 @@ class NewRouletteService( items = request.items ) - repositoryV2.save(roulette) + repository.save(roulette) return request.isActive } fun updateRoulette(memberId: Long, request: UpdateNewRouletteRequest): Boolean { rouletteValidate(can = request.can, items = request.items) - val rouletteList = findByCreatorId(creatorId = memberId) + val rouletteList = repository.findByCreatorId(creatorId = memberId) if (rouletteList.isEmpty()) { throw SodaException("잘못된 요청입니다.") @@ -121,10 +90,10 @@ class NewRouletteService( it.can = request.can it.items = request.items it.isActive = request.isActive - repositoryV2.save(it) + repository.save(it) } else if (request.isActive) { it.isActive = false - repositoryV2.save(it) + repository.save(it) } } @@ -132,13 +101,13 @@ class NewRouletteService( } fun getRoulette(creatorId: Long, memberId: Long): GetRouletteResponse { - val rouletteList = findByCreatorId(creatorId = creatorId) + val rouletteList = repository.findByCreatorId(creatorId = creatorId) if (rouletteList.isEmpty()) { throw SodaException("룰렛을 사용할 수 없습니다.") } - var activeRoulette: RouletteV2? = null + var activeRoulette: NewRoulette? = null for (roulette in rouletteList) { if (roulette.isActive) { activeRoulette = roulette @@ -170,13 +139,13 @@ class NewRouletteService( } // STEP 2 - 룰렛 데이터 가져오기 - val rouletteList = findByCreatorId(creatorId = host.id!!) + val rouletteList = repository.findByCreatorId(creatorId = host.id!!) if (rouletteList.isEmpty()) { throw SodaException("룰렛을 사용할 수 없습니다.") } - var activeRoulette: RouletteV2? = null + var activeRoulette: NewRoulette? = null for (roulette in rouletteList) { if (roulette.isActive) { activeRoulette = roulette @@ -251,28 +220,7 @@ class NewRouletteService( } } - fun hasActiveRoulette(creatorId: Long): Boolean { - val rouletteList = findByCreatorId(creatorId) - - for (roulette in rouletteList) { - if (roulette.isActive) { - return true - } - } - - return false - } - - fun deactivateAll(creatorId: Long) { - val rouletteList = findByCreatorId(creatorId) - - rouletteList.forEach { - it.isActive = false - repositoryV2.save(it) - } - } - companion object { - const val SEQUENCE_NAME = "Roulette:sequence" + const val SEQUENCE_NAME = "newRoulette:sequence" } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt index a8504da..f6a31e1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RedisIdGenerator.kt @@ -1,13 +1,10 @@ package kr.co.vividnext.sodalive.live.roulette -import org.springframework.beans.factory.annotation.Qualifier import org.springframework.data.redis.core.StringRedisTemplate import org.springframework.stereotype.Service @Service -class RedisIdGenerator( - @Qualifier("valkeyStringRedisTemplate") private val stringRedisTemplate: StringRedisTemplate -) { +class RedisIdGenerator(private val stringRedisTemplate: StringRedisTemplate) { fun generateId(key: String): Long { return stringRedisTemplate.opsForValue().increment(key, 1) ?: 1L } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/RouletteRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt similarity index 86% rename from src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/RouletteRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt index e2358a0..8755bdf 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/RouletteRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt @@ -1,4 +1,4 @@ -package kr.co.vividnext.sodalive.redis.v1 +package kr.co.vividnext.sodalive.live.roulette.v2 import kr.co.vividnext.sodalive.live.roulette.NewRoulette import org.springframework.data.repository.CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt index 7260304..bcd5802 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt @@ -13,16 +13,13 @@ import kr.co.vividnext.sodalive.can.use.UseCanCalculateRepository import kr.co.vividnext.sodalive.can.use.UseCanCalculateStatus import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.live.room.LiveRoomRepository +import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.live.roulette.NewRoulette import kr.co.vividnext.sodalive.live.roulette.RedisIdGenerator import kr.co.vividnext.sodalive.live.roulette.RouletteItem import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole -import kr.co.vividnext.sodalive.redis.v1.LiveRoomInfoRedisRepository -import kr.co.vividnext.sodalive.redis.v1.RouletteRepository -import kr.co.vividnext.sodalive.redis.v2.LiveRoomInfoRedisRepositoryV2 -import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -41,27 +38,10 @@ class RouletteService( private val memberRepository: MemberRepository, private val chargeRepository: ChargeRepository, private val roomInfoRepository: LiveRoomInfoRedisRepository, - private val roomInfoRepositoryV2: LiveRoomInfoRedisRepositoryV2, private val useCanCalculateRepository: UseCanCalculateRepository ) { private val tokenLocks: MutableMap = mutableMapOf() - private fun getLiveRoomInfo(roomId: Long): LiveRoomInfoV2? { - var roomInfoV2 = roomInfoRepositoryV2.findByIdOrNull(roomId) - - if (roomInfoV2 == null) { - val roomInfoV1 = roomInfoRepository.findByIdOrNull(roomId) - - if (roomInfoV1 != null) { - roomInfoV2 = roomInfoV1.convertRoomInfoV2() - roomInfoRepositoryV2.save(roomInfoV2) - roomInfoRepository.delete(roomInfoV1) - } - } - - return roomInfoV2 - } - fun getAllRoulette(creatorId: Long, memberId: Long): List { if (creatorId != memberId) throw SodaException("잘못된 요청입니다.") @@ -178,7 +158,7 @@ class RouletteService( val lock = getOrCreateLock(memberId = member.id!!) lock.write { - val roomInfo = getLiveRoomInfo(room.id!!) + val roomInfo = roomInfoRepository.findByIdOrNull(room.id!!) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.addRouletteMessage( @@ -187,7 +167,7 @@ class RouletteService( donationMessage = "[$result] 당첨!" ) - roomInfoRepositoryV2.save(roomInfo) + roomInfoRepository.save(roomInfo) } return SpinRouletteResponse(can = roulette.can, result = result, items = itemList) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index 9290896..82896e4 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -35,9 +35,7 @@ import kr.co.vividnext.sodalive.member.stipulation.StipulationIds import kr.co.vividnext.sodalive.member.stipulation.StipulationRepository import kr.co.vividnext.sodalive.member.tag.MemberCreatorTag import kr.co.vividnext.sodalive.member.tag.MemberTagRepository -import kr.co.vividnext.sodalive.member.token.MemberToken -import kr.co.vividnext.sodalive.redis.v1.MemberTokenRepository -import kr.co.vividnext.sodalive.redis.v2.MemberTokenRepositoryV2 +import kr.co.vividnext.sodalive.member.token.MemberTokenRepository import kr.co.vividnext.sodalive.utils.generateFileName import kr.co.vividnext.sodalive.utils.generatePassword import org.springframework.beans.factory.annotation.Value @@ -64,7 +62,6 @@ import kotlin.concurrent.write class MemberService( private val repository: MemberRepository, private val tokenRepository: MemberTokenRepository, - private val tokenRepositoryV2: MemberTokenRepositoryV2, private val stipulationRepository: StipulationRepository, private val stipulationAgreeRepository: StipulationAgreeRepository, private val creatorFollowingRepository: CreatorFollowingRepository, @@ -438,12 +435,11 @@ class MemberService( val lock = getOrCreateLock(memberId = memberId) lock.write { - val memberToken = saveAndGetTokenById(memberId) + val memberToken = tokenRepository.findByIdOrNull(memberId) + ?: throw SodaException("로그인 정보를 확인해주세요.") - if (memberToken != null) { - memberToken.tokenSet.remove(token) - tokenRepositoryV2.save(memberToken) - } + memberToken.tokenSet.remove(token) + tokenRepository.save(memberToken) } } @@ -455,25 +451,7 @@ class MemberService( member.pushToken = null val lock = getOrCreateLock(memberId = memberId) - lock.write { - tokenRepository.deleteById(memberId) - tokenRepositoryV2.deleteById(memberId) - } - } - - private fun saveAndGetTokenById(id: Long): MemberToken? { - var memberToken = tokenRepositoryV2.findByIdOrNull(id = id) - - if (memberToken == null) { - memberToken = tokenRepository.findByIdOrNull(id = id) - - if (memberToken != null) { - tokenRepositoryV2.save(memberToken) - tokenRepository.delete(memberToken) - } - } - - return memberToken + lock.write { tokenRepository.deleteById(memberId) } } @Transactional diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/MemberTokenRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/token/MemberTokenRepository.kt similarity index 65% rename from src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/MemberTokenRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/member/token/MemberTokenRepository.kt index 0046e05..29808a2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v1/MemberTokenRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/token/MemberTokenRepository.kt @@ -1,6 +1,5 @@ -package kr.co.vividnext.sodalive.redis.v1 +package kr.co.vividnext.sodalive.member.token -import kr.co.vividnext.sodalive.member.token.MemberToken import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomInfoRedisRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomInfoRedisRepositoryV2.kt deleted file mode 100644 index 0e2acd7..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomInfoRedisRepositoryV2.kt +++ /dev/null @@ -1,6 +0,0 @@ -package kr.co.vividnext.sodalive.redis.v2 - -import kr.co.vividnext.sodalive.v2.LiveRoomInfoV2 -import org.springframework.data.repository.CrudRepository - -interface LiveRoomInfoRedisRepositoryV2 : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomKickOutRedisRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomKickOutRedisRepositoryV2.kt deleted file mode 100644 index af7401c..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomKickOutRedisRepositoryV2.kt +++ /dev/null @@ -1,6 +0,0 @@ -package kr.co.vividnext.sodalive.redis.v2 - -import kr.co.vividnext.sodalive.v2.LiveRoomKickOutV2 -import org.springframework.data.repository.CrudRepository - -interface LiveRoomKickOutRedisRepositoryV2 : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomMenuRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomMenuRepositoryV2.kt deleted file mode 100644 index 5d6a5a8..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/LiveRoomMenuRepositoryV2.kt +++ /dev/null @@ -1,8 +0,0 @@ -package kr.co.vividnext.sodalive.redis.v2 - -import kr.co.vividnext.sodalive.live.room.menu.LiveRoomMenu -import org.springframework.data.repository.CrudRepository - -interface LiveRoomMenuRepositoryV2 : CrudRepository { - fun findByCreatorId(creatorId: Long): List -} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/MemberTokenRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/MemberTokenRepositoryV2.kt deleted file mode 100644 index 62cae04..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/MemberTokenRepositoryV2.kt +++ /dev/null @@ -1,8 +0,0 @@ -package kr.co.vividnext.sodalive.redis.v2 - -import kr.co.vividnext.sodalive.member.token.MemberToken -import org.springframework.data.repository.CrudRepository -import org.springframework.stereotype.Repository - -@Repository -interface MemberTokenRepositoryV2 : CrudRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/RouletteRepositoryV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/RouletteRepositoryV2.kt deleted file mode 100644 index ba768f8..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/redis/v2/RouletteRepositoryV2.kt +++ /dev/null @@ -1,8 +0,0 @@ -package kr.co.vividnext.sodalive.redis.v2 - -import kr.co.vividnext.sodalive.v2.RouletteV2 -import org.springframework.data.repository.CrudRepository - -interface RouletteRepositoryV2 : CrudRepository { - fun findByCreatorId(creatorId: Long): List -} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoV2.kt deleted file mode 100644 index b46dfa6..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomInfoV2.kt +++ /dev/null @@ -1,123 +0,0 @@ -package kr.co.vividnext.sodalive.v2 - -import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessage -import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember -import kr.co.vividnext.sodalive.live.room.info.LiveRoomMemberRole -import kr.co.vividnext.sodalive.member.Member -import org.springframework.data.annotation.Id -import org.springframework.data.redis.core.RedisHash - -@RedisHash("LiveRoomInfo") -data class LiveRoomInfoV2( - @Id - val roomId: Long, - var speakerList: List = mutableListOf(), - var listenerList: List = mutableListOf(), - var managerList: List = mutableListOf(), - var donationMessageList: List = mutableListOf() -) { - var speakerCount = 0 - private set - - var listenerCount = 0 - private set - - var managerCount = 0 - private set - - fun addSpeaker(member: Member, cloudFrontHost: String) { - val liveRoomMember = LiveRoomMember(member, cloudFrontHost) - liveRoomMember.role = LiveRoomMemberRole.SPEAKER - - val speakerSet = speakerList.toMutableSet() - speakerSet.add(liveRoomMember) - speakerList = speakerSet.toList() - - setSpeakerCount() - } - - fun removeSpeaker(member: Member) { - (speakerList as MutableList).removeIf { it.id == member.id!! } - setSpeakerCount() - } - - private fun setSpeakerCount() { - speakerCount = speakerList.size - } - - fun addListener(member: Member, cloudFrontHost: String) { - val liveRoomMember = LiveRoomMember(member, cloudFrontHost) - liveRoomMember.role = LiveRoomMemberRole.LISTENER - - val listenerSet = listenerList.toMutableSet() - listenerSet.add(liveRoomMember) - listenerList = listenerSet.toList() - - setListenerCount() - } - - fun removeListener(member: Member) { - (listenerList as MutableList).removeIf { it.id == member.id!! } - setListenerCount() - } - - private fun setListenerCount() { - listenerCount = listenerList.size - } - - fun addManager(member: Member, cloudFrontHost: String) { - val liveRoomMember = LiveRoomMember(member, cloudFrontHost) - liveRoomMember.role = LiveRoomMemberRole.MANAGER - - val managerSet = managerList.toMutableSet() - managerSet.add(liveRoomMember) - managerList = managerSet.toList() - - setManagerCount() - } - - fun removeManager(member: Member) { - (managerList as MutableList).removeIf { it.id == member.id!! } - setManagerCount() - } - - private fun setManagerCount() { - managerCount = managerList.size - } - - fun addDonationMessage(memberId: Long, nickname: String, isSecret: Boolean, can: Int, donationMessage: String) { - val donationMessageSet = donationMessageList.toMutableSet() - donationMessageSet.add( - LiveRoomDonationMessage( - memberId = memberId, - nickname = nickname, - isSecret = isSecret, - canMessage = if (isSecret) { - "${can}캔으로 비밀미션을 보냈습니다." - } else { - "${can}캔을 후원하셨습니다." - }, - donationMessage = donationMessage - ) - ) - donationMessageList = donationMessageSet.toList() - } - - fun addRouletteMessage(memberId: Long, nickname: String, donationMessage: String) { - val donationMessageSet = donationMessageList.toMutableSet() - donationMessageSet.add( - LiveRoomDonationMessage( - memberId = memberId, - nickname = nickname, - isSecret = false, - canMessage = "", - donationMessage = donationMessage - ) - ) - donationMessageList = donationMessageSet.toList() - } - - fun removeDonationMessage(uuid: String) { - (donationMessageList as MutableList).removeIf { it.uuid == uuid } - } -} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutV2.kt deleted file mode 100644 index fb48c29..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/LiveRoomKickOutV2.kt +++ /dev/null @@ -1,24 +0,0 @@ -package kr.co.vividnext.sodalive.v2 - -import kr.co.vividnext.sodalive.live.room.kickout.LiveRoomKickOutUser -import org.springframework.data.annotation.Id -import org.springframework.data.redis.core.RedisHash - -@RedisHash("LiveRoomKickOut") -data class LiveRoomKickOutV2( - @Id - val roomId: Long, - var userList: MutableList = mutableListOf() -) { - fun kickOut(userId: Long) { - var liveRoomKickOutUser = userList.find { it.userId == userId } - if (liveRoomKickOutUser == null) { - liveRoomKickOutUser = LiveRoomKickOutUser(userId) - } else { - liveRoomKickOutUser.plusCount() - } - - userList.removeIf { it.userId == userId } - userList.add(liveRoomKickOutUser) - } -} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteV2.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteV2.kt deleted file mode 100644 index 59ecd35..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/RouletteV2.kt +++ /dev/null @@ -1,17 +0,0 @@ -package kr.co.vividnext.sodalive.v2 - -import kr.co.vividnext.sodalive.live.roulette.RouletteItem -import org.springframework.data.redis.core.RedisHash -import org.springframework.data.redis.core.index.Indexed -import javax.persistence.Id - -@RedisHash("Roulette") -data class RouletteV2( - @Id - val id: Long, - @Indexed - val creatorId: Long, - var can: Int, - var isActive: Boolean, - var items: List = mutableListOf() -) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f53882b..6dc7c92 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -52,14 +52,6 @@ jwt: secret: ${JWT_SECRET} spring: - data: - redis: - repositories: - enabled: false - valkey: - host: ${VALKEY_HOST} - port: ${VALKEY_PORT} - redis: host: ${REDIS_HOST} port: ${REDIS_PORT} From fcae1b67709e7cec159d201b5c4361faa2d1468b Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 24 Nov 2024 01:48:17 +0900 Subject: [PATCH 12/13] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20-=2050=EC=BA=94=20=EC=9D=B4=EC=83=81=EC=9D=98=20?= =?UTF-8?q?=EC=9C=A0=EB=A3=8C=EC=BD=98=ED=85=90=EC=B8=A0=EB=8A=94=20?= =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=84=A4=EB=AA=85=EC=9D=84=20?= =?UTF-8?q?=EC=88=A8=EA=B8=B8=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?isFullDetailVisible=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/content/AudioContent.kt | 3 ++- .../co/vividnext/sodalive/content/AudioContentService.kt | 9 ++++++++- .../sodalive/content/CreateAudioContentRequest.kt | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt index 2b6c768..688ac4d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt @@ -41,7 +41,8 @@ data class AudioContent( val isGeneratePreview: Boolean = true, var isOnlyRental: Boolean = false, var isAdult: Boolean = false, - var isCommentAvailable: Boolean = true + var isCommentAvailable: Boolean = true, + var isFullDetailVisible: Boolean = true ) : BaseEntity() { var isActive: Boolean = false var content: String? = null diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index 30d9b39..db03f60 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -178,6 +178,12 @@ class AudioContentService( request.isOnlyRental } + val isFullDetailVisible = if (request.price >= 50) { + request.isFullDetailVisible + } else { + true + } + // DB에 값 추가 val audioContent = AudioContent( title = request.title, @@ -194,7 +200,8 @@ class AudioContentService( purchaseOption = request.purchaseOption, isGeneratePreview = request.isGeneratePreview, isOnlyRental = isOnlyRental, - isCommentAvailable = request.isCommentAvailable + isCommentAvailable = request.isCommentAvailable, + isFullDetailVisible = isFullDetailVisible ) audioContent.theme = theme audioContent.member = member diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt index 3c4e6bf..08ae03c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt @@ -14,6 +14,7 @@ data class CreateAudioContentRequest( val isGeneratePreview: Boolean = false, val isOnlyRental: Boolean = false, val isCommentAvailable: Boolean = false, + val isFullDetailVisible: Boolean = true, val previewStartTime: String? = null, val previewEndTime: String? = null ) From 84804d32ad803e1ad1a061f3810ec96b50b7c8c2 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 24 Nov 2024 02:02:50 +0900 Subject: [PATCH 13/13] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20-=2050=EC=BA=94=20=EC=9D=B4=EC=83=81=EC=9D=98=20?= =?UTF-8?q?=EC=9C=A0=EB=A3=8C=EC=BD=98=ED=85=90=EC=B8=A0=EC=9D=B4=EA=B3=A0?= =?UTF-8?q?=20=EA=B5=AC=EB=A7=A4=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20?= =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=9D=B4=EA=B3=A0=20isFullDetail?= =?UTF-8?q?Visible=EA=B0=80=20false=EC=9D=B4=EB=A9=B4=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EC=84=A4=EB=AA=85=EC=9D=B4=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?10=EA=B8=80=EC=9E=90=EA=B9=8C=EC=A7=80=EB=A7=8C=20=EB=B3=B4?= =?UTF-8?q?=EC=9D=B4=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/content/AudioContentService.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index db03f60..984427a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -596,10 +596,26 @@ class AudioContentService( audioContent.purchaseOption } + val contentDetail = if ( + audioContent.price >= 50 && + !isExistsAudioContent && + !audioContent.isFullDetailVisible + ) { + val length = audioContent.detail.length + + if (length < 20) { + "${audioContent.detail.take(length / 2)}..." + } else { + "${audioContent.detail.take(10)}..." + } + } else { + audioContent.detail + } + return GetAudioContentDetailResponse( contentId = audioContent.id!!, title = audioContent.title, - detail = audioContent.detail, + detail = contentDetail, coverImageUrl = "$coverImageHost/${audioContent.coverImage!!}", contentUrl = audioContentUrl, themeStr = audioContent.theme!!.theme,