daily/Router/UserRouter.py

97 lines
4.6 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from Models.DepartmentModel import Department
from Models.PostModel import Post
from Schemas import UserSchemas
from Crud import UserCrud, AuthCrud
from Schemas.UserSchemas import TokenData
from Utils.AuthUtils import token_data_depend, create_token
from Utils.CrudUtils import auto_create_crud
from Utils.SqlAlchemyUtils import get_db
from Utils.VerifyCodeUtils import EmailVerifyCode, EmailVerifyType
from Utils.wxAppUtils import code2Session
router = APIRouter(
prefix="/api/daily/user"
)
# 授权登录后调用的接口,
@router.post('/login_to_app', summary="应用登录", tags=["用户接口"], response_model=UserSchemas.LoginToAppRes)
def login_to_app(req: UserSchemas.LoginToAppReq, db: Session = Depends(get_db)):
openid = code2Session(req.code).openid
if not openid:
raise HTTPException(detail="code无效", status_code=303)
user = UserCrud.get_user_info(db, openid)
if not user:
user = UserCrud.create_user(db, openid)
auth_data = AuthCrud.get_user_auth(db, openid)
user_data = user.to_dict()
user_data["auth_data"] = auth_data
token_data = TokenData(**user_data)
token = create_token(token_data.dict())
return UserSchemas.LoginToAppRes(**user.to_dict(), token=token)
@router.post('/get_user_info', summary='获取用户信息', tags=["用户接口"], response_model=UserSchemas.GetUserInfoRes)
def get_user_info(token_data: TokenData = Depends(token_data_depend), db: Session = Depends(get_db)):
user = UserCrud.get_user_info(db, token_data.openid)
return UserSchemas.GetUserInfoRes(**user.to_dict())
# 修改用户的邮箱、姓名、部门信息,需要进行邮箱验证码验证
@router.post('/change_user_info_and_email', tags=["用户接口"], summary='修改用户信息及email')
def change_user_info_and_email(req: UserSchemas.ChangeUserInfoReq, token_data: TokenData = Depends(token_data_depend),
db: Session = Depends(get_db)):
checked = EmailVerifyCode.check_code(req.email, req.email_code, EmailVerifyType.change)
if not checked:
raise HTTPException(detail="邮箱验证码错误", status_code=303)
if token_data.openid != req.openid:
raise HTTPException(detail="无权限的操作", status_code=303)
user = UserCrud.change_user_info(db, token_data.openid, UserSchemas.UserInfoChange(**req.dict(), registered=True))
auth_data = AuthCrud.get_user_auth(db, token_data.openid)
user_data = user.to_dict()
user_data["auth_data"] = auth_data
new_token_data = TokenData(**user_data)
token = create_token(new_token_data.dict(), auth_data=auth_data)
return {'msg': "修改成功", 'state': 1, 'data': {'token': token}}
@router.post('/change_user_info', tags=["用户接口"], summary='修改用户信息')
def change_user_info(req: UserSchemas.ChangeUserInfoReq, token_data: TokenData = Depends(token_data_depend),
db: Session = Depends(get_db)):
if token_data.openid != req.openid:
raise HTTPException(detail="无权限的操作", status_code=303)
UserCrud.change_user_info(db, token_data.openid, UserSchemas.UserInfoChange(**req.dict()))
return {'msg': "修改成功", 'state': 1}
@router.post('/bind_email', tags=["用户接口"], summary='绑定email')
def bind_email(req: UserSchemas.BindEmailReq, token_data: TokenData = Depends(token_data_depend),
db: Session = Depends(get_db)):
checked = EmailVerifyCode.check_code(req.email, req.email_code, EmailVerifyType.change)
if not checked:
raise HTTPException(detail="邮箱验证码错误", status_code=303)
UserCrud.update_user_info_from_email(db, token_data.openid, req.email)
auth_data = AuthCrud.get_user_auth(db, token_data.openid)
user = UserCrud.get_user_info(db, token_data.openid)
user_data = user.to_dict()
user_data["auth_data"] = auth_data
token_data = TokenData(**user_data)
token = create_token(token_data)
return {'msg': "修改成功", 'state': 1, 'data': {'token': token}}
@router.post("/get_email_verify_code", tags=["用户接口"], summary="获取邮箱验证码")
def get_email_verify_code(body: UserSchemas.EmailSendReqBody):
email = body.email
EmailVerifyCode.send_change_code(email)
return {"msg": "验证码已发送至邮箱,请查看", "state": 1}
department_crud = auto_create_crud(Department, 'department', "部门", auto_create_keys=['id'], tags=["部门职务操作"])
post_crud = auto_create_crud(Post, 'post', "职务", auto_create_keys=['id'], tags=["部门职务操作"])
department_crud.mount(router)
post_crud.mount(router)