157 lines
5.1 KiB
Python
157 lines
5.1 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)
|
||
# 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,
|
||
|
||
'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 = []
|
||
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)
|
||
await crud.user.create(db, new_account)
|
||
res = {
|
||
'created_account': created,
|
||
'password': '123'
|
||
}
|
||
return schemas.Msg(code=0, msg='ok', data=res)
|