You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.9 KiB

from fastapi import HTTPException, status
from sqlalchemy import func, and_
from typing import List
from ..database.db import database
from ..database.users import users_table as ut, users_rights, rights_table
from ..schemas.users import UserCreate, User
async def get_user_by_username(username: str):
'''Метод для получения строки с данными пользователя из базы данных по
username.'''
query = ut.select().where(ut.c.login == username)
user_data = await database.fetch_one(query)
query = (ut.
join(users_rights).
join(rights_table).
select().
where(and_(ut.c.id == users_rights.c.user_id,
ut.c.login == username,
rights_table.c.id == users_rights.c.right_id)).
with_only_columns([ut.c.id,
ut.c.login,
ut.c.password,
func.group_concat(rights_table.c.name,
' ').label("rights")]).
group_by(ut.c.id))
response = await database.fetch_one(query)
user_data = dict(response)
user_data['rights'] = user_data['rights'].split()
return user_data
async def create_user(username: str, hashed_password: str, rights: List[str]):
UserCreate(login=username,
password=hashed_password,
rights=rights)
def check_user_rights(user_data: User, *rights: List[str]) -> None:
user_rights = user_data.rights
for right in user_rights:
if right not in user_rights:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,
detail='Not enough permissions',
headers={"WWW-Authenticate": "Bearer"}
)