Исправлена V1 миграция - добавлена запятая после email

Реализован saveWithOAuth2() в UserRepository
Реализован findByProviderAndProviderId() в UserRepository
Обновлен CustomOAuth2UserService для использования OAuth2 методов
Исправил package declaration во всех 7 OAuth2 файлах
This commit is contained in:
skettiks
2026-05-14 20:57:58 +03:00
parent 88794e6a96
commit 166c5be863
11 changed files with 88 additions and 24 deletions
@@ -9,6 +9,7 @@ data class UserEntity(
val id: UUID,
val name: String,
val email: String,
val password: String?,
val provider: String?,
val providerId: String?,
val createdAt: LocalDateTime,
@@ -31,6 +32,7 @@ fun User.toEntity(
id = id,
name = name,
email = email,
password = password,
provider = provider?.name,
providerId = providerId,
createdAt = createdAt,
@@ -20,6 +20,7 @@ class UserRepository(
id = UUID.fromString(rs.getString("id")),
name = rs.getString("name"),
email = rs.getString("email"),
password = rs.getString("password"),
provider = rs.getString("provider"),
providerId = rs.getString("provider_id"),
createdAt = rs.getTimestamp("created_at").toLocalDateTime(),
@@ -32,11 +33,12 @@ class UserRepository(
jdbc.update(
"""
UPDATE users
SET name = ?, email = ?, provider = ?, provider_id = ?
SET name = ?, email = ?, password = ?, provider = ?, provider_id = ?
WHERE id = ?
""".trimIndent(),
entity.name,
entity.email,
user.password,
entity.provider,
entity.providerId,
entity.id,
@@ -44,12 +46,13 @@ class UserRepository(
if (updatedRows == 0) {
jdbc.update(
"""
INSERT INTO users (id, name, email, provider, provider_id, created_at)
VALUES (?, ?, ?, ?, ?, ?)
INSERT INTO users (id, name, email, password, provider, provider_id, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""".trimIndent(),
entity.id,
entity.name,
entity.email,
user.password,
entity.provider,
entity.providerId,
entity.createdAt,
@@ -61,7 +64,7 @@ class UserRepository(
override fun findById(id: UUID): User? {
val entities =
jdbc.query(
"SELECT id, name, email, provider, provider_id, created_at FROM users WHERE id = ?",
"SELECT id, name, email, password, provider, provider_id, created_at FROM users WHERE id = ?",
userEntityRowMapper,
id,
)
@@ -71,7 +74,7 @@ class UserRepository(
override fun findAll(): List<User> =
jdbc
.query(
"SELECT id, name, email, provider, provider_id, created_at FROM users",
"SELECT id, name, email, password, provider, provider_id, created_at FROM users",
userEntityRowMapper,
).map { it.toDomain() }
@@ -79,6 +82,47 @@ class UserRepository(
jdbc.update("DELETE FROM users WHERE id = ?", id)
}
override fun saveWithOAuth2(user: User, provider: String, providerId: String): User {
val updatedRows = jdbc.update(
"""
UPDATE users
SET name = ?, email = ?, password = ?, provider = ?, provider_id = ?
WHERE id = ?
""".trimIndent(),
user.name,
user.email,
user.password,
provider,
providerId,
user.id,
)
if (updatedRows == 0) {
jdbc.update(
"""
INSERT INTO users (id, name, email, password, provider, provider_id)
VALUES (?, ?, ?, ?, ?, ?)
""".trimIndent(),
user.id,
user.name,
user.email,
user.password,
provider,
providerId,
)
}
return user
}
override fun findByProviderAndProviderId(provider: String, providerId: String): User? {
val entities = jdbc.query(
"SELECT id, name, email, password, provider, provider_id, created_at FROM users WHERE provider = ? AND provider_id = ?",
userEntityRowMapper,
provider,
providerId,
)
return entities.firstOrNull()?.toDomain()
}
override fun findByProviderAndProviderId(
provider: AuthProvider,
providerId: String,
@@ -86,7 +130,7 @@ class UserRepository(
val entities =
jdbc.query(
"""
SELECT id, name, email, provider, provider_id, created_at
SELECT id, name, email, password, provider, provider_id, created_at
FROM users
WHERE provider = ? AND provider_id = ?
""".trimIndent(),
@@ -1,4 +1,4 @@
package com.project.movienight.adapters.security.oauth2
package com.project.movienight.adapters.security
import com.project.movienight.application.ports.output.IdGenerator
import com.project.movienight.application.ports.output.UserRepositoryPort
@@ -37,21 +37,34 @@ class CustomOAuth2UserService(
}
private fun findOrCreateUser(userInfo: OAuth2UserInfo): User {
val existingUser = userRepository.findByEmail(userInfo.getEmail())
// Сначала ищем по provider + provider_id (основной способ для OAuth2)
val existingUser = userRepository.findByProviderAndProviderId(
userInfo.getProvider(),
userInfo.getProviderId()
)
return if (existingUser != null) {
log.debug("User found by email: {}", userInfo.getEmail())
log.debug("User found by provider: {}", userInfo.getProvider())
existingUser
} else {
log.debug("Creating new user for provider: {}", userInfo.getProvider())
val newUser = User(
id = idGenerator.generateId(),
name = userInfo.getName(),
email = userInfo.getEmail(),
password = "", // OAuth2 пользователи не имеют пароля
library = null,
)
userRepository.save(newUser)
// Проверяем нет ли пользователя с таким email (связывание аккаунтов)
val userByEmail = userRepository.findByEmail(userInfo.getEmail())
if (userByEmail != null) {
// Пользователь существует, обновляем его OAuth2 данными
log.debug("Linking OAuth2 account to existing user: {}", userInfo.getEmail())
userRepository.saveWithOAuth2(userByEmail, userInfo.getProvider(), userInfo.getProviderId())
} else {
log.debug("Creating new user for provider: {}", userInfo.getProvider())
val newUser = User(
id = idGenerator.generateId(),
name = userInfo.getName(),
email = userInfo.getEmail(),
password = "",
library = null,
)
userRepository.saveWithOAuth2(newUser, userInfo.getProvider(), userInfo.getProviderId())
}
}
}
}
@@ -1,4 +1,4 @@
package com.project.movienight.adapters.security.oauth2
package com.project.movienight.adapters.security
class GoogleOAuth2UserInfo(
private val attributes: Map<String, Any>
@@ -1,4 +1,4 @@
package com.project.movienight.adapters.security.oauth2
package com.project.movienight.adapters.security
interface OAuth2UserInfo {
fun getProviderId(): String
@@ -1,4 +1,4 @@
package com.project.movienight.adapters.security.oauth2
package com.project.movienight.adapters.security
import org.springframework.security.oauth2.core.OAuth2AuthenticationException
import org.springframework.security.oauth2.core.user.OAuth2User
@@ -1,4 +1,4 @@
package com.project.movienight.adapters.security.oauth2
package com.project.movienight.adapters.security
import com.project.movienight.domain.model.User
import org.springframework.security.core.GrantedAuthority
@@ -1,4 +1,4 @@
package com.project.movienight.adapters.security.oauth2
package com.project.movienight.adapters.security
@Suppress("UNCHECKED_CAST")
class VkOAuth2UserInfo(
@@ -1,4 +1,4 @@
package com.project.movienight.adapters.security.oauth2
package com.project.movienight.adapters.security
@Suppress("UNCHECKED_CAST")
class YandexOAuth2UserInfo(
@@ -7,6 +7,10 @@ import java.util.UUID
interface UserRepositoryPort {
fun save(user: User): User
fun saveWithOAuth2(user: User, provider: String, providerId: String): User
fun findByProviderAndProviderId(provider: String, providerId: String): User?
fun findById(id: UUID): User?
fun findByEmail(email: String): User?