Newer
Older
from fastapi import APIRouter, Depends
from nacsos_data.db.crud import upsert_orm
from sqlalchemy import select
from sqlalchemy.orm import selectinload
from nacsos_data.models.users import UserBaseModel
from nacsos_data.models.projects import ProjectPermissionsModel
from nacsos_data.db.schemas import ProjectPermissions
from nacsos_data.db.crud.projects import \
read_project_permissions_for_project, \
read_project_permissions_by_id, \
delete_project_permissions
from server.data import db_engine
from server.util.security import UserPermissionChecker, UserPermissions
from server.util.logging import get_logger
logger = get_logger('nacsos.api.route.project')
router = APIRouter()
@router.get('/me', response_model=ProjectPermissionsModel)
async def get_project_permissions_current_user(permission: UserPermissions = Depends(UserPermissionChecker())) \
-> ProjectPermissionsModel:
@router.get('/list/{project_id}', response_model=list[ProjectPermissionsModel])
async def get_all_project_permissions(project_id: str, permission=Depends(UserPermissionChecker('owner'))) \
if permission:
return await read_project_permissions_for_project(project_id=project_id, engine=db_engine)
class UserPermission(ProjectPermissionsModel):
user: UserBaseModel
@router.get('/list-users', response_model=list[UserPermission])
async def get_all_user_permissions(permission=Depends(UserPermissionChecker('owner'))):
async with db_engine.session() as session:
stmt = (select(ProjectPermissions)
.where(ProjectPermissions.project_id == permission.permissions.project_id)
.options(selectinload(ProjectPermissions.user)))
result = (await session.execute(stmt)).scalars().all()
return [UserPermission(**{**row.__dict__, 'user': row.user.__dict__}) for row in result] # type: ignore
@router.put('/permission', response_model=str)
async def save_project_permission(project_permission: ProjectPermissionsModel,
permission=Depends(UserPermissionChecker('owner'))) -> str:
pkey = await upsert_orm(upsert_model=project_permission, Schema=ProjectPermissions,
primary_key='project_permission_id',
skip_update=['project_id', 'user_id', 'project_permission_id'],
db_engine=db_engine)
return str(pkey)
@router.delete('/permission')
async def remove_project_permission(project_permission_id: str,
permission=Depends(UserPermissionChecker('owner'))):
await delete_project_permissions(project_permission_id=project_permission_id, engine=db_engine)
@router.get('/{project_permission_id}', response_model=ProjectPermissionsModel)
async def get_project_permissions_by_id(project_permission_id: str,
permission=Depends(UserPermissionChecker('owner'))) \
if permission:
return await read_project_permissions_by_id(permissions_id=project_permission_id, engine=db_engine)