feature/app-selector

This commit is contained in:
2026-05-26 16:59:32 -06:00
parent 904fa965c8
commit dbf68986da
34 changed files with 792 additions and 169 deletions

View File

@@ -3,7 +3,7 @@ import logging
import inspect
from core.database import get_core_db
from core.security import get_current_user, is_hub_admin, resolve_tenant_id_required, validate_access_to_resource
from core.security import get_current_user, is_hub_admin, resolve_tenant_id_required, validate_access_to_resource, get_active_system
from fastapi import APIRouter, Body, Depends, HTTPException, Path, Query, Request
from api.v1.common.catalog_validation_errors import CatalogValidationError
@@ -175,11 +175,16 @@ class TenantCRUDRoutes(
# Excluimos los parámetros estándar de paginación y control
standard_params = {"company_id", "all_companies", "page", "page_size", "sort_by", "sort_order"}
filters = {
k: v
for k, v in request.query_params.items()
k: v
for k, v in request.query_params.items()
if k not in standard_params and v is not None and v != ""
}
# Inyectar active_system (header/cookie) si no viene por query param
active_system = get_active_system(request)
if active_system and "system" not in filters:
filters["system"] = active_system
# Determine what parameters the service method accepts
sig = inspect.signature(self.service.get_all)
kwargs = {}
@@ -383,6 +388,7 @@ class TenantCRUDRoutes(
description=f"Create a new {self.resource_name}",
)
async def create_child_resource(
request: Request,
company_id: int = Query(..., description="Company ID"),
data: create_schema = Body(...), # type: ignore
db: Session = Depends(self.db_dependency),
@@ -396,6 +402,12 @@ class TenantCRUDRoutes(
self.require_all,
)
# Inyectar sistema activo en el campo system si el recurso lo soporta
if self.enable_filters:
active_system = get_active_system(request)
if active_system and hasattr(data, "system"):
data = data.model_copy(update={"system": active_system})
# For child resources, parent_id validation would go here
try:
resource = self.service.create(db, data, tenant_id, company_id)
@@ -429,6 +441,7 @@ class TenantCRUDRoutes(
description=f"Create a new {self.resource_name}",
)
async def create_parent_resource(
request: Request,
company_id: int = Query(..., description="Company ID"),
data: create_schema = Body(...), # type: ignore
db: Session = Depends(self.db_dependency),
@@ -441,6 +454,13 @@ class TenantCRUDRoutes(
self.create_permissions,
self.require_all,
)
# Inyectar sistema activo en el campo system si el recurso lo soporta
if self.enable_filters:
active_system = get_active_system(request)
if active_system and hasattr(data, "system"):
data = data.model_copy(update={"system": active_system})
try:
resource = self.service.create(db, data, tenant_id, company_id)
return resource