新增管理员创建用户接口 POST /admin/users,创建后邮箱自动确认
This commit is contained in:
@@ -6,6 +6,7 @@ from zoneinfo import ZoneInfo
|
||||
|
||||
from fastapi import APIRouter, HTTPException, Query, status
|
||||
from sqlalchemy import case, func, select, update
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy.orm import joinedload, selectinload
|
||||
|
||||
from app.deps import AdminUser, DbSession
|
||||
@@ -13,6 +14,7 @@ from app.models import Cloud, Profile, User
|
||||
from app.schemas import (
|
||||
AdminCloudStatusIn,
|
||||
AdminCloudVisibilityIn,
|
||||
AdminCreateUserIn,
|
||||
AdminStatsOut,
|
||||
AdminUserOut,
|
||||
AdminUserUpdateIn,
|
||||
@@ -22,6 +24,7 @@ from app.schemas import (
|
||||
DeleteResultOut,
|
||||
PageOut,
|
||||
)
|
||||
from app.security import hash_password, utc_now
|
||||
from app.serializers import cloud_out, profile_out, user_out
|
||||
from app.services.storage import delete_files
|
||||
|
||||
@@ -83,6 +86,32 @@ async def list_users(
|
||||
)
|
||||
|
||||
|
||||
@router.post("/users", response_model=AdminUserOut, status_code=status.HTTP_201_CREATED)
|
||||
async def create_user(
|
||||
payload: AdminCreateUserIn,
|
||||
_: AdminUser,
|
||||
db: DbSession,
|
||||
) -> AdminUserOut:
|
||||
email = str(payload.email).strip().lower()
|
||||
user = User(
|
||||
email=email,
|
||||
password_hash=hash_password(payload.password),
|
||||
email_verified_at=utc_now(),
|
||||
)
|
||||
user.profile = Profile(username=payload.username, role=payload.role)
|
||||
db.add(user)
|
||||
try:
|
||||
await db.commit()
|
||||
except IntegrityError as exc:
|
||||
await db.rollback()
|
||||
message = str(exc.orig).lower()
|
||||
if "email" in message:
|
||||
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="该邮箱已被注册") from exc
|
||||
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="这个昵称已经被使用") from exc
|
||||
await db.refresh(user, ["profile"])
|
||||
return AdminUserOut(user=user_out(user), profile=profile_out(user.profile))
|
||||
|
||||
|
||||
@router.patch("/users/{user_id}", response_model=AdminUserOut)
|
||||
async def update_user(
|
||||
user_id: uuid.UUID,
|
||||
|
||||
Reference in New Issue
Block a user