# Copyright 2026 zhaoxi826 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from fastapi import APIRouter from fastapi import Depends from pydantic import BaseModel from pretor.utils.access import Accessor, TokenData from fastapi.concurrency import run_in_threadpool from pretor.utils.ray_hook import ray_actor_hook from pretor.utils.check_user.role_check import RoleChecker from pretor.core.database.table.user import UserAuthority from pretor.utils.error import UserNotExistError auth_router = APIRouter(prefix="/api/v1/auth", tags=["auth"]) class UserRegister(BaseModel): """UserRegister 核心组件类。 这是一个领域数据模型或功能封装类,承载了 UserRegister 相关的内聚属性定义与状态维护。它的存在隔离了局部的业务复杂性,并对外提供了类型安全的访问接口。""" user_name: str password: str @auth_router.post("/register") async def create_user(user_register: UserRegister): """处理针对 create user 相关的 HTTP API 请求。 该接口负责解析前端传入的载荷数据,调用底层核心业务逻辑进行处理,并组装标准化的 JSON 响应。 Args: user_register (UserRegister): 参与 create user 逻辑运算或数据构建的上下文依赖对象。 Returns: : 序列化后的标准网络响应模型(如包含业务状态码、成功标志及对应的数据载荷 Data)。""" postgres_database = ray_actor_hook("postgres_database").postgres_database hashed_password = await run_in_threadpool( Accessor.hash_password, user_register.password ) user = await postgres_database.add_user.remote( user_register.user_name, hashed_password ) return {"message": "success", "user_id": user.user_id} class UserLogin(BaseModel): """UserLogin 核心组件类。 这是一个领域数据模型或功能封装类,承载了 UserLogin 相关的内聚属性定义与状态维护。它的存在隔离了局部的业务复杂性,并对外提供了类型安全的访问接口。""" user_name: str password: str @auth_router.post("/login") async def login_user(user_login: UserLogin): """处理针对 login user 相关的 HTTP API 请求。 该接口负责解析前端传入的载荷数据,调用底层核心业务逻辑进行处理,并组装标准化的 JSON 响应。 Args: user_login (UserLogin): 参与 login user 逻辑运算或数据构建的上下文依赖对象。 Returns: : 序列化后的标准网络响应模型(如包含业务状态码、成功标志及对应的数据载荷 Data)。""" postgres_database = ray_actor_hook("postgres_database").postgres_database user = await postgres_database.login_user.remote(user_login.user_name) if not user: raise UserNotExistError() token = await run_in_threadpool( Accessor.login_hashed_password, user, user_login.password ) return {"message": "success", "token": token} class ChangeAuthorityRequest(BaseModel): """ChangeAuthorityRequest 核心组件类。 这是一个领域数据模型或功能封装类,承载了 ChangeAuthorityRequest 相关的内聚属性定义与状态维护。它的存在隔离了局部的业务复杂性,并对外提供了类型安全的访问接口。""" user_id: str new_authority: UserAuthority @auth_router.put("/authority") async def change_authority( request: ChangeAuthorityRequest, _: TokenData = Depends( RoleChecker(allowed_roles=UserAuthority.SUPER_ADMINISTRATOR) ), ): """ Update a user's authority level. Only accessible by SUPER_ADMINISTRATOR. """ postgres_database = ray_actor_hook("postgres_database").postgres_database user = await postgres_database.change_user_authority.remote( user_id=request.user_id, new_authority=request.new_authority ) return { "message": "success", "user_id": user.user_id, "new_authority": user.user_authority, } @auth_router.get("/list") async def get_user_list( _: TokenData = Depends( RoleChecker(allowed_roles=UserAuthority.SUPER_ADMINISTRATOR) ), ): """ Get a list of all users. Only accessible by SUPER_ADMINISTRATOR. """ postgres_database = ray_actor_hook("postgres_database").postgres_database users = await postgres_database.get_all_users.remote() return { "users": [ {"user_id": u.user_id, "user_name": u.user_name, "role": u.user_authority} for u in users ] } @auth_router.delete("/{user_id}") async def delete_user( user_id: str, _: TokenData = Depends( RoleChecker(allowed_roles=UserAuthority.SUPER_ADMINISTRATOR) ), ): """ Delete a user. Only accessible by SUPER_ADMINISTRATOR. """ postgres_database = ray_actor_hook("postgres_database").postgres_database await postgres_database.delete_user_by_id.remote(user_id=user_id) return {"message": "success"}