Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/hesabixAPI/adapters/api/v1/admin/scripts.py
2026-04-14 19:34:55 +03:30

119 lines
3.4 KiB
Python
Executable file

from __future__ import annotations
from typing import Any, Dict, Optional
from fastapi import APIRouter, Depends, Body, Request, Query
from sqlalchemy.orm import Session
from pydantic import BaseModel
from adapters.db.session import get_db
from app.core.auth_dependency import get_current_user, AuthContext
from app.core.responses import success_response, ApiError
from app.services.admin_script_service import (
list_scripts,
create_script_run,
list_script_runs,
get_script_run_details,
cancel_script_run,
)
router = APIRouter(prefix="/admin/scripts", tags=["مدیریت سیستم"])
class ScriptRunCreatePayload(BaseModel):
params: Dict[str, Any] | None = None
dry_run: bool = True
def _require_system_admin(ctx: AuthContext) -> None:
if not ctx.is_superadmin():
raise ApiError("FORBIDDEN", "Superadmin access required", http_status=403)
@router.get(
"",
summary="لیست اسکریپت‌های ادمین",
description="دریافت کاتالوگ اسکریپت‌های قابل اجرا توسط مدیر سیستم",
)
def list_scripts_endpoint(
request: Request,
ctx: AuthContext = Depends(get_current_user),
):
_require_system_admin(ctx)
return success_response({"items": list_scripts()}, request)
@router.post(
"/{script_key}/runs",
summary="ایجاد اجرای اسکریپت",
description="ایجاد اجرای جدید برای یک اسکریپت. اجرای واقعی در پس‌زمینه انجام می‌شود.",
)
def create_script_run_endpoint(
request: Request,
script_key: str,
payload: ScriptRunCreatePayload = Body(...),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
):
_require_system_admin(ctx)
created = create_script_run(
db=db,
user_id=ctx.get_user_id(),
script_key=script_key,
params=payload.params or {},
dry_run=payload.dry_run,
)
return success_response(created, request, message="SCRIPT_RUN_CREATED")
@router.get(
"/runs",
summary="لیست اجرای اسکریپت‌ها",
description="لیست تاریخچه اجرای اسکریپت‌ها با امکان فیلتر",
)
def list_script_runs_endpoint(
request: Request,
script_key: Optional[str] = Query(None),
status: Optional[str] = Query(None),
take: int = Query(50, ge=1, le=500),
skip: int = Query(0, ge=0),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
):
_require_system_admin(ctx)
result = list_script_runs(db, script_key=script_key, status=status, take=take, skip=skip)
return success_response(result, request)
@router.get(
"/runs/{run_id}",
summary="جزئیات اجرای اسکریپت",
description="نمایش جزئیات اجرای اسکریپت به همراه لاگ‌ها",
)
def get_script_run_endpoint(
request: Request,
run_id: int,
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
):
_require_system_admin(ctx)
result = get_script_run_details(db, run_id)
return success_response(result, request)
@router.post(
"/runs/{run_id}/cancel",
summary="لغو اجرای اسکریپت",
description="علامت‌گذاری اجرای در حال انجام به عنوان لغو شده",
)
def cancel_script_run_endpoint(
request: Request,
run_id: int,
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
):
_require_system_admin(ctx)
result = cancel_script_run(db, run_id)
return success_response(result, request, message="SCRIPT_RUN_CANCELLED")