исправление

This commit is contained in:
Elena Ponomareva
2026-04-24 22:55:56 +03:00
parent 88837d2e18
commit 8120294d47
7 changed files with 114 additions and 61 deletions
@@ -8,10 +8,20 @@ import com.project.movienight.application.ports.input.CreateFilmUseCase
import com.project.movienight.application.ports.input.DeleteFilmUseCase import com.project.movienight.application.ports.input.DeleteFilmUseCase
import com.project.movienight.application.ports.input.EditFilmCommand import com.project.movienight.application.ports.input.EditFilmCommand
import com.project.movienight.application.ports.input.EditFilmUseCase import com.project.movienight.application.ports.input.EditFilmUseCase
import com.project.movienight.application.services.FilmService import com.project.movienight.application.ports.input.GetAllFilmsUseCase
import com.project.movienight.domain.exception.EntityNotFoundException import com.project.movienight.application.ports.input.GetFilmByIdUseCase
import com.project.movienight.application.ports.input.SearchFilmByTitleUseCase
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PatchMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.web.bind.annotation.RestController
import java.util.UUID import java.util.UUID
@RestController @RestController
@@ -20,7 +30,9 @@ class FilmController(
private val createFilmUseCase: CreateFilmUseCase, private val createFilmUseCase: CreateFilmUseCase,
private val editFilmUseCase: EditFilmUseCase, private val editFilmUseCase: EditFilmUseCase,
private val deleteFilmUseCase: DeleteFilmUseCase, private val deleteFilmUseCase: DeleteFilmUseCase,
private val filmService: FilmService, private val getFilmByIdUseCase: GetFilmByIdUseCase,
private val getAllFilmsUseCase: GetAllFilmsUseCase,
private val searchFilmByTitleUseCase: SearchFilmByTitleUseCase,
) { ) {
@PostMapping @PostMapping
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
@@ -44,8 +56,7 @@ class FilmController(
FilmResponse.fromDomain( FilmResponse.fromDomain(
editFilmUseCase.edit( editFilmUseCase.edit(
id = id, id = id,
command = command = EditFilmCommand(
EditFilmCommand(
title = request.title, title = request.title,
description = request.description, description = request.description,
), ),
@@ -62,13 +73,15 @@ class FilmController(
fun getById( fun getById(
@PathVariable id: UUID, @PathVariable id: UUID,
): FilmResponse = ): FilmResponse =
FilmResponse.fromDomain( FilmResponse.fromDomain(getFilmByIdUseCase.getById(id))
filmService.findById(id) ?: throw EntityNotFoundException("Film", id.toString())
)
@GetMapping("/search") @GetMapping("/search")
fun searchByTitle( fun searchByTitle(
@RequestParam title: String, @RequestParam title: String,
): FilmResponse? = ): FilmResponse? =
filmService.findByTitle(title)?.let { FilmResponse.fromDomain(it) } searchFilmByTitleUseCase.searchByTitle(title)?.let { FilmResponse.fromDomain(it) }
@GetMapping
fun getAll(): List<FilmResponse> =
getAllFilmsUseCase.getAll().map { FilmResponse.fromDomain(it) }
} }
@@ -7,13 +7,21 @@ import com.project.movienight.application.ports.input.AddFilmToLibraryCommand
import com.project.movienight.application.ports.input.AddFilmToLibraryUseCase import com.project.movienight.application.ports.input.AddFilmToLibraryUseCase
import com.project.movienight.application.ports.input.CreateFilmLibraryCommand import com.project.movienight.application.ports.input.CreateFilmLibraryCommand
import com.project.movienight.application.ports.input.CreateFilmLibraryUseCase import com.project.movienight.application.ports.input.CreateFilmLibraryUseCase
import com.project.movienight.application.ports.input.GetAllFilmsUseCase
import com.project.movienight.application.ports.input.GetFilmByIdUseCase
import com.project.movienight.application.ports.input.GetFilmLibraryQuery import com.project.movienight.application.ports.input.GetFilmLibraryQuery
import com.project.movienight.application.ports.input.GetFilmLibraryUseCase import com.project.movienight.application.ports.input.GetFilmLibraryUseCase
import com.project.movienight.application.ports.input.RemoveFilmFromLibraryCommand import com.project.movienight.application.ports.input.RemoveFilmFromLibraryCommand
import com.project.movienight.application.ports.input.RemoveFilmFromLibraryUseCase import com.project.movienight.application.ports.input.RemoveFilmFromLibraryUseCase
import com.project.movienight.application.services.FilmService
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.web.bind.annotation.RestController
import java.util.UUID import java.util.UUID
@RestController @RestController
@@ -23,7 +31,8 @@ class FilmLibraryController(
private val addFilmToLibraryUseCase: AddFilmToLibraryUseCase, private val addFilmToLibraryUseCase: AddFilmToLibraryUseCase,
private val removeFilmFromLibraryUseCase: RemoveFilmFromLibraryUseCase, private val removeFilmFromLibraryUseCase: RemoveFilmFromLibraryUseCase,
private val getFilmLibraryUseCase: GetFilmLibraryUseCase, private val getFilmLibraryUseCase: GetFilmLibraryUseCase,
private val filmService: FilmService, private val getFilmByIdUseCase: GetFilmByIdUseCase,
private val getAllFilmsUseCase: GetAllFilmsUseCase,
) { ) {
@PostMapping @PostMapping
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
@@ -58,9 +67,9 @@ class FilmLibraryController(
GetFilmLibraryQuery(userId = userId) GetFilmLibraryQuery(userId = userId)
) )
val film = filmService.findById(library.filmId) val film = getFilmByIdUseCase.getById(library.filmId)
return film?.let { listOf(FilmResponse.fromDomain(it)) } ?: emptyList() return listOf(FilmResponse.fromDomain(film))
} }
@PostMapping("/films/{filmId}") @PostMapping("/films/{filmId}")
@@ -98,7 +107,7 @@ class FilmLibraryController(
GetFilmLibraryQuery(userId = userId) GetFilmLibraryQuery(userId = userId)
) )
val allFilms = filmService.findAll() val allFilms = getAllFilmsUseCase.getAll()
val availableFilms = allFilms.filter { it.id != userLibrary.filmId } val availableFilms = allFilms.filter { it.id != userLibrary.filmId }
@@ -8,10 +8,18 @@ import com.project.movienight.application.ports.input.CreateUserUseCase
import com.project.movienight.application.ports.input.DeleteUserUseCase import com.project.movienight.application.ports.input.DeleteUserUseCase
import com.project.movienight.application.ports.input.EditUserCommand import com.project.movienight.application.ports.input.EditUserCommand
import com.project.movienight.application.ports.input.EditUserUseCase import com.project.movienight.application.ports.input.EditUserUseCase
import com.project.movienight.application.services.UserService import com.project.movienight.application.ports.input.GetAllUsersUseCase
import com.project.movienight.domain.exception.EntityNotFoundException import com.project.movienight.application.ports.input.GetUserByIdUseCase
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PatchMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.web.bind.annotation.RestController
import java.util.UUID import java.util.UUID
@RestController @RestController
@@ -20,7 +28,8 @@ class UserController(
private val createUserUseCase: CreateUserUseCase, private val createUserUseCase: CreateUserUseCase,
private val editUserUseCase: EditUserUseCase, private val editUserUseCase: EditUserUseCase,
private val deleteUserUseCase: DeleteUserUseCase, private val deleteUserUseCase: DeleteUserUseCase,
private val userService: UserService, private val getUserByIdUseCase: GetUserByIdUseCase,
private val getAllUsersUseCase: GetAllUsersUseCase,
) { ) {
@PostMapping @PostMapping
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
@@ -38,15 +47,13 @@ class UserController(
@GetMapping @GetMapping
fun getAll(): List<UserResponse> = fun getAll(): List<UserResponse> =
userService.findAll().map { UserResponse.fromDomain(it) } getAllUsersUseCase.getAll().map { UserResponse.fromDomain(it) }
@GetMapping("/{id}") @GetMapping("/{id}")
fun getById( fun getById(
@PathVariable id: UUID, @PathVariable id: UUID,
): UserResponse = ): UserResponse =
UserResponse.fromDomain( UserResponse.fromDomain(getUserByIdUseCase.getById(id))
userService.findById(id) ?: throw EntityNotFoundException("User", id.toString())
)
@PatchMapping("/{id}") @PatchMapping("/{id}")
fun edit( fun edit(
@@ -56,8 +63,7 @@ class UserController(
UserResponse.fromDomain( UserResponse.fromDomain(
editUserUseCase.edit( editUserUseCase.edit(
id = id, id = id,
command = command = EditUserCommand(
EditUserCommand(
name = request.name, name = request.name,
), ),
), ),
@@ -27,3 +27,15 @@ data class EditFilmCommand(
interface DeleteFilmUseCase { interface DeleteFilmUseCase {
fun delete(id: UUID) fun delete(id: UUID)
} }
interface GetFilmByIdUseCase {
fun getById(id: UUID): Film
}
interface GetAllFilmsUseCase {
fun getAll(): List<Film>
}
interface SearchFilmByTitleUseCase {
fun searchByTitle(title: String): Film?
}
@@ -26,3 +26,11 @@ data class EditUserCommand(
interface DeleteUserUseCase { interface DeleteUserUseCase {
fun delete(id: UUID) fun delete(id: UUID)
} }
interface GetUserByIdUseCase {
fun getById(id: UUID): User
}
interface GetAllUsersUseCase {
fun getAll(): List<User>
}
@@ -5,6 +5,9 @@ import com.project.movienight.application.ports.input.CreateFilmUseCase
import com.project.movienight.application.ports.input.DeleteFilmUseCase import com.project.movienight.application.ports.input.DeleteFilmUseCase
import com.project.movienight.application.ports.input.EditFilmCommand import com.project.movienight.application.ports.input.EditFilmCommand
import com.project.movienight.application.ports.input.EditFilmUseCase import com.project.movienight.application.ports.input.EditFilmUseCase
import com.project.movienight.application.ports.input.GetAllFilmsUseCase
import com.project.movienight.application.ports.input.GetFilmByIdUseCase
import com.project.movienight.application.ports.input.SearchFilmByTitleUseCase
import com.project.movienight.application.ports.output.FilmRepositoryPort import com.project.movienight.application.ports.output.FilmRepositoryPort
import com.project.movienight.application.ports.output.IdGenerator import com.project.movienight.application.ports.output.IdGenerator
import com.project.movienight.config.FilmServiceProperties import com.project.movienight.config.FilmServiceProperties
@@ -21,7 +24,11 @@ class FilmService(
private val filmConfig: FilmServiceProperties, private val filmConfig: FilmServiceProperties,
) : CreateFilmUseCase, ) : CreateFilmUseCase,
EditFilmUseCase, EditFilmUseCase,
DeleteFilmUseCase { DeleteFilmUseCase,
GetFilmByIdUseCase,
GetAllFilmsUseCase,
SearchFilmByTitleUseCase {
override fun create(command: CreateFilmCommand): Film { override fun create(command: CreateFilmCommand): Film {
if (filmConfig.isBlocked(command.title)) { if (filmConfig.isBlocked(command.title)) {
throw BlockedValueException(target = "Film", field = "title") throw BlockedValueException(target = "Film", field = "title")
@@ -30,8 +37,7 @@ class FilmService(
throw BlockedValueException(target = "Film", field = "description") throw BlockedValueException(target = "Film", field = "description")
} }
val film = val film = Film(
Film(
id = idGenerator.generateId(), id = idGenerator.generateId(),
title = command.title, title = command.title,
description = command.description, description = command.description,
@@ -39,10 +45,7 @@ class FilmService(
return filmRepository.save(film) return filmRepository.save(film)
} }
override fun edit( override fun edit(id: UUID, command: EditFilmCommand): Film {
id: UUID,
command: EditFilmCommand,
): Film {
if (filmConfig.isBlocked(command.title)) { if (filmConfig.isBlocked(command.title)) {
throw BlockedValueException(target = "Film", field = "title") throw BlockedValueException(target = "Film", field = "title")
} }
@@ -51,21 +54,20 @@ class FilmService(
} }
var film = filmRepository.findById(id) ?: throw EntityNotFoundException(entity = "Film", id = id.toString()) var film = filmRepository.findById(id) ?: throw EntityNotFoundException(entity = "Film", id = id.toString())
film = film.copy(title = command.title, description = command.description) film = film.copy(title = command.title, description = command.description)
return filmRepository.save(film) return filmRepository.save(film)
} }
override fun delete(id: UUID) { override fun delete(id: UUID) {
filmRepository.findById(id) ?: throw EntityNotFoundException(entity = "Film", id = id.toString()) filmRepository.findById(id) ?: throw EntityNotFoundException(entity = "Film", id = id.toString())
filmRepository.deleteById(id) filmRepository.deleteById(id)
} }
fun findByTitle(title: String): Film? = filmRepository.findByTitle(title) override fun getById(id: UUID): Film {
return filmRepository.findById(id) ?: throw EntityNotFoundException(entity = "Film", id = id.toString())
}
fun findAll(): List<Film> = filmRepository.findAll() override fun getAll(): List<Film> = filmRepository.findAll()
fun findById(id: UUID): Film? = filmRepository.findById(id) override fun searchByTitle(title: String): Film? = filmRepository.findByTitle(title)
} }
@@ -5,6 +5,8 @@ import com.project.movienight.application.ports.input.CreateUserUseCase
import com.project.movienight.application.ports.input.DeleteUserUseCase import com.project.movienight.application.ports.input.DeleteUserUseCase
import com.project.movienight.application.ports.input.EditUserCommand import com.project.movienight.application.ports.input.EditUserCommand
import com.project.movienight.application.ports.input.EditUserUseCase import com.project.movienight.application.ports.input.EditUserUseCase
import com.project.movienight.application.ports.input.GetAllUsersUseCase
import com.project.movienight.application.ports.input.GetUserByIdUseCase
import com.project.movienight.application.ports.output.IdGenerator import com.project.movienight.application.ports.output.IdGenerator
import com.project.movienight.application.ports.output.UserRepositoryPort import com.project.movienight.application.ports.output.UserRepositoryPort
import com.project.movienight.config.UserServiceProperties import com.project.movienight.config.UserServiceProperties
@@ -21,14 +23,16 @@ class UserService(
private val userConfig: UserServiceProperties, private val userConfig: UserServiceProperties,
) : CreateUserUseCase, ) : CreateUserUseCase,
EditUserUseCase, EditUserUseCase,
DeleteUserUseCase { DeleteUserUseCase,
GetUserByIdUseCase,
GetAllUsersUseCase {
override fun create(command: CreateUserCommand): User { override fun create(command: CreateUserCommand): User {
if (userConfig.isBlocked(command.name)) { if (userConfig.isBlocked(command.name)) {
throw BlockedValueException(target = "User", field = "name") throw BlockedValueException(target = "User", field = "name")
} }
val user = val user = User(
User(
id = idGenerator.generateId(), id = idGenerator.generateId(),
name = command.name, name = command.name,
email = command.email, email = command.email,
@@ -46,19 +50,18 @@ class UserService(
} }
var user = userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString()) var user = userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString())
user = user.copy(name = command.name) user = user.copy(name = command.name)
return userRepository.save(user) return userRepository.save(user)
} }
override fun delete(id: UUID) { override fun delete(id: UUID) {
userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString()) userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString())
userRepository.deleteById(id) userRepository.deleteById(id)
} }
fun findAll(): List<User> = userRepository.findAll() override fun getById(id: UUID): User {
return userRepository.findById(id) ?: throw EntityNotFoundException(entity = "User", id = id.toString())
}
fun findById(id: UUID): User? = userRepository.findById(id) override fun getAll(): List<User> = userRepository.findAll()
} }