From 8beeb096e769654f390c883fe81ee9f7e2c7f5af Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sat, 17 Jun 2023 08:41:04 +0900 Subject: [PATCH 01/25] =?UTF-8?q?feat:=20(#523)=20topic=20=EA=B5=AC?= =?UTF-8?q?=EB=8F=85=20=EC=A1=B0=ED=9A=8C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/TopicSubscribeResponse.kt | 12 +++++ .../service/NotificationService.kt | 4 ++ .../service/NotificationServiceImpl.kt | 18 ++++++++ .../usecase/QueryTopicSubscribesUseCase.kt | 17 +++++++ .../dms/global/security/SecurityConfig.kt | 8 ++-- .../TopicSubscribePersistenceAdapter.kt | 46 +++++++++++++++++++ .../notification/NotificationWebAdapter.kt | 11 ++++- 7 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt create mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt create mode 100644 dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt new file mode 100644 index 000000000..339c119e0 --- /dev/null +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt @@ -0,0 +1,12 @@ +package team.aliens.dms.domain.notification.dto + +import team.aliens.dms.domain.notification.model.Topic + +data class TopicSubscribesResponse( + val topicSubscribes: List +) + +data class TopicSubscribeResponse( + val topic: Topic, + val isSubscribed: Boolean +) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt index 846055a1a..7cafe0a3a 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt @@ -1,8 +1,10 @@ package team.aliens.dms.domain.notification.service +import team.aliens.dms.domain.notification.dto.TopicSubscribeResponse import team.aliens.dms.domain.notification.model.DeviceToken import team.aliens.dms.domain.notification.model.Notification import team.aliens.dms.domain.notification.model.Topic +import java.util.UUID interface NotificationService { @@ -24,4 +26,6 @@ interface NotificationService { fun sendMessagesByTopic( notification: Notification ) + + fun getTopicSubscribesByUserId(userId: UUID): List } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index c7ac6b2f9..e8db90416 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -75,4 +75,22 @@ class NotificationServiceImpl( notification = notification ) } + + override fun getTopicSubscribesByUserId(userId: UUID): List { + return topicSubscribePort.queryTopicSubscribesByUserId(userId).map { + TopicSubscribeResponse( + topic = it.topic, + isSubscribed = true + ) + }.toMutableList().also { + Topic.values().forEach { topic -> + it.add( + TopicSubscribeResponse( + topic = topic, + isSubscribed = false + ) + ) + } + } + } } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt new file mode 100644 index 000000000..cc5599220 --- /dev/null +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt @@ -0,0 +1,17 @@ +package team.aliens.dms.domain.notification.usecase + +import team.aliens.dms.common.annotation.ReadOnlyUseCase +import team.aliens.dms.domain.notification.dto.TopicSubscribesResponse +import team.aliens.dms.domain.notification.service.NotificationService + +@ReadOnlyUseCase +class QueryTopicSubscribesUseCase( + private val notificationService: NotificationService +) { + + fun execute(deviceToken: String): TopicSubscribesResponse { + return TopicSubscribesResponse( + notificationService.getTopicSubscribesByDeviceToken(deviceToken) + ) + } +} diff --git a/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/security/SecurityConfig.kt b/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/security/SecurityConfig.kt index 6258a67c3..696540797 100644 --- a/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/security/SecurityConfig.kt +++ b/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/security/SecurityConfig.kt @@ -141,10 +141,12 @@ class SecurityConfig( .antMatchers(HttpMethod.GET, "/remains/available-time").hasAnyAuthority(STUDENT.name, MANAGER.name) .antMatchers(HttpMethod.DELETE, "/remains/options/{remain-option-id}").hasAuthority(MANAGER.name) .antMatchers(HttpMethod.GET, "/remains/status/file").hasAuthority(MANAGER.name) - .antMatchers(HttpMethod.GET, "/notifications/token").authenticated() + // /notification + .antMatchers(HttpMethod.POST, "/notifications/token").authenticated() .antMatchers(HttpMethod.POST, "/notifications/topic").authenticated() - .antMatchers(HttpMethod.DELETE, "/notifications/token").authenticated() - .antMatchers(HttpMethod.PATCH, "/notifications/token").authenticated() + .antMatchers(HttpMethod.DELETE, "/notifications/topic").authenticated() + .antMatchers(HttpMethod.GET, "/notifications/topic").authenticated() + .antMatchers(HttpMethod.PATCH, "/notifications/topic").authenticated() .anyRequest().denyAll() http diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt new file mode 100644 index 000000000..fea74a708 --- /dev/null +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt @@ -0,0 +1,46 @@ +package team.aliens.dms.persistence.notification + +import org.springframework.stereotype.Component +import team.aliens.dms.domain.notification.model.Topic +import team.aliens.dms.domain.notification.model.TopicSubscribe +import team.aliens.dms.domain.notification.spi.TopicSubscribePort +import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntityId +import team.aliens.dms.persistence.notification.mapper.TopicSubscribeMapper +import team.aliens.dms.persistence.notification.repository.TopicSubscribeJpaRepository +import java.util.UUID + +@Component +class TopicSubscribePersistenceAdapter( + private val topicSubscribeMapper: TopicSubscribeMapper, + private val topicSubscribeRepository: TopicSubscribeJpaRepository +) : TopicSubscribePort { + + override fun saveTopicSubscribe(topicSubscribe: TopicSubscribe) = topicSubscribeMapper.toDomain( + topicSubscribeRepository.save( + topicSubscribeMapper.toEntity(topicSubscribe) + ) + )!! + + override fun saveAllTopicSubscribes(topicSubscribes: List) { + topicSubscribeRepository.saveAll( + topicSubscribes.map { + topicSubscribeMapper.toEntity(it) + } + ) + } + + override fun deleteByUserIdAndTopics(userId: UUID, topics: List) { + topicSubscribeRepository.deleteAllById( + topics.map { + TopicSubscribeJpaEntityId( + deviceTokenId = userId, + topic = it + ) + } + ) + } + + override fun queryTopicSubscribesByDeviceTokenId(deviceTokenId: UUID) = + topicSubscribeRepository.findByDeviceTokenId(deviceTokenId) + .map { topicSubscribeMapper.toDomain(it)!! } +} diff --git a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt index f8dbaea0f..84004a076 100644 --- a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt +++ b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt @@ -2,15 +2,18 @@ package team.aliens.dms.domain.notification import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PatchMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController import team.aliens.dms.domain.notification.dto.SetDeviceTokenRequest +import team.aliens.dms.domain.notification.dto.TopicSubscribesResponse import team.aliens.dms.domain.notification.dto.request.DeviceTokenRequest import team.aliens.dms.domain.notification.dto.request.TopicRequest import team.aliens.dms.domain.notification.dto.request.UpdateTopicSubscribesWebRequest +import team.aliens.dms.domain.notification.usecase.QueryTopicSubscribesUseCase import team.aliens.dms.domain.notification.usecase.SetDeviceTokenUseCase import team.aliens.dms.domain.notification.usecase.SubscribeTopicUseCase import team.aliens.dms.domain.notification.usecase.UnsubscribeTopicUseCase @@ -24,7 +27,8 @@ class NotificationWebAdapter( private val setDeviceTokenUseCase: SetDeviceTokenUseCase, private val subscribeTopicUseCase: SubscribeTopicUseCase, private val unsubscribeTopicUseCase: UnsubscribeTopicUseCase, - private val updateTopicSubscribesUseCase: UpdateTopicSubscribesUseCase + private val updateTopicSubscribesUseCase: UpdateTopicSubscribesUseCase, + private val queryTopicSubscribesUseCase: QueryTopicSubscribesUseCase ) { @PostMapping("/token") @@ -57,4 +61,9 @@ class NotificationWebAdapter( topicsToSubscribe = request.topicsToSubscribe.map { it.toPair() } ) } + + @GetMapping("/topic") + fun queryTopicSubscribes(@RequestBody @Valid request: DeviceTokenRequest): TopicSubscribesResponse { + return queryTopicSubscribesUseCase.execute(request.deviceToken) + } } From d2668416e53d471615d04a24cdb5f4d64af0cb4d Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sat, 17 Jun 2023 08:44:25 +0900 Subject: [PATCH 02/25] feat: (#523) topicSubscribe Domain & Entity setting . --- .../notification/model/TopicSubscribe.kt | 11 +++++ .../service/NotificationService.kt | 3 +- .../service/NotificationServiceImpl.kt | 33 +++++++++++--- .../notification/spi/TopicSubscribePort.kt | 16 +++++++ .../entity/TopicSubscribeJpaEntity.kt | 43 +++++++++++++++++++ .../mapper/TopicSubscribeMapper.kt | 38 ++++++++++++++++ .../repository/TopicSubscribeJpaRepository.kt | 12 ++++++ 7 files changed, 147 insertions(+), 9 deletions(-) create mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt create mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt create mode 100644 dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt create mode 100644 dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt create mode 100644 dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt new file mode 100644 index 000000000..bb0e083fe --- /dev/null +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt @@ -0,0 +1,11 @@ +package team.aliens.dms.domain.notification.model + +import java.util.UUID + +class TopicSubscribe( + + val deviceTokenId: UUID, + + val topic: Topic + +) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt index 7cafe0a3a..437bbd5dd 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt @@ -4,7 +4,6 @@ import team.aliens.dms.domain.notification.dto.TopicSubscribeResponse import team.aliens.dms.domain.notification.model.DeviceToken import team.aliens.dms.domain.notification.model.Notification import team.aliens.dms.domain.notification.model.Topic -import java.util.UUID interface NotificationService { @@ -27,5 +26,5 @@ interface NotificationService { notification: Notification ) - fun getTopicSubscribesByUserId(userId: UUID): List + fun getTopicSubscribesByDeviceToken(deviceToken: String): List } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index e8db90416..62ed21e6e 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -7,6 +7,8 @@ import team.aliens.dms.domain.notification.model.Notification import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.spi.DeviceTokenPort import team.aliens.dms.domain.notification.spi.NotificationPort +import team.aliens.dms.domain.notification.spi.TopicSubscribePort +import java.util.UUID @Component class NotificationServiceImpl( @@ -22,6 +24,13 @@ class NotificationServiceImpl( } override fun subscribeTopic(deviceToken: String, topic: Topic) { + val savedToken = this.getDeviceTokenByDeviceToken(deviceToken) + topicSubscribePort.saveTopicSubscribe( + TopicSubscribe( + deviceTokenId = savedToken.id, + topic = topic + ) + ) notificationPort.subscribeTopic( deviceToken = this.getDeviceTokenByDeviceToken(deviceToken).deviceToken, topic = topic @@ -29,6 +38,13 @@ class NotificationServiceImpl( } override fun unsubscribeTopic(deviceToken: String, topic: Topic) { + val savedToken = this.getDeviceTokenByDeviceToken(deviceToken) + topicSubscribePort.saveTopicSubscribe( + TopicSubscribe( + deviceTokenId = savedToken.id, + topic = topic + ) + ) notificationPort.unsubscribeTopic( deviceToken = this.getDeviceTokenByDeviceToken(deviceToken).deviceToken, topic = topic @@ -76,20 +92,23 @@ class NotificationServiceImpl( ) } - override fun getTopicSubscribesByUserId(userId: UUID): List { - return topicSubscribePort.queryTopicSubscribesByUserId(userId).map { + override fun getTopicSubscribesByDeviceToken(deviceToken: String): List { + val savedToken = getDeviceTokenByDeviceToken(deviceToken) + return topicSubscribePort.queryTopicSubscribesByDeviceTokenId(savedToken.id).map { TopicSubscribeResponse( topic = it.topic, isSubscribed = true ) }.toMutableList().also { Topic.values().forEach { topic -> - it.add( - TopicSubscribeResponse( - topic = topic, - isSubscribed = false + if (!it.any { it.topic == topic }) { + it.add( + TopicSubscribeResponse( + topic = topic, + isSubscribed = false + ) ) - ) + } } } } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt new file mode 100644 index 000000000..83b9fdab8 --- /dev/null +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt @@ -0,0 +1,16 @@ +package team.aliens.dms.domain.notification.spi + +import java.util.UUID +import team.aliens.dms.domain.notification.model.Topic +import team.aliens.dms.domain.notification.model.TopicSubscribe + +interface TopicSubscribePort { + + fun saveTopicSubscribe(topicSubscribe: TopicSubscribe): TopicSubscribe + + fun queryTopicSubscribesByDeviceTokenId(deviceTokenId: UUID): List + + fun saveAllTopicSubscribes(topicSubscribes: List) + + fun deleteByUserIdAndTopics(userId: UUID, topics: List) +} diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt new file mode 100644 index 000000000..5e13384a3 --- /dev/null +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt @@ -0,0 +1,43 @@ +package team.aliens.dms.persistence.notification.entity + +import java.io.Serializable +import java.util.UUID +import javax.persistence.Column +import javax.persistence.Embeddable +import javax.persistence.EmbeddedId +import javax.persistence.Entity +import javax.persistence.EnumType +import javax.persistence.Enumerated +import javax.persistence.FetchType +import javax.persistence.JoinColumn +import javax.persistence.ManyToOne +import javax.persistence.MapsId +import javax.persistence.Table +import team.aliens.dms.domain.notification.model.Topic + +@Entity +@Table(name = "tbl_topic_subscribe") +class TopicSubscribeJpaEntity( + + @EmbeddedId + val id: TopicSubscribeJpaEntityId, + + @MapsId("deviceTokenId") + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "device_token_id", columnDefinition = "BINARY(16)", nullable = false) + val deviceToken: DeviceTokenJpaEntity + +) + +@Embeddable +data class TopicSubscribeJpaEntityId( + + @Column + val deviceTokenId: UUID, + + @MapsId("topic") + @Enumerated(EnumType.STRING) + @Column(columnDefinition = "VARCHAR(20)", nullable = false) + val topic: Topic + +) : Serializable diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt new file mode 100644 index 000000000..1c4d2ddb1 --- /dev/null +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt @@ -0,0 +1,38 @@ +package team.aliens.dms.persistence.notification.mapper + +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Component +import team.aliens.dms.domain.notification.exception.DeviceTokenNotFoundException +import team.aliens.dms.domain.notification.model.TopicSubscribe +import team.aliens.dms.persistence.GenericMapper +import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntity +import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntityId +import team.aliens.dms.persistence.notification.repository.DeviceTokenJpaRepository + +@Component +class TopicSubscribeMapper( + private val deviceTokenRepository: DeviceTokenJpaRepository +) : GenericMapper { + + override fun toDomain(entity: TopicSubscribeJpaEntity?): TopicSubscribe? { + return entity?.let { + TopicSubscribe( + deviceTokenId = it.deviceToken.id!!, + topic = it.id.topic + ) + } + } + + override fun toEntity(domain: TopicSubscribe): TopicSubscribeJpaEntity { + + val deviceToken = deviceTokenRepository.findByIdOrNull(domain.deviceTokenId) ?: throw DeviceTokenNotFoundException + + return TopicSubscribeJpaEntity( + id = TopicSubscribeJpaEntityId( + deviceTokenId = domain.deviceTokenId, + topic = domain.topic + ), + deviceToken = deviceToken + ) + } +} diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt new file mode 100644 index 000000000..9abcf2b73 --- /dev/null +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt @@ -0,0 +1,12 @@ +package team.aliens.dms.persistence.notification.repository + +import java.util.UUID +import org.springframework.data.repository.CrudRepository +import org.springframework.stereotype.Repository +import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntity +import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntityId + +@Repository +interface TopicSubscribeJpaRepository : CrudRepository { + fun findByDeviceTokenId(deviceTokenId: UUID): List +} From db8c6faad141787e2b5c350662151b72fb16838c Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Fri, 16 Jun 2023 22:28:22 +0900 Subject: [PATCH 03/25] =?UTF-8?q?feat:=20(#523)=20tokenSubscribe=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/NotificationServiceImpl.kt | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index 62ed21e6e..956bade58 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -1,10 +1,12 @@ package team.aliens.dms.domain.notification.service import org.springframework.stereotype.Component +import team.aliens.dms.domain.notification.dto.TopicSubscribeResponse import team.aliens.dms.domain.notification.exception.DeviceTokenNotFoundException import team.aliens.dms.domain.notification.model.DeviceToken import team.aliens.dms.domain.notification.model.Notification import team.aliens.dms.domain.notification.model.Topic +import team.aliens.dms.domain.notification.model.TopicSubscribe import team.aliens.dms.domain.notification.spi.DeviceTokenPort import team.aliens.dms.domain.notification.spi.NotificationPort import team.aliens.dms.domain.notification.spi.TopicSubscribePort @@ -13,6 +15,7 @@ import java.util.UUID @Component class NotificationServiceImpl( private val notificationPort: NotificationPort, + private val topicSubscribePort: TopicSubscribePort, private val deviceTokenPort: DeviceTokenPort ) : NotificationService { @@ -38,35 +41,42 @@ class NotificationServiceImpl( } override fun unsubscribeTopic(deviceToken: String, topic: Topic) { - val savedToken = this.getDeviceTokenByDeviceToken(deviceToken) - topicSubscribePort.saveTopicSubscribe( - TopicSubscribe( - deviceTokenId = savedToken.id, - topic = topic - ) - ) notificationPort.unsubscribeTopic( - deviceToken = this.getDeviceTokenByDeviceToken(deviceToken).deviceToken, + deviceToken = deviceToken, topic = topic ) } override fun updateSubscribes(deviceToken: String, topicsToSubscribe: List>) { - val deviceToken = this.getDeviceTokenByDeviceToken(deviceToken) + val savedToken = this.getDeviceTokenByDeviceToken(deviceToken) + + val subscribes = mutableListOf() + val unsubscribes = mutableListOf() + topicsToSubscribe.forEach { (topic, isSubscribe) -> if (isSubscribe) { notificationPort.subscribeTopic( - deviceToken = deviceToken.deviceToken, + deviceToken = deviceToken, topic = topic ) + subscribes.add(topic) } else { notificationPort.unsubscribeTopic( - deviceToken = deviceToken.deviceToken, + deviceToken = deviceToken, topic = topic ) + unsubscribes.add(topic) } } + + topicSubscribePort.saveAllTopicSubscribes( + subscribes.map { TopicSubscribe(savedToken.id, it) } + ) + topicSubscribePort.deleteByUserIdAndTopics( + userId = savedToken.id, + topics = unsubscribes + ) } private fun getDeviceTokenByDeviceToken(deviceToken: String) = From bd88fc95982ae4bdb22539174d4205d390cb9ba2 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sat, 17 Jun 2023 08:43:18 +0900 Subject: [PATCH 04/25] =?UTF-8?q?chore:=20(#523)=20readOnly=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dms/domain/notification/usecase/SubscribeTopicUseCase.kt | 4 ++-- .../domain/notification/usecase/UnsubscribeTopicUseCase.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/SubscribeTopicUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/SubscribeTopicUseCase.kt index c383eac56..2a25f5c4d 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/SubscribeTopicUseCase.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/SubscribeTopicUseCase.kt @@ -1,10 +1,10 @@ package team.aliens.dms.domain.notification.usecase -import team.aliens.dms.common.annotation.ReadOnlyUseCase +import team.aliens.dms.common.annotation.UseCase import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.service.NotificationService -@ReadOnlyUseCase +@UseCase class SubscribeTopicUseCase( private val notificationService: NotificationService ) { diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UnsubscribeTopicUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UnsubscribeTopicUseCase.kt index b099df27f..83056d945 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UnsubscribeTopicUseCase.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UnsubscribeTopicUseCase.kt @@ -1,10 +1,10 @@ package team.aliens.dms.domain.notification.usecase -import team.aliens.dms.common.annotation.ReadOnlyUseCase +import team.aliens.dms.common.annotation.UseCase import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.service.NotificationService -@ReadOnlyUseCase +@UseCase class UnsubscribeTopicUseCase( private val notificationService: NotificationService ) { From d6fb0f8f8717dfb4675b59c7472659e708563f5b Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sat, 17 Jun 2023 15:44:26 +0900 Subject: [PATCH 05/25] feat: (#523) topic group --- .../dto/TopicSubscribeResponse.kt | 37 ++++++++++++++++++- .../dms/domain/notification/model/Topic.kt | 29 ++++++++++++++- .../service/NotificationService.kt | 4 +- .../service/NotificationServiceImpl.kt | 22 +---------- .../usecase/QueryTopicSubscribesUseCase.kt | 6 +-- .../notification/NotificationWebAdapter.kt | 4 +- 6 files changed, 72 insertions(+), 30 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt index 339c119e0..6cc12be5a 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt @@ -1,12 +1,47 @@ package team.aliens.dms.domain.notification.dto import team.aliens.dms.domain.notification.model.Topic +import team.aliens.dms.domain.notification.model.TopicGroup +import team.aliens.dms.domain.notification.model.TopicSubscribe -data class TopicSubscribesResponse( +data class TopicSubscribeGroupsResponse( + val topicGroups: List +) { + companion object { + fun of(topicSubscribes: List) = TopicSubscribeGroupsResponse( + TopicGroup.values() + .associateWith { mutableListOf() } + .also { topicGroups -> + val topicSubscribesSet = topicSubscribes + .map { it.topic } + .toSet() + Topic.values().forEach { + topicGroups[it.topicGroup]?.add( + TopicSubscribeResponse( + topic = it, + isSubscribed = topicSubscribesSet.contains(it) + ) + ) + } + } + .map { topicGroup -> + TopicGroupSubscribeResponse( + topicGroup = topicGroup.key, + topicSubscribes = topicGroup.value + ) + } + ) + } +} + +data class TopicGroupSubscribeResponse( + val topicGroup: TopicGroup, val topicSubscribes: List ) data class TopicSubscribeResponse( val topic: Topic, + val title: String = topic.title, + val description: String = topic.content, val isSubscribed: Boolean ) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt index f2ded69e4..0b57ae129 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt @@ -1,5 +1,30 @@ package team.aliens.dms.domain.notification.model -enum class Topic { - NOTICE + +enum class TopicGroup { + NOTICE, + STUDY_ROOM } + +enum class Topic( + val topicGroup: TopicGroup, + val title: String, + val content: String +) { + NOTICE( + topicGroup = TopicGroup.NOTICE, + title = "공지 알림", + content = "기숙사 공지에 대한 알림입니다." + ), + + STUDY_ROOM_TIME_SLOT( + topicGroup = TopicGroup.STUDY_ROOM, + title = "이용 시간 알림", + content = "자습실 이용 시작 10분 전에 알림을 발송합니다." + ), + STUDY_ROOM_APPLY( + topicGroup = TopicGroup.STUDY_ROOM, + title = "신청 시간 알림", + content = "자습실 신청 시간을 알리는 알림입니다." + ); +} \ No newline at end of file diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt index 437bbd5dd..7f30d67c7 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt @@ -1,9 +1,9 @@ package team.aliens.dms.domain.notification.service -import team.aliens.dms.domain.notification.dto.TopicSubscribeResponse import team.aliens.dms.domain.notification.model.DeviceToken import team.aliens.dms.domain.notification.model.Notification import team.aliens.dms.domain.notification.model.Topic +import team.aliens.dms.domain.notification.model.TopicSubscribe interface NotificationService { @@ -26,5 +26,5 @@ interface NotificationService { notification: Notification ) - fun getTopicSubscribesByDeviceToken(deviceToken: String): List + fun getTopicSubscribesByDeviceToken(deviceToken: String): List } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index 956bade58..a9aab7c48 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -1,7 +1,6 @@ package team.aliens.dms.domain.notification.service import org.springframework.stereotype.Component -import team.aliens.dms.domain.notification.dto.TopicSubscribeResponse import team.aliens.dms.domain.notification.exception.DeviceTokenNotFoundException import team.aliens.dms.domain.notification.model.DeviceToken import team.aliens.dms.domain.notification.model.Notification @@ -10,7 +9,6 @@ import team.aliens.dms.domain.notification.model.TopicSubscribe import team.aliens.dms.domain.notification.spi.DeviceTokenPort import team.aliens.dms.domain.notification.spi.NotificationPort import team.aliens.dms.domain.notification.spi.TopicSubscribePort -import java.util.UUID @Component class NotificationServiceImpl( @@ -102,24 +100,8 @@ class NotificationServiceImpl( ) } - override fun getTopicSubscribesByDeviceToken(deviceToken: String): List { + override fun getTopicSubscribesByDeviceToken(deviceToken: String): List { val savedToken = getDeviceTokenByDeviceToken(deviceToken) - return topicSubscribePort.queryTopicSubscribesByDeviceTokenId(savedToken.id).map { - TopicSubscribeResponse( - topic = it.topic, - isSubscribed = true - ) - }.toMutableList().also { - Topic.values().forEach { topic -> - if (!it.any { it.topic == topic }) { - it.add( - TopicSubscribeResponse( - topic = topic, - isSubscribed = false - ) - ) - } - } - } + return topicSubscribePort.queryTopicSubscribesByDeviceTokenId(savedToken.id) } } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt index cc5599220..d72250b47 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt @@ -1,7 +1,7 @@ package team.aliens.dms.domain.notification.usecase import team.aliens.dms.common.annotation.ReadOnlyUseCase -import team.aliens.dms.domain.notification.dto.TopicSubscribesResponse +import team.aliens.dms.domain.notification.dto.TopicSubscribeGroupsResponse import team.aliens.dms.domain.notification.service.NotificationService @ReadOnlyUseCase @@ -9,8 +9,8 @@ class QueryTopicSubscribesUseCase( private val notificationService: NotificationService ) { - fun execute(deviceToken: String): TopicSubscribesResponse { - return TopicSubscribesResponse( + fun execute(deviceToken: String): TopicSubscribeGroupsResponse { + return TopicSubscribeGroupsResponse.of( notificationService.getTopicSubscribesByDeviceToken(deviceToken) ) } diff --git a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt index 84004a076..5cd0a4667 100644 --- a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt +++ b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt @@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController import team.aliens.dms.domain.notification.dto.SetDeviceTokenRequest -import team.aliens.dms.domain.notification.dto.TopicSubscribesResponse +import team.aliens.dms.domain.notification.dto.TopicSubscribeGroupsResponse import team.aliens.dms.domain.notification.dto.request.DeviceTokenRequest import team.aliens.dms.domain.notification.dto.request.TopicRequest import team.aliens.dms.domain.notification.dto.request.UpdateTopicSubscribesWebRequest @@ -63,7 +63,7 @@ class NotificationWebAdapter( } @GetMapping("/topic") - fun queryTopicSubscribes(@RequestBody @Valid request: DeviceTokenRequest): TopicSubscribesResponse { + fun queryTopicSubscribes(@RequestBody @Valid request: DeviceTokenRequest): TopicSubscribeGroupsResponse { return queryTopicSubscribesUseCase.execute(request.deviceToken) } } From 4f763af3a4b1b5741e089fd785e3073d59a048d0 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sun, 18 Jun 2023 13:15:51 +0900 Subject: [PATCH 06/25] =?UTF-8?q?refactor:=20(#523)=20=EC=A7=81=EA=B4=80?= =?UTF-8?q?=EC=A0=81=EC=9D=B8=20=EB=B3=80=EC=88=98=EB=AA=85=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/NotificationServiceImpl.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index a9aab7c48..eb779da57 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -25,10 +25,10 @@ class NotificationServiceImpl( } override fun subscribeTopic(deviceToken: String, topic: Topic) { - val savedToken = this.getDeviceTokenByDeviceToken(deviceToken) + val savedDeviceToken = this.getDeviceTokenByDeviceToken(deviceToken) topicSubscribePort.saveTopicSubscribe( TopicSubscribe( - deviceTokenId = savedToken.id, + deviceTokenId = savedDeviceToken.id, topic = topic ) ) @@ -47,10 +47,10 @@ class NotificationServiceImpl( override fun updateSubscribes(deviceToken: String, topicsToSubscribe: List>) { - val savedToken = this.getDeviceTokenByDeviceToken(deviceToken) + val savedDeviceToken = this.getDeviceTokenByDeviceToken(deviceToken) - val subscribes = mutableListOf() - val unsubscribes = mutableListOf() + val subscribeTopics = mutableListOf() + val unsubscribeTopics = mutableListOf() topicsToSubscribe.forEach { (topic, isSubscribe) -> if (isSubscribe) { @@ -58,22 +58,22 @@ class NotificationServiceImpl( deviceToken = deviceToken, topic = topic ) - subscribes.add(topic) + subscribeTopics.add(topic) } else { notificationPort.unsubscribeTopic( deviceToken = deviceToken, topic = topic ) - unsubscribes.add(topic) + unsubscribeTopics.add(topic) } } topicSubscribePort.saveAllTopicSubscribes( - subscribes.map { TopicSubscribe(savedToken.id, it) } + subscribeTopics.map { TopicSubscribe(savedDeviceToken.id, it) } ) topicSubscribePort.deleteByUserIdAndTopics( - userId = savedToken.id, - topics = unsubscribes + userId = savedDeviceToken.id, + topics = unsubscribeTopics ) } From 2dd47d2de119447be08a0a7dca2d5c22f24da7dd Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sun, 18 Jun 2023 13:22:54 +0900 Subject: [PATCH 07/25] =?UTF-8?q?refactor:=20(#523)=20TopicGroupsResponse?= =?UTF-8?q?=20=EB=B0=98=ED=99=98=20=EB=A1=9C=EC=A7=81=20=EA=B0=80=EB=8F=85?= =?UTF-8?q?=EC=84=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/TopicSubscribeResponse.kt | 54 ++++++++++++------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt index 6cc12be5a..2c16354b7 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt @@ -8,29 +8,43 @@ data class TopicSubscribeGroupsResponse( val topicGroups: List ) { companion object { - fun of(topicSubscribes: List) = TopicSubscribeGroupsResponse( - TopicGroup.values() - .associateWith { mutableListOf() } - .also { topicGroups -> - val topicSubscribesSet = topicSubscribes - .map { it.topic } - .toSet() - Topic.values().forEach { - topicGroups[it.topicGroup]?.add( - TopicSubscribeResponse( - topic = it, - isSubscribed = topicSubscribesSet.contains(it) - ) + fun of(topicSubscribes: List): TopicSubscribeGroupsResponse { + + val topicSubscribesSet = topicSubscribes + .map { it.topic } + .toSet() + + return TopicSubscribeGroupsResponse( + TopicGroup.values() + .associateWith { mutableListOf() } + .also { + addTopicSubscribesToTopicGroupsMap( + topicGroupsMap = it, + topicSubscribesSet = topicSubscribesSet ) } - } - .map { topicGroup -> - TopicGroupSubscribeResponse( - topicGroup = topicGroup.key, - topicSubscribes = topicGroup.value + .map { + TopicGroupSubscribeResponse( + topicGroup = it.key, + topicSubscribes = it.value + ) + } + ) + } + + private fun addTopicSubscribesToTopicGroupsMap( + topicGroupsMap: Map>, + topicSubscribesSet: Set + ) { + Topic.values().forEach { + topicGroupsMap[it.topicGroup]?.add( + TopicSubscribeResponse( + topic = it, + isSubscribed = topicSubscribesSet.contains(it) ) - } - ) + ) + } + } } } From 8ba2c01dbf15a15cf4d3d382a96eb07864852c8e Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sun, 18 Jun 2023 13:23:28 +0900 Subject: [PATCH 08/25] =?UTF-8?q?chore:=20(#523)=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20MapsId=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/notification/entity/TopicSubscribeJpaEntity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt index 5e13384a3..faacf991f 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt @@ -35,7 +35,6 @@ data class TopicSubscribeJpaEntityId( @Column val deviceTokenId: UUID, - @MapsId("topic") @Enumerated(EnumType.STRING) @Column(columnDefinition = "VARCHAR(20)", nullable = false) val topic: Topic From 9f39a1f94fd83b1d046a5d04baadc2892eaa2c36 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sun, 18 Jun 2023 14:43:04 +0900 Subject: [PATCH 09/25] =?UTF-8?q?chore:=20(#523)=20deviceTokenId=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=EC=9C=BC=EB=A1=9C=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit . --- .../domain/notification/service/NotificationServiceImpl.kt | 4 ++-- .../dms/domain/notification/spi/TopicSubscribePort.kt | 2 +- .../notification/TopicSubscribePersistenceAdapter.kt | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index eb779da57..14b7b9f71 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -71,8 +71,8 @@ class NotificationServiceImpl( topicSubscribePort.saveAllTopicSubscribes( subscribeTopics.map { TopicSubscribe(savedDeviceToken.id, it) } ) - topicSubscribePort.deleteByUserIdAndTopics( - userId = savedDeviceToken.id, + topicSubscribePort.deleteByDeviceTokenIdAndTopics( + deviceTokenId = savedDeviceToken.id, topics = unsubscribeTopics ) } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt index 83b9fdab8..1f16c49fb 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt @@ -12,5 +12,5 @@ interface TopicSubscribePort { fun saveAllTopicSubscribes(topicSubscribes: List) - fun deleteByUserIdAndTopics(userId: UUID, topics: List) + fun deleteByDeviceTokenIdAndTopics(deviceTokenId: UUID, topics: List) } diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt index fea74a708..91fd2a740 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt @@ -1,5 +1,6 @@ package team.aliens.dms.persistence.notification +import java.util.UUID import org.springframework.stereotype.Component import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.model.TopicSubscribe @@ -7,7 +8,6 @@ import team.aliens.dms.domain.notification.spi.TopicSubscribePort import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntityId import team.aliens.dms.persistence.notification.mapper.TopicSubscribeMapper import team.aliens.dms.persistence.notification.repository.TopicSubscribeJpaRepository -import java.util.UUID @Component class TopicSubscribePersistenceAdapter( @@ -29,11 +29,11 @@ class TopicSubscribePersistenceAdapter( ) } - override fun deleteByUserIdAndTopics(userId: UUID, topics: List) { + override fun deleteByDeviceTokenIdAndTopics(deviceTokenId: UUID, topics: List) { topicSubscribeRepository.deleteAllById( topics.map { TopicSubscribeJpaEntityId( - deviceTokenId = userId, + deviceTokenId = deviceTokenId, topic = it ) } From e6c9be1246e32d1753b0aa952df77b2883a69050 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sun, 18 Jun 2023 14:41:32 +0900 Subject: [PATCH 10/25] =?UTF-8?q?chore:=20(#523)=20readonly=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/usecase/UpdateTopicSubscribesUseCase.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt index 1df3777c1..c7b444c23 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt @@ -1,10 +1,10 @@ package team.aliens.dms.domain.notification.usecase -import team.aliens.dms.common.annotation.ReadOnlyUseCase +import team.aliens.dms.common.annotation.UseCase import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.service.NotificationService -@ReadOnlyUseCase +@UseCase class UpdateTopicSubscribesUseCase( private val notificationService: NotificationService ) { From b12fb7b63522f0e335ccd16715f184b81456d339 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sun, 18 Jun 2023 14:41:43 +0900 Subject: [PATCH 11/25] =?UTF-8?q?chore:=20(#523)=20=EB=AC=B8=EA=B5=AC=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 --- .../kotlin/team/aliens/dms/domain/notification/model/Topic.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt index 0b57ae129..6de8315a3 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt @@ -20,7 +20,7 @@ enum class Topic( STUDY_ROOM_TIME_SLOT( topicGroup = TopicGroup.STUDY_ROOM, title = "이용 시간 알림", - content = "자습실 이용 시작 10분 전에 알림을 발송합니다." + content = "자습실 이용 시작 10분 전에 알림을 받을 수 있습니다." ), STUDY_ROOM_APPLY( topicGroup = TopicGroup.STUDY_ROOM, From c7bc56f769b21af2d1794ce7629526d4c0f0f905 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sun, 18 Jun 2023 14:54:19 +0900 Subject: [PATCH 12/25] =?UTF-8?q?chore:=20(#523)=20delete=20query=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 영속성 컨텍스트에 없는 객체 삭제로 인한 에러 해결 --- .../TopicSubscribePersistenceAdapter.kt | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt index 91fd2a740..b0d5114fb 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt @@ -1,16 +1,18 @@ package team.aliens.dms.persistence.notification +import com.querydsl.jpa.impl.JPAQueryFactory import java.util.UUID import org.springframework.stereotype.Component import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.model.TopicSubscribe import team.aliens.dms.domain.notification.spi.TopicSubscribePort -import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntityId +import team.aliens.dms.persistence.notification.entity.QTopicSubscribeJpaEntity.topicSubscribeJpaEntity import team.aliens.dms.persistence.notification.mapper.TopicSubscribeMapper import team.aliens.dms.persistence.notification.repository.TopicSubscribeJpaRepository @Component class TopicSubscribePersistenceAdapter( + private val queryFactory: JPAQueryFactory, private val topicSubscribeMapper: TopicSubscribeMapper, private val topicSubscribeRepository: TopicSubscribeJpaRepository ) : TopicSubscribePort { @@ -30,14 +32,13 @@ class TopicSubscribePersistenceAdapter( } override fun deleteByDeviceTokenIdAndTopics(deviceTokenId: UUID, topics: List) { - topicSubscribeRepository.deleteAllById( - topics.map { - TopicSubscribeJpaEntityId( - deviceTokenId = deviceTokenId, - topic = it - ) - } - ) + queryFactory + .delete(topicSubscribeJpaEntity) + .where( + topicSubscribeJpaEntity.deviceToken.id.eq(deviceTokenId), + topicSubscribeJpaEntity.id.topic.`in`(topics) + ) + .execute() } override fun queryTopicSubscribesByDeviceTokenId(deviceTokenId: UUID) = From 671a2ca086618b97ae28e37697c91854b222296d Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Sun, 18 Jun 2023 14:57:11 +0900 Subject: [PATCH 13/25] =?UTF-8?q?chore:=20(#523)=20saveAll=EC=8B=9C=20sele?= =?UTF-8?q?ct=20=EC=BF=BC=EB=A6=AC=20=EB=AC=B6=EC=96=B4=EC=84=9C=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dms-infrastructure/src/main/resources/application.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dms-infrastructure/src/main/resources/application.yml b/dms-infrastructure/src/main/resources/application.yml index e510eac7a..94375a5af 100644 --- a/dms-infrastructure/src/main/resources/application.yml +++ b/dms-infrastructure/src/main/resources/application.yml @@ -7,7 +7,7 @@ spring: timeout-per-shutdown-phase: "60s" datasource: - url: jdbc:mysql://${DB_URL:localhost}:${DB_PORT:3306}/${DB_NAME:dms}?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&tinyInt1isBit=false + url: jdbc:mysql://${DB_URL:localhost}:${DB_PORT:3306}/${DB_NAME:dms}?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&tinyInt1isBit=false&rewriteBatchedStatements=true username: ${MYSQL_USERNAME:root} password: ${MYSQL_PASSWORD:11111111} driver-class-name: com.mysql.cj.jdbc.Driver @@ -15,6 +15,9 @@ spring: jpa: hibernate: ddl-auto: ${DDL:validate} + order_inserts: true + jdbc: + batch_size: 500 properties: hibernate: format_sql: ${FORMAT_SQL:true} From ede38d8b9a7ac126e9b4fe90ff71d1ca683b3090 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Mon, 19 Jun 2023 07:53:44 +0900 Subject: [PATCH 14/25] =?UTF-8?q?feat:=20(#523)=20isSubscribed=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/TopicSubscribeResponse.kt | 10 ++----- .../notification/model/TopicSubscribe.kt | 6 ++-- .../service/NotificationServiceImpl.kt | 28 +++++++++++-------- .../entity/TopicSubscribeJpaEntity.kt | 5 +++- .../mapper/TopicSubscribeMapper.kt | 6 ++-- 5 files changed, 32 insertions(+), 23 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt index 2c16354b7..0f47b2ba8 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt @@ -10,17 +10,13 @@ data class TopicSubscribeGroupsResponse( companion object { fun of(topicSubscribes: List): TopicSubscribeGroupsResponse { - val topicSubscribesSet = topicSubscribes - .map { it.topic } - .toSet() - return TopicSubscribeGroupsResponse( TopicGroup.values() .associateWith { mutableListOf() } .also { addTopicSubscribesToTopicGroupsMap( topicGroupsMap = it, - topicSubscribesSet = topicSubscribesSet + topicSubscribesMap = topicSubscribes.associateBy { it.topic } ) } .map { @@ -34,13 +30,13 @@ data class TopicSubscribeGroupsResponse( private fun addTopicSubscribesToTopicGroupsMap( topicGroupsMap: Map>, - topicSubscribesSet: Set + topicSubscribesMap: Map ) { Topic.values().forEach { topicGroupsMap[it.topicGroup]?.add( TopicSubscribeResponse( topic = it, - isSubscribed = topicSubscribesSet.contains(it) + isSubscribed = topicSubscribesMap[it]?.isSubscribed ?: false ) ) } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt index bb0e083fe..bc6e5c030 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt @@ -2,10 +2,12 @@ package team.aliens.dms.domain.notification.model import java.util.UUID -class TopicSubscribe( +data class TopicSubscribe( val deviceTokenId: UUID, - val topic: Topic + val topic: Topic, + + val isSubscribed: Boolean ) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index 14b7b9f71..a53732552 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -29,7 +29,8 @@ class NotificationServiceImpl( topicSubscribePort.saveTopicSubscribe( TopicSubscribe( deviceTokenId = savedDeviceToken.id, - topic = topic + topic = topic, + isSubscribed = true ) ) notificationPort.subscribeTopic( @@ -39,6 +40,14 @@ class NotificationServiceImpl( } override fun unsubscribeTopic(deviceToken: String, topic: Topic) { + val savedDeviceToken = this.getDeviceTokenByDeviceToken(deviceToken) + topicSubscribePort.saveTopicSubscribe( + TopicSubscribe( + deviceTokenId = savedDeviceToken.id, + topic = topic, + isSubscribed = false + ) + ) notificationPort.unsubscribeTopic( deviceToken = deviceToken, topic = topic @@ -49,31 +58,28 @@ class NotificationServiceImpl( val savedDeviceToken = this.getDeviceTokenByDeviceToken(deviceToken) - val subscribeTopics = mutableListOf() - val unsubscribeTopics = mutableListOf() - topicsToSubscribe.forEach { (topic, isSubscribe) -> if (isSubscribe) { notificationPort.subscribeTopic( deviceToken = deviceToken, topic = topic ) - subscribeTopics.add(topic) } else { notificationPort.unsubscribeTopic( deviceToken = deviceToken, topic = topic ) - unsubscribeTopics.add(topic) } } topicSubscribePort.saveAllTopicSubscribes( - subscribeTopics.map { TopicSubscribe(savedDeviceToken.id, it) } - ) - topicSubscribePort.deleteByDeviceTokenIdAndTopics( - deviceTokenId = savedDeviceToken.id, - topics = unsubscribeTopics + topicsToSubscribe.map { + TopicSubscribe( + deviceTokenId = savedDeviceToken.id, + topic = it.first, + isSubscribed = it.second + ) + } ) } diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt index faacf991f..b1a5c73f1 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt @@ -25,7 +25,10 @@ class TopicSubscribeJpaEntity( @MapsId("deviceTokenId") @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "device_token_id", columnDefinition = "BINARY(16)", nullable = false) - val deviceToken: DeviceTokenJpaEntity + val deviceToken: DeviceTokenJpaEntity, + + @Column(columnDefinition = "BIT(1)", nullable = false) + val isSubscribed: Boolean ) diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt index 1c4d2ddb1..9f12e0547 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt @@ -18,7 +18,8 @@ class TopicSubscribeMapper( return entity?.let { TopicSubscribe( deviceTokenId = it.deviceToken.id!!, - topic = it.id.topic + topic = it.id.topic, + isSubscribed = it.isSubscribed ) } } @@ -32,7 +33,8 @@ class TopicSubscribeMapper( deviceTokenId = domain.deviceTokenId, topic = domain.topic ), - deviceToken = deviceToken + deviceToken = deviceToken, + isSubscribed = domain.isSubscribed ) } } From 0e84a51d97f60ae7ce2aa3cf0a9641a85b72043e Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Mon, 19 Jun 2023 09:04:46 +0900 Subject: [PATCH 15/25] =?UTF-8?q?chore:=20(#523)=20string=20devicetoken=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=EB=AA=85=20token=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team/aliens/dms/common/spi/EventPort.kt | 2 +- .../notification/dto/SetDeviceTokenRequest.kt | 4 +- .../domain/notification/model/DeviceToken.kt | 2 +- .../service/NotificationService.kt | 10 ++--- .../service/NotificationServiceImpl.kt | 45 +++++++++---------- .../notification/spi/DeviceTokenPort.kt | 4 +- .../notification/spi/NotificationPort.kt | 10 ++--- .../usecase/QueryTopicSubscribesUseCase.kt | 4 +- .../usecase/SubscribeTopicUseCase.kt | 4 +- .../usecase/UnsubscribeTopicUseCase.kt | 4 +- .../usecase/UpdateTopicSubscribesUseCase.kt | 4 +- .../team/aliens/dms/event/EventAdapter.kt | 4 +- .../team/aliens/dms/event/EventHandler.kt | 4 +- .../kotlin/team/aliens/dms/event/Events.kt | 4 +- .../dms/global/filter/ExceptionFilter.kt | 10 +++-- .../dms/thirdparty/notification/FCMAdapter.kt | 20 ++++----- .../DeviceTokenPersistenceAdapter.kt | 4 +- .../entity/DeviceTokenJpaEntity.kt | 8 ++-- .../notification/mapper/DeviceTokenMapper.kt | 4 +- .../repository/DeviceTokenJpaRepository.kt | 4 +- .../notification/NotificationWebAdapter.kt | 16 +++---- ...kenRequest.kt => DeviceTokenWebRequest.kt} | 2 +- .../notification/dto/request/TopicRequest.kt | 2 +- 23 files changed, 87 insertions(+), 88 deletions(-) rename dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/{DeviceTokenRequest.kt => DeviceTokenWebRequest.kt} (71%) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/common/spi/EventPort.kt b/dms-core/src/main/kotlin/team/aliens/dms/common/spi/EventPort.kt index dbd303722..a36e6da74 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/common/spi/EventPort.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/common/spi/EventPort.kt @@ -3,7 +3,7 @@ package team.aliens.dms.common.spi import team.aliens.dms.domain.notification.model.Notification interface NotificationEventPort { - fun publishNotification(deviceToken: String, notification: Notification) + fun publishNotification(token: String, notification: Notification) fun publishNotificationToAllByTopic(notification: Notification) } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/SetDeviceTokenRequest.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/SetDeviceTokenRequest.kt index 5c9573a03..efeaeb88a 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/SetDeviceTokenRequest.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/SetDeviceTokenRequest.kt @@ -4,11 +4,11 @@ import team.aliens.dms.domain.notification.model.DeviceToken import team.aliens.dms.domain.user.model.User class SetDeviceTokenRequest( - val deviceToken: String + val token: String ) { fun toDeviceToken(user: User) = DeviceToken( userId = user.id, schoolId = user.schoolId, - deviceToken = deviceToken + token = token ) } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/DeviceToken.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/DeviceToken.kt index ab67c66d6..af5640232 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/DeviceToken.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/DeviceToken.kt @@ -6,5 +6,5 @@ data class DeviceToken( val id: UUID = UUID(0, 0), val userId: UUID, val schoolId: UUID, - val deviceToken: String + val token: String ) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt index 7f30d67c7..3f94c7116 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt @@ -9,14 +9,14 @@ interface NotificationService { fun saveDeviceToken(deviceToken: DeviceToken) - fun unsubscribeTopic(deviceToken: String, topic: Topic) + fun unsubscribeTopic(token: String, topic: Topic) - fun subscribeTopic(deviceToken: String, topic: Topic) + fun subscribeTopic(token: String, topic: Topic) - fun updateSubscribes(deviceToken: String, topicsToSubscribe: List>) + fun updateSubscribes(token: String, topicsToSubscribe: List>) fun sendMessage( - deviceToken: String, + token: String, notification: Notification ) @@ -26,5 +26,5 @@ interface NotificationService { notification: Notification ) - fun getTopicSubscribesByDeviceToken(deviceToken: String): List + fun getTopicSubscribesByToken(token: String): List } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index a53732552..974e325e5 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -20,62 +20,59 @@ class NotificationServiceImpl( override fun saveDeviceToken(deviceToken: DeviceToken) { deviceTokenPort.saveDeviceToken(deviceToken) notificationPort.subscribeAllTopics( - deviceToken = deviceToken.deviceToken + token = deviceToken.token ) } - override fun subscribeTopic(deviceToken: String, topic: Topic) { - val savedDeviceToken = this.getDeviceTokenByDeviceToken(deviceToken) + override fun subscribeTopic(token: String, topic: Topic) { + val deviceToken = this.getDeviceTokenByToken(token) topicSubscribePort.saveTopicSubscribe( TopicSubscribe( - deviceTokenId = savedDeviceToken.id, + deviceTokenId = deviceToken.id, topic = topic, isSubscribed = true ) ) notificationPort.subscribeTopic( - deviceToken = this.getDeviceTokenByDeviceToken(deviceToken).deviceToken, + token = this.getDeviceTokenByToken(token).token, topic = topic ) } - override fun unsubscribeTopic(deviceToken: String, topic: Topic) { - val savedDeviceToken = this.getDeviceTokenByDeviceToken(deviceToken) + override fun unsubscribeTopic(token: String, topic: Topic) { + val deviceToken = this.getDeviceTokenByToken(token) topicSubscribePort.saveTopicSubscribe( TopicSubscribe( - deviceTokenId = savedDeviceToken.id, + deviceTokenId = deviceToken.id, topic = topic, isSubscribed = false ) ) notificationPort.unsubscribeTopic( - deviceToken = deviceToken, + token = token, topic = topic ) } - override fun updateSubscribes(deviceToken: String, topicsToSubscribe: List>) { - - val savedDeviceToken = this.getDeviceTokenByDeviceToken(deviceToken) - + override fun updateSubscribes(token: String, topicsToSubscribe: List>) { + val deviceToken = this.getDeviceTokenByToken(token) topicsToSubscribe.forEach { (topic, isSubscribe) -> if (isSubscribe) { notificationPort.subscribeTopic( - deviceToken = deviceToken, + token = token, topic = topic ) } else { notificationPort.unsubscribeTopic( - deviceToken = deviceToken, + token = token, topic = topic ) } } - topicSubscribePort.saveAllTopicSubscribes( topicsToSubscribe.map { TopicSubscribe( - deviceTokenId = savedDeviceToken.id, + deviceTokenId = deviceToken.id, topic = it.first, isSubscribed = it.second ) @@ -83,19 +80,19 @@ class NotificationServiceImpl( ) } - private fun getDeviceTokenByDeviceToken(deviceToken: String) = - deviceTokenPort.queryDeviceTokenByDeviceToken(deviceToken) ?: throw DeviceTokenNotFoundException + private fun getDeviceTokenByToken(token: String) = + deviceTokenPort.queryDeviceTokenByToken(token) ?: throw DeviceTokenNotFoundException - override fun sendMessage(deviceToken: String, notification: Notification) { + override fun sendMessage(token: String, notification: Notification) { notificationPort.sendMessage( - deviceToken = deviceToken, + token = token, notification = notification ) } override fun sendMessages(deviceTokens: List, notification: Notification) { notificationPort.sendMessages( - deviceTokens = deviceTokens, + tokens = deviceTokens, notification = notification ) } @@ -106,8 +103,8 @@ class NotificationServiceImpl( ) } - override fun getTopicSubscribesByDeviceToken(deviceToken: String): List { - val savedToken = getDeviceTokenByDeviceToken(deviceToken) + override fun getTopicSubscribesByToken(token: String): List { + val savedToken = getDeviceTokenByToken(token) return topicSubscribePort.queryTopicSubscribesByDeviceTokenId(savedToken.id) } } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/DeviceTokenPort.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/DeviceTokenPort.kt index 46e4c9ae1..1e0a090ea 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/DeviceTokenPort.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/DeviceTokenPort.kt @@ -1,7 +1,7 @@ package team.aliens.dms.domain.notification.spi -import team.aliens.dms.domain.notification.model.DeviceToken import java.util.UUID +import team.aliens.dms.domain.notification.model.DeviceToken interface DeviceTokenPort { @@ -9,7 +9,7 @@ interface DeviceTokenPort { fun queryDeviceTokenByUserId(userId: UUID): DeviceToken? - fun queryDeviceTokenByDeviceToken(deviceToken: String): DeviceToken? + fun queryDeviceTokenByToken(token: String): DeviceToken? fun deleteDeviceTokenByUserId(userId: UUID) } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/NotificationPort.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/NotificationPort.kt index 3625fd729..17bc19163 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/NotificationPort.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/NotificationPort.kt @@ -6,19 +6,19 @@ import team.aliens.dms.domain.notification.model.Topic interface NotificationPort { fun sendMessage( - deviceToken: String, + token: String, notification: Notification ) - fun sendMessages(deviceTokens: List, notification: Notification) + fun sendMessages(tokens: List, notification: Notification) fun sendByTopic( notification: Notification ) - fun subscribeTopic(deviceToken: String, topic: Topic) + fun subscribeTopic(token: String, topic: Topic) - fun subscribeAllTopics(deviceToken: String) + fun subscribeAllTopics(token: String) - fun unsubscribeTopic(deviceToken: String, topic: Topic) + fun unsubscribeTopic(token: String, topic: Topic) } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt index d72250b47..ffe7d902f 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt @@ -9,9 +9,9 @@ class QueryTopicSubscribesUseCase( private val notificationService: NotificationService ) { - fun execute(deviceToken: String): TopicSubscribeGroupsResponse { + fun execute(token: String): TopicSubscribeGroupsResponse { return TopicSubscribeGroupsResponse.of( - notificationService.getTopicSubscribesByDeviceToken(deviceToken) + notificationService.getTopicSubscribesByToken(token) ) } } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/SubscribeTopicUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/SubscribeTopicUseCase.kt index 2a25f5c4d..c0c811ef9 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/SubscribeTopicUseCase.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/SubscribeTopicUseCase.kt @@ -9,9 +9,9 @@ class SubscribeTopicUseCase( private val notificationService: NotificationService ) { - fun execute(deviceToken: String, topic: Topic) { + fun execute(token: String, topic: Topic) { notificationService.subscribeTopic( - deviceToken = deviceToken, + token = token, topic = topic ) } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UnsubscribeTopicUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UnsubscribeTopicUseCase.kt index 83056d945..2ff2b08e5 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UnsubscribeTopicUseCase.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UnsubscribeTopicUseCase.kt @@ -9,9 +9,9 @@ class UnsubscribeTopicUseCase( private val notificationService: NotificationService ) { - fun execute(deviceToken: String, topic: Topic) { + fun execute(token: String, topic: Topic) { notificationService.unsubscribeTopic( - deviceToken = deviceToken, + token = token, topic = topic ) } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt index c7b444c23..47799ea26 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt @@ -9,9 +9,9 @@ class UpdateTopicSubscribesUseCase( private val notificationService: NotificationService ) { - fun execute(deviceToken: String, topicsToSubscribe: List>) { + fun execute(token: String, topicsToSubscribe: List>) { notificationService.updateSubscribes( - deviceToken = deviceToken, + token = token, topicsToSubscribe = topicsToSubscribe ) } diff --git a/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/EventAdapter.kt b/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/EventAdapter.kt index df83b14cd..4f3fe93fd 100644 --- a/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/EventAdapter.kt +++ b/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/EventAdapter.kt @@ -11,12 +11,12 @@ class EventAdapter( ) : EventPort { override fun publishNotification( - deviceToken: String, + token: String, notification: Notification ) { eventPublisher.publishEvent( SingleNotificationEvent( - deviceToken = deviceToken, + token = token, notification = notification ) ) diff --git a/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/EventHandler.kt b/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/EventHandler.kt index 22d844f65..3966348df 100644 --- a/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/EventHandler.kt +++ b/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/EventHandler.kt @@ -16,13 +16,13 @@ class NotificationEventHandler( when (event) { is SingleNotificationEvent -> { notificationService.sendMessage( - deviceToken = event.deviceToken, + token = event.token, notification = event.notification ) } is GroupNotificationEvent -> { notificationService.sendMessages( - deviceTokens = event.deviceTokens, + deviceTokens = event.tokens, notification = event.notification ) } diff --git a/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/Events.kt b/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/Events.kt index effaa280a..cd5c754e0 100644 --- a/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/Events.kt +++ b/dms-infrastructure/src/main/kotlin/team/aliens/dms/event/Events.kt @@ -8,11 +8,11 @@ open class TopicNotificationEvent( ) : ApplicationEvent(notification) open class GroupNotificationEvent( - val deviceTokens: List, + val tokens: List, notification: Notification ) : TopicNotificationEvent(notification) class SingleNotificationEvent( - val deviceToken: String, + val token: String, notification: Notification ) : TopicNotificationEvent(notification) diff --git a/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt b/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt index 4cce71388..82f3f8ca0 100644 --- a/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt +++ b/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt @@ -2,16 +2,16 @@ package team.aliens.dms.global.filter import com.fasterxml.jackson.databind.ObjectMapper import io.sentry.Sentry +import java.nio.charset.StandardCharsets +import javax.servlet.FilterChain +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse import org.springframework.http.MediaType import org.springframework.web.filter.OncePerRequestFilter import team.aliens.dms.common.error.DmsException import team.aliens.dms.common.error.ErrorProperty import team.aliens.dms.global.error.ErrorResponse import team.aliens.dms.global.error.GlobalErrorCode -import java.nio.charset.StandardCharsets -import javax.servlet.FilterChain -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse class ExceptionFilter( private val objectMapper: ObjectMapper @@ -27,7 +27,9 @@ class ExceptionFilter( } catch (e: DmsException) { errorToJson(e.errorProperty, response) Sentry.captureException(e) + e.printStackTrace() } catch (e: Exception) { + e.printStackTrace() when (e.cause) { is DmsException -> { errorToJson((e.cause as DmsException).errorProperty, response) diff --git a/dms-infrastructure/src/main/kotlin/team/aliens/dms/thirdparty/notification/FCMAdapter.kt b/dms-infrastructure/src/main/kotlin/team/aliens/dms/thirdparty/notification/FCMAdapter.kt index 407417799..213a76297 100644 --- a/dms-infrastructure/src/main/kotlin/team/aliens/dms/thirdparty/notification/FCMAdapter.kt +++ b/dms-infrastructure/src/main/kotlin/team/aliens/dms/thirdparty/notification/FCMAdapter.kt @@ -16,26 +16,26 @@ class FCMAdapter : NotificationPort { private val firebaseInstance: FirebaseMessaging get() = FirebaseMessaging.getInstance() - override fun subscribeTopic(deviceToken: String, topic: Topic) { - firebaseInstance.subscribeToTopicAsync(listOf(deviceToken), topic.toString()) + override fun subscribeTopic(token: String, topic: Topic) { + firebaseInstance.subscribeToTopicAsync(listOf(token), topic.toString()) } - override fun subscribeAllTopics(deviceToken: String) { + override fun subscribeAllTopics(token: String) { Topic.values().forEach { - firebaseInstance.subscribeToTopicAsync(listOf(deviceToken), it.toString()) + firebaseInstance.subscribeToTopicAsync(listOf(token), it.toString()) } } - override fun unsubscribeTopic(deviceToken: String, topic: Topic) { - firebaseInstance.unsubscribeFromTopicAsync(listOf(deviceToken), topic.toString()) + override fun unsubscribeTopic(token: String, topic: Topic) { + firebaseInstance.unsubscribeFromTopicAsync(listOf(token), topic.toString()) } override fun sendMessage( - deviceToken: String, + token: String, notification: Notification ) { val message = this.getMassageBuilderByNotification(notification) - .setToken(deviceToken) + .setToken(token) .build() firebaseInstance.sendAsync(message) } @@ -63,11 +63,11 @@ class FCMAdapter : NotificationPort { } override fun sendMessages( - deviceTokens: List, + tokens: List, notification: Notification ) { val message = this.getMulticastMassageBuilderByNotification(notification) - .addAllTokens(deviceTokens) + .addAllTokens(tokens) .build() firebaseInstance.sendMulticastAsync(message) } diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/DeviceTokenPersistenceAdapter.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/DeviceTokenPersistenceAdapter.kt index 06a00fcd3..695b9ef3f 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/DeviceTokenPersistenceAdapter.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/DeviceTokenPersistenceAdapter.kt @@ -23,8 +23,8 @@ class DeviceTokenPersistenceAdapter( deviceTokenRepository.findByUserId(userId) ) - override fun queryDeviceTokenByDeviceToken(deviceToken: String) = notificationMapper.toDomain( - deviceTokenRepository.findByDeviceToken(deviceToken) + override fun queryDeviceTokenByToken(token: String) = notificationMapper.toDomain( + deviceTokenRepository.findByToken(token) ) override fun deleteDeviceTokenByUserId(userId: UUID) { diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/DeviceTokenJpaEntity.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/DeviceTokenJpaEntity.kt index 3af9d5ca5..d4c80da77 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/DeviceTokenJpaEntity.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/DeviceTokenJpaEntity.kt @@ -1,8 +1,5 @@ package team.aliens.dms.persistence.notification.entity -import team.aliens.dms.persistence.BaseUUIDEntity -import team.aliens.dms.persistence.school.entity.SchoolJpaEntity -import team.aliens.dms.persistence.user.entity.UserJpaEntity import java.util.UUID import javax.persistence.Column import javax.persistence.Entity @@ -10,6 +7,9 @@ import javax.persistence.FetchType import javax.persistence.JoinColumn import javax.persistence.ManyToOne import javax.persistence.Table +import team.aliens.dms.persistence.BaseUUIDEntity +import team.aliens.dms.persistence.school.entity.SchoolJpaEntity +import team.aliens.dms.persistence.user.entity.UserJpaEntity @Entity @Table(name = "tbl_device_token") @@ -26,6 +26,6 @@ class DeviceTokenJpaEntity( val school: SchoolJpaEntity?, @Column(columnDefinition = "VARCHAR(500)", nullable = false) - val deviceToken: String + val token: String ) : BaseUUIDEntity(id) diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/DeviceTokenMapper.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/DeviceTokenMapper.kt index 4205b8666..66f01084d 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/DeviceTokenMapper.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/DeviceTokenMapper.kt @@ -22,7 +22,7 @@ class DeviceTokenMapper( id = it.id!!, userId = it.user!!.id!!, schoolId = it.school!!.id!!, - deviceToken = it.deviceToken + token = it.token ) } } @@ -36,7 +36,7 @@ class DeviceTokenMapper( id = domain.id, user = user, school = school, - deviceToken = domain.deviceToken + token = domain.token ) } } diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/DeviceTokenJpaRepository.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/DeviceTokenJpaRepository.kt index 0ef139026..55801f5d3 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/DeviceTokenJpaRepository.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/DeviceTokenJpaRepository.kt @@ -1,13 +1,13 @@ package team.aliens.dms.persistence.notification.repository +import java.util.UUID import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository import team.aliens.dms.persistence.notification.entity.DeviceTokenJpaEntity -import java.util.UUID @Repository interface DeviceTokenJpaRepository : CrudRepository { - fun findByDeviceToken(deviceToken: String): DeviceTokenJpaEntity? + fun findByToken(token: String): DeviceTokenJpaEntity? fun findByUserId(userId: UUID): DeviceTokenJpaEntity? fun deleteByUserId(userId: UUID) } diff --git a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt index 5cd0a4667..1e3ab80a5 100644 --- a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt +++ b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt @@ -1,5 +1,6 @@ package team.aliens.dms.domain.notification +import javax.validation.Valid import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping @@ -10,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController import team.aliens.dms.domain.notification.dto.SetDeviceTokenRequest import team.aliens.dms.domain.notification.dto.TopicSubscribeGroupsResponse -import team.aliens.dms.domain.notification.dto.request.DeviceTokenRequest +import team.aliens.dms.domain.notification.dto.request.DeviceTokenWebRequest import team.aliens.dms.domain.notification.dto.request.TopicRequest import team.aliens.dms.domain.notification.dto.request.UpdateTopicSubscribesWebRequest import team.aliens.dms.domain.notification.usecase.QueryTopicSubscribesUseCase @@ -18,7 +19,6 @@ import team.aliens.dms.domain.notification.usecase.SetDeviceTokenUseCase import team.aliens.dms.domain.notification.usecase.SubscribeTopicUseCase import team.aliens.dms.domain.notification.usecase.UnsubscribeTopicUseCase import team.aliens.dms.domain.notification.usecase.UpdateTopicSubscribesUseCase -import javax.validation.Valid @Validated @RequestMapping("/notifications") @@ -32,16 +32,16 @@ class NotificationWebAdapter( ) { @PostMapping("/token") - fun setDeviceToken(@RequestBody @Valid request: DeviceTokenRequest) { + fun setDeviceToken(@RequestBody @Valid request: DeviceTokenWebRequest) { setDeviceTokenUseCase.execute( - SetDeviceTokenRequest(deviceToken = request.deviceToken) + SetDeviceTokenRequest(token = request.deviceToken) ) } @PostMapping("/topic") fun subscribeTopic(@RequestBody @Valid request: TopicRequest) { subscribeTopicUseCase.execute( - deviceToken = request.deviceToken, + token = request.token, topic = request.topic ) } @@ -49,7 +49,7 @@ class NotificationWebAdapter( @DeleteMapping("/topic") fun unsubscribeTopic(@RequestBody @Valid request: TopicRequest) { unsubscribeTopicUseCase.execute( - deviceToken = request.deviceToken, + token = request.token, topic = request.topic ) } @@ -57,13 +57,13 @@ class NotificationWebAdapter( @PatchMapping("/topic") fun updateTopicSubscribes(@RequestBody @Valid request: UpdateTopicSubscribesWebRequest) { updateTopicSubscribesUseCase.execute( - deviceToken = request.deviceToken, + token = request.deviceToken, topicsToSubscribe = request.topicsToSubscribe.map { it.toPair() } ) } @GetMapping("/topic") - fun queryTopicSubscribes(@RequestBody @Valid request: DeviceTokenRequest): TopicSubscribeGroupsResponse { + fun queryTopicSubscribes(@RequestBody @Valid request: DeviceTokenWebRequest): TopicSubscribeGroupsResponse { return queryTopicSubscribesUseCase.execute(request.deviceToken) } } diff --git a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/DeviceTokenRequest.kt b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/DeviceTokenWebRequest.kt similarity index 71% rename from dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/DeviceTokenRequest.kt rename to dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/DeviceTokenWebRequest.kt index ff31eb630..8bfcd1a27 100644 --- a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/DeviceTokenRequest.kt +++ b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/DeviceTokenWebRequest.kt @@ -1,5 +1,5 @@ package team.aliens.dms.domain.notification.dto.request -data class DeviceTokenRequest( +data class DeviceTokenWebRequest( val deviceToken: String ) diff --git a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/TopicRequest.kt b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/TopicRequest.kt index 95ed968b6..dd33e67a1 100644 --- a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/TopicRequest.kt +++ b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/TopicRequest.kt @@ -3,6 +3,6 @@ package team.aliens.dms.domain.notification.dto.request import team.aliens.dms.domain.notification.model.Topic data class TopicRequest( - val deviceToken: String, + val token: String, val topic: Topic ) From 88e494450c8599aba963464e90349268662e3588 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Mon, 19 Jun 2023 09:11:17 +0900 Subject: [PATCH 16/25] chore: (#523) detekt --- .../team/aliens/dms/domain/notification/model/Topic.kt | 3 +-- .../aliens/dms/domain/notification/spi/DeviceTokenPort.kt | 2 +- .../dms/domain/notification/spi/TopicSubscribePort.kt | 2 +- .../team/aliens/dms/global/filter/ExceptionFilter.kt | 8 ++++---- .../notification/TopicSubscribePersistenceAdapter.kt | 2 +- .../notification/entity/DeviceTokenJpaEntity.kt | 6 +++--- .../notification/entity/TopicSubscribeJpaEntity.kt | 2 +- .../notification/repository/DeviceTokenJpaRepository.kt | 2 +- .../repository/TopicSubscribeJpaRepository.kt | 2 +- .../dms/domain/notification/NotificationWebAdapter.kt | 2 +- 10 files changed, 15 insertions(+), 16 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt index 6de8315a3..9bb54d47b 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt @@ -1,6 +1,5 @@ package team.aliens.dms.domain.notification.model - enum class TopicGroup { NOTICE, STUDY_ROOM @@ -27,4 +26,4 @@ enum class Topic( title = "신청 시간 알림", content = "자습실 신청 시간을 알리는 알림입니다." ); -} \ No newline at end of file +} diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/DeviceTokenPort.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/DeviceTokenPort.kt index 1e0a090ea..55053fe1f 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/DeviceTokenPort.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/DeviceTokenPort.kt @@ -1,7 +1,7 @@ package team.aliens.dms.domain.notification.spi -import java.util.UUID import team.aliens.dms.domain.notification.model.DeviceToken +import java.util.UUID interface DeviceTokenPort { diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt index 1f16c49fb..941a4ef8a 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt @@ -1,8 +1,8 @@ package team.aliens.dms.domain.notification.spi -import java.util.UUID import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.model.TopicSubscribe +import java.util.UUID interface TopicSubscribePort { diff --git a/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt b/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt index 82f3f8ca0..241b497d9 100644 --- a/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt +++ b/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt @@ -2,16 +2,16 @@ package team.aliens.dms.global.filter import com.fasterxml.jackson.databind.ObjectMapper import io.sentry.Sentry -import java.nio.charset.StandardCharsets -import javax.servlet.FilterChain -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse import org.springframework.http.MediaType import org.springframework.web.filter.OncePerRequestFilter import team.aliens.dms.common.error.DmsException import team.aliens.dms.common.error.ErrorProperty import team.aliens.dms.global.error.ErrorResponse import team.aliens.dms.global.error.GlobalErrorCode +import java.nio.charset.StandardCharsets +import javax.servlet.FilterChain +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse class ExceptionFilter( private val objectMapper: ObjectMapper diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt index b0d5114fb..9431cef33 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt @@ -1,7 +1,6 @@ package team.aliens.dms.persistence.notification import com.querydsl.jpa.impl.JPAQueryFactory -import java.util.UUID import org.springframework.stereotype.Component import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.model.TopicSubscribe @@ -9,6 +8,7 @@ import team.aliens.dms.domain.notification.spi.TopicSubscribePort import team.aliens.dms.persistence.notification.entity.QTopicSubscribeJpaEntity.topicSubscribeJpaEntity import team.aliens.dms.persistence.notification.mapper.TopicSubscribeMapper import team.aliens.dms.persistence.notification.repository.TopicSubscribeJpaRepository +import java.util.UUID @Component class TopicSubscribePersistenceAdapter( diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/DeviceTokenJpaEntity.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/DeviceTokenJpaEntity.kt index d4c80da77..3287281a1 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/DeviceTokenJpaEntity.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/DeviceTokenJpaEntity.kt @@ -1,5 +1,8 @@ package team.aliens.dms.persistence.notification.entity +import team.aliens.dms.persistence.BaseUUIDEntity +import team.aliens.dms.persistence.school.entity.SchoolJpaEntity +import team.aliens.dms.persistence.user.entity.UserJpaEntity import java.util.UUID import javax.persistence.Column import javax.persistence.Entity @@ -7,9 +10,6 @@ import javax.persistence.FetchType import javax.persistence.JoinColumn import javax.persistence.ManyToOne import javax.persistence.Table -import team.aliens.dms.persistence.BaseUUIDEntity -import team.aliens.dms.persistence.school.entity.SchoolJpaEntity -import team.aliens.dms.persistence.user.entity.UserJpaEntity @Entity @Table(name = "tbl_device_token") diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt index b1a5c73f1..ba01df491 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt @@ -1,5 +1,6 @@ package team.aliens.dms.persistence.notification.entity +import team.aliens.dms.domain.notification.model.Topic import java.io.Serializable import java.util.UUID import javax.persistence.Column @@ -13,7 +14,6 @@ import javax.persistence.JoinColumn import javax.persistence.ManyToOne import javax.persistence.MapsId import javax.persistence.Table -import team.aliens.dms.domain.notification.model.Topic @Entity @Table(name = "tbl_topic_subscribe") diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/DeviceTokenJpaRepository.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/DeviceTokenJpaRepository.kt index 55801f5d3..97e39c503 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/DeviceTokenJpaRepository.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/DeviceTokenJpaRepository.kt @@ -1,9 +1,9 @@ package team.aliens.dms.persistence.notification.repository -import java.util.UUID import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository import team.aliens.dms.persistence.notification.entity.DeviceTokenJpaEntity +import java.util.UUID @Repository interface DeviceTokenJpaRepository : CrudRepository { diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt index 9abcf2b73..06a866d64 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt @@ -1,10 +1,10 @@ package team.aliens.dms.persistence.notification.repository -import java.util.UUID import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntity import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntityId +import java.util.UUID @Repository interface TopicSubscribeJpaRepository : CrudRepository { diff --git a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt index 1e3ab80a5..1e45ed047 100644 --- a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt +++ b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt @@ -1,6 +1,5 @@ package team.aliens.dms.domain.notification -import javax.validation.Valid import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping @@ -19,6 +18,7 @@ import team.aliens.dms.domain.notification.usecase.SetDeviceTokenUseCase import team.aliens.dms.domain.notification.usecase.SubscribeTopicUseCase import team.aliens.dms.domain.notification.usecase.UnsubscribeTopicUseCase import team.aliens.dms.domain.notification.usecase.UpdateTopicSubscribesUseCase +import javax.validation.Valid @Validated @RequestMapping("/notifications") From b3f810d07c46eb1772293eac3e8c0d8d0e9b38c3 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Mon, 19 Jun 2023 09:39:19 +0900 Subject: [PATCH 17/25] =?UTF-8?q?chore:=20(#523)=20=EC=8B=A4=EC=88=98?= =?UTF-8?q?=EB=A1=9C=20=EC=BB=A4=EB=B0=8B=ED=95=9C=20=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt b/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt index 241b497d9..4cce71388 100644 --- a/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt +++ b/dms-infrastructure/src/main/kotlin/team/aliens/dms/global/filter/ExceptionFilter.kt @@ -27,9 +27,7 @@ class ExceptionFilter( } catch (e: DmsException) { errorToJson(e.errorProperty, response) Sentry.captureException(e) - e.printStackTrace() } catch (e: Exception) { - e.printStackTrace() when (e.cause) { is DmsException -> { errorToJson((e.cause as DmsException).errorProperty, response) From da54f1121096fd7d9dc5cfb75bea3e271f4a8b0a Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Mon, 19 Jun 2023 09:45:46 +0900 Subject: [PATCH 18/25] =?UTF-8?q?chore:=20(#523)=20subscribe,=20unsubscrib?= =?UTF-8?q?e=20=ED=95=A8=EC=88=98=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/model/TopicSubscribe.kt | 23 ++++++++++++++++++- .../service/NotificationServiceImpl.kt | 6 ++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt index bc6e5c030..9a222cc8f 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt @@ -10,4 +10,25 @@ data class TopicSubscribe( val isSubscribed: Boolean -) +) { + companion object { + + fun subscribe( + deviceTokenId: UUID, + topic: Topic, + ) = TopicSubscribe( + deviceTokenId = deviceTokenId, + topic = topic, + isSubscribed = true + ) + + fun unsubscribe( + deviceTokenId: UUID, + topic: Topic, + ) = TopicSubscribe( + deviceTokenId = deviceTokenId, + topic = topic, + isSubscribed = false + ) + } +} diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index 974e325e5..c64e90641 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -27,10 +27,9 @@ class NotificationServiceImpl( override fun subscribeTopic(token: String, topic: Topic) { val deviceToken = this.getDeviceTokenByToken(token) topicSubscribePort.saveTopicSubscribe( - TopicSubscribe( + TopicSubscribe.subscribe( deviceTokenId = deviceToken.id, topic = topic, - isSubscribed = true ) ) notificationPort.subscribeTopic( @@ -42,10 +41,9 @@ class NotificationServiceImpl( override fun unsubscribeTopic(token: String, topic: Topic) { val deviceToken = this.getDeviceTokenByToken(token) topicSubscribePort.saveTopicSubscribe( - TopicSubscribe( + TopicSubscribe.unsubscribe( deviceTokenId = deviceToken.id, topic = topic, - isSubscribed = false ) ) notificationPort.unsubscribeTopic( From cbf5b61f98013a17eed43ced8a8d9fa42f7e0dee Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Mon, 19 Jun 2023 09:47:30 +0900 Subject: [PATCH 19/25] =?UTF-8?q?chore:=20(#523)=20=EC=93=B0=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/notification/spi/TopicSubscribePort.kt | 5 +---- .../TopicSubscribePersistenceAdapter.kt | 14 -------------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt index 941a4ef8a..51dec16d8 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt @@ -1,8 +1,7 @@ package team.aliens.dms.domain.notification.spi -import team.aliens.dms.domain.notification.model.Topic -import team.aliens.dms.domain.notification.model.TopicSubscribe import java.util.UUID +import team.aliens.dms.domain.notification.model.TopicSubscribe interface TopicSubscribePort { @@ -11,6 +10,4 @@ interface TopicSubscribePort { fun queryTopicSubscribesByDeviceTokenId(deviceTokenId: UUID): List fun saveAllTopicSubscribes(topicSubscribes: List) - - fun deleteByDeviceTokenIdAndTopics(deviceTokenId: UUID, topics: List) } diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt index 9431cef33..aa5940fa9 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt @@ -1,18 +1,14 @@ package team.aliens.dms.persistence.notification -import com.querydsl.jpa.impl.JPAQueryFactory import org.springframework.stereotype.Component -import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.model.TopicSubscribe import team.aliens.dms.domain.notification.spi.TopicSubscribePort -import team.aliens.dms.persistence.notification.entity.QTopicSubscribeJpaEntity.topicSubscribeJpaEntity import team.aliens.dms.persistence.notification.mapper.TopicSubscribeMapper import team.aliens.dms.persistence.notification.repository.TopicSubscribeJpaRepository import java.util.UUID @Component class TopicSubscribePersistenceAdapter( - private val queryFactory: JPAQueryFactory, private val topicSubscribeMapper: TopicSubscribeMapper, private val topicSubscribeRepository: TopicSubscribeJpaRepository ) : TopicSubscribePort { @@ -31,16 +27,6 @@ class TopicSubscribePersistenceAdapter( ) } - override fun deleteByDeviceTokenIdAndTopics(deviceTokenId: UUID, topics: List) { - queryFactory - .delete(topicSubscribeJpaEntity) - .where( - topicSubscribeJpaEntity.deviceToken.id.eq(deviceTokenId), - topicSubscribeJpaEntity.id.topic.`in`(topics) - ) - .execute() - } - override fun queryTopicSubscribesByDeviceTokenId(deviceTokenId: UUID) = topicSubscribeRepository.findByDeviceTokenId(deviceTokenId) .map { topicSubscribeMapper.toDomain(it)!! } From 871bb157b6a9b4b4e1f55f2c4e08b026dc566bb9 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Mon, 19 Jun 2023 10:15:43 +0900 Subject: [PATCH 20/25] =?UTF-8?q?chore:=20(#523)=20groupName=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dms/domain/notification/dto/TopicSubscribeResponse.kt | 1 + .../team/aliens/dms/domain/notification/model/Topic.kt | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt index 0f47b2ba8..69dae09e1 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt @@ -46,6 +46,7 @@ data class TopicSubscribeGroupsResponse( data class TopicGroupSubscribeResponse( val topicGroup: TopicGroup, + val groupName: String = topicGroup.groupName, val topicSubscribes: List ) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt index 9bb54d47b..0693372a2 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/Topic.kt @@ -1,8 +1,10 @@ package team.aliens.dms.domain.notification.model -enum class TopicGroup { - NOTICE, - STUDY_ROOM +enum class TopicGroup( + val groupName: String +) { + NOTICE("공지"), + STUDY_ROOM("자습실") } enum class Topic( From 4f2bbaebc8725cc179db9336ffd9481c9f7daa24 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Mon, 19 Jun 2023 11:19:31 +0900 Subject: [PATCH 21/25] =?UTF-8?q?chore:=20(#523)=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/NotificationServiceImpl.kt | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index c64e90641..763f870a4 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -54,28 +54,33 @@ class NotificationServiceImpl( override fun updateSubscribes(token: String, topicsToSubscribe: List>) { val deviceToken = this.getDeviceTokenByToken(token) - topicsToSubscribe.forEach { (topic, isSubscribe) -> - if (isSubscribe) { - notificationPort.subscribeTopic( - token = token, - topic = topic - ) - } else { - notificationPort.unsubscribeTopic( - token = token, - topic = topic - ) - } + val topicSubscribes = topicsToSubscribe.map { (topic, isSubscribe) -> + this.subscribeOrUnsubscribeTopic(isSubscribe, token, topic) + TopicSubscribe( + deviceTokenId = deviceToken.id, + topic = topic, + isSubscribed = isSubscribe + ) + } + topicSubscribePort.saveAllTopicSubscribes(topicSubscribes) + } + + private fun subscribeOrUnsubscribeTopic( + isSubscribe: Boolean, + token: String, + topic: Topic + ) { + if (isSubscribe) { + notificationPort.subscribeTopic( + token = token, + topic = topic + ) + } else { + notificationPort.unsubscribeTopic( + token = token, + topic = topic + ) } - topicSubscribePort.saveAllTopicSubscribes( - topicsToSubscribe.map { - TopicSubscribe( - deviceTokenId = deviceToken.id, - topic = it.first, - isSubscribed = it.second - ) - } - ) } private fun getDeviceTokenByToken(token: String) = From 3335aea10bcc4e0c008d0bd0c72d9549f11a4e5c Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Tue, 20 Jun 2023 14:35:56 +0900 Subject: [PATCH 22/25] =?UTF-8?q?chore:=20(#523)=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=A1=B0=ED=9A=8C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dms/domain/notification/service/NotificationServiceImpl.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index 763f870a4..3fba95949 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -33,7 +33,7 @@ class NotificationServiceImpl( ) ) notificationPort.subscribeTopic( - token = this.getDeviceTokenByToken(token).token, + token = token, topic = topic ) } From d5b3b4018811badb36ccba23a1bc9ff5340f77eb Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Tue, 20 Jun 2023 14:52:49 +0900 Subject: [PATCH 23/25] chore: (#523) order_updates=true --- dms-infrastructure/src/main/resources/application.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/dms-infrastructure/src/main/resources/application.yml b/dms-infrastructure/src/main/resources/application.yml index 94375a5af..341f6401c 100644 --- a/dms-infrastructure/src/main/resources/application.yml +++ b/dms-infrastructure/src/main/resources/application.yml @@ -16,6 +16,7 @@ spring: hibernate: ddl-auto: ${DDL:validate} order_inserts: true + order_updates: true jdbc: batch_size: 500 properties: From d9fc21f8ca5ef9fb1e9bb21b6319585b437b0d54 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Tue, 20 Jun 2023 15:00:21 +0900 Subject: [PATCH 24/25] feat: (#523) topicSubscription --- .../dto/TopicSubscribeResponse.kt | 58 ------------------- .../dto/TopicSubscriptionResponse.kt | 58 +++++++++++++++++++ ...TopicSubscribe.kt => TopicSubscription.kt} | 6 +- .../service/NotificationService.kt | 4 +- .../service/NotificationServiceImpl.kt | 24 ++++---- .../notification/spi/TopicSubscribePort.kt | 13 ----- .../notification/spi/TopicSubscriptionPort.kt | 13 +++++ .../usecase/QueryTopicSubscribesUseCase.kt | 17 ------ .../usecase/QueryTopicSubscriptionUseCase.kt | 17 ++++++ ....kt => UpdateTopicSubscriptionsUseCase.kt} | 2 +- .../TopicSubscribePersistenceAdapter.kt | 33 ----------- .../TopicSubscriptionPersistenceAdapter.kt | 33 +++++++++++ ...ntity.kt => TopicSubscriptionJpaEntity.kt} | 10 ++-- ...beMapper.kt => TopicSubscriptionMapper.kt} | 20 +++---- ...y.kt => TopicSubscriptionJpaRepository.kt} | 8 +-- .../notification/NotificationWebAdapter.kt | 22 +++---- ... => UpdateTopicSubscriptionsWebRequest.kt} | 2 +- 17 files changed, 170 insertions(+), 170 deletions(-) delete mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt create mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscriptionResponse.kt rename dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/{TopicSubscribe.kt => TopicSubscription.kt} (86%) delete mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt create mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscriptionPort.kt delete mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt create mode 100644 dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscriptionUseCase.kt rename dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/{UpdateTopicSubscribesUseCase.kt => UpdateTopicSubscriptionsUseCase.kt} (93%) delete mode 100644 dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt create mode 100644 dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscriptionPersistenceAdapter.kt rename dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/{TopicSubscribeJpaEntity.kt => TopicSubscriptionJpaEntity.kt} (87%) rename dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/{TopicSubscribeMapper.kt => TopicSubscriptionMapper.kt} (69%) rename dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/{TopicSubscribeJpaRepository.kt => TopicSubscriptionJpaRepository.kt} (69%) rename dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/{UpdateTopicSubscribesWebRequest.kt => UpdateTopicSubscriptionsWebRequest.kt} (88%) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt deleted file mode 100644 index 69dae09e1..000000000 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscribeResponse.kt +++ /dev/null @@ -1,58 +0,0 @@ -package team.aliens.dms.domain.notification.dto - -import team.aliens.dms.domain.notification.model.Topic -import team.aliens.dms.domain.notification.model.TopicGroup -import team.aliens.dms.domain.notification.model.TopicSubscribe - -data class TopicSubscribeGroupsResponse( - val topicGroups: List -) { - companion object { - fun of(topicSubscribes: List): TopicSubscribeGroupsResponse { - - return TopicSubscribeGroupsResponse( - TopicGroup.values() - .associateWith { mutableListOf() } - .also { - addTopicSubscribesToTopicGroupsMap( - topicGroupsMap = it, - topicSubscribesMap = topicSubscribes.associateBy { it.topic } - ) - } - .map { - TopicGroupSubscribeResponse( - topicGroup = it.key, - topicSubscribes = it.value - ) - } - ) - } - - private fun addTopicSubscribesToTopicGroupsMap( - topicGroupsMap: Map>, - topicSubscribesMap: Map - ) { - Topic.values().forEach { - topicGroupsMap[it.topicGroup]?.add( - TopicSubscribeResponse( - topic = it, - isSubscribed = topicSubscribesMap[it]?.isSubscribed ?: false - ) - ) - } - } - } -} - -data class TopicGroupSubscribeResponse( - val topicGroup: TopicGroup, - val groupName: String = topicGroup.groupName, - val topicSubscribes: List -) - -data class TopicSubscribeResponse( - val topic: Topic, - val title: String = topic.title, - val description: String = topic.content, - val isSubscribed: Boolean -) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscriptionResponse.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscriptionResponse.kt new file mode 100644 index 000000000..c5a84fe02 --- /dev/null +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/dto/TopicSubscriptionResponse.kt @@ -0,0 +1,58 @@ +package team.aliens.dms.domain.notification.dto + +import team.aliens.dms.domain.notification.model.Topic +import team.aliens.dms.domain.notification.model.TopicGroup +import team.aliens.dms.domain.notification.model.TopicSubscription + +data class TopicSubscriptionGroupsResponse( + val topicGroups: List +) { + companion object { + fun of(topicSubscriptions: List): TopicSubscriptionGroupsResponse { + + return TopicSubscriptionGroupsResponse( + TopicGroup.values() + .associateWith { mutableListOf() } + .also { topicGroupsMap -> + addTopicSubscriptionsToTopicGroupsMap( + topicGroupsMap = topicGroupsMap, + topicSubscriptionsMap = topicSubscriptions.associateBy { it.topic } + ) + } + .map { + TopicGroupSubscriptionResponse( + topicGroup = it.key, + topicSubscriptions = it.value + ) + } + ) + } + + private fun addTopicSubscriptionsToTopicGroupsMap( + topicGroupsMap: Map>, + topicSubscriptionsMap: Map + ) { + Topic.values().forEach { + topicGroupsMap[it.topicGroup]?.add( + TopicSubscriptionResponse( + topic = it, + isSubscribed = topicSubscriptionsMap[it]?.isSubscribed ?: false + ) + ) + } + } + } +} + +data class TopicGroupSubscriptionResponse( + val topicGroup: TopicGroup, + val groupName: String = topicGroup.groupName, + val topicSubscriptions: List +) + +data class TopicSubscriptionResponse( + val topic: Topic, + val title: String = topic.title, + val description: String = topic.content, + val isSubscribed: Boolean +) diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscription.kt similarity index 86% rename from dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt rename to dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscription.kt index 9a222cc8f..f59a93ec9 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscribe.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/model/TopicSubscription.kt @@ -2,7 +2,7 @@ package team.aliens.dms.domain.notification.model import java.util.UUID -data class TopicSubscribe( +data class TopicSubscription( val deviceTokenId: UUID, @@ -16,7 +16,7 @@ data class TopicSubscribe( fun subscribe( deviceTokenId: UUID, topic: Topic, - ) = TopicSubscribe( + ) = TopicSubscription( deviceTokenId = deviceTokenId, topic = topic, isSubscribed = true @@ -25,7 +25,7 @@ data class TopicSubscribe( fun unsubscribe( deviceTokenId: UUID, topic: Topic, - ) = TopicSubscribe( + ) = TopicSubscription( deviceTokenId = deviceTokenId, topic = topic, isSubscribed = false diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt index 3f94c7116..d87471528 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationService.kt @@ -3,7 +3,7 @@ package team.aliens.dms.domain.notification.service import team.aliens.dms.domain.notification.model.DeviceToken import team.aliens.dms.domain.notification.model.Notification import team.aliens.dms.domain.notification.model.Topic -import team.aliens.dms.domain.notification.model.TopicSubscribe +import team.aliens.dms.domain.notification.model.TopicSubscription interface NotificationService { @@ -26,5 +26,5 @@ interface NotificationService { notification: Notification ) - fun getTopicSubscribesByToken(token: String): List + fun getTopicSubscriptionsByToken(token: String): List } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt index 3fba95949..1ff9e66f4 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/service/NotificationServiceImpl.kt @@ -5,15 +5,15 @@ import team.aliens.dms.domain.notification.exception.DeviceTokenNotFoundExceptio import team.aliens.dms.domain.notification.model.DeviceToken import team.aliens.dms.domain.notification.model.Notification import team.aliens.dms.domain.notification.model.Topic -import team.aliens.dms.domain.notification.model.TopicSubscribe +import team.aliens.dms.domain.notification.model.TopicSubscription import team.aliens.dms.domain.notification.spi.DeviceTokenPort import team.aliens.dms.domain.notification.spi.NotificationPort -import team.aliens.dms.domain.notification.spi.TopicSubscribePort +import team.aliens.dms.domain.notification.spi.TopicSubscriptionPort @Component class NotificationServiceImpl( private val notificationPort: NotificationPort, - private val topicSubscribePort: TopicSubscribePort, + private val topicSubscriptionPort: TopicSubscriptionPort, private val deviceTokenPort: DeviceTokenPort ) : NotificationService { @@ -26,8 +26,8 @@ class NotificationServiceImpl( override fun subscribeTopic(token: String, topic: Topic) { val deviceToken = this.getDeviceTokenByToken(token) - topicSubscribePort.saveTopicSubscribe( - TopicSubscribe.subscribe( + topicSubscriptionPort.saveTopicSubscription( + TopicSubscription.subscribe( deviceTokenId = deviceToken.id, topic = topic, ) @@ -40,8 +40,8 @@ class NotificationServiceImpl( override fun unsubscribeTopic(token: String, topic: Topic) { val deviceToken = this.getDeviceTokenByToken(token) - topicSubscribePort.saveTopicSubscribe( - TopicSubscribe.unsubscribe( + topicSubscriptionPort.saveTopicSubscription( + TopicSubscription.unsubscribe( deviceTokenId = deviceToken.id, topic = topic, ) @@ -54,15 +54,15 @@ class NotificationServiceImpl( override fun updateSubscribes(token: String, topicsToSubscribe: List>) { val deviceToken = this.getDeviceTokenByToken(token) - val topicSubscribes = topicsToSubscribe.map { (topic, isSubscribe) -> + val topicSubscriptions = topicsToSubscribe.map { (topic, isSubscribe) -> this.subscribeOrUnsubscribeTopic(isSubscribe, token, topic) - TopicSubscribe( + TopicSubscription( deviceTokenId = deviceToken.id, topic = topic, isSubscribed = isSubscribe ) } - topicSubscribePort.saveAllTopicSubscribes(topicSubscribes) + topicSubscriptionPort.saveAllTopicSubscriptions(topicSubscriptions) } private fun subscribeOrUnsubscribeTopic( @@ -106,8 +106,8 @@ class NotificationServiceImpl( ) } - override fun getTopicSubscribesByToken(token: String): List { + override fun getTopicSubscriptionsByToken(token: String): List { val savedToken = getDeviceTokenByToken(token) - return topicSubscribePort.queryTopicSubscribesByDeviceTokenId(savedToken.id) + return topicSubscriptionPort.queryTopicSubscriptionsByDeviceTokenId(savedToken.id) } } diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt deleted file mode 100644 index 51dec16d8..000000000 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscribePort.kt +++ /dev/null @@ -1,13 +0,0 @@ -package team.aliens.dms.domain.notification.spi - -import java.util.UUID -import team.aliens.dms.domain.notification.model.TopicSubscribe - -interface TopicSubscribePort { - - fun saveTopicSubscribe(topicSubscribe: TopicSubscribe): TopicSubscribe - - fun queryTopicSubscribesByDeviceTokenId(deviceTokenId: UUID): List - - fun saveAllTopicSubscribes(topicSubscribes: List) -} diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscriptionPort.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscriptionPort.kt new file mode 100644 index 000000000..1deb9a557 --- /dev/null +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/spi/TopicSubscriptionPort.kt @@ -0,0 +1,13 @@ +package team.aliens.dms.domain.notification.spi + +import java.util.UUID +import team.aliens.dms.domain.notification.model.TopicSubscription + +interface TopicSubscriptionPort { + + fun saveTopicSubscription(topicSubscription: TopicSubscription): TopicSubscription + + fun queryTopicSubscriptionsByDeviceTokenId(deviceTokenId: UUID): List + + fun saveAllTopicSubscriptions(topicSubscriptions: List) +} diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt deleted file mode 100644 index ffe7d902f..000000000 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscribesUseCase.kt +++ /dev/null @@ -1,17 +0,0 @@ -package team.aliens.dms.domain.notification.usecase - -import team.aliens.dms.common.annotation.ReadOnlyUseCase -import team.aliens.dms.domain.notification.dto.TopicSubscribeGroupsResponse -import team.aliens.dms.domain.notification.service.NotificationService - -@ReadOnlyUseCase -class QueryTopicSubscribesUseCase( - private val notificationService: NotificationService -) { - - fun execute(token: String): TopicSubscribeGroupsResponse { - return TopicSubscribeGroupsResponse.of( - notificationService.getTopicSubscribesByToken(token) - ) - } -} diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscriptionUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscriptionUseCase.kt new file mode 100644 index 000000000..686a5f480 --- /dev/null +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/QueryTopicSubscriptionUseCase.kt @@ -0,0 +1,17 @@ +package team.aliens.dms.domain.notification.usecase + +import team.aliens.dms.common.annotation.ReadOnlyUseCase +import team.aliens.dms.domain.notification.dto.TopicSubscriptionGroupsResponse +import team.aliens.dms.domain.notification.service.NotificationService + +@ReadOnlyUseCase +class QueryTopicSubscriptionUseCase( + private val notificationService: NotificationService +) { + + fun execute(token: String): TopicSubscriptionGroupsResponse { + return TopicSubscriptionGroupsResponse.of( + notificationService.getTopicSubscriptionsByToken(token) + ) + } +} diff --git a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscriptionsUseCase.kt similarity index 93% rename from dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt rename to dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscriptionsUseCase.kt index 47799ea26..ade8fa538 100644 --- a/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscribesUseCase.kt +++ b/dms-core/src/main/kotlin/team/aliens/dms/domain/notification/usecase/UpdateTopicSubscriptionsUseCase.kt @@ -5,7 +5,7 @@ import team.aliens.dms.domain.notification.model.Topic import team.aliens.dms.domain.notification.service.NotificationService @UseCase -class UpdateTopicSubscribesUseCase( +class UpdateTopicSubscriptionsUseCase( private val notificationService: NotificationService ) { diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt deleted file mode 100644 index aa5940fa9..000000000 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscribePersistenceAdapter.kt +++ /dev/null @@ -1,33 +0,0 @@ -package team.aliens.dms.persistence.notification - -import org.springframework.stereotype.Component -import team.aliens.dms.domain.notification.model.TopicSubscribe -import team.aliens.dms.domain.notification.spi.TopicSubscribePort -import team.aliens.dms.persistence.notification.mapper.TopicSubscribeMapper -import team.aliens.dms.persistence.notification.repository.TopicSubscribeJpaRepository -import java.util.UUID - -@Component -class TopicSubscribePersistenceAdapter( - private val topicSubscribeMapper: TopicSubscribeMapper, - private val topicSubscribeRepository: TopicSubscribeJpaRepository -) : TopicSubscribePort { - - override fun saveTopicSubscribe(topicSubscribe: TopicSubscribe) = topicSubscribeMapper.toDomain( - topicSubscribeRepository.save( - topicSubscribeMapper.toEntity(topicSubscribe) - ) - )!! - - override fun saveAllTopicSubscribes(topicSubscribes: List) { - topicSubscribeRepository.saveAll( - topicSubscribes.map { - topicSubscribeMapper.toEntity(it) - } - ) - } - - override fun queryTopicSubscribesByDeviceTokenId(deviceTokenId: UUID) = - topicSubscribeRepository.findByDeviceTokenId(deviceTokenId) - .map { topicSubscribeMapper.toDomain(it)!! } -} diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscriptionPersistenceAdapter.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscriptionPersistenceAdapter.kt new file mode 100644 index 000000000..0f47d16c9 --- /dev/null +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/TopicSubscriptionPersistenceAdapter.kt @@ -0,0 +1,33 @@ +package team.aliens.dms.persistence.notification + +import java.util.UUID +import org.springframework.stereotype.Component +import team.aliens.dms.domain.notification.model.TopicSubscription +import team.aliens.dms.domain.notification.spi.TopicSubscriptionPort +import team.aliens.dms.persistence.notification.mapper.TopicSubscriptionMapper +import team.aliens.dms.persistence.notification.repository.TopicSubscriptionJpaRepository + +@Component +class TopicSubscriptionPersistenceAdapter( + private val topicSubscriptionMapper: TopicSubscriptionMapper, + private val topicSubscriptionRepository: TopicSubscriptionJpaRepository +) : TopicSubscriptionPort { + + override fun saveTopicSubscription(topicSubscription: TopicSubscription) = topicSubscriptionMapper.toDomain( + topicSubscriptionRepository.save( + topicSubscriptionMapper.toEntity(topicSubscription) + ) + )!! + + override fun saveAllTopicSubscriptions(topicSubscriptions: List) { + topicSubscriptionRepository.saveAll( + topicSubscriptions.map { + topicSubscriptionMapper.toEntity(it) + } + ) + } + + override fun queryTopicSubscriptionsByDeviceTokenId(deviceTokenId: UUID) = + topicSubscriptionRepository.findByDeviceTokenId(deviceTokenId) + .map { topicSubscriptionMapper.toDomain(it)!! } +} diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscriptionJpaEntity.kt similarity index 87% rename from dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt rename to dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscriptionJpaEntity.kt index ba01df491..e0ed80b14 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscribeJpaEntity.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/entity/TopicSubscriptionJpaEntity.kt @@ -1,6 +1,5 @@ package team.aliens.dms.persistence.notification.entity -import team.aliens.dms.domain.notification.model.Topic import java.io.Serializable import java.util.UUID import javax.persistence.Column @@ -14,13 +13,14 @@ import javax.persistence.JoinColumn import javax.persistence.ManyToOne import javax.persistence.MapsId import javax.persistence.Table +import team.aliens.dms.domain.notification.model.Topic @Entity -@Table(name = "tbl_topic_subscribe") -class TopicSubscribeJpaEntity( +@Table(name = "tbl_topic_subscription") +class TopicSubscriptionJpaEntity( @EmbeddedId - val id: TopicSubscribeJpaEntityId, + val id: TopicSubscriptionJpaEntityId, @MapsId("deviceTokenId") @ManyToOne(fetch = FetchType.LAZY) @@ -33,7 +33,7 @@ class TopicSubscribeJpaEntity( ) @Embeddable -data class TopicSubscribeJpaEntityId( +data class TopicSubscriptionJpaEntityId( @Column val deviceTokenId: UUID, diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscriptionMapper.kt similarity index 69% rename from dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt rename to dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscriptionMapper.kt index 9f12e0547..d707fd62e 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscribeMapper.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/mapper/TopicSubscriptionMapper.kt @@ -3,20 +3,20 @@ package team.aliens.dms.persistence.notification.mapper import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Component import team.aliens.dms.domain.notification.exception.DeviceTokenNotFoundException -import team.aliens.dms.domain.notification.model.TopicSubscribe +import team.aliens.dms.domain.notification.model.TopicSubscription import team.aliens.dms.persistence.GenericMapper -import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntity -import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntityId +import team.aliens.dms.persistence.notification.entity.TopicSubscriptionJpaEntityId +import team.aliens.dms.persistence.notification.entity.TopicSubscriptionJpaEntity import team.aliens.dms.persistence.notification.repository.DeviceTokenJpaRepository @Component -class TopicSubscribeMapper( +class TopicSubscriptionMapper( private val deviceTokenRepository: DeviceTokenJpaRepository -) : GenericMapper { +) : GenericMapper { - override fun toDomain(entity: TopicSubscribeJpaEntity?): TopicSubscribe? { + override fun toDomain(entity: TopicSubscriptionJpaEntity?): TopicSubscription? { return entity?.let { - TopicSubscribe( + TopicSubscription( deviceTokenId = it.deviceToken.id!!, topic = it.id.topic, isSubscribed = it.isSubscribed @@ -24,12 +24,12 @@ class TopicSubscribeMapper( } } - override fun toEntity(domain: TopicSubscribe): TopicSubscribeJpaEntity { + override fun toEntity(domain: TopicSubscription): TopicSubscriptionJpaEntity { val deviceToken = deviceTokenRepository.findByIdOrNull(domain.deviceTokenId) ?: throw DeviceTokenNotFoundException - return TopicSubscribeJpaEntity( - id = TopicSubscribeJpaEntityId( + return TopicSubscriptionJpaEntity( + id = TopicSubscriptionJpaEntityId( deviceTokenId = domain.deviceTokenId, topic = domain.topic ), diff --git a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscriptionJpaRepository.kt similarity index 69% rename from dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt rename to dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscriptionJpaRepository.kt index 06a866d64..d0648c33e 100644 --- a/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscribeJpaRepository.kt +++ b/dms-persistence/src/main/kotlin/team/aliens/dms/persistence/notification/repository/TopicSubscriptionJpaRepository.kt @@ -2,11 +2,11 @@ package team.aliens.dms.persistence.notification.repository import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository -import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntity -import team.aliens.dms.persistence.notification.entity.TopicSubscribeJpaEntityId +import team.aliens.dms.persistence.notification.entity.TopicSubscriptionJpaEntity +import team.aliens.dms.persistence.notification.entity.TopicSubscriptionJpaEntityId import java.util.UUID @Repository -interface TopicSubscribeJpaRepository : CrudRepository { - fun findByDeviceTokenId(deviceTokenId: UUID): List +interface TopicSubscriptionJpaRepository : CrudRepository { + fun findByDeviceTokenId(deviceTokenId: UUID): List } diff --git a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt index 1e45ed047..9bb3900a0 100644 --- a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt +++ b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/NotificationWebAdapter.kt @@ -1,5 +1,6 @@ package team.aliens.dms.domain.notification +import javax.validation.Valid import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping @@ -9,16 +10,15 @@ import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController import team.aliens.dms.domain.notification.dto.SetDeviceTokenRequest -import team.aliens.dms.domain.notification.dto.TopicSubscribeGroupsResponse +import team.aliens.dms.domain.notification.dto.TopicSubscriptionGroupsResponse import team.aliens.dms.domain.notification.dto.request.DeviceTokenWebRequest import team.aliens.dms.domain.notification.dto.request.TopicRequest -import team.aliens.dms.domain.notification.dto.request.UpdateTopicSubscribesWebRequest -import team.aliens.dms.domain.notification.usecase.QueryTopicSubscribesUseCase +import team.aliens.dms.domain.notification.dto.request.UpdateTopicSubscriptionsWebRequest +import team.aliens.dms.domain.notification.usecase.QueryTopicSubscriptionUseCase import team.aliens.dms.domain.notification.usecase.SetDeviceTokenUseCase import team.aliens.dms.domain.notification.usecase.SubscribeTopicUseCase import team.aliens.dms.domain.notification.usecase.UnsubscribeTopicUseCase -import team.aliens.dms.domain.notification.usecase.UpdateTopicSubscribesUseCase -import javax.validation.Valid +import team.aliens.dms.domain.notification.usecase.UpdateTopicSubscriptionsUseCase @Validated @RequestMapping("/notifications") @@ -27,8 +27,8 @@ class NotificationWebAdapter( private val setDeviceTokenUseCase: SetDeviceTokenUseCase, private val subscribeTopicUseCase: SubscribeTopicUseCase, private val unsubscribeTopicUseCase: UnsubscribeTopicUseCase, - private val updateTopicSubscribesUseCase: UpdateTopicSubscribesUseCase, - private val queryTopicSubscribesUseCase: QueryTopicSubscribesUseCase + private val updateTopicSubscriptionsUseCase: UpdateTopicSubscriptionsUseCase, + private val queryTopicSubscriptionUseCase: QueryTopicSubscriptionUseCase ) { @PostMapping("/token") @@ -55,15 +55,15 @@ class NotificationWebAdapter( } @PatchMapping("/topic") - fun updateTopicSubscribes(@RequestBody @Valid request: UpdateTopicSubscribesWebRequest) { - updateTopicSubscribesUseCase.execute( + fun updateTopicSubscriptions(@RequestBody @Valid request: UpdateTopicSubscriptionsWebRequest) { + updateTopicSubscriptionsUseCase.execute( token = request.deviceToken, topicsToSubscribe = request.topicsToSubscribe.map { it.toPair() } ) } @GetMapping("/topic") - fun queryTopicSubscribes(@RequestBody @Valid request: DeviceTokenWebRequest): TopicSubscribeGroupsResponse { - return queryTopicSubscribesUseCase.execute(request.deviceToken) + fun queryTopicSubscriptions(@RequestBody @Valid request: DeviceTokenWebRequest): TopicSubscriptionGroupsResponse { + return queryTopicSubscriptionUseCase.execute(request.deviceToken) } } diff --git a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/UpdateTopicSubscribesWebRequest.kt b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/UpdateTopicSubscriptionsWebRequest.kt similarity index 88% rename from dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/UpdateTopicSubscribesWebRequest.kt rename to dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/UpdateTopicSubscriptionsWebRequest.kt index 949f46e99..26d9be114 100644 --- a/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/UpdateTopicSubscribesWebRequest.kt +++ b/dms-presentation/src/main/kotlin/team/aliens/dms/domain/notification/dto/request/UpdateTopicSubscriptionsWebRequest.kt @@ -2,7 +2,7 @@ package team.aliens.dms.domain.notification.dto.request import team.aliens.dms.domain.notification.model.Topic -data class UpdateTopicSubscribesWebRequest( +data class UpdateTopicSubscriptionsWebRequest( val deviceToken: String, val topicsToSubscribe: List ) { From 45e42f92605d11ca728853f8f39b0b6d11e48f4f Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Tue, 20 Jun 2023 16:00:17 +0900 Subject: [PATCH 25/25] =?UTF-8?q?chore:=20(#523)=20batch=5Fsize=20100?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dms-infrastructure/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dms-infrastructure/src/main/resources/application.yml b/dms-infrastructure/src/main/resources/application.yml index 341f6401c..9fa7049fd 100644 --- a/dms-infrastructure/src/main/resources/application.yml +++ b/dms-infrastructure/src/main/resources/application.yml @@ -18,7 +18,7 @@ spring: order_inserts: true order_updates: true jdbc: - batch_size: 500 + batch_size: 100 properties: hibernate: format_sql: ${FORMAT_SQL:true}