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 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) await crud.user.update_login_time(db, data.username) return { 'data': { 'name': user.name, 'nickname': user.nickname, 'email': user.email, '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 ), "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 ), "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: """ 修改密码 """ await crud.user.reset_password(db, data_in) return schemas.Msg(code=0, msg='ok') @router.get("/all_account") async def all_account(page: int = 1, limit: int = 10, 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)