82 lines
2.5 KiB
Python
82 lines
2.5 KiB
Python
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)
|
||
|
||
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,
|
||
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.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)
|