поиск по названию в библиотеке пользователя / во всей бд

This commit is contained in:
Elena Ponomareva
2026-04-19 14:03:34 +03:00
parent 482b282dd5
commit d69419b90d
5 changed files with 43 additions and 16 deletions
@@ -61,6 +61,15 @@ class FilmRepository(
filmRowMapper, filmRowMapper,
) )
override fun findByTitle(title: String): Film? {
val films = jdbc.query(
"SELECT id, title, description FROM films WHERE title = ?",
filmRowMapper,
title
)
return films.firstOrNull()
}
override fun deleteById(id: UUID) { override fun deleteById(id: UUID) {
jdbc.update("DELETE FROM films WHERE id = ?", id) jdbc.update("DELETE FROM films WHERE id = ?", id)
} }
@@ -8,15 +8,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.services.FilmService
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.*
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
@@ -25,6 +19,7 @@ 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,
) { ) {
@PostMapping @PostMapping
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
@@ -61,4 +56,10 @@ class FilmController(
fun delete( fun delete(
@PathVariable id: UUID, @PathVariable id: UUID,
) = deleteFilmUseCase.delete(id) ) = deleteFilmUseCase.delete(id)
@GetMapping("/search")
fun searchByTitle(
@RequestParam title: String,
): FilmResponse? =
filmService.findByTitle(title)?.let { FilmResponse.fromDomain(it) }
} }
@@ -2,6 +2,7 @@ package com.project.movienight.adapters.web
import com.project.movienight.adapters.web.dto.request.CreateFilmLibraryRequest import com.project.movienight.adapters.web.dto.request.CreateFilmLibraryRequest
import com.project.movienight.adapters.web.dto.response.FilmLibraryResponse import com.project.movienight.adapters.web.dto.response.FilmLibraryResponse
import com.project.movienight.adapters.web.dto.response.FilmResponse
import com.project.movienight.application.ports.input.AddFilmToLibraryCommand 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
@@ -10,15 +11,9 @@ 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.DeleteMapping import org.springframework.web.bind.annotation.*
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
@@ -28,6 +23,7 @@ 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,
) { ) {
@PostMapping @PostMapping
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
@@ -80,4 +76,19 @@ class FilmLibraryController(
filmId = filmId, filmId = filmId,
), ),
) )
@GetMapping("/available-films")
fun getAvailableFilms(
@PathVariable userId: UUID,
): List<FilmResponse> {
val userLibrary = getFilmLibraryUseCase.getLibrary(
GetFilmLibraryQuery(userId = userId)
)
val allFilms = filmService.findAll()
val availableFilms = allFilms.filter { it.id != userLibrary.filmId }
return availableFilms.map { FilmResponse.fromDomain(it) }
}
} }
@@ -10,5 +10,7 @@ interface FilmRepositoryPort {
fun findAll(): List<Film> fun findAll(): List<Film>
fun findByTitle(title: String): Film?
fun deleteById(id: UUID) fun deleteById(id: UUID)
} }
@@ -62,4 +62,8 @@ class FilmService(
filmRepository.deleteById(id) filmRepository.deleteById(id)
} }
fun findByTitle(title: String): Film? = filmRepository.findByTitle(title)
fun findAll(): List<Film> = filmRepository.findAll()
} }