Big refactoring
Some checks failed
Deploy / lint (push) Failing after 21s
Deploy / test (push) Has been skipped
Deploy / deploy (push) Has been skipped

This commit is contained in:
Dennis Thiessen
2026-03-03 15:20:18 +01:00
parent 181cfe6588
commit 0a011d4ce9
55 changed files with 6898 additions and 544 deletions

View File

@@ -3,7 +3,7 @@
All endpoints require admin role.
"""
from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from app.dependencies import get_db, require_admin
@@ -12,13 +12,16 @@ from app.schemas.admin import (
CreateUserRequest,
DataCleanupRequest,
JobToggle,
RecommendationConfigUpdate,
PasswordReset,
RegistrationToggle,
SystemSettingUpdate,
TickerUniverseUpdate,
UserManagement,
)
from app.schemas.common import APIEnvelope
from app.services import admin_service
from app.services import ticker_universe_service
router = APIRouter(tags=["admin"])
@@ -123,6 +126,47 @@ async def list_settings(
)
@router.get("/admin/settings/recommendations", response_model=APIEnvelope)
async def get_recommendation_settings(
_admin: User = Depends(require_admin),
db: AsyncSession = Depends(get_db),
):
config = await admin_service.get_recommendation_config(db)
return APIEnvelope(status="success", data=config)
@router.put("/admin/settings/recommendations", response_model=APIEnvelope)
async def update_recommendation_settings(
body: RecommendationConfigUpdate,
_admin: User = Depends(require_admin),
db: AsyncSession = Depends(get_db),
):
updated = await admin_service.update_recommendation_config(
db,
body.model_dump(exclude_unset=True),
)
return APIEnvelope(status="success", data=updated)
@router.get("/admin/settings/ticker-universe", response_model=APIEnvelope)
async def get_ticker_universe_setting(
_admin: User = Depends(require_admin),
db: AsyncSession = Depends(get_db),
):
data = await admin_service.get_ticker_universe_default(db)
return APIEnvelope(status="success", data=data)
@router.put("/admin/settings/ticker-universe", response_model=APIEnvelope)
async def update_ticker_universe_setting(
body: TickerUniverseUpdate,
_admin: User = Depends(require_admin),
db: AsyncSession = Depends(get_db),
):
data = await admin_service.update_ticker_universe_default(db, body.universe)
return APIEnvelope(status="success", data=data)
@router.put("/admin/settings/{key}", response_model=APIEnvelope)
async def update_setting(
key: str,
@@ -138,6 +182,21 @@ async def update_setting(
)
@router.post("/admin/tickers/bootstrap", response_model=APIEnvelope)
async def bootstrap_tickers(
universe: str = Query("sp500", pattern="^(sp500|nasdaq100|nasdaq_all)$"),
prune_missing: bool = Query(False),
_admin: User = Depends(require_admin),
db: AsyncSession = Depends(get_db),
):
result = await ticker_universe_service.bootstrap_universe(
db,
universe,
prune_missing=prune_missing,
)
return APIEnvelope(status="success", data=result)
# ---------------------------------------------------------------------------
# Data cleanup
# ---------------------------------------------------------------------------
@@ -167,6 +226,15 @@ async def list_jobs(
return APIEnvelope(status="success", data=jobs)
@router.get("/admin/pipeline/readiness", response_model=APIEnvelope)
async def get_pipeline_readiness(
_admin: User = Depends(require_admin),
db: AsyncSession = Depends(get_db),
):
data = await admin_service.get_pipeline_readiness(db)
return APIEnvelope(status="success", data=data)
@router.post("/admin/jobs/{job_name}/trigger", response_model=APIEnvelope)
async def trigger_job(
job_name: str,