refactor(storage): route project DSNs and remove legacy backends
This commit is contained in:
@@ -17,7 +17,16 @@ from app.api.problem_details import ProblemDetails
|
||||
from app.api.pagination import PaginatedList
|
||||
from app.api.v1.router import api_router as handler_api_router
|
||||
from app.auth.metadata_dependencies import get_current_metadata_user
|
||||
from app.auth.project_dependencies import ProjectContext, get_project_context
|
||||
from app.auth.project_dependencies import (
|
||||
ProjectContext,
|
||||
get_project_business_routing,
|
||||
get_project_context,
|
||||
get_project_simulation_routing,
|
||||
)
|
||||
from app.infra.db.project_routing import (
|
||||
ActiveProjectRouting,
|
||||
activate_project_routing,
|
||||
)
|
||||
|
||||
T = TypeVar("T")
|
||||
|
||||
@@ -44,6 +53,13 @@ _PUBLIC_PARAMETER_RENAMES = {
|
||||
}
|
||||
_MODEL_NAME_IS_NETWORK = {"RunSimulationManuallyByDate", "PressureSensorPlacement"}
|
||||
_MODEL_USERNAME_FROM_AUTH = {"PressureSensorPlacement"}
|
||||
_TIMESCALE_ROUTED_ENDPOINT_MODULES = {
|
||||
"app.api.v1.endpoints.burst_detection",
|
||||
"app.api.v1.endpoints.burst_location",
|
||||
"app.api.v1.endpoints.leakage",
|
||||
"app.api.v1.endpoints.simulation",
|
||||
}
|
||||
_TIMESCALE_ROUTED_ENDPOINT_NAMES = {"open_project_endpoint"}
|
||||
|
||||
|
||||
def _clean_name(name: str) -> str:
|
||||
@@ -128,10 +144,14 @@ def _with_header_project_context(endpoint, route_name: str):
|
||||
None,
|
||||
)
|
||||
injected_context_name = existing_context_parameter or "_rest_project_context"
|
||||
injected_routing_name = "_rest_project_routing"
|
||||
injected_user_name = "_rest_current_user"
|
||||
|
||||
@wraps(endpoint)
|
||||
async def wrapper(*args, **kwargs):
|
||||
project_routing = kwargs.pop(injected_routing_name, None)
|
||||
if not isinstance(project_routing, ActiveProjectRouting):
|
||||
raise RuntimeError("REST project database routing was not resolved")
|
||||
project_context = kwargs.get(injected_context_name)
|
||||
if not isinstance(project_context, ProjectContext):
|
||||
raise RuntimeError("REST project context was not resolved")
|
||||
@@ -162,10 +182,11 @@ def _with_header_project_context(endpoint, route_name: str):
|
||||
kwargs[parameter_name] = original_model.model_validate(data)
|
||||
if model_has_username:
|
||||
kwargs.pop(injected_user_name, None)
|
||||
result = endpoint(*args, **kwargs)
|
||||
if inspect.isawaitable(result):
|
||||
return await result
|
||||
return result
|
||||
with activate_project_routing(project_routing):
|
||||
result = endpoint(*args, **kwargs)
|
||||
if inspect.isawaitable(result):
|
||||
return await result
|
||||
return result
|
||||
|
||||
parameters = []
|
||||
for name, parameter in signature.parameters.items():
|
||||
@@ -181,6 +202,14 @@ def _with_header_project_context(endpoint, route_name: str):
|
||||
if name in body_models:
|
||||
parameter = parameter.replace(annotation=body_models[name][1])
|
||||
parameters.append(parameter)
|
||||
routing_dependency = (
|
||||
get_project_simulation_routing
|
||||
if (
|
||||
endpoint.__module__ in _TIMESCALE_ROUTED_ENDPOINT_MODULES
|
||||
or endpoint.__name__ in _TIMESCALE_ROUTED_ENDPOINT_NAMES
|
||||
)
|
||||
else get_project_business_routing
|
||||
)
|
||||
if not existing_context_parameter:
|
||||
parameters.append(
|
||||
inspect.Parameter(
|
||||
@@ -190,6 +219,14 @@ def _with_header_project_context(endpoint, route_name: str):
|
||||
default=Depends(get_project_context),
|
||||
)
|
||||
)
|
||||
parameters.append(
|
||||
inspect.Parameter(
|
||||
injected_routing_name,
|
||||
kind=inspect.Parameter.KEYWORD_ONLY,
|
||||
annotation=ActiveProjectRouting,
|
||||
default=Depends(routing_dependency),
|
||||
)
|
||||
)
|
||||
if username_parameter or model_has_username:
|
||||
parameters.append(
|
||||
inspect.Parameter(
|
||||
|
||||
Reference in New Issue
Block a user