Initial commit: svg backend
This commit is contained in:
118
backend/app/repositories/scheme_seats.py
Normal file
118
backend/app/repositories/scheme_seats.py
Normal file
@@ -0,0 +1,118 @@
|
||||
import json
|
||||
from uuid import uuid4
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
from sqlalchemy import asc, delete, select
|
||||
|
||||
from app.db.session import AsyncSessionLocal
|
||||
from app.models.scheme_seat import SchemeSeatRecord
|
||||
|
||||
|
||||
async def replace_scheme_version_seats(
|
||||
*,
|
||||
scheme_id: str,
|
||||
scheme_version_id: str,
|
||||
seats: list[dict],
|
||||
) -> None:
|
||||
async with AsyncSessionLocal() as session:
|
||||
await session.execute(
|
||||
delete(SchemeSeatRecord).where(
|
||||
SchemeSeatRecord.scheme_version_id == scheme_version_id
|
||||
)
|
||||
)
|
||||
|
||||
for item in seats:
|
||||
row = SchemeSeatRecord(
|
||||
seat_record_id=uuid4().hex,
|
||||
scheme_id=scheme_id,
|
||||
scheme_version_id=scheme_version_id,
|
||||
element_id=item.get("id"),
|
||||
seat_id=item.get("seat_id"),
|
||||
sector_id=item.get("sector_id"),
|
||||
group_id=item.get("group_id"),
|
||||
row_label=item.get("row"),
|
||||
seat_number=item.get("seat_number"),
|
||||
tag=item.get("tag"),
|
||||
classes_raw=json.dumps(item.get("classes", []), ensure_ascii=False),
|
||||
x=item.get("x"),
|
||||
y=item.get("y"),
|
||||
cx=item.get("cx"),
|
||||
cy=item.get("cy"),
|
||||
width=item.get("width"),
|
||||
height=item.get("height"),
|
||||
)
|
||||
session.add(row)
|
||||
|
||||
await session.commit()
|
||||
|
||||
|
||||
async def list_scheme_version_seats(scheme_version_id: str) -> list[SchemeSeatRecord]:
|
||||
async with AsyncSessionLocal() as session:
|
||||
result = await session.execute(
|
||||
select(SchemeSeatRecord)
|
||||
.where(SchemeSeatRecord.scheme_version_id == scheme_version_id)
|
||||
.order_by(asc(SchemeSeatRecord.id))
|
||||
)
|
||||
return list(result.scalars().all())
|
||||
|
||||
|
||||
async def get_scheme_version_seat_by_seat_id(
|
||||
*,
|
||||
scheme_version_id: str,
|
||||
seat_id: str,
|
||||
) -> SchemeSeatRecord:
|
||||
async with AsyncSessionLocal() as session:
|
||||
result = await session.execute(
|
||||
select(SchemeSeatRecord).where(
|
||||
SchemeSeatRecord.scheme_version_id == scheme_version_id,
|
||||
SchemeSeatRecord.seat_id == seat_id,
|
||||
)
|
||||
)
|
||||
row = result.scalar_one_or_none()
|
||||
|
||||
if row is None:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Seat not found in current scheme version",
|
||||
)
|
||||
|
||||
return row
|
||||
|
||||
|
||||
async def clone_scheme_version_seats(
|
||||
*,
|
||||
source_scheme_version_id: str,
|
||||
target_scheme_version_id: str,
|
||||
) -> None:
|
||||
async with AsyncSessionLocal() as session:
|
||||
result = await session.execute(
|
||||
select(SchemeSeatRecord).where(
|
||||
SchemeSeatRecord.scheme_version_id == source_scheme_version_id
|
||||
)
|
||||
)
|
||||
rows = list(result.scalars().all())
|
||||
|
||||
for row in rows:
|
||||
session.add(
|
||||
SchemeSeatRecord(
|
||||
seat_record_id=uuid4().hex,
|
||||
scheme_id=row.scheme_id,
|
||||
scheme_version_id=target_scheme_version_id,
|
||||
element_id=row.element_id,
|
||||
seat_id=row.seat_id,
|
||||
sector_id=row.sector_id,
|
||||
group_id=row.group_id,
|
||||
row_label=row.row_label,
|
||||
seat_number=row.seat_number,
|
||||
tag=row.tag,
|
||||
classes_raw=row.classes_raw,
|
||||
x=row.x,
|
||||
y=row.y,
|
||||
cx=row.cx,
|
||||
cy=row.cy,
|
||||
width=row.width,
|
||||
height=row.height,
|
||||
)
|
||||
)
|
||||
|
||||
await session.commit()
|
||||
Reference in New Issue
Block a user