Improve the frontend 3

This commit is contained in:
Urtzi Alfaro
2025-10-30 21:08:07 +01:00
parent 36217a2729
commit 63f5c6d512
184 changed files with 21512 additions and 7442 deletions

View File

@@ -1,9 +1,12 @@
"""
Enhanced Base Database Configuration for All Microservices
Provides DatabaseManager with connection pooling, health checks, and multi-database support
Fixed: SSL configuration now uses connect_args instead of URL parameters to avoid asyncpg parameter parsing issues
"""
import os
import ssl
from typing import Optional, Dict, Any, List
from sqlalchemy import create_engine, text
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
@@ -43,14 +46,17 @@ class DatabaseManager:
connect_timeout: int = 30,
**engine_kwargs
):
# Add SSL parameters to database URL if PostgreSQL
if "postgresql" in database_url.lower() and "ssl" not in database_url.lower():
separator = "&" if "?" in database_url else "?"
# asyncpg uses 'ssl=require' or 'ssl=verify-full', not 'sslmode'
database_url = f"{database_url}{separator}ssl=require"
logger.info(f"SSL enforcement added to database URL for {service_name}")
self.database_url = database_url
# Configure SSL for PostgreSQL via connect_args instead of URL parameters
# This avoids asyncpg parameter parsing issues
self.use_ssl = False
if "postgresql" in database_url.lower():
# Check if SSL is already configured in URL or should be enabled
if "ssl" not in database_url.lower() and "sslmode" not in database_url.lower():
# Enable SSL for production, but allow override via URL
self.use_ssl = True
logger.info(f"SSL will be enabled for PostgreSQL connection: {service_name}")
self.service_name = service_name
self.pool_size = pool_size
self.max_overflow = max_overflow
@@ -58,13 +64,27 @@ class DatabaseManager:
# Configure pool for async engines
# Note: SQLAlchemy 2.0 async engines automatically use AsyncAdaptedQueuePool
# We should NOT specify poolclass for async engines unless using StaticPool for SQLite
# Prepare connect_args for asyncpg
connect_args = {"timeout": connect_timeout}
# Add SSL configuration if needed (for asyncpg driver)
if self.use_ssl and "asyncpg" in database_url.lower():
# Create SSL context that doesn't verify certificates (for local development)
# In production, you should use a proper SSL context with certificate verification
ssl_context = ssl.create_default_context()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE
connect_args["ssl"] = ssl_context
logger.info(f"SSL enabled with relaxed verification for {service_name}")
engine_config = {
"echo": echo,
"pool_pre_ping": pool_pre_ping,
"pool_recycle": pool_recycle,
"pool_size": pool_size,
"max_overflow": max_overflow,
"connect_args": {"command_timeout": connect_timeout},
"connect_args": connect_args,
**engine_kwargs
}
@@ -342,12 +362,16 @@ def init_legacy_compatibility(database_url: str):
"""Initialize legacy global variables for backward compatibility"""
global engine, AsyncSessionLocal
# Add SSL parameters to database URL if PostgreSQL
if "postgresql" in database_url.lower() and "ssl" not in database_url.lower():
separator = "&" if "?" in database_url else "?"
# asyncpg uses 'ssl=require' or 'ssl=verify-full', not 'sslmode'
database_url = f"{database_url}{separator}ssl=require"
logger.info("SSL enforcement added to legacy database URL")
# Configure SSL for PostgreSQL if needed
connect_args = {}
if "postgresql" in database_url.lower() and "asyncpg" in database_url.lower():
if "ssl" not in database_url.lower() and "sslmode" not in database_url.lower():
# Create SSL context that doesn't verify certificates (for local development)
ssl_context = ssl.create_default_context()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE
connect_args["ssl"] = ssl_context
logger.info("SSL enabled with relaxed verification for legacy database connection")
engine = create_async_engine(
database_url,
@@ -355,7 +379,8 @@ def init_legacy_compatibility(database_url: str):
pool_pre_ping=True,
pool_recycle=300,
pool_size=20,
max_overflow=30
max_overflow=30,
connect_args=connect_args
)
AsyncSessionLocal = async_sessionmaker(