Search films by title using the new search endpoint
View available films to add to your library (excludes films already in your collection)
Tests
Added comprehensive test coverage for film search, creation, and deletion operations
Added test coverage for library management functionality
Added test coverage for user management operations
<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit
* **New Features**
* Search films by title using the new search endpoint
* View available films to add to your library (excludes films already in your collection)
* **Tests**
* Added comprehensive test coverage for film search, creation, and deletion operations
* Added test coverage for library management functionality
* Added test coverage for user management operations
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This PR implements a title-based film search feature across the persistence, service, and web layers. It adds a findByTitle method to the repository port and implementation, exposes findByTitle and findAll methods through FilmService, and introduces two new HTTP GET endpoints: /api/films/search for searching films by title and /api/users/{userId}/library/available-films for retrieving available films in a user's library. Comprehensive integration tests are included.
Added findByTitle(title: String): Film? method to repository port interface and implemented with parameterized SQL query against the films table filtering by title and returning first match or null.
Service Layer src/main/kotlin/com/project/movienight/application/services/FilmService.kt
Added two delegation methods: findByTitle(title: String): Film? and findAll(): List<Film>, both passing through to the repository layer.
Web Layer src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt, src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt
Introduced GET /api/films/search endpoint accepting title query parameter with optional result. Added GET /api/users/{userId}/library/available-films endpoint retrieving available films for user's library by filtering out already-added films. Both controllers now depend on FilmService.
Added comprehensive Spring Boot integration test classes covering film CRUD operations, title-based search with existing and non-existent films, user CRUD operations, and film library management operations (add/remove films).
Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes
Poem
🐰 Whiskers twitch with search delight,
Films by title, shining bright,
Libraries find what's free to claim,
New endpoints dance with test acclaim,
Delegation flows from depth to height! 🎬
Note
🎁 Summarized by CodeRabbit Free
Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.
Comment @coderabbitai help to get the list of available commands and usage tips.
<!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<details>
<summary>ℹ️ Recent review info</summary>
<details>
<summary>⚙️ Run configuration</summary>
**Configuration used**: Organization UI
**Review profile**: ASSERTIVE
**Plan**: Free
**Run ID**: `d85b1be3-bbb9-4c2e-b718-e5ceacbd6726`
</details>
<details>
<summary>📥 Commits</summary>
Reviewing files that changed from the base of the PR and between 482b282dd5c1498f488fdcca1d46ec45a22bcbb6 and 8926e5b08c95fc5a475d5143988d92bff4188c7a.
</details>
<details>
<summary>📒 Files selected for processing (8)</summary>
* `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt`
* `src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt`
* `src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt`
* `src/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.kt`
* `src/main/kotlin/com/project/movienight/application/services/FilmService.kt`
* `src/test/kotlin/com/project/movienight/controllers/FilmControllerTest.kt`
* `src/test/kotlin/com/project/movienight/controllers/FilmLibraryControllerTest.kt`
* `src/test/kotlin/com/project/movienight/controllers/UserControllerTest.kt`
</details>
</details>
---
<!-- walkthrough_start -->
<details>
<summary>📝 Walkthrough</summary>
## Walkthrough
This PR implements a title-based film search feature across the persistence, service, and web layers. It adds a `findByTitle` method to the repository port and implementation, exposes `findByTitle` and `findAll` methods through `FilmService`, and introduces two new HTTP GET endpoints: `/api/films/search` for searching films by title and `/api/users/{userId}/library/available-films` for retrieving available films in a user's library. Comprehensive integration tests are included.
## Changes
|Cohort / File(s)|Summary|
|---|---|
|**Persistence Layer** <br> `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt`, `src/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.kt`|Added `findByTitle(title: String): Film?` method to repository port interface and implemented with parameterized SQL query against the `films` table filtering by title and returning first match or null.|
|**Service Layer** <br> `src/main/kotlin/com/project/movienight/application/services/FilmService.kt`|Added two delegation methods: `findByTitle(title: String): Film?` and `findAll(): List<Film>`, both passing through to the repository layer.|
|**Web Layer** <br> `src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt`, `src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt`|Introduced `GET /api/films/search` endpoint accepting `title` query parameter with optional result. Added `GET /api/users/{userId}/library/available-films` endpoint retrieving available films for user's library by filtering out already-added films. Both controllers now depend on `FilmService`.|
|**Integration Tests** <br> `src/test/kotlin/com/project/movienight/controllers/FilmControllerTest.kt`, `src/test/kotlin/com/project/movienight/controllers/FilmLibraryControllerTest.kt`, `src/test/kotlin/com/project/movienight/controllers/UserControllerTest.kt`|Added comprehensive Spring Boot integration test classes covering film CRUD operations, title-based search with existing and non-existent films, user CRUD operations, and film library management operations (add/remove films).|
## Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes
## Poem
> 🐰 Whiskers twitch with search delight,
> Films by title, shining bright,
> Libraries find what's free to claim,
> New endpoints dance with test acclaim,
> Delegation flows from depth to height! 🎬
</details>
<!-- walkthrough_end -->
<!-- tips_start -->
---
> [!NOTE]
> <details>
> <summary>🎁 Summarized by CodeRabbit Free</summary>
>
> Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting <https://app.coderabbit.ai/login>.
>
> </details>
<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>
<!-- tips_end -->
<!-- internal state start -->
<!-- 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= -->
<!-- internal state end -->
Pull request closed
This pull request cannot be reopened because the branch was deleted.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary by CodeRabbit
New Features
Tests
ℹ️ Recent review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Free
Run ID:
d85b1be3-bbb9-4c2e-b718-e5ceacbd6726📥 Commits
Reviewing files that changed from the base of the PR and between
482b282dd5and8926e5b08c.📒 Files selected for processing (8)
src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.ktsrc/main/kotlin/com/project/movienight/adapters/web/FilmController.ktsrc/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.ktsrc/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.ktsrc/main/kotlin/com/project/movienight/application/services/FilmService.ktsrc/test/kotlin/com/project/movienight/controllers/FilmControllerTest.ktsrc/test/kotlin/com/project/movienight/controllers/FilmLibraryControllerTest.ktsrc/test/kotlin/com/project/movienight/controllers/UserControllerTest.kt📝 Walkthrough
Walkthrough
This PR implements a title-based film search feature across the persistence, service, and web layers. It adds a
findByTitlemethod to the repository port and implementation, exposesfindByTitleandfindAllmethods throughFilmService, and introduces two new HTTP GET endpoints:/api/films/searchfor searching films by title and/api/users/{userId}/library/available-filmsfor retrieving available films in a user's library. Comprehensive integration tests are included.Changes
src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt,src/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.ktfindByTitle(title: String): Film?method to repository port interface and implemented with parameterized SQL query against thefilmstable filtering by title and returning first match or null.src/main/kotlin/com/project/movienight/application/services/FilmService.ktfindByTitle(title: String): Film?andfindAll(): List<Film>, both passing through to the repository layer.src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt,src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.ktGET /api/films/searchendpoint acceptingtitlequery parameter with optional result. AddedGET /api/users/{userId}/library/available-filmsendpoint retrieving available films for user's library by filtering out already-added films. Both controllers now depend onFilmService.src/test/kotlin/com/project/movienight/controllers/FilmControllerTest.kt,src/test/kotlin/com/project/movienight/controllers/FilmLibraryControllerTest.kt,src/test/kotlin/com/project/movienight/controllers/UserControllerTest.ktEstimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes
Poem
Comment
@coderabbitai helpto get the list of available commands and usage tips.Pull request closed