feat: link tackle items to related rigs

This commit is contained in:
ik
2026-09-21 20:18:23 +07:00
parent 26ad9b5194
commit c38097767f
5 changed files with 28 additions and 5 deletions
+5 -3
View File
@@ -5,8 +5,8 @@ from sqlalchemy import func, select
from sqlalchemy.orm import selectinload
from ..dependencies import Db
from ..models import Bait, CatchReport, Fish, ModerationStatus, Rig, Spot, TackleItem, Waterbody
from ..schemas import BaitOut, FishOut, PaginatedRigOut, PaginatedTackleItemOut, RigOut, RigSummaryOut, TackleItemOut, WaterbodyOut
from ..models import Bait, CatchReport, Fish, ModerationStatus, Rig, RigComponent, Spot, TackleItem, Waterbody
from ..schemas import BaitOut, FishOut, PaginatedRigOut, PaginatedTackleItemOut, RigOut, RigSummaryOut, TackleItemOut, TackleItemRigOut, WaterbodyOut
router = APIRouter()
@@ -77,7 +77,9 @@ def tackle_item(item_id: UUID, db: Db) -> TackleItemOut:
item = db.get(TackleItem, item_id)
if item is None:
raise HTTPException(status_code=404, detail="tackle item not found")
return TackleItemOut.model_validate(item).model_copy(update={"missing_fields": _item_missing_fields(item)})
rigs = list(db.scalars(select(Rig).join(RigComponent, RigComponent.rig_id == Rig.id).where(RigComponent.tackle_item_id == item_id).options(selectinload(Rig.components)).distinct().order_by(Rig.name, Rig.id)))
related = [TackleItemRigOut(id=rig.id, name=rig.name, source_system=rig.source_system, source_checked_at=rig.source_checked_at, component_count=len(rig.components)) for rig in rigs]
return TackleItemOut.model_validate(item).model_copy(update={"missing_fields": _item_missing_fields(item), "related_rigs": related})
@router.get("/api/v1/tackle/rigs", response_model=PaginatedRigOut)
+9
View File
@@ -40,6 +40,14 @@ class BaitOut(BaseModel):
kind: str
class TackleItemRigOut(BaseModel):
id: UUID
name: str
source_system: str | None
source_checked_at: datetime | None
component_count: int
class TackleItemOut(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: UUID
@@ -54,6 +62,7 @@ class TackleItemOut(BaseModel):
source_url: str | None
source_checked_at: datetime | None
missing_fields: list[str] = Field(default_factory=list)
related_rigs: list[TackleItemRigOut] = Field(default_factory=list)
class PaginatedTackleItemOut(BaseModel):