Skip to content

Commit 2c99cff

Browse files
committed
Merge branch 'main' into development
2 parents dfb0e7b + 9d2eee9 commit 2c99cff

8 files changed

Lines changed: 115 additions & 16 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ dependencies {
5454
implementation("io.jsonwebtoken:jjwt-api:0.11.5")
5555
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
5656
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
57+
implementation("com.fasterxml.jackson.datatype:jackson-datatype-hibernate5-jakarta")
5758
implementation("org.jetbrains.kotlin:kotlin-reflect")
5859
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
5960
implementation("org.liquibase:liquibase-core:4.24.0")

src/main/kotlin/com/kioschool/kioschoolapi/domain/order/service/OrderService.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.kioschool.kioschoolapi.global.websocket.dto.Message
1616
import com.kioschool.kioschoolapi.global.websocket.service.CustomWebSocketService
1717
import org.springframework.stereotype.Service
1818
import java.time.LocalDateTime
19+
import com.kioschool.kioschoolapi.domain.order.dto.common.OrderDto
1920

2021
@Service
2122
class OrderService(
@@ -32,12 +33,13 @@ class OrderService(
3233
return orderRepository.save(order)
3334
}
3435

36+
3537
@OrderUpdateEvent
3638
fun saveOrderAndSendWebsocketMessage(order: Order, type: WebsocketType): Order {
3739
val savedOrder = orderRepository.save(order)
3840
websocketService.sendMessage(
3941
"/sub/order/${order.workspace.id}",
40-
Message(type, savedOrder)
42+
Message(type, OrderDto.of(savedOrder))
4143
)
4244
return savedOrder
4345
}
@@ -48,7 +50,7 @@ class OrderService(
4850
val order = savedOrderProduct.order
4951
websocketService.sendMessage(
5052
"/sub/order/${order.workspace.id}",
51-
Message(WebsocketType.UPDATED, order)
53+
Message(WebsocketType.UPDATED, OrderDto.of(order))
5254
)
5355
return savedOrderProduct
5456
}

src/main/kotlin/com/kioschool/kioschoolapi/global/configuration/RedisConfiguration.kt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
package com.kioschool.kioschoolapi.global.configuration
22

3+
import com.fasterxml.jackson.databind.ObjectMapper
4+
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator
5+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
6+
import com.fasterxml.jackson.module.kotlin.KotlinModule
37
import org.springframework.beans.factory.annotation.Value
48
import org.springframework.context.annotation.Bean
59
import org.springframework.context.annotation.Configuration
610
import org.springframework.data.redis.connection.RedisConnectionFactory
711
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
812
import org.springframework.data.redis.core.RedisTemplate
913
import org.springframework.data.redis.core.ValueOperations
14+
import org.springframework.data.redis.listener.ChannelTopic
15+
import org.springframework.data.redis.listener.RedisMessageListenerContainer
16+
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
17+
import org.springframework.data.redis.serializer.StringRedisSerializer
18+
import com.fasterxml.jackson.datatype.hibernate5.jakarta.Hibernate5JakartaModule
1019

1120
@Configuration
1221
class RedisConfiguration(
@@ -34,8 +43,47 @@ class RedisConfiguration(
3443
return redisTemplate
3544
}
3645

46+
@Bean
47+
fun redisPubSubTemplate(connectionFactory: RedisConnectionFactory): RedisTemplate<String, Any> {
48+
val template = RedisTemplate<String, Any>()
49+
template.connectionFactory = connectionFactory
50+
template.keySerializer = StringRedisSerializer()
51+
template.valueSerializer = GenericJackson2JsonRedisSerializer(objectMapper())
52+
return template
53+
}
54+
55+
@Bean
56+
fun redisMessageListenerContainer(
57+
connectionFactory: RedisConnectionFactory
58+
): RedisMessageListenerContainer {
59+
val container = RedisMessageListenerContainer()
60+
container.setConnectionFactory(connectionFactory)
61+
return container
62+
}
63+
64+
@Bean
65+
fun internalTopic(): ChannelTopic {
66+
return ChannelTopic("websocket-topic")
67+
}
68+
3769
@Bean
3870
fun getValueOperations(): ValueOperations<String, Int> {
3971
return redisTemplate().opsForValue()
4072
}
73+
74+
75+
76+
private fun objectMapper(): ObjectMapper {
77+
return ObjectMapper().apply {
78+
registerModule(JavaTimeModule())
79+
registerModule(Hibernate5JakartaModule())
80+
registerModule(KotlinModule.Builder().build())
81+
activateDefaultTyping(
82+
BasicPolymorphicTypeValidator.builder()
83+
.allowIfBaseType(Any::class.java)
84+
.build(),
85+
ObjectMapper.DefaultTyping.EVERYTHING
86+
)
87+
}
88+
}
4189
}

src/main/kotlin/com/kioschool/kioschoolapi/global/security/JwtProvider.kt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,6 @@ class JwtProvider(
3636
}
3737

3838
fun resolveToken(request: HttpServletRequest): String? {
39-
val rawCookieHeader = request.getHeader("Cookie")
40-
println("Raw Cookie Header: $rawCookieHeader")
41-
42-
if (rawCookieHeader == null) {
43-
println("Cookie header is missing from the request entirely.")
44-
}
45-
46-
request.cookies?.forEach {
47-
println("Found Cookie -> Name: ${it.name}, Value: ${it.value}")
48-
} ?: println("No cookies found in request object at all")
49-
5039
val rawToken = request.cookies?.find { it.name == HttpHeaders.AUTHORIZATION }?.value
5140
?: request.getHeader(HttpHeaders.AUTHORIZATION)
5241
?: return null
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.kioschool.kioschoolapi.global.websocket.dto
2+
3+
data class RedisPubSubMessage(
4+
val destination: String,
5+
val payload: Message
6+
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.kioschool.kioschoolapi.global.websocket.redis
2+
3+
import com.kioschool.kioschoolapi.global.websocket.dto.Message
4+
import com.kioschool.kioschoolapi.global.websocket.dto.RedisPubSubMessage
5+
import org.springframework.data.redis.core.RedisTemplate
6+
import org.springframework.data.redis.listener.ChannelTopic
7+
import org.springframework.stereotype.Service
8+
9+
@Service
10+
class RedisPublisher(
11+
private val redisTemplate: RedisTemplate<String, Any>,
12+
private val channelTopic: ChannelTopic
13+
) {
14+
fun publish(destination: String, message: Message) {
15+
val pubSubMessage = RedisPubSubMessage(destination, message)
16+
redisTemplate.convertAndSend(channelTopic.topic, pubSubMessage)
17+
}
18+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.kioschool.kioschoolapi.global.websocket.redis
2+
3+
import com.kioschool.kioschoolapi.global.websocket.dto.RedisPubSubMessage
4+
import org.springframework.beans.factory.annotation.Qualifier
5+
import org.springframework.data.redis.connection.Message
6+
import org.springframework.data.redis.connection.MessageListener
7+
import org.springframework.data.redis.core.RedisTemplate
8+
import org.springframework.data.redis.listener.ChannelTopic
9+
import org.springframework.data.redis.listener.RedisMessageListenerContainer
10+
import org.springframework.messaging.simp.SimpMessagingTemplate
11+
import org.springframework.stereotype.Service
12+
13+
@Service
14+
class RedisSubscriber(
15+
private val messagingTemplate: SimpMessagingTemplate,
16+
private val redisMessageListenerContainer: RedisMessageListenerContainer,
17+
private val channelTopic: ChannelTopic,
18+
@Qualifier("redisPubSubTemplate")
19+
private val redisTemplate: RedisTemplate<String, Any>
20+
) : MessageListener {
21+
22+
init {
23+
redisMessageListenerContainer.addMessageListener(this, channelTopic)
24+
}
25+
26+
override fun onMessage(message: Message, pattern: ByteArray?) {
27+
try {
28+
val pubSubMessage =
29+
redisTemplate.valueSerializer.deserialize(message.body) as RedisPubSubMessage
30+
messagingTemplate.convertAndSend(pubSubMessage.destination, pubSubMessage.payload)
31+
} catch (e: Exception) {
32+
println("Redis Subscriber Error: ${e.message}")
33+
}
34+
}
35+
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.kioschool.kioschoolapi.global.websocket.service
22

33
import com.kioschool.kioschoolapi.global.websocket.dto.Message
4-
import org.springframework.messaging.simp.SimpMessagingTemplate
4+
import com.kioschool.kioschoolapi.global.websocket.redis.RedisPublisher
55
import org.springframework.stereotype.Service
66

77
@Service
88
class CustomWebSocketService(
9-
private val simpMessagingTemplate: SimpMessagingTemplate
9+
private val redisPublisher: RedisPublisher
1010
) {
1111
fun sendMessage(destination: String, message: Message) {
12-
simpMessagingTemplate.convertAndSend(destination, message)
12+
redisPublisher.publish(destination, message)
1313
}
1414
}

0 commit comments

Comments
 (0)