This commit is contained in:
2026-03-04 19:33:47 +03:00
parent 7ff0dfa8c6
commit f066d5561b
27 changed files with 972 additions and 365 deletions

View File

@@ -10,6 +10,7 @@
from datetime import datetime
from typing import List, Optional
import json
import re
from sqlalchemy.orm import Session
from ...models.task import TaskRecord, TaskLogRecord
@@ -80,18 +81,40 @@ class TaskPersistenceService:
# [DEF:_resolve_environment_id:Function]
# @TIER: STANDARD
# @PURPOSE: Resolve environment id based on provided value or fallback to default
# @PURPOSE: Resolve environment id into existing environments.id value to satisfy FK constraints.
# @PRE: Session is active
# @POST: Environment ID is returned
# @POST: Returns existing environments.id or None when unresolved.
@staticmethod
def _resolve_environment_id(session: Session, env_id: Optional[str]) -> str:
def _resolve_environment_id(session: Session, env_id: Optional[str]) -> Optional[str]:
with belief_scope("_resolve_environment_id"):
if env_id:
return env_id
repo_env = session.query(Environment).filter_by(name="default").first()
if repo_env:
return str(repo_env.id)
return "default"
raw_value = str(env_id or "").strip()
if not raw_value:
return None
# 1) Direct match by primary key.
by_id = session.query(Environment).filter(Environment.id == raw_value).first()
if by_id:
return str(by_id.id)
# 2) Exact match by name.
by_name = session.query(Environment).filter(Environment.name == raw_value).first()
if by_name:
return str(by_name.id)
# 3) Slug-like match (e.g. "ss-dev" -> "SS DEV").
def normalize_token(value: str) -> str:
lowered = str(value or "").strip().lower()
return re.sub(r"[^a-z0-9]+", "-", lowered).strip("-")
target_token = normalize_token(raw_value)
if not target_token:
return None
for env in session.query(Environment).all():
if normalize_token(env.id) == target_token or normalize_token(env.name) == target_token:
return str(env.id)
return None
# [/DEF:_resolve_environment_id:Function]
# [DEF:__init__:Function]