import json from uuid import uuid4 from sqlalchemy import asc, delete, select from app.db.session import AsyncSessionLocal from app.models.scheme_group import SchemeGroupRecord async def replace_scheme_version_groups( *, scheme_id: str, scheme_version_id: str, groups: list[dict], ) -> None: async with AsyncSessionLocal() as session: await session.execute( delete(SchemeGroupRecord).where( SchemeGroupRecord.scheme_version_id == scheme_version_id ) ) for item in groups: row = SchemeGroupRecord( group_record_id=uuid4().hex, scheme_id=scheme_id, scheme_version_id=scheme_version_id, element_id=item.get("id"), group_id=item.get("group_id"), name=item.get("group_id") or item.get("id") or "unnamed-group", classes_raw=json.dumps(item.get("classes", []), ensure_ascii=False), ) session.add(row) await session.commit() async def list_scheme_version_groups(scheme_version_id: str) -> list[SchemeGroupRecord]: async with AsyncSessionLocal() as session: result = await session.execute( select(SchemeGroupRecord) .where(SchemeGroupRecord.scheme_version_id == scheme_version_id) .order_by(asc(SchemeGroupRecord.id)) ) return list(result.scalars().all()) async def clone_scheme_version_groups( *, source_scheme_version_id: str, target_scheme_version_id: str, ) -> None: async with AsyncSessionLocal() as session: result = await session.execute( select(SchemeGroupRecord).where( SchemeGroupRecord.scheme_version_id == source_scheme_version_id ) ) rows = list(result.scalars().all()) for row in rows: session.add( SchemeGroupRecord( group_record_id=uuid4().hex, scheme_id=row.scheme_id, scheme_version_id=target_scheme_version_id, element_id=row.element_id, group_id=row.group_id, name=row.name, classes_raw=row.classes_raw, ) ) await session.commit()