feat: Implement multi-tenancy support in middleware and security layers
- Enhanced TenantMiddleware to validate tenant information from JWT tokens. - Added LicenseValidationMiddleware to check tenant licenses before processing requests. - Updated security utilities to extract tenant information from tokens and validate company access. - Introduced CompanyStore to manage active company state and handle company switching in the frontend. - Modified API routes to include company_id in requests for better resource management. - Improved logging and error handling throughout the middleware and API layers. - Updated frontend components to reflect changes in company management and selection. - Added new API route for fetching user's companies with proper authentication handling.
This commit is contained in:
@@ -13,6 +13,7 @@ logger = logging.getLogger(__name__)
|
||||
# access to the values within the .ini file in use.
|
||||
config = context.config
|
||||
|
||||
|
||||
def get_database_url():
|
||||
"""Obtiene la URL de la base de datos (PostgreSQL) desde variables de entorno o alembic.ini."""
|
||||
# Intentar construir desde variables de entorno primero
|
||||
@@ -41,6 +42,7 @@ def get_database_url():
|
||||
|
||||
return url
|
||||
|
||||
|
||||
# Configurar la URL de la base de datos
|
||||
database_url = get_database_url()
|
||||
|
||||
@@ -54,7 +56,7 @@ if os.environ.get("ALEMBIC_DEBUG"):
|
||||
debug_url = before + "@" + after
|
||||
except Exception:
|
||||
debug_url = "postgresql://***:***@***"
|
||||
logger.error("Error al ocultar la contraseña en la URL para debug.")
|
||||
logger.error("Error al ocultar la contraseña en la URL para debug.")
|
||||
|
||||
config.set_main_option("sqlalchemy.url", database_url)
|
||||
|
||||
@@ -77,8 +79,9 @@ config = context.config
|
||||
fileConfig(config.config_file_name)
|
||||
target_metadata = Base.metadata
|
||||
|
||||
|
||||
def import_models_from_dir(dir_path: str):
|
||||
"""Importa recursivamente cualquier archivo models.py desde dir_path y archivos en directorios models/"""
|
||||
"""Importa recursivamente cualquier archivo models.py desde dir_path y archivos en directorios models/"""
|
||||
for root, dirs, files in os.walk(dir_path):
|
||||
# Importar archivos models.py directos
|
||||
if "models.py" in files:
|
||||
@@ -90,7 +93,7 @@ def import_models_from_dir(dir_path: str):
|
||||
spec = importlib.util.spec_from_file_location(module_name, module_path)
|
||||
mod = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(mod)
|
||||
|
||||
|
||||
# Importar todos los archivos .py en directorios llamados "models"
|
||||
if os.path.basename(root) == "models":
|
||||
for file in files:
|
||||
@@ -99,18 +102,20 @@ def import_models_from_dir(dir_path: str):
|
||||
rel_path = os.path.relpath(module_path, BASE_DIR)
|
||||
module_name = rel_path.replace(os.sep, ".").replace(".py", "")
|
||||
try:
|
||||
spec = importlib.util.spec_from_file_location(module_name, module_path)
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
module_name, module_path
|
||||
)
|
||||
mod = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(mod)
|
||||
except Exception as e:
|
||||
logger.warning(f"No se pudo importar {module_path}: {e}")
|
||||
|
||||
|
||||
# Importar todos los models dentro de api/v1/modules y api/v1/modules/uploads
|
||||
modules_dir = os.path.join(BASE_DIR, "api", "v1", "modules")
|
||||
import_models_from_dir(modules_dir)
|
||||
|
||||
|
||||
|
||||
def run_migrations_offline() -> None:
|
||||
"""Run migrations in 'offline' mode.
|
||||
|
||||
@@ -147,10 +152,7 @@ def run_migrations_online() -> None:
|
||||
)
|
||||
|
||||
with connectable.connect() as connection:
|
||||
context.configure(
|
||||
connection=connection,
|
||||
target_metadata=target_metadata
|
||||
)
|
||||
context.configure(connection=connection, target_metadata=target_metadata)
|
||||
|
||||
with context.begin_transaction():
|
||||
context.run_migrations()
|
||||
@@ -159,4 +161,4 @@ def run_migrations_online() -> None:
|
||||
if context.is_offline_mode():
|
||||
run_migrations_offline()
|
||||
else:
|
||||
run_migrations_online()
|
||||
run_migrations_online()
|
||||
|
||||
Reference in New Issue
Block a user