more_agent/app/main.py

286 lines
7.6 KiB
Python
Raw Normal View History

2026-05-12 05:03:18 +00:00
"""用户管理服务 - FastAPI 应用入口模块。
提供用户注册登录查询更新删除等 RESTful API 接口
"""
from typing import Optional
from fastapi import FastAPI, HTTPException, Query, status
from fastapi.middleware.cors import CORSMiddleware
from app.models import (
ErrorResponse,
SuccessResponse,
UserCreate,
UserLogin,
UserResponse,
UserUpdate,
)
from app.services import (
create_user,
delete_user,
get_all_users,
get_user_by_id,
get_user_count,
login,
update_user,
)
# 创建 FastAPI 应用实例
app = FastAPI(
title="User Management API",
description="用户管理服务 - 提供用户注册、登录、CRUD 等基础功能",
version="1.0.0",
)
# 添加 CORS 中间件,允许跨域访问
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/health", tags=["系统"])
async def health_check():
"""健康检查接口。
Returns:
服务运行状态信息
"""
return {
"status": "ok",
"service": "user-management-service",
"version": "1.0.0",
"total_users": get_user_count(),
}
# ──────────────────────────────────────────────
# 用户管理 API
# ──────────────────────────────────────────────
@app.post(
"/api/users",
response_model=UserResponse,
status_code=status.HTTP_201_CREATED,
tags=["用户管理"],
summary="注册新用户",
description="创建一个新的用户账户,需要提供用户名、邮箱和密码。",
responses={
201: {"description": "用户创建成功", "model": UserResponse},
400: {"description": "请求数据不合法", "model": ErrorResponse},
409: {"description": "用户名或邮箱已被占用", "model": ErrorResponse},
},
)
async def api_create_user(user_data: UserCreate):
"""用户注册接口。
Args:
user_data: 用户注册信息用户名邮箱密码
Returns:
创建成功的用户信息
Raises:
HTTPException: 当输入验证失败或用户名/邮箱已存在时抛出
"""
try:
return create_user(user_data)
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail=str(e),
)
@app.get(
"/api/users",
response_model=list[UserResponse],
tags=["用户管理"],
summary="获取用户列表",
description="分页获取所有用户信息列表。",
)
async def api_get_users(
skip: int = Query(0, ge=0, description="跳过的记录数"),
limit: int = Query(10, ge=1, le=100, description="每页数量"),
):
"""获取用户列表接口。
Args:
skip: 跳过的记录数默认 0
limit: 每页数量默认 10最大 100
Returns:
用户信息列表
"""
return get_all_users(skip, limit)
@app.get(
"/api/users/{user_id}",
response_model=UserResponse,
tags=["用户管理"],
summary="获取单个用户",
description="根据用户 ID 获取指定用户的详细信息。",
responses={
200: {"description": "成功获取用户信息", "model": UserResponse},
404: {"description": "用户不存在", "model": ErrorResponse},
},
)
async def api_get_user(user_id: str):
"""获取单个用户接口。
Args:
user_id: 用户 ID
Returns:
用户详细信息
Raises:
HTTPException: 当用户不存在时抛出 404
"""
user = get_user_by_id(user_id)
if user is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"用户 '{user_id}' 不存在",
)
return user
@app.put(
"/api/users/{user_id}",
response_model=UserResponse,
tags=["用户管理"],
summary="更新用户信息",
description="更新指定用户的用户名和/或邮箱。",
responses={
200: {"description": "更新成功", "model": UserResponse},
404: {"description": "用户不存在", "model": ErrorResponse},
409: {"description": "新用户名已被占用", "model": ErrorResponse},
},
)
async def api_update_user(user_id: str, update_data: UserUpdate):
"""更新用户信息接口。
Args:
user_id: 要更新的用户 ID
update_data: 待更新的字段
Returns:
更新后的用户信息
Raises:
HTTPException: 用户不存在抛出 404用户名冲突抛出 409
"""
try:
result = update_user(user_id, update_data)
if result is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"用户 '{user_id}' 不存在",
)
return result
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail=str(e),
)
@app.delete(
"/api/users/{user_id}",
response_model=SuccessResponse,
tags=["用户管理"],
summary="删除用户",
description="删除指定的用户账户。",
responses={
200: {"description": "删除成功", "model": SuccessResponse},
404: {"description": "用户不存在", "model": ErrorResponse},
},
)
async def api_delete_user(user_id: str):
"""删除用户接口。
Args:
user_id: 要删除的用户 ID
Returns:
删除成功消息
Raises:
HTTPException: 用户不存在时抛出 404
"""
success = delete_user(user_id)
if not success:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"用户 '{user_id}' 不存在",
)
return {"message": f"用户 '{user_id}' 已成功删除"}
# ──────────────────────────────────────────────
# 用户登录 API
# ──────────────────────────────────────────────
@app.post(
"/api/users/login",
response_model=UserResponse,
tags=["用户管理"],
summary="用户登录",
description="使用用户名和密码进行登录验证。",
responses={
200: {"description": "登录成功", "model": UserResponse},
401: {"description": "用户名或密码错误", "model": ErrorResponse},
},
)
async def api_login(login_data: UserLogin):
"""用户登录接口。
Args:
login_data: 登录凭证用户名和密码
Returns:
登录成功的用户信息
Raises:
HTTPException: 用户名或密码错误时抛出 401
"""
user = login(login_data)
if user is None:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="用户名或密码错误",
)
return user
# ──────────────────────────────────────────────
# 应用入口
# ──────────────────────────────────────────────
def main():
"""启动 FastAPI 应用的入口函数。
使用 uvicorn 运行服务监听 0.0.0.0:8000
"""
import uvicorn
uvicorn.run(
"app.main:app",
host="0.0.0.0",
port=8000,
reload=True,
)
if __name__ == "__main__":
main()