chore(release): first stable release #45

Merged
devitq merged 134 commits from develop into main 2026-05-23 07:28:37 +00:00
devitq commented 2026-05-18 17:43:32 +00:00 (Migrated from github.com)

well, not stable yet

well, not stable yet
coderabbitai[bot] commented 2026-05-18 17:43:39 +00:00 (Migrated from github.com)

Important

Review skipped

Too many files!

This PR contains 190 files, which is 40 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 600d9def-e4fa-42b2-9b25-4c585ac6df51

📥 Commits

Reviewing files that changed from the base of the PR and between 482b282dd5 and 1e0e1776be.

Files ignored due to path filters (1)
  • gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
📒 Files selected for processing (190)
  • .github/workflows/build.yaml
  • .github/workflows/ci.yaml
  • .github/workflows/docker.yaml
  • .github/workflows/jellyfin-plugin.yaml
  • .github/workflows/release.yaml
  • .gitignore
  • .idea/kotlinc.xml
  • Containerfile
  • build.gradle.kts
  • config/detekt/detekt.yaml
  • deploy/argocd/cloudnative-pg.yaml
  • deploy/argocd/external-secrets-operator.yaml
  • deploy/argocd/grafana.yaml
  • deploy/argocd/jellyfin.yaml
  • deploy/argocd/victoriametrics-agent.yaml
  • deploy/argocd/victoriametrics-alert.yaml
  • deploy/argocd/victoriametrics-operator.yaml
  • deploy/argocd/victoriametrics-single.yaml
  • deploy/helm/movienight/Chart.yaml
  • deploy/helm/movienight/templates/NOTES.txt
  • deploy/helm/movienight/templates/_helpers.tpl
  • deploy/helm/movienight/templates/backend/deployment.yaml
  • deploy/helm/movienight/templates/backend/service.yaml
  • deploy/helm/movienight/templates/gateway/gateway.yaml
  • deploy/helm/movienight/templates/gateway/httproute.yaml
  • deploy/helm/movienight/templates/observability/grafana-dashboard-business.yaml
  • deploy/helm/movienight/templates/observability/grafana-dashboard-red.yaml
  • deploy/helm/movienight/templates/observability/grafana-datasource.yaml
  • deploy/helm/movienight/templates/postgres/cluster.yaml
  • deploy/helm/movienight/templates/rbac/serviceaccount.yaml
  • deploy/helm/movienight/values.schema.json
  • deploy/helm/movienight/values.yaml
  • deploy/manifests/backend-secret.yaml
  • deploy/manifests/bootstrap-secret.yaml
  • deploy/manifests/cluster-secret-store.yaml
  • deploy/manifests/ns.yaml
  • gradle/libs.versions.toml
  • guideline.md
  • plugins/jellyfin/.gitignore
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Configuration/PluginConfiguration.cs
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Configuration/config.js
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Configuration/configPage.html
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Configuration/ui.js
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Controllers/MovieNightController.cs
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Jellyfin.Plugin.MovieNight.csproj
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Plugin.cs
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/PluginServiceRegistrator.cs
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightBackendClient.cs
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightEventPayload.cs
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightPeriodicSyncService.cs
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightPlaybackEventService.cs
  • plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightSyncService.cs
  • plugins/jellyfin/README.md
  • plugins/jellyfin/build.yaml
  • scripts/generate_library.py
  • src/main/kotlin/com/project/movienight/MovieNightApplication.kt
  • src/main/kotlin/com/project/movienight/adapters/jellyfin/JellyfinApiClient.kt
  • src/main/kotlin/com/project/movienight/adapters/metrics/BusinessMetricsService.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/entity/FilmRatingEntity.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/entity/JellyfinSyncStateEntity.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/entity/UserEntity.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/entity/UserPreferencesEntity.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmLibraryEntryRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmLibraryRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRatingRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/JellyfinEventRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/JellyfinSyncStateRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/RecommendationEventRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserPreferencesRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRecommendationWeightsRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/support/DelimitedValueCodec.kt
  • src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt
  • src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt
  • src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt
  • src/main/kotlin/com/project/movienight/adapters/security/SecurityConfiguration.kt
  • src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt
  • src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt
  • src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt
  • src/main/kotlin/com/project/movienight/adapters/web/ApiExceptionHandler.kt
  • src/main/kotlin/com/project/movienight/adapters/web/ContentTypeParser.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/adapters/web/FilmRatingController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/JellyfinEventsController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/JellyfinPluginAuthenticator.kt
  • src/main/kotlin/com/project/movienight/adapters/web/JellyfinPluginController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/JellyfinSyncController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/RecommendationController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/RecommendationOnboardingController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/TraceIdFilter.kt
  • src/main/kotlin/com/project/movienight/adapters/web/UserController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/UserPreferencesController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/UserRecommendationWeightsController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/CreateFilmLibraryRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/CreateFilmRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/CreateUserRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/EditFilmRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/EditUserRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/JellyfinEventRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/JellyfinSyncRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/RateFilmRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/RecommendationOnboardingRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/UpdateUserRecommendationWeightsRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/request/UpsertUserPreferencesRequest.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/FilmLibraryEntryResponse.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/FilmLibraryResponse.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/FilmRatingResponse.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/FilmResponse.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/RecommendationEventResponse.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/RecommendationOnboardingResponse.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/RecommendationResponse.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/UserPreferencesResponse.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/UserRecommendationWeightsResponse.kt
  • src/main/kotlin/com/project/movienight/adapters/web/dto/response/UserResponse.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/FilmLibraryUseCase.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/FilmRatingUseCase.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/FilmUseCase.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/GetRecommendationsUseCase.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/JellyfinUseCase.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/RecommendationOnboardingUseCase.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/UserPreferencesUseCase.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/UserRecommendationWeightsUseCase.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/UserUseCase.kt
  • src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/BusinessMetricsPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/FilmLibraryEntryRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/FilmLibraryRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/FilmRatingRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/JellyfinCatalogPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/JellyfinEventStorePort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/JellyfinSyncStateRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/RecommendationEventRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/UserPreferencesRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/UserRecommendationWeightsRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/UserRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/services/FilmLibraryService.kt
  • src/main/kotlin/com/project/movienight/application/services/FilmRatingService.kt
  • src/main/kotlin/com/project/movienight/application/services/FilmService.kt
  • src/main/kotlin/com/project/movienight/application/services/JellyfinEventService.kt
  • src/main/kotlin/com/project/movienight/application/services/JellyfinSyncService.kt
  • src/main/kotlin/com/project/movienight/application/services/RecommendationOnboardingService.kt
  • src/main/kotlin/com/project/movienight/application/services/RecommendationService.kt
  • src/main/kotlin/com/project/movienight/application/services/UserPreferencesService.kt
  • src/main/kotlin/com/project/movienight/application/services/UserRecommendationWeightsService.kt
  • src/main/kotlin/com/project/movienight/application/services/UserService.kt
  • src/main/kotlin/com/project/movienight/config/JellyfinIntegrationProperties.kt
  • src/main/kotlin/com/project/movienight/config/MetricsConfiguration.kt
  • src/main/kotlin/com/project/movienight/domain/model/AuthProvider.kt
  • src/main/kotlin/com/project/movienight/domain/model/Film.kt
  • src/main/kotlin/com/project/movienight/domain/model/FilmLibraryEntry.kt
  • src/main/kotlin/com/project/movienight/domain/model/FilmRating.kt
  • src/main/kotlin/com/project/movienight/domain/model/JellyfinSyncState.kt
  • src/main/kotlin/com/project/movienight/domain/model/RecommendationContext.kt
  • src/main/kotlin/com/project/movienight/domain/model/RecommendationEvent.kt
  • src/main/kotlin/com/project/movienight/domain/model/RecommendationStyle.kt
  • src/main/kotlin/com/project/movienight/domain/model/User.kt
  • src/main/kotlin/com/project/movienight/domain/model/UserPreferences.kt
  • src/main/kotlin/com/project/movienight/domain/model/UserRecommendationWeights.kt
  • src/main/resources/application.yaml
  • src/main/resources/db/ER.md
  • src/main/resources/db/migration/V1__init.sql
  • src/main/resources/db/migration/V2__add_oauth2_index.sql
  • src/main/resources/db/migration/V3__jellyfin_events.sql
  • src/main/resources/db/migration/V4__add_ratings_table.sql
  • src/main/resources/db/migration/V5__add_jellyfin_id_columns.sql
  • src/main/resources/db/migration/V6__extend_schema.sql
  • src/main/resources/db/migration/V7__recommendation_events.sql
  • src/main/resources/db/migration/V8__user_recommendation_weights.sql
  • src/main/resources/db/migration/V9__cleanup_legacy_schema.sql
  • src/main/resources/logback-spring.xml
  • src/test/kotlin/com/project/movienight/ClassLoaderTest.kt
  • src/test/kotlin/com/project/movienight/RecommendationSmokeTest.kt
  • src/test/kotlin/com/project/movienight/adapters/persistence/entity/UserEntityMappingTest.kt
  • src/test/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmLibraryEntryRepositoryIntegrationTest.kt
  • src/test/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepositoryIntegrationTest.kt
  • src/test/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRepositoryIntegrationTest.kt
  • src/test/kotlin/com/project/movienight/adapters/web/FilmControllerSearchTest.kt
  • src/test/kotlin/com/project/movienight/application/services/FilmLibraryServiceTest.kt
  • src/test/kotlin/com/project/movienight/application/services/FilmServiceTest.kt
  • src/test/kotlin/com/project/movienight/application/services/UserServiceTest.kt
  • src/test/kotlin/com/project/movienight/config/TestSecurityConfiguration.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/JellyfinPluginContractTest.kt
  • src/test/kotlin/com/project/movienight/controllers/UserControllerTest.kt
  • src/test/kotlin/com/project/movienight/domain/model/UserRecommendationWeightsTest.kt
  • src/test/resources/application-test.yaml

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- This is an auto-generated comment: skip review by coderabbit.ai --> > [!IMPORTANT] > ## Review skipped > > Too many files! > > This PR contains 190 files, which is 40 over the limit of 150. > > To get a review, narrow the scope: > • coderabbit review --type committed # exclude uncommitted changes > • coderabbit review --dir <path> # limit to a subdirectory > • coderabbit review --base <branch> # compare against a closer base > > <details> > <summary>⚙️ Run configuration</summary> > > **Configuration used**: Organization UI > > **Review profile**: ASSERTIVE > > **Plan**: Pro > > **Run ID**: `600d9def-e4fa-42b2-9b25-4c585ac6df51` > > </details> > > <details> > <summary>📥 Commits</summary> > > Reviewing files that changed from the base of the PR and between 482b282dd5c1498f488fdcca1d46ec45a22bcbb6 and 1e0e1776be09fec4898a94c85f9d57be09149424. > > </details> > > <details> > <summary>⛔ Files ignored due to path filters (1)</summary> > > * `gradle/wrapper/gradle-wrapper.jar` is excluded by `!**/*.jar` > > </details> > > <details> > <summary>📒 Files selected for processing (190)</summary> > > * `.github/workflows/build.yaml` > * `.github/workflows/ci.yaml` > * `.github/workflows/docker.yaml` > * `.github/workflows/jellyfin-plugin.yaml` > * `.github/workflows/release.yaml` > * `.gitignore` > * `.idea/kotlinc.xml` > * `Containerfile` > * `build.gradle.kts` > * `config/detekt/detekt.yaml` > * `deploy/argocd/cloudnative-pg.yaml` > * `deploy/argocd/external-secrets-operator.yaml` > * `deploy/argocd/grafana.yaml` > * `deploy/argocd/jellyfin.yaml` > * `deploy/argocd/victoriametrics-agent.yaml` > * `deploy/argocd/victoriametrics-alert.yaml` > * `deploy/argocd/victoriametrics-operator.yaml` > * `deploy/argocd/victoriametrics-single.yaml` > * `deploy/helm/movienight/Chart.yaml` > * `deploy/helm/movienight/templates/NOTES.txt` > * `deploy/helm/movienight/templates/_helpers.tpl` > * `deploy/helm/movienight/templates/backend/deployment.yaml` > * `deploy/helm/movienight/templates/backend/service.yaml` > * `deploy/helm/movienight/templates/gateway/gateway.yaml` > * `deploy/helm/movienight/templates/gateway/httproute.yaml` > * `deploy/helm/movienight/templates/observability/grafana-dashboard-business.yaml` > * `deploy/helm/movienight/templates/observability/grafana-dashboard-red.yaml` > * `deploy/helm/movienight/templates/observability/grafana-datasource.yaml` > * `deploy/helm/movienight/templates/postgres/cluster.yaml` > * `deploy/helm/movienight/templates/rbac/serviceaccount.yaml` > * `deploy/helm/movienight/values.schema.json` > * `deploy/helm/movienight/values.yaml` > * `deploy/manifests/backend-secret.yaml` > * `deploy/manifests/bootstrap-secret.yaml` > * `deploy/manifests/cluster-secret-store.yaml` > * `deploy/manifests/ns.yaml` > * `gradle/libs.versions.toml` > * `guideline.md` > * `plugins/jellyfin/.gitignore` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Configuration/PluginConfiguration.cs` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Configuration/config.js` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Configuration/configPage.html` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Configuration/ui.js` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Controllers/MovieNightController.cs` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Jellyfin.Plugin.MovieNight.csproj` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Plugin.cs` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/PluginServiceRegistrator.cs` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightBackendClient.cs` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightEventPayload.cs` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightPeriodicSyncService.cs` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightPlaybackEventService.cs` > * `plugins/jellyfin/Jellyfin.Plugin.MovieNight/Services/MovieNightSyncService.cs` > * `plugins/jellyfin/README.md` > * `plugins/jellyfin/build.yaml` > * `scripts/generate_library.py` > * `src/main/kotlin/com/project/movienight/MovieNightApplication.kt` > * `src/main/kotlin/com/project/movienight/adapters/jellyfin/JellyfinApiClient.kt` > * `src/main/kotlin/com/project/movienight/adapters/metrics/BusinessMetricsService.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/entity/FilmRatingEntity.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/entity/JellyfinSyncStateEntity.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/entity/UserEntity.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/entity/UserPreferencesEntity.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmLibraryEntryRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmLibraryRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRatingRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/JellyfinEventRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/JellyfinSyncStateRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/RecommendationEventRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserPreferencesRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRecommendationWeightsRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRepository.kt` > * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/support/DelimitedValueCodec.kt` > * `src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt` > * `src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt` > * `src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt` > * `src/main/kotlin/com/project/movienight/adapters/security/SecurityConfiguration.kt` > * `src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt` > * `src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt` > * `src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/ApiExceptionHandler.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/ContentTypeParser.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/adapters/web/FilmRatingController.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/JellyfinEventsController.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/JellyfinPluginAuthenticator.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/JellyfinPluginController.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/JellyfinSyncController.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/RecommendationController.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/RecommendationOnboardingController.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/TraceIdFilter.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/UserController.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/UserPreferencesController.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/UserRecommendationWeightsController.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/CreateFilmLibraryRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/CreateFilmRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/CreateUserRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/EditFilmRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/EditUserRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/JellyfinEventRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/JellyfinSyncRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/RateFilmRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/RecommendationOnboardingRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/UpdateUserRecommendationWeightsRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/request/UpsertUserPreferencesRequest.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/FilmLibraryEntryResponse.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/FilmLibraryResponse.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/FilmRatingResponse.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/FilmResponse.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/RecommendationEventResponse.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/RecommendationOnboardingResponse.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/RecommendationResponse.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/UserPreferencesResponse.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/UserRecommendationWeightsResponse.kt` > * `src/main/kotlin/com/project/movienight/adapters/web/dto/response/UserResponse.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/FilmLibraryUseCase.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/FilmRatingUseCase.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/FilmUseCase.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/GetRecommendationsUseCase.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/JellyfinUseCase.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/RecommendationOnboardingUseCase.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/UserPreferencesUseCase.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/UserRecommendationWeightsUseCase.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/UserUseCase.kt` > * `src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/BusinessMetricsPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/FilmLibraryEntryRepositoryPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/FilmLibraryRepositoryPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/FilmRatingRepositoryPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/JellyfinCatalogPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/JellyfinEventStorePort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/JellyfinSyncStateRepositoryPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/RecommendationEventRepositoryPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/UserPreferencesRepositoryPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/UserRecommendationWeightsRepositoryPort.kt` > * `src/main/kotlin/com/project/movienight/application/ports/output/UserRepositoryPort.kt` > * `src/main/kotlin/com/project/movienight/application/services/FilmLibraryService.kt` > * `src/main/kotlin/com/project/movienight/application/services/FilmRatingService.kt` > * `src/main/kotlin/com/project/movienight/application/services/FilmService.kt` > * `src/main/kotlin/com/project/movienight/application/services/JellyfinEventService.kt` > * `src/main/kotlin/com/project/movienight/application/services/JellyfinSyncService.kt` > * `src/main/kotlin/com/project/movienight/application/services/RecommendationOnboardingService.kt` > * `src/main/kotlin/com/project/movienight/application/services/RecommendationService.kt` > * `src/main/kotlin/com/project/movienight/application/services/UserPreferencesService.kt` > * `src/main/kotlin/com/project/movienight/application/services/UserRecommendationWeightsService.kt` > * `src/main/kotlin/com/project/movienight/application/services/UserService.kt` > * `src/main/kotlin/com/project/movienight/config/JellyfinIntegrationProperties.kt` > * `src/main/kotlin/com/project/movienight/config/MetricsConfiguration.kt` > * `src/main/kotlin/com/project/movienight/domain/model/AuthProvider.kt` > * `src/main/kotlin/com/project/movienight/domain/model/Film.kt` > * `src/main/kotlin/com/project/movienight/domain/model/FilmLibraryEntry.kt` > * `src/main/kotlin/com/project/movienight/domain/model/FilmRating.kt` > * `src/main/kotlin/com/project/movienight/domain/model/JellyfinSyncState.kt` > * `src/main/kotlin/com/project/movienight/domain/model/RecommendationContext.kt` > * `src/main/kotlin/com/project/movienight/domain/model/RecommendationEvent.kt` > * `src/main/kotlin/com/project/movienight/domain/model/RecommendationStyle.kt` > * `src/main/kotlin/com/project/movienight/domain/model/User.kt` > * `src/main/kotlin/com/project/movienight/domain/model/UserPreferences.kt` > * `src/main/kotlin/com/project/movienight/domain/model/UserRecommendationWeights.kt` > * `src/main/resources/application.yaml` > * `src/main/resources/db/ER.md` > * `src/main/resources/db/migration/V1__init.sql` > * `src/main/resources/db/migration/V2__add_oauth2_index.sql` > * `src/main/resources/db/migration/V3__jellyfin_events.sql` > * `src/main/resources/db/migration/V4__add_ratings_table.sql` > * `src/main/resources/db/migration/V5__add_jellyfin_id_columns.sql` > * `src/main/resources/db/migration/V6__extend_schema.sql` > * `src/main/resources/db/migration/V7__recommendation_events.sql` > * `src/main/resources/db/migration/V8__user_recommendation_weights.sql` > * `src/main/resources/db/migration/V9__cleanup_legacy_schema.sql` > * `src/main/resources/logback-spring.xml` > * `src/test/kotlin/com/project/movienight/ClassLoaderTest.kt` > * `src/test/kotlin/com/project/movienight/RecommendationSmokeTest.kt` > * `src/test/kotlin/com/project/movienight/adapters/persistence/entity/UserEntityMappingTest.kt` > * `src/test/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmLibraryEntryRepositoryIntegrationTest.kt` > * `src/test/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepositoryIntegrationTest.kt` > * `src/test/kotlin/com/project/movienight/adapters/persistence/jdbc/UserRepositoryIntegrationTest.kt` > * `src/test/kotlin/com/project/movienight/adapters/web/FilmControllerSearchTest.kt` > * `src/test/kotlin/com/project/movienight/application/services/FilmLibraryServiceTest.kt` > * `src/test/kotlin/com/project/movienight/application/services/FilmServiceTest.kt` > * `src/test/kotlin/com/project/movienight/application/services/UserServiceTest.kt` > * `src/test/kotlin/com/project/movienight/config/TestSecurityConfiguration.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/JellyfinPluginContractTest.kt` > * `src/test/kotlin/com/project/movienight/controllers/UserControllerTest.kt` > * `src/test/kotlin/com/project/movienight/domain/model/UserRecommendationWeightsTest.kt` > * `src/test/resources/application-test.yaml` > > </details> > > You can disable this status message by setting the `reviews.review_status` to `false` in the CodeRabbit configuration file. > > Use the checkbox below for a quick retry: > - [ ] <!-- {"checkboxId": "e9bb8d72-00e8-4f67-9cb2-caf3b22574fe"} --> 🔍 Trigger review <!-- end of auto-generated comment: skip review by coderabbit.ai --> <!-- finishing_touch_checkbox_start --> <details> <summary>✨ Finishing Touches</summary> <details> <summary>🧪 Generate unit tests (beta)</summary> - [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Create PR with unit tests - [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Commit unit tests in branch `develop` </details> </details> <!-- finishing_touch_checkbox_end --> <!-- tips_start --> --- Thanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=devitq/movienight-backend&utm_content=45)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. <details> <summary>❤️ Share</summary> - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code) </details> <sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub> <!-- tips_end -->
copilot-pull-request-reviewer[bot] (Migrated from github.com) reviewed 2026-05-23 07:30:32 +00:00
copilot-pull-request-reviewer[bot] (Migrated from github.com) left a comment

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.
Sign in to join this conversation.