43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
"""Finance router — daily revenue vs cost reconciliation."""
|
|
from __future__ import annotations
|
|
|
|
import datetime as _dt
|
|
from typing import Any, Optional
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.database import get_db
|
|
from app.models.upstream import Upstream
|
|
from app.models.website import Website
|
|
from app.services.finance_service import get_daily_summary, yesterday_shanghai
|
|
from app.utils.auth import get_current_user
|
|
|
|
router = APIRouter(prefix="/api/finance", tags=["finance"])
|
|
|
|
|
|
@router.get("/daily-summary")
|
|
def daily_summary(
|
|
date: Optional[str] = Query(None, description="YYYY-MM-DD, defaults to yesterday Asia/Shanghai"),
|
|
db: Session = Depends(get_db),
|
|
_: Any = Depends(get_current_user),
|
|
) -> dict:
|
|
"""Return daily revenue vs cost summary.
|
|
|
|
Never raises for individual item failures — each failed website/upstream
|
|
is included in the response with status='failed' and an error message.
|
|
Only raises HTTP errors for bad request parameters.
|
|
"""
|
|
if date:
|
|
try:
|
|
target = _dt.date.fromisoformat(date)
|
|
except ValueError:
|
|
raise HTTPException(400, f"Invalid date format: {date!r}. Expected YYYY-MM-DD.")
|
|
else:
|
|
target = yesterday_shanghai()
|
|
|
|
websites = db.query(Website).filter(Website.enabled == True).all()
|
|
upstreams = db.query(Upstream).filter(Upstream.enabled == True).all()
|
|
|
|
return get_daily_summary(websites, upstreams, target)
|