This commit is contained in:
2026-03-18 08:45:15 +03:00
parent 3094a2b58b
commit 6d64124e88
17 changed files with 1563 additions and 31159 deletions

View File

@@ -25,6 +25,7 @@ from sqlalchemy.orm import Session
from .config_models import AppConfig, Environment, GlobalSettings
from .database import SessionLocal
from ..models.config import AppConfigRecord
from ..models.mapping import Environment as EnvironmentRecord
from .logger import logger, configure_logger, belief_scope
@@ -146,6 +147,8 @@ class ConfigManager:
"settings": self.raw_payload.get("settings", {}),
}
)
self._sync_environment_records(session, config)
session.commit()
logger.reason(
"Database configuration validated successfully",
extra={
@@ -202,6 +205,60 @@ class ConfigManager:
session.close()
# [/DEF:_load_config:Function]
# [DEF:_sync_environment_records:Function]
# @PURPOSE: Mirror configured environments into the relational environments table used by FK-backed domain models.
def _sync_environment_records(self, session: Session, config: AppConfig) -> None:
with belief_scope("ConfigManager._sync_environment_records"):
configured_envs = list(config.environments or [])
configured_ids = {
str(environment.id or "").strip()
for environment in configured_envs
if str(environment.id or "").strip()
}
persisted_records = session.query(EnvironmentRecord).all()
persisted_by_id = {str(record.id or "").strip(): record for record in persisted_records}
for environment in configured_envs:
normalized_id = str(environment.id or "").strip()
if not normalized_id:
continue
display_name = str(environment.name or normalized_id).strip() or normalized_id
normalized_url = str(environment.url or "").strip()
credentials_id = str(environment.username or "").strip() or normalized_id
record = persisted_by_id.get(normalized_id)
if record is None:
logger.reason(
"Creating relational environment record from typed config",
extra={"environment_id": normalized_id, "environment_name": display_name},
)
session.add(
EnvironmentRecord(
id=normalized_id,
name=display_name,
url=normalized_url,
credentials_id=credentials_id,
)
)
continue
record.name = display_name
record.url = normalized_url
record.credentials_id = credentials_id
for record in persisted_records:
normalized_id = str(record.id or "").strip()
if normalized_id and normalized_id not in configured_ids:
logger.reason(
"Removing stale relational environment record absent from typed config",
extra={"environment_id": normalized_id},
)
session.delete(record)
# [/DEF:_sync_environment_records:Function]
# [DEF:_save_config_to_db:Function]
# @PURPOSE: Persist provided AppConfig into the global DB configuration record.
def _save_config_to_db(self, config: AppConfig, session: Optional[Session] = None) -> None:
@@ -220,6 +277,8 @@ class ConfigManager:
logger.reason("Updating existing global app config record", extra={"record_id": record.id})
record.payload = payload
self._sync_environment_records(db, config)
db.commit()
logger.reason(
"Configuration persisted to database",