from typing import Annotated, Any from fastapi import APIRouter, Query from app.adapters.db import db from app.api.fandata import schemas from app.dsp.enums import DSPId from app.fandata.enums import CollectionGranularity, FanCredentialsStatus from app.fandata.models import FanCollectionState, FanCredentials, FanCredentialsFilter router = APIRouter(prefix="/fandata", tags=["Fandata"]) @router.get( "/collection-activity", response_model=list[schemas.CollectionActivityDay], ) def get_collection_activity( days: Annotated[int, Query(ge=1, le=90)] = 7, granularity: CollectionGranularity = CollectionGranularity.daily, ) -> Any: with db.autocommit(): return FanCollectionState.query.collection_activity( days=days, granularity=granularity ) @router.get( "/credentials", response_model=schemas.FanPaginated, ) def list_credentials( limit: Annotated[int, Query(ge=1, le=100)] = 20, offset: Annotated[int, Query(ge=0)] = 0, search: Annotated[str | None, Query()] = None, dsp_id: Annotated[DSPId | None, Query()] = None, token_status: Annotated[FanCredentialsStatus | None, Query()] = None, ) -> Any: with db.autocommit(): return FanCredentials.query.fan_view_paginate( dsp_id=dsp_id, token_status=token_status, search=search, limit=limit, offset=offset, ) @router.get( "/credentials/count", response_model=schemas.FanCredentialsCount, ) def count_fan_credentials( params: Annotated[schemas.GetFanCredentialsInput, Query()], ) -> Any: with db.autocommit(): count = FanCredentials.query.filter( FanCredentialsFilter( dsp_client_id=params.dsp_client_id, token_status=params.token_status, not_collected_since=params.not_collected_since, max_consecutive_failures=params.max_consecutive_failures, ) ).count() if params.limit: count = min(count, params.limit) return {"count": count}