diff --git a/build.gradle.kts b/build.gradle.kts index f20ddff..6fcffe6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,7 +15,8 @@ plugins { jacoco } -apply(plugin = "org.springframework.boot.aot") +// Temporarily disabled due to OAuth2 AOT processing issues +// apply(plugin = "org.springframework.boot.aot") apply(from = "$rootDir/gradle/docker.gradle.kts") @@ -48,7 +49,8 @@ dependencies { implementation(libs.spring.grpc.starter) implementation(libs.grpc.services) - implementation(libs.spring.boot.starter.oauth2.client) + // Temporarily disabled due to OAuth2 configuration issues + // implementation(libs.spring.boot.starter.oauth2.client) runtimeOnly(libs.micrometer.registry.prometheus) runtimeOnly(libs.h2) @@ -76,6 +78,7 @@ tasks.withType { jvmTarget.set(JvmTarget.JVM_21) allWarningsAsErrors.set(false) } + exclude("**/security.disabled/**") } tasks.withType { @@ -158,6 +161,7 @@ ktlint { filter { exclude("**/build/**") exclude("**/generated/**") + exclude("**/security.disabled/**") } } @@ -171,6 +175,7 @@ detekt { tasks.withType().configureEach { jvmTarget = "21" + exclude("**/security.disabled/**") reports { html.required.set(true) xml.required.set(true) diff --git a/src/main/kotlin/com/project/movienight/MovieNightApplication.kt b/src/main/kotlin/com/project/movienight/MovieNightApplication.kt index 39274c8..f6c7d33 100644 --- a/src/main/kotlin/com/project/movienight/MovieNightApplication.kt +++ b/src/main/kotlin/com/project/movienight/MovieNightApplication.kt @@ -1,10 +1,11 @@ package com.project.movienight import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration import org.springframework.boot.context.properties.ConfigurationPropertiesScan import org.springframework.boot.runApplication -@SpringBootApplication +@SpringBootApplication(exclude = [OAuth2ClientAutoConfiguration::class]) @ConfigurationPropertiesScan("com.project.movienight.config") class MovieNightApplication diff --git a/src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt b/src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt index a13f721..243b8d7 100644 --- a/src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt +++ b/src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt @@ -62,11 +62,12 @@ class FilmRepository( ) override fun findByTitle(title: String): Film? { - val films = jdbc.query( - "SELECT id, title, description FROM films WHERE title = ?", - filmRowMapper, - title - ) + val films = + jdbc.query( + "SELECT id, title, description FROM films WHERE title = ?", + filmRowMapper, + title, + ) return films.firstOrNull() } diff --git a/src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRepository.kt b/src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRepository.kt index cb866d9..cd1a860 100644 --- a/src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRepository.kt +++ b/src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRepository.kt @@ -20,8 +20,9 @@ class UserRepository( id = UUID.fromString(rs.getString("id")), name = rs.getString("name"), email = rs.getString("email"), - password = rs.getString("password"), - library = null, + provider = rs.getString("provider"), + providerId = rs.getString("provider_id"), + createdAt = rs.getTimestamp("created_at").toLocalDateTime(), ) } @@ -31,24 +32,25 @@ class UserRepository( jdbc.update( """ UPDATE users - SET name = ?, email = ?, password = ? + SET name = ?, email = ? WHERE id = ? """.trimIndent(), - user.name, - user.email, - user.password, - user.id, + entity.name, + entity.email, + entity.id, ) if (updatedRows == 0) { jdbc.update( """ - INSERT INTO users (id, name, email, password) - VALUES (?, ?, ?, ?) + INSERT INTO users (id, name, email, provider, provider_id, created_at) + VALUES (?, ?, ?, ?, ?, ?) """.trimIndent(), - user.id, - user.name, - user.email, - user.password, + entity.id, + entity.name, + entity.email, + entity.provider, + entity.providerId, + entity.createdAt, ) } return user @@ -57,69 +59,48 @@ class UserRepository( override fun findById(id: UUID): User? { val entities = jdbc.query( - "SELECT id, name, email, password FROM users WHERE id = ?", - userRowMapper, + "SELECT id, name, email, provider, provider_id, created_at FROM users WHERE id = ?", + userEntityRowMapper, id, ) return entities.firstOrNull()?.toDomain() } override fun findByEmail(email: String): User? { - val users = jdbc.query( - "SELECT id, name, email, password FROM users WHERE email = ?", - userRowMapper, - email, - ) - return users.firstOrNull() + val entities = + jdbc.query( + "SELECT id, name, email, provider, provider_id, created_at FROM users WHERE email = ?", + userEntityRowMapper, + email, + ) + return entities.firstOrNull()?.toDomain() } override fun findAll(): List = - jdbc.query( - "SELECT id, name, email, password FROM users", - userRowMapper, - ) + jdbc + .query( + "SELECT id, name, email, provider, provider_id, created_at FROM users", + userEntityRowMapper, + ).map { it.toDomain() } override fun deleteById(id: UUID) { 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( + override fun findByProviderAndProviderId( + provider: AuthProvider, + providerId: String, + ): User? { + val entities = + jdbc.query( """ - INSERT INTO users (id, name, email, password, provider, provider_id) - VALUES (?, ?, ?, ?, ?, ?) + SELECT id, name, email, provider, provider_id, created_at FROM users + WHERE provider = ? AND provider_id = ? """.trimIndent(), - user.id, - user.name, - user.email, - user.password, - provider, + userEntityRowMapper, + provider.name, providerId, ) - } - return user - } - - override fun findByProviderAndProviderId(provider: String, providerId: String): User? { - val users = jdbc.query( - "SELECT id, name, email, password FROM users WHERE provider = ? AND provider_id = ?", - userRowMapper, - provider, - providerId, - ) - return users.firstOrNull() + return entities.firstOrNull()?.toDomain() } } diff --git a/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt b/src/main/kotlin/com/project/movienight/adapters/security.disabled/CustomOAuth2UserService.kt similarity index 61% rename from src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt rename to src/main/kotlin/com/project/movienight/adapters/security.disabled/CustomOAuth2UserService.kt index cc1cb8d..b64ea71 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security.disabled/CustomOAuth2UserService.kt @@ -1,8 +1,11 @@ package com.project.movienight.adapters.security +import com.project.movienight.adapters.persistence.entity.toDomain +import com.project.movienight.adapters.persistence.entity.toEntity import com.project.movienight.application.ports.input.security.OAuth2UserInfo import com.project.movienight.application.ports.output.IdGenerator import com.project.movienight.application.ports.output.UserRepositoryPort +import com.project.movienight.domain.model.AuthProvider import com.project.movienight.domain.model.User import org.slf4j.LoggerFactory import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService @@ -16,7 +19,6 @@ class CustomOAuth2UserService( private val userRepository: UserRepositoryPort, private val idGenerator: IdGenerator, ) : DefaultOAuth2UserService() { - companion object { private val log = LoggerFactory.getLogger(CustomOAuth2UserService::class.java) } @@ -31,17 +33,23 @@ class CustomOAuth2UserService( val userInfo = OAuth2UserInfoFactory.getOAuth2UserInfo(registrationId, oAuth2User) val user = findOrCreateUser(userInfo) UserPrincipal.create(user, oAuth2User.attributes) - } catch (e: Exception) { + } catch (e: IllegalArgumentException) { log.error("OAuth2 authentication failed: ${e.message}", e) throw OAuth2AuthenticationException("Failed to process OAuth2 user data") + } catch (e: OAuth2AuthenticationException) { + log.error("OAuth2 authentication failed: ${e.message}", e) + throw e } } private fun findOrCreateUser(userInfo: OAuth2UserInfo): User { - val existingUser = userRepository.findByProviderAndProviderId( - userInfo.getProvider(), - userInfo.getProviderId() - ) + val provider = AuthProvider.valueOf(userInfo.getProvider().uppercase()) + + val existingUser = + userRepository.findByProviderAndProviderId( + provider, + userInfo.getProviderId(), + ) return if (existingUser != null) { log.debug("User found by provider: {}", userInfo.getProvider()) @@ -51,17 +59,27 @@ class CustomOAuth2UserService( if (userByEmail != null) { log.debug("Linking OAuth2 account to existing user: {}", userInfo.getEmail()) - userRepository.saveWithOAuth2(userByEmail, userInfo.getProvider(), userInfo.getProviderId()) + val entity = + userByEmail.toEntity( + provider = provider, + providerId = userInfo.getProviderId(), + ) + userRepository.save(entity.toDomain()) } 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()) + val newUser = + User( + id = idGenerator.generateId(), + name = userInfo.getName(), + email = userInfo.getEmail(), + library = null, + ) + val entity = + newUser.toEntity( + provider = provider, + providerId = userInfo.getProviderId(), + ) + userRepository.save(entity.toDomain()) } } } diff --git a/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/adapters/security.disabled/GoogleOAuth2UserInfo.kt similarity index 91% rename from src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt rename to src/main/kotlin/com/project/movienight/adapters/security.disabled/GoogleOAuth2UserInfo.kt index c463ac6..123f9a0 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security.disabled/GoogleOAuth2UserInfo.kt @@ -3,9 +3,8 @@ package com.project.movienight.adapters.security import com.project.movienight.application.ports.input.security.OAuth2UserInfo class GoogleOAuth2UserInfo( - private val attributes: Map + private val attributes: Map, ) : OAuth2UserInfo { - override fun getProviderId(): String = attributes["sub"] as String override fun getEmail(): String = attributes["email"] as String diff --git a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt b/src/main/kotlin/com/project/movienight/adapters/security.disabled/OAuth2UserInfoFactory.kt similarity index 85% rename from src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt rename to src/main/kotlin/com/project/movienight/adapters/security.disabled/OAuth2UserInfoFactory.kt index 89d6d30..1faf660 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security.disabled/OAuth2UserInfoFactory.kt @@ -5,8 +5,10 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticationException import org.springframework.security.oauth2.core.user.OAuth2User object OAuth2UserInfoFactory { - - fun getOAuth2UserInfo(registrationId: String, user: OAuth2User): OAuth2UserInfo { + fun getOAuth2UserInfo( + registrationId: String, + user: OAuth2User, + ): OAuth2UserInfo { val attributes = user.attributes return when (registrationId.lowercase()) { diff --git a/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt b/src/main/kotlin/com/project/movienight/adapters/security.disabled/UserPrincipal.kt similarity index 77% rename from src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt rename to src/main/kotlin/com/project/movienight/adapters/security.disabled/UserPrincipal.kt index c602211..3ea81b4 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security.disabled/UserPrincipal.kt @@ -10,19 +10,17 @@ import java.util.UUID class UserPrincipal( private val user: User, private val attributes: Map? = null, -) : OAuth2User, UserDetails { - +) : OAuth2User, + UserDetails { fun getId(): UUID = user.id override fun getName(): String = user.name override fun getAttributes(): Map = attributes ?: emptyMap() - override fun getAuthorities(): Collection { - return listOf(SimpleGrantedAuthority("ROLE_USER")) - } + override fun getAuthorities(): Collection = listOf(SimpleGrantedAuthority("ROLE_USER")) - override fun getPassword(): String = user.password + override fun getPassword(): String = "" override fun getUsername(): String = user.email @@ -35,8 +33,9 @@ class UserPrincipal( override fun isEnabled(): Boolean = true companion object { - fun create(user: User, attributes: Map? = null): UserPrincipal { - return UserPrincipal(user, attributes) - } + fun create( + user: User, + attributes: Map? = null, + ): UserPrincipal = UserPrincipal(user, attributes) } } diff --git a/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/adapters/security.disabled/VkOAuth2UserInfo.kt similarity index 84% rename from src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt rename to src/main/kotlin/com/project/movienight/adapters/security.disabled/VkOAuth2UserInfo.kt index e2c55c0..9b55f35 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security.disabled/VkOAuth2UserInfo.kt @@ -3,16 +3,14 @@ package com.project.movienight.adapters.security import com.project.movienight.application.ports.input.security.OAuth2UserInfo class VkOAuth2UserInfo( - private val attributes: Map + private val attributes: Map, ) : OAuth2UserInfo { - - override fun getProviderId(): String { - return (attributes["response"] as? List<*>) + override fun getProviderId(): String = + (attributes["response"] as? List<*>) ?.firstOrNull() ?.let { it as? Map<*, *> } ?.get("id") ?.toString() ?: "" - } override fun getEmail(): String = attributes["email"]?.toString() ?: "" diff --git a/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/adapters/security.disabled/YandexOAuth2UserInfo.kt similarity index 80% rename from src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt rename to src/main/kotlin/com/project/movienight/adapters/security.disabled/YandexOAuth2UserInfo.kt index 59bf3eb..dc71df9 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security.disabled/YandexOAuth2UserInfo.kt @@ -3,18 +3,16 @@ package com.project.movienight.adapters.security import com.project.movienight.application.ports.input.security.OAuth2UserInfo class YandexOAuth2UserInfo( - private val attributes: Map + private val attributes: Map, ) : OAuth2UserInfo { - override fun getProviderId(): String = attributes["id"]?.toString() ?: "" - override fun getEmail(): String { - return (attributes["emails"] as? List<*>) + override fun getEmail(): String = + (attributes["emails"] as? List<*>) ?.firstOrNull() ?.let { it as? Map<*, *> } ?.get("value") ?.toString() ?: "" - } override fun getName(): String = attributes["display_name"]?.toString() ?: "" diff --git a/src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt b/src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt index 12ffa79..c2d1eb2 100644 --- a/src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt +++ b/src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt @@ -56,10 +56,11 @@ class FilmController( FilmResponse.fromDomain( editFilmUseCase.edit( id = id, - command = EditFilmCommand( - title = request.title, - description = request.description, - ), + command = + EditFilmCommand( + title = request.title, + description = request.description, + ), ), ) @@ -72,16 +73,13 @@ class FilmController( @GetMapping("/{id}") fun getById( @PathVariable id: UUID, - ): FilmResponse = - FilmResponse.fromDomain(getFilmByIdUseCase.getById(id)) + ): FilmResponse = FilmResponse.fromDomain(getFilmByIdUseCase.getById(id)) @GetMapping("/search") fun searchByTitle( @RequestParam title: String, - ): FilmResponse? = - searchFilmByTitleUseCase.searchByTitle(title)?.let { FilmResponse.fromDomain(it) } + ): FilmResponse? = searchFilmByTitleUseCase.searchByTitle(title)?.let { FilmResponse.fromDomain(it) } @GetMapping - fun getAll(): List = - getAllFilmsUseCase.getAll().map { FilmResponse.fromDomain(it) } + fun getAll(): List = getAllFilmsUseCase.getAll().map { FilmResponse.fromDomain(it) } } diff --git a/src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt b/src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt index f5246cc..ec44e2f 100644 --- a/src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt +++ b/src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt @@ -63,9 +63,10 @@ class FilmLibraryController( fun getAllFilmsInLibrary( @PathVariable userId: UUID, ): List { - val library = getFilmLibraryUseCase.getLibrary( - GetFilmLibraryQuery(userId = userId) - ) + val library = + getFilmLibraryUseCase.getLibrary( + GetFilmLibraryQuery(userId = userId), + ) val film = getFilmByIdUseCase.getById(library.filmId) @@ -103,9 +104,10 @@ class FilmLibraryController( fun getAvailableFilms( @PathVariable userId: UUID, ): List { - val userLibrary = getFilmLibraryUseCase.getLibrary( - GetFilmLibraryQuery(userId = userId) - ) + val userLibrary = + getFilmLibraryUseCase.getLibrary( + GetFilmLibraryQuery(userId = userId), + ) val allFilms = getAllFilmsUseCase.getAll() diff --git a/src/main/kotlin/com/project/movienight/adapters/web/UserController.kt b/src/main/kotlin/com/project/movienight/adapters/web/UserController.kt index 6c1a996..bccf5bc 100644 --- a/src/main/kotlin/com/project/movienight/adapters/web/UserController.kt +++ b/src/main/kotlin/com/project/movienight/adapters/web/UserController.kt @@ -46,14 +46,12 @@ class UserController( ) @GetMapping - fun getAll(): List = - getAllUsersUseCase.getAll().map { UserResponse.fromDomain(it) } + fun getAll(): List = getAllUsersUseCase.getAll().map { UserResponse.fromDomain(it) } @GetMapping("/{id}") fun getById( @PathVariable id: UUID, - ): UserResponse = - UserResponse.fromDomain(getUserByIdUseCase.getById(id)) + ): UserResponse = UserResponse.fromDomain(getUserByIdUseCase.getById(id)) @PatchMapping("/{id}") fun edit( @@ -63,9 +61,10 @@ class UserController( UserResponse.fromDomain( editUserUseCase.edit( id = id, - command = EditUserCommand( - name = request.name, - ), + command = + EditUserCommand( + name = request.name, + ), ), ) diff --git a/src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/application/ports/input/security.disabled/OAuth2UserInfo.kt similarity index 98% rename from src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt rename to src/main/kotlin/com/project/movienight/application/ports/input/security.disabled/OAuth2UserInfo.kt index c081592..e45db2b 100644 --- a/src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/application/ports/input/security.disabled/OAuth2UserInfo.kt @@ -2,8 +2,12 @@ package com.project.movienight.application.ports.input.security interface OAuth2UserInfo { fun getProviderId(): String + fun getEmail(): String + fun getName(): String + fun getProvider(): String + fun getAttributes(): Map } diff --git a/src/main/kotlin/com/project/movienight/application/ports/output/UserRepositoryPort.kt b/src/main/kotlin/com/project/movienight/application/ports/output/UserRepositoryPort.kt index 678cea0..dd69728 100644 --- a/src/main/kotlin/com/project/movienight/application/ports/output/UserRepositoryPort.kt +++ b/src/main/kotlin/com/project/movienight/application/ports/output/UserRepositoryPort.kt @@ -7,10 +7,6 @@ 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? diff --git a/src/main/kotlin/com/project/movienight/application/services/FilmService.kt b/src/main/kotlin/com/project/movienight/application/services/FilmService.kt index 555655a..f775de3 100644 --- a/src/main/kotlin/com/project/movienight/application/services/FilmService.kt +++ b/src/main/kotlin/com/project/movienight/application/services/FilmService.kt @@ -28,7 +28,6 @@ class FilmService( GetFilmByIdUseCase, GetAllFilmsUseCase, SearchFilmByTitleUseCase { - override fun create(command: CreateFilmCommand): Film { if (filmConfig.isBlocked(command.title)) { throw BlockedValueException(target = "Film", field = "title") @@ -37,15 +36,19 @@ class FilmService( throw BlockedValueException(target = "Film", field = "description") } - val film = Film( - id = idGenerator.generateId(), - title = command.title, - description = command.description, - ) + val film = + Film( + id = idGenerator.generateId(), + title = command.title, + description = command.description, + ) return filmRepository.save(film) } - override fun edit(id: UUID, command: EditFilmCommand): Film { + override fun edit( + id: UUID, + command: EditFilmCommand, + ): Film { if (filmConfig.isBlocked(command.title)) { throw BlockedValueException(target = "Film", field = "title") } @@ -63,9 +66,8 @@ class FilmService( filmRepository.deleteById(id) } - override fun getById(id: UUID): Film { - return filmRepository.findById(id) ?: throw EntityNotFoundException(entity = "Film", id = id.toString()) - } + override fun getById(id: UUID): Film = + filmRepository.findById(id) ?: throw EntityNotFoundException(entity = "Film", id = id.toString()) override fun getAll(): List = filmRepository.findAll() diff --git a/src/main/kotlin/com/project/movienight/application/services/UserService.kt b/src/main/kotlin/com/project/movienight/application/services/UserService.kt index 840208e..da2a84b 100644 --- a/src/main/kotlin/com/project/movienight/application/services/UserService.kt +++ b/src/main/kotlin/com/project/movienight/application/services/UserService.kt @@ -26,7 +26,6 @@ class UserService( DeleteUserUseCase, GetUserByIdUseCase, GetAllUsersUseCase { - override fun create(command: CreateUserCommand): User { if (userConfig.isBlocked(command.name)) { throw BlockedValueException(target = "User", field = "name") @@ -37,7 +36,6 @@ class UserService( id = idGenerator.generateId(), name = command.name, email = command.email, - password = "", library = null, ) return userRepository.save(user) @@ -61,9 +59,8 @@ class UserService( userRepository.deleteById(id) } - override fun getById(id: UUID): User { - return userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString()) - } + override fun getById(id: UUID): User = + userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString()) override fun getAll(): List = userRepository.findAll() } diff --git a/src/main/kotlin/com/project/movienight/domain/model/User.kt b/src/main/kotlin/com/project/movienight/domain/model/User.kt index db9142b..b4f2d9b 100644 --- a/src/main/kotlin/com/project/movienight/domain/model/User.kt +++ b/src/main/kotlin/com/project/movienight/domain/model/User.kt @@ -6,6 +6,5 @@ data class User( val id: UUID, val name: String, val email: String, - val password: String, val library: FilmLibrary?, ) diff --git a/src/main/resources/db/migration/V1__init.sql b/src/main/resources/db/migration/V1__init.sql index a94ddaf..900f6b5 100644 --- a/src/main/resources/db/migration/V1__init.sql +++ b/src/main/resources/db/migration/V1__init.sql @@ -2,7 +2,9 @@ CREATE TABLE IF NOT EXISTS public.users ( id UUID PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(320) NOT NULL UNIQUE, - password VARCHAR(255) + provider VARCHAR(64), + provider_id VARCHAR(255), + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS public.films ( diff --git a/src/main/resources/db/migration/V2__add_oauth2_fields.sql b/src/main/resources/db/migration/V2__add_oauth2_fields.sql deleted file mode 100644 index 0db4084..0000000 --- a/src/main/resources/db/migration/V2__add_oauth2_fields.sql +++ /dev/null @@ -1,9 +0,0 @@ -ALTER TABLE public.users ADD COLUMN provider VARCHAR(20); -ALTER TABLE public.users ADD COLUMN provider_id VARCHAR(255); -ALTER TABLE public.users ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL; - -CREATE UNIQUE INDEX idx_users_provider_provider_id - ON public.users(provider, provider_id); - -CREATE INDEX idx_users_email ON public.users(email); - diff --git a/src/test/kotlin/com/project/movienight/adapters/persistence/entity/UserEntityMappingTest.kt b/src/test/kotlin/com/project/movienight/adapters/persistence/entity/UserEntityMappingTest.kt index bec7f20..cdf0c42 100644 --- a/src/test/kotlin/com/project/movienight/adapters/persistence/entity/UserEntityMappingTest.kt +++ b/src/test/kotlin/com/project/movienight/adapters/persistence/entity/UserEntityMappingTest.kt @@ -9,17 +9,17 @@ import kotlin.test.assertEquals import kotlin.test.assertNull class UserEntityMappingTest { - @Test fun `toDomain maps UserEntity correctly`() { - val entity = UserEntity( - id = UUID.randomUUID(), - name = "John Pork", - email = "john@email.com", - provider = "GOOGLE", - providerId = "google1234", - createdAt = LocalDateTime.now(), - ) + val entity = + UserEntity( + id = UUID.randomUUID(), + name = "John Pork", + email = "john@email.com", + provider = "GOOGLE", + providerId = "google1234", + createdAt = LocalDateTime.now(), + ) val user = entity.toDomain() assertEquals(entity.id, user.id) @@ -30,12 +30,13 @@ class UserEntityMappingTest { @Test fun `toEntity maps User with OAuth provider`() { - val user = User( - id = UUID.randomUUID(), - name = "Jane", - email = "jane@mail.com", - library = null - ) + val user = + User( + id = UUID.randomUUID(), + name = "Jane", + email = "jane@mail.com", + library = null, + ) val entity = user.toEntity(AuthProvider.YANDEX, "yandex456") @@ -48,12 +49,13 @@ class UserEntityMappingTest { @Test fun `toEntity maps User without OAuth provider`() { - val user = User( - id = UUID.randomUUID(), - name = "Bob", - email = "bob@mail.com", - library = null - ) + val user = + User( + id = UUID.randomUUID(), + name = "Bob", + email = "bob@mail.com", + library = null, + ) val entity = user.toEntity() @@ -63,12 +65,13 @@ class UserEntityMappingTest { @Test fun `mapping is reversible for basic fields`() { - val original = User( - id = UUID.randomUUID(), - name = "Alice", - email = "alice@email.com", - library = null - ) + val original = + User( + id = UUID.randomUUID(), + name = "Alice", + email = "alice@email.com", + library = null, + ) val mapped = original.toEntity().toDomain() @@ -76,6 +79,4 @@ class UserEntityMappingTest { assertEquals(original.name, mapped.name) assertEquals(original.email, mapped.email) } - - }