2012-10-11 18:01:04 +00:00
|
|
|
import uuid
|
2020-10-07 15:18:43 +00:00
|
|
|
|
2020-05-10 15:06:19 +00:00
|
|
|
from typing import List, Optional
|
2013-06-06 11:26:05 +00:00
|
|
|
|
2020-10-07 15:18:43 +00:00
|
|
|
import brewman.schemas.auth as schemas
|
|
|
|
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Security, status
|
2020-05-10 15:06:19 +00:00
|
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
|
|
|
from ...core.security import get_current_active_user as get_user
|
|
|
|
from ...db.session import SessionLocal
|
2020-10-07 15:18:43 +00:00
|
|
|
from ...models.auth import Role, User
|
|
|
|
from ...schemas.auth import UserToken
|
|
|
|
|
2020-05-08 04:52:25 +00:00
|
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
2013-06-06 11:26:05 +00:00
|
|
|
|
2020-05-10 15:06:19 +00:00
|
|
|
# Dependency
|
|
|
|
def get_db():
|
|
|
|
try:
|
|
|
|
db = SessionLocal()
|
|
|
|
yield db
|
|
|
|
finally:
|
|
|
|
db.close()
|
|
|
|
|
|
|
|
|
2020-05-11 20:01:21 +00:00
|
|
|
@router.post("", response_model=schemas.User)
|
2020-05-10 15:06:19 +00:00
|
|
|
def save(
|
2020-10-07 15:18:43 +00:00
|
|
|
data: schemas.UserIn,
|
|
|
|
db: Session = Depends(get_db),
|
|
|
|
user: UserToken = Security(get_user, scopes=["users"]),
|
2020-05-10 15:06:19 +00:00
|
|
|
):
|
|
|
|
try:
|
2020-05-10 17:08:35 +00:00
|
|
|
item = User(name=data.name, password=data.password, locked_out=data.locked_out)
|
2020-05-10 15:06:19 +00:00
|
|
|
db.add(item)
|
|
|
|
add_roles(item, data.roles, db)
|
|
|
|
db.commit()
|
|
|
|
return user_info(item, db, user)
|
|
|
|
except SQLAlchemyError as e:
|
|
|
|
db.rollback()
|
|
|
|
raise HTTPException(
|
2020-10-07 15:18:43 +00:00
|
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
|
|
detail=str(e),
|
2020-05-10 15:06:19 +00:00
|
|
|
)
|
|
|
|
except Exception:
|
|
|
|
db.rollback()
|
2020-06-01 03:31:31 +00:00
|
|
|
raise
|
2019-04-06 04:13:12 +00:00
|
|
|
|
2013-10-30 05:53:48 +00:00
|
|
|
|
2020-05-10 16:55:37 +00:00
|
|
|
@router.get("/me", response_model=schemas.User)
|
2020-05-10 15:06:19 +00:00
|
|
|
def show_me(
|
2020-10-07 15:18:43 +00:00
|
|
|
db: Session = Depends(get_db),
|
|
|
|
user: UserToken = Depends(get_user),
|
2020-05-10 15:06:19 +00:00
|
|
|
):
|
2020-05-10 16:55:37 +00:00
|
|
|
item = db.query(User).filter(User.id == user.id_).first()
|
2020-05-10 15:06:19 +00:00
|
|
|
return user_info(item, db, user)
|
|
|
|
|
|
|
|
|
|
|
|
@router.put("/me", response_model=schemas.User)
|
|
|
|
def update_me(
|
2020-10-07 15:18:43 +00:00
|
|
|
data: schemas.UserIn,
|
|
|
|
db: Session = Depends(get_db),
|
|
|
|
user: UserToken = Depends(get_user),
|
2020-05-10 15:06:19 +00:00
|
|
|
):
|
|
|
|
try:
|
2020-05-10 16:55:37 +00:00
|
|
|
item: User = db.query(User).filter(User.id == user.id_).first()
|
2020-05-11 20:01:21 +00:00
|
|
|
if "users" in user.permissions:
|
2020-05-10 15:06:19 +00:00
|
|
|
item.name = data.name
|
|
|
|
item.locked_out = data.locked_out
|
|
|
|
add_roles(item, data.roles, db)
|
|
|
|
if data.password and item.password != data.password:
|
|
|
|
item.password = data.password
|
|
|
|
db.commit()
|
|
|
|
return user_info(item, db, user)
|
|
|
|
except SQLAlchemyError as e:
|
|
|
|
db.rollback()
|
|
|
|
raise HTTPException(
|
2020-10-07 15:18:43 +00:00
|
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
|
|
detail=str(e),
|
2019-04-06 04:13:12 +00:00
|
|
|
)
|
2020-05-10 15:06:19 +00:00
|
|
|
except Exception:
|
|
|
|
db.rollback()
|
2020-06-01 03:31:31 +00:00
|
|
|
raise
|
2020-05-10 15:06:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
@router.put("/{id_}", response_model=schemas.User)
|
|
|
|
def update(
|
|
|
|
id_: uuid.UUID,
|
|
|
|
data: schemas.UserIn,
|
|
|
|
db: Session = Depends(get_db),
|
|
|
|
user: UserToken = Security(get_user, scopes=["users"]),
|
|
|
|
):
|
|
|
|
try:
|
2020-05-10 16:55:37 +00:00
|
|
|
item: User = db.query(User).filter(User.id == id_).first()
|
2020-05-10 15:06:19 +00:00
|
|
|
item.name = data.name
|
|
|
|
if data.password and item.password != data.password:
|
|
|
|
item.password = data.password
|
|
|
|
item.locked_out = data.locked_out
|
|
|
|
add_roles(item, data.roles, db)
|
|
|
|
db.commit()
|
|
|
|
return user_info(item, db, user)
|
|
|
|
except SQLAlchemyError as e:
|
|
|
|
db.rollback()
|
|
|
|
raise HTTPException(
|
2020-10-07 15:18:43 +00:00
|
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
|
|
detail=str(e),
|
2019-04-06 04:13:12 +00:00
|
|
|
)
|
2020-05-10 15:06:19 +00:00
|
|
|
except Exception:
|
|
|
|
db.rollback()
|
2020-06-01 03:31:31 +00:00
|
|
|
raise
|
2020-05-10 15:06:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
def add_roles(user: User, roles: List[schemas.RoleItem], db: Session):
|
|
|
|
for role in roles:
|
2020-05-10 16:55:37 +00:00
|
|
|
ug = [g for g in user.roles if g.id == role.id_]
|
2020-05-10 15:06:19 +00:00
|
|
|
ug = None if len(ug) == 0 else ug[0]
|
|
|
|
if role.enabled and ug is None:
|
2020-05-10 16:55:37 +00:00
|
|
|
user.roles.append(db.query(Role).filter(Role.id == role.id_).one())
|
2020-05-10 15:06:19 +00:00
|
|
|
elif not role.enabled and ug:
|
|
|
|
user.roles.remove(ug)
|
|
|
|
|
|
|
|
|
|
|
|
@router.delete("/{id_}")
|
|
|
|
def delete(
|
2020-10-07 15:18:43 +00:00
|
|
|
id_: uuid.UUID,
|
|
|
|
db: Session = Depends(get_db),
|
|
|
|
user: UserToken = Security(get_user, scopes=["users"]),
|
2020-05-10 15:06:19 +00:00
|
|
|
):
|
|
|
|
try:
|
2020-05-10 16:55:37 +00:00
|
|
|
item: User = db.query(User).filter(User.id == id_).first()
|
2020-05-10 15:06:19 +00:00
|
|
|
if item is None:
|
|
|
|
raise HTTPException(
|
2020-10-07 15:18:43 +00:00
|
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
|
|
detail="User not found",
|
2020-05-10 15:06:19 +00:00
|
|
|
)
|
2012-11-29 13:09:26 +00:00
|
|
|
else:
|
2020-05-10 15:06:19 +00:00
|
|
|
raise HTTPException(
|
2020-10-07 15:18:43 +00:00
|
|
|
status_code=status.HTTP_501_NOT_IMPLEMENTED,
|
|
|
|
detail="User deletion not implemented",
|
2019-04-06 04:13:12 +00:00
|
|
|
)
|
2020-05-10 15:06:19 +00:00
|
|
|
except Exception:
|
|
|
|
db.rollback()
|
2020-06-01 03:31:31 +00:00
|
|
|
raise
|
2019-04-06 04:13:12 +00:00
|
|
|
|
2020-05-10 15:06:19 +00:00
|
|
|
|
2020-05-11 20:01:21 +00:00
|
|
|
@router.get("")
|
2020-05-10 15:06:19 +00:00
|
|
|
def show_blank(
|
2020-10-07 15:18:43 +00:00
|
|
|
db: Session = Depends(get_db),
|
|
|
|
user: UserToken = Security(get_user, scopes=["users"]),
|
2020-05-10 15:06:19 +00:00
|
|
|
):
|
|
|
|
return user_info(None, db, user)
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/list", response_model=List[schemas.UserList])
|
2020-05-10 17:08:35 +00:00
|
|
|
async def show_list(
|
2020-10-07 15:18:43 +00:00
|
|
|
db: Session = Depends(get_db),
|
|
|
|
user: UserToken = Security(get_user, scopes=["users"]),
|
2020-05-10 17:08:35 +00:00
|
|
|
):
|
2020-05-10 15:06:19 +00:00
|
|
|
return [
|
2020-05-10 17:08:35 +00:00
|
|
|
{
|
|
|
|
"id": item.id,
|
|
|
|
"name": item.name,
|
|
|
|
"lockedOut": item.locked_out,
|
|
|
|
"roles": [p.name for p in sorted(item.roles, key=lambda p: p.name)],
|
|
|
|
}
|
2020-05-10 15:06:19 +00:00
|
|
|
for item in db.query(User).order_by(User.name).all()
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/active")
|
2020-10-07 16:59:24 +00:00
|
|
|
async def show_active(
|
|
|
|
db: Session = Depends(get_db), user: UserToken = Depends(get_user)
|
|
|
|
):
|
|
|
|
return [
|
|
|
|
{"name": item.name}
|
|
|
|
for item in db.query(User).filter(User.locked_out == False).order_by(User.name)
|
|
|
|
]
|
2020-05-10 15:06:19 +00:00
|
|
|
|
|
|
|
|
2020-05-11 20:01:21 +00:00
|
|
|
@router.get("/{id_}", response_model=schemas.User)
|
2020-05-10 15:06:19 +00:00
|
|
|
def show_id(
|
2020-10-07 15:18:43 +00:00
|
|
|
id_: uuid.UUID,
|
|
|
|
db: Session = Depends(get_db),
|
|
|
|
user: UserToken = Security(get_user, scopes=["users"]),
|
2020-05-10 15:06:19 +00:00
|
|
|
):
|
2020-05-10 16:55:37 +00:00
|
|
|
item = db.query(User).filter(User.id == id_).first()
|
2020-05-10 15:06:19 +00:00
|
|
|
return user_info(item, db, user)
|
|
|
|
|
|
|
|
|
2020-05-10 16:55:37 +00:00
|
|
|
def user_info(item: Optional[User], db: Session, user: UserToken):
|
2020-05-10 15:06:19 +00:00
|
|
|
if item is None:
|
|
|
|
return {
|
2020-05-10 17:08:35 +00:00
|
|
|
"name": "",
|
|
|
|
"lockedOut": False,
|
2020-10-07 16:59:24 +00:00
|
|
|
"roles": [
|
|
|
|
{"id": r.id, "name": r.name, "enabled": False}
|
|
|
|
for r in db.query(Role).order_by(Role.name).all()
|
|
|
|
],
|
2020-05-10 15:06:19 +00:00
|
|
|
}
|
|
|
|
else:
|
|
|
|
return {
|
2020-05-10 16:55:37 +00:00
|
|
|
"id": item.id,
|
2020-05-10 15:06:19 +00:00
|
|
|
"name": item.name,
|
|
|
|
"password": "",
|
|
|
|
"lockedOut": item.locked_out,
|
|
|
|
"roles": [
|
2020-10-07 15:18:43 +00:00
|
|
|
{
|
|
|
|
"id": r.id,
|
|
|
|
"name": r.name,
|
|
|
|
"enabled": True if r in item.roles else False,
|
|
|
|
}
|
2020-05-10 15:06:19 +00:00
|
|
|
for r in db.query(Role).order_by(Role.name).all()
|
2020-05-10 17:08:35 +00:00
|
|
|
]
|
|
|
|
if "advanced-delete" in user.permissions
|
|
|
|
else [],
|
2020-05-10 15:06:19 +00:00
|
|
|
}
|