from datetime import timedelta from typing import Any from fastapi import APIRouter, Body, Depends, HTTPException, Request from fastapi.security import OAuth2PasswordRequestForm from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorDatabase import crud, schemas from api import deps from core import security from core.config import settings from utils import get_uid from db import get_database router = APIRouter() # @router.post("/login") # async def login( # # data: schemas.UserLogin, # data: OAuth2PasswordRequestForm = Depends(), # db: AsyncIOMotorDatabase = Depends(get_database) # ) -> Any: # """ # OAuth2兼容令牌登录,获取将来令牌的访问令牌 # """ # user = await crud.user.authenticate(db, # name=data.username, password=data.password # ) # if not user: # # raise HTTPException(status_code=400, detail="Incorrect name or password") # return schemas.Msg(code=-1, msg='密码或用户名错误') # access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) # # access_token_expires = timedelta(seconds=5) # await crud.user.update_login_time(db, data.username) # # return { # 'data': { # 'name': user.name, # 'nickname': user.nickname, # 'email': user.email, # 'tel': user.tel, # 'userid':user.id, # # 'token': security.create_access_token( # expires_delta=access_token_expires, _id=str(user.id), email=user.email, # nickname=user.nickname, # is_superuser=user.is_superuser, name=user.name, # data_where=user.data_where, # ), # "token_type": "bearer", # # }, # 'access_token': security.create_access_token( # expires_delta=access_token_expires, _id=str(user.id), email=user.email, # nickname=user.nickname, # is_superuser=user.is_superuser, name=user.name, data_where=user.data_where # ), # "token_type": "bearer", # # 'code': 0, # 'msg': 'success', # } @router.get("/me", response_model=schemas.User) def me(current_user: schemas.User = Depends(deps.get_current_user)) -> Any: """ Test access token """ return current_user @router.post("/reset_password") async def reset_password(request: Request, game: str, data_in: schemas.UserRestPassword, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.User = Depends(deps.get_current_user) ) -> Any: """ 修改其他人密码 """ try: await crud.user.reset_password(db, data_in) except Exception as e: return schemas.Msg(code=0, msg='修改失败', data={'username': data_in}) return schemas.Msg(code=0, msg='ok') @router.post("/reset_my_password") async def reset_password(request: Request, game: str, data_in: schemas.UserRestMyPassword, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.User = Depends(deps.get_current_user) ) -> Any: """ 修改自己的密码 """ await crud.user.reset_password(db, schemas.UserRestPassword(username=current_user.name, password=data_in.password)) return schemas.Msg(code=0, msg='ok') @router.post("/edit_profile") async def edit_profile(request: Request, game: str, data_in: schemas.UserProfileEdit, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.User = Depends(deps.get_current_user) ) -> Any: """ 编辑用户资料 """ await crud.user.edit_profile(db, data_in, user_id=request.user.id) return schemas.Msg(code=0, msg='ok', data=data_in) @router.get("/all_account") async def all_account(page: int = 1, limit: int = 100, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.User = Depends(deps.get_current_user) ) -> Any: """ 获取所有用户 """ page -= 1 if page < 0: page = 0 cursor = crud.user.find(db).skip(page * limit).limit(limit) data = [schemas.UserDB(**user) async for user in cursor] return schemas.Msg(code=0, msg='ok', data=data) @router.post("/add_account") async def all_account( data_in: schemas.CreateAccount, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.User = Depends(deps.get_current_user) ) -> schemas.Msg: """ 创建新账号 """ created = [] id = [] for name in data_in.account_list: if is_exists := await crud.user.exists(db, {'name': name}): continue else: new_account = schemas.UserCreate(name=name, password='123') created.append(name) #创建账户并返回id id_one=await crud.user.create(db, new_account) id.append(id_one) res = { 'created_account': created, 'password': '123', 'id':id } return schemas.Msg(code=0, msg='ok', data=res)