Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 30 additions & 41 deletions src/main/kotlin/com/tripsync/application/auth/OAuth2UserService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@ import com.tripsync.common.dto.ApiResponse
import com.tripsync.common.exception.DomainException
import com.tripsync.domain.entity.User
import com.tripsync.domain.enums.AuthProvider
import com.tripsync.domain.enums.YnFlag
import com.tripsync.domain.repository.UserRepository
import mu.KotlinLogging
import org.springframework.http.HttpStatus
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest
import org.springframework.security.oauth2.core.user.OAuth2User
import org.springframework.stereotype.Service

Expand All @@ -18,8 +15,6 @@ class OAuth2UserService(
private val userRepository: UserRepository,
private val jwtTokenProvider: JwtTokenProvider,
) : DefaultOAuth2UserService() {
private val logger = KotlinLogging.logger {}

fun processGoogleLogin(oAuth2User: OAuth2User): ApiResponse<Map<String, Any>> {
val email = oAuth2User.getAttribute<String>("email")
?: throw DomainException(HttpStatus.BAD_REQUEST, "OAUTH_EMAIL_MISSING", "이메일 정보를 가져올 수 없습니다.")
Expand All @@ -28,33 +23,14 @@ class OAuth2UserService(
val providerId = oAuth2User.getAttribute<String>("sub")
?: throw DomainException(HttpStatus.BAD_REQUEST, "OAUTH_ID_MISSING", "사용자 ID를 가져올 수 없습니다.")

val existingUser = userRepository.findByAuthProviderAndProviderUserId(AuthProvider.GOOGLE, providerId)

val user = if (existingUser != null) {
existingUser
} else {
userRepository.save(
User(
nickname = name,
email = email,
authProvider = AuthProvider.GOOGLE,
providerUserId = providerId,
profileImageUrl = picture,
)
)
}

val token = jwtTokenProvider.generateToken(user.id, user.isGuest)
@Suppress("UNCHECKED_CAST")
return ApiResponse.ok(
mapOf(
"token" to token,
"userId" to user.id,
"nickname" to user.nickname,
"email" to (user.email ?: ""),
"authProvider" to user.authProvider.name,
) as Map<String, Any>
val user = findOrCreateOAuthUser(
provider = AuthProvider.GOOGLE,
providerId = providerId,
nickname = name,
email = email,
profileImageUrl = picture,
)
return authResponse(user)
}

fun processKakaoLogin(oAuth2User: OAuth2User): ApiResponse<Map<String, Any>> {
Expand All @@ -68,32 +44,45 @@ class OAuth2UserService(
val providerId = attributes["id"]?.toString()
?: throw DomainException(HttpStatus.BAD_REQUEST, "OAUTH_ID_MISSING", "사용자 ID를 가져올 수 없습니다.")

val existingUser = userRepository.findByAuthProviderAndProviderUserId(AuthProvider.KAKAO, providerId)
val user = findOrCreateOAuthUser(
provider = AuthProvider.KAKAO,
providerId = providerId,
nickname = nickname,
email = email,
profileImageUrl = profileImage,
)
return authResponse(user)
}

val user = if (existingUser != null) {
existingUser
} else {
userRepository.save(
private fun findOrCreateOAuthUser(
provider: AuthProvider,
providerId: String,
nickname: String,
email: String?,
profileImageUrl: String?,
): User {
return userRepository.findByAuthProviderAndProviderUserId(provider, providerId)
?: userRepository.save(
User(
nickname = nickname,
email = email,
authProvider = AuthProvider.KAKAO,
authProvider = provider,
providerUserId = providerId,
profileImageUrl = profileImage,
profileImageUrl = profileImageUrl,
)
)
}
}

private fun authResponse(user: User): ApiResponse<Map<String, Any>> {
val token = jwtTokenProvider.generateToken(user.id, user.isGuest)
@Suppress("UNCHECKED_CAST")
return ApiResponse.ok(
mapOf(
"token" to token,
"userId" to user.id,
"nickname" to user.nickname,
"email" to (user.email ?: ""),
"authProvider" to user.authProvider.name,
) as Map<String, Any>
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,8 @@ class ScheduleResponseMapper(
return formatStoredSchedule(schedule).filterKeys { it in publicKeys }
}

@Suppress("UNCHECKED_CAST")
private fun formatLlmMetadata(schedule: Schedule): Map<String, Any?> {
val metadata = schedule.generationInput["llm"] as? Map<String, Any?> ?: emptyMap()
val metadata = schedule.generationInput["llm"] as? Map<*, *> ?: emptyMap<String, Any?>()
val provider = schedule.llmProvider ?: metadata["provider"]
return mapOf(
"provider" to provider,
Expand Down
Loading