package com.project.movienight.application.services import com.project.movienight.application.ports.input.CreateUserCommand import com.project.movienight.application.ports.input.EditUserCommand import com.project.movienight.application.ports.input.UserUseCase import com.project.movienight.application.ports.output.IdGenerator import com.project.movienight.application.ports.output.UserRepositoryPort import com.project.movienight.config.UserServiceProperties import com.project.movienight.domain.exception.BlockedValueException import com.project.movienight.domain.exception.EntityNotFoundException import com.project.movienight.domain.model.User import org.springframework.stereotype.Service import java.util.UUID @Service class UserService( private val userRepository: UserRepositoryPort, private val idGenerator: IdGenerator, private val userConfig: UserServiceProperties, ) : UserUseCase { override fun create(command: CreateUserCommand): User { if (userConfig.isBlocked(command.name)) { throw BlockedValueException(target = "User", field = "name") } val user = User( id = idGenerator.generateId(), name = command.name, email = command.email, jellyfinUserId = null, ) return userRepository.save(user) } override fun edit( id: UUID, command: EditUserCommand, ): User { if (userConfig.isBlocked(command.name)) { throw BlockedValueException(target = "User", field = "name") } var user = userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString()) user = user.copy( name = command.name, jellyfinUserId = command.jellyfinUserId ?: user.jellyfinUserId, ) return userRepository.save(user) } override fun delete(id: UUID) { userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString()) userRepository.deleteById(id) } override fun getById(id: UUID): User = userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString()) override fun getAll(): List = userRepository.findAll() }