Files
movienight-backend/src/main/resources/application.yaml
T
skettiks 43be102d4e refactor: обновить use case слои и интеграцию Jellyfin
Основные изменения: укрупнены use case-интерфейсы, контроллеры переведены на цельные зависимости, логика доступных фильмов перенесена в FilmLibraryService, добавлены проверки существования фильма и улучшена обработка ошибок API.

Метрики: FilmService больше не зависит напрямую от Micrometer для counters, используется BusinessMetricsPort; добавлены TimedAspect и duration-метрики через @Timed для create/edit/delete фильмов.

Jellyfin: event handling переведен на транзакционную модель, sync учитывает runtime-ошибки, добавлены plugin-token/web-url настройки, webhook и sync endpoints защищены X-MovieNight-Plugin-Token.

Плагин: добавлен Jellyfin plugin в plugins/jellyfin, backend принимает push-sync payload, sync-state доступен плагину, pull-sync вынесен в /api/integrations/jellyfin/pull-sync, README описывает фактический контракт.

API и DTO: добавлены RecommendationResponse, ContentTypeParser, validation annotations, обработка validation errors и ResponseStatusException, endpoint /api/users/me.

БД: добавлена V7 cleanup-миграция для legacy ratings/jellyfin_id объектов; V4/V5 в этот коммит не включались.

Проверка: .\gradlew.bat check --stacktrace проходит полностью.
2026-05-22 12:32:16 +03:00

122 lines
3.9 KiB
YAML

spring:
application:
name: MovieNight
lifecycle:
timeout-per-shutdown-phase: 20s
datasource:
url: ${SPRING_DATASOURCE_URL:jdbc:h2:mem:movienight;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE}
username: ${SPRING_DATASOURCE_USERNAME:sa}
password: ${SPRING_DATASOURCE_PASSWORD:}
driver-class-name: ${SPRING_DATASOURCE_DRIVER_CLASS_NAME:org.h2.Driver}
hikari:
maximum-pool-size: ${SPRING_DATASOURCE_HIKARI_MAXIMUM_POOL_SIZE:20}
minimum-idle: ${SPRING_DATASOURCE_HIKARI_MINIMUM_IDLE:5}
connection-timeout: ${SPRING_DATASOURCE_HIKARI_CONNECTION_TIMEOUT:30000}
idle-timeout: ${SPRING_DATASOURCE_HIKARI_IDLE_TIMEOUT:600000}
max-lifetime: ${SPRING_DATASOURCE_HIKARI_MAX_LIFETIME:1800000}
flyway:
enabled: ${SPRING_FLYWAY_ENABLED:true}
url: ${SPRING_FLYWAY_URL:${SPRING_DATASOURCE_URL:jdbc:h2:mem:movienight;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE}}
user: ${SPRING_FLYWAY_USER:${SPRING_DATASOURCE_USERNAME:sa}}
password: ${SPRING_FLYWAY_PASSWORD:${SPRING_DATASOURCE_PASSWORD:}}
locations: ${SPRING_FLYWAY_LOCATIONS:classpath:db/migration}
baseline-on-migrate: ${SPRING_FLYWAY_BASELINE_ON_MIGRATE:true}
h2:
console:
enabled: ${SPRING_H2_CONSOLE_ENABLED:true}
path: /h2-console
security:
oauth2:
client:
registration:
google:
client-id: ${OAUTH2_GOOGLE_CLIENT_ID:test-client-id}
client-secret: ${OAUTH2_GOOGLE_CLIENT_SECRET:test-secret}
scope: email,profile
yandex:
client-id: ${OAUTH2_YANDEX_CLIENT_ID:test-client-id}
client-secret: ${OAUTH2_YANDEX_CLIENT_SECRET:test-secret}
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
scope: login:email,login:avatar
vk:
client-id: ${OAUTH2_VK_CLIENT_ID:test-client-id}
client-secret: ${OAUTH2_VK_CLIENT_SECRET:test-secret}
authorization-grant-type: authorization_code
client-authentication-method: client_secret_post
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
scope: email
provider:
yandex:
authorization-uri: https://oauth.yandex.ru/authorize
token-uri: https://oauth.yandex.ru/token
user-info-uri: https://login.yandex.ru/info
user-name-attribute: id
vk:
authorization-uri: https://oauth.vk.com/authorize
token-uri: https://oauth.vk.com/access_token
user-info-uri: https://api.vk.com/method/users.get?v=5.131&fields=photo_200
user-name-attribute: response
server:
shutdown: graceful
management:
endpoints:
web:
base-path: /actuator
exposure:
include: health,info,prometheus
endpoint:
health:
probes:
enabled: true
show-details: when_authorized
health:
livenessstate:
enabled: true
readinessstate:
enabled: true
info:
env:
enabled: true
springdoc:
api-docs:
path: /api/v1/docs
swagger-ui:
path: /api/v1/swagger-ui
enabled: true
show-actuator: true
info:
app:
name: ${spring.application.name}
description: MovieNight backend service
version: ${project.version:unknown}
integrations:
jellyfin:
enabled: ${JELLYFIN_SYNC_ENABLED:false}
base-url: ${JELLYFIN_BASE_URL:}
web-url: ${JELLYFIN_WEB_URL:${JELLYFIN_BASE_URL:}}
api-key: ${JELLYFIN_API_KEY:}
plugin-token: ${JELLYFIN_PLUGIN_TOKEN:}
sync-interval-ms: ${JELLYFIN_SYNC_INTERVAL_MS:1800000}
request-timeout-ms: ${JELLYFIN_REQUEST_TIMEOUT_MS:20000}
services:
user:
blocked-names:
- admin
- root
- system
film:
blocked-patterns:
- censored
- epstein
- python
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%X{traceId}] %logger{36} - %msg%n"