Skip to content

Commit

Permalink
entityCallback에서 호출하는 backfill 로직의 코루틴 컨텍스트를 Unconfined로 변경
Browse files Browse the repository at this point in the history
  • Loading branch information
Jhvictor4 committed Sep 7, 2023
1 parent c740de4 commit 96621db
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 40 deletions.
1 change: 0 additions & 1 deletion api/src/main/kotlin/handler/DeviceHandler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.wafflestudio.snu4t.handler
import com.wafflestudio.snu4t.common.dto.OkResponse
import com.wafflestudio.snu4t.middleware.SnuttRestApiDefaultMiddleware
import com.wafflestudio.snu4t.notification.service.DeviceService
import com.wafflestudio.snu4t.users.data.User
import com.wafflestudio.snu4t.users.service.UserNicknameService
import com.wafflestudio.snu4t.users.service.UserService
import org.springframework.stereotype.Component
Expand Down
30 changes: 22 additions & 8 deletions core/src/main/kotlin/users/data/UserEntityCallback.kt
Original file line number Diff line number Diff line change
@@ -1,28 +1,42 @@
package com.wafflestudio.snu4t.users.data

import com.wafflestudio.snu4t.users.service.UserNicknameBackFillSupporter
import com.wafflestudio.snu4t.users.repository.UserRepository
import com.wafflestudio.snu4t.users.service.UserNicknameService
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.reactor.mono
import org.bson.Document
import org.reactivestreams.Publisher
import org.slf4j.LoggerFactory
import org.springframework.context.annotation.Lazy
import org.springframework.core.CoroutinesUtils
import org.springframework.data.mongodb.core.mapping.event.ReactiveAfterConvertCallback
import org.springframework.stereotype.Component
import reactor.core.publisher.Mono

@Component
class UserEntityCallback(
@Lazy private val supporter: UserNicknameBackFillSupporter
class UserEntityCallback @Lazy constructor(
private val userRepository: UserRepository,
private val userNicknameService: UserNicknameService,
) : ReactiveAfterConvertCallback<User> {

private val log = LoggerFactory.getLogger(javaClass)

override fun onAfterConvert(entity: User, document: Document, collection: String): Publisher<User> {
if (entity.nickname == null) {
log.info("empty nickname found. user: $entity")
return CoroutinesUtils.deferredToMono(supporter.backFillNickname(entity))
if (entity.nickname != null) {
return Mono.just(entity)
}

return Mono.just(entity)
log.info("empty nickname found. user: $entity")
return backFillNickname(entity)
}

private fun backFillNickname(user: User): Mono<User> = mono(Dispatchers.Unconfined) {
try {
val result = userRepository.save(user.copy(nickname = userNicknameService.generateUniqueRandomNickname()))
log.info("[BACKFILL] updated nickname of USER: $result")
result
} catch (e: Exception) {
log.error("[BACKFILL] failed to update nickname of USER: $user", e)
throw e
}
}
}

This file was deleted.

0 comments on commit 96621db

Please sign in to comment.