44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from uuid import UUID
|
|
|
|
from fastapi import Request
|
|
|
|
from app.core.errors import AppError
|
|
|
|
|
|
def guest_project_scope(request: Request) -> UUID | None:
|
|
principal = getattr(request.state, "auth_principal", None)
|
|
if getattr(principal, "role", None) != "guest":
|
|
return None
|
|
project_id = getattr(principal, "project_id", None)
|
|
if isinstance(project_id, UUID):
|
|
return project_id
|
|
raise AppError(
|
|
code="GUEST_PROJECT_SCOPE_REQUIRED",
|
|
message="Deze gastensessie heeft alleen toegang tot de GeoIntel-demowerkruimte.",
|
|
status_code=403,
|
|
)
|
|
|
|
|
|
def assert_guest_project_scope(request: Request, project_id: UUID) -> None:
|
|
guest_project_id = guest_project_scope(request)
|
|
if guest_project_id is not None and project_id != guest_project_id:
|
|
raise AppError(
|
|
code="GUEST_PROJECT_SCOPE_REQUIRED",
|
|
message="Deze gastensessie heeft alleen toegang tot de GeoIntel-demowerkruimte.",
|
|
status_code=403,
|
|
)
|
|
|
|
|
|
def guest_scoped_project_filter(
|
|
request: Request,
|
|
requested_project_id: UUID | None,
|
|
) -> UUID | None:
|
|
guest_project_id = guest_project_scope(request)
|
|
if guest_project_id is None:
|
|
return requested_project_id
|
|
if requested_project_id is not None:
|
|
assert_guest_project_scope(request, requested_project_id)
|
|
return guest_project_id
|