78 lines
2.6 KiB
Python
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}}
|