xiangqinxiaochengxu/backend/app/routers/admin/admins.py
2026-04-17 10:49:14 +08:00

78 lines
2.6 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.dependencies import require_super_admin
from app.schemas.admin import AdminCreateRequest, AdminPasswordResetRequest, AdminStatusUpdateRequest
from app.services.admin_service import (
create_admin_account,
list_admin_accounts,
reset_admin_password,
update_admin_status,
)
router = APIRouter()
@router.get("")
async def list_admins(
admin_payload: dict = Depends(require_super_admin),
session: AsyncSession = Depends(get_db),
) -> dict:
_ = admin_payload
admins = await list_admin_accounts(session)
data = [
{
"id": item.id,
"username": item.username,
"role": item.role,
"is_active": item.is_active,
"last_login": item.last_login.isoformat() if item.last_login else None,
"created_at": item.created_at.isoformat() if item.created_at else None,
}
for item in admins
]
return {"code": 0, "message": "ok", "data": data}
@router.post("")
async def create_admin(
payload: AdminCreateRequest,
admin_payload: dict = Depends(require_super_admin),
session: AsyncSession = Depends(get_db),
) -> dict:
_ = admin_payload
try:
admin = await create_admin_account(session, payload)
except ValueError as exc:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(exc)) from exc
return {"code": 0, "message": "ok", "data": {"id": admin.id}}
@router.put("/{admin_id}/status")
async def update_status(
admin_id: int,
payload: AdminStatusUpdateRequest,
admin_payload: dict = Depends(require_super_admin),
session: AsyncSession = Depends(get_db),
) -> dict:
_ = admin_payload
admin = await update_admin_status(session, admin_id, payload.is_active)
if admin is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Admin not found")
return {"code": 0, "message": "ok", "data": {"id": admin.id, "is_active": admin.is_active}}
@router.put("/{admin_id}/password")
async def reset_password(
admin_id: int,
payload: AdminPasswordResetRequest,
admin_payload: dict = Depends(require_super_admin),
session: AsyncSession = Depends(get_db),
) -> dict:
_ = admin_payload
admin = await reset_admin_password(session, admin_id, payload.password)
if admin is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Admin not found")
return {"code": 0, "message": "ok", "data": {"id": admin.id}}