platform-core/modules/routes/routeAdminDemoConfig.py
ValueOn AG ebc4b2a080
Some checks failed
Deploy Plattform-Core (Int) / test (push) Failing after 12s
Deploy Plattform-Core (Int) / deploy (push) Has been skipped
cp adapted to 2026 poweron 2
2026-06-09 09:58:05 +02:00

98 lines
2.8 KiB
Python

# Copyright (c) 2026 PowerOn AG
# All rights reserved.
"""
Admin Demo Config API
Provides endpoints to list, load, and remove demo configurations.
SysAdmin-only access.
"""
import logging
from fastapi import APIRouter, Depends, HTTPException, Request, status
from modules.auth import limiter
from modules.auth.authentication import requirePlatformAdmin
from modules.datamodels.datamodelUam import User
from modules.security.rootAccess import getRootDbAppConnector
logger = logging.getLogger(__name__)
router = APIRouter(
prefix="/api/admin/demo-config",
tags=["Admin Demo Config"],
)
@router.get("")
@limiter.limit("30/minute")
def listDemoConfigs(
request: Request,
currentUser: User = Depends(requirePlatformAdmin),
) -> dict:
"""List all available demo configurations."""
from modules.demoConfigs import getAvailableDemoConfigs
configs = getAvailableDemoConfigs()
return {
"configs": [cfg.toDict() for cfg in configs.values()],
}
@router.post("/{code}/load")
@limiter.limit("5/minute")
def loadDemoConfig(
code: str,
request: Request,
currentUser: User = Depends(requirePlatformAdmin),
) -> dict:
"""Load (create) a demo configuration. Idempotent."""
from modules.demoConfigs import getDemoConfigByCode
config = getDemoConfigByCode(code)
if not config:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Demo config '{code}' not found",
)
db = getRootDbAppConnector()
logger.info(f"Loading demo config '{code}' (user: {currentUser.username})")
summary = config.load(db)
logger.info(f"Demo config '{code}' loaded: {summary}")
return {"status": "ok", "code": code, "summary": summary}
@router.post("/{code}/remove")
@limiter.limit("5/minute")
def removeDemoConfig(
code: str,
request: Request,
currentUser: User = Depends(requirePlatformAdmin),
) -> dict:
"""Remove all data created by a demo configuration.
Requires X-Confirm-Destructive: true header as safety guard.
"""
from modules.demoConfigs import getDemoConfigByCode
confirmHeader = request.headers.get("X-Confirm-Destructive", "").lower()
if confirmHeader != "true":
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Destructive operation requires header X-Confirm-Destructive: true",
)
config = getDemoConfigByCode(code)
if not config:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Demo config '{code}' not found",
)
db = getRootDbAppConnector()
logger.info(f"Removing demo config '{code}' (user: {currentUser.username}, confirmed)")
summary = config.remove(db)
logger.info(f"Demo config '{code}' removed: {summary}")
return {"status": "ok", "code": code, "summary": summary}