"""User settings endpoints, including scrobbling configuration. Settings are per-caller and created lazily, so a first read returns defaults. The scrobbler session key is write-only — accepted on ``PUT`` but never returned. """ from fastapi import APIRouter from app.api.deps import CurrentUser, UserSettingsServiceDep from app.api.schemas.settings import ( ScrobblingOut, ScrobblingUpdate, SettingsOut, SettingsUpdate, ) from app.domain.entities.settings import UserSettings router = APIRouter(prefix="/settings", tags=["settings"]) def _to_settings_out(settings: UserSettings) -> SettingsOut: return SettingsOut(theme=settings.theme, stream_quality=settings.stream_quality) def _to_scrobbling_out(settings: UserSettings) -> ScrobblingOut: return ScrobblingOut( enabled=settings.scrobble_enabled, provider=settings.scrobble_provider, username=settings.scrobble_username, configured=settings.scrobble_session_key_enc is not None, ) @router.get("") async def get_settings(user: CurrentUser, service: UserSettingsServiceDep) -> SettingsOut: return _to_settings_out(await service.get(user.id)) @router.patch("") async def update_settings( body: SettingsUpdate, user: CurrentUser, service: UserSettingsServiceDep ) -> SettingsOut: settings = await service.update_general( user.id, theme=body.theme, stream_quality=body.stream_quality ) return _to_settings_out(settings) @router.get("/scrobbling") async def get_scrobbling_settings( user: CurrentUser, service: UserSettingsServiceDep ) -> ScrobblingOut: return _to_scrobbling_out(await service.get(user.id)) @router.put("/scrobbling") async def set_scrobbling_settings( body: ScrobblingUpdate, user: CurrentUser, service: UserSettingsServiceDep ) -> ScrobblingOut: settings = await service.set_scrobbling( user.id, enabled=body.enabled, provider=body.provider, username=body.username, session_key=body.session_key, ) return _to_scrobbling_out(settings)