feat: switch backend indexing to code-first identifiers
This commit is contained in:
@@ -18,15 +18,8 @@ router = APIRouter(tags=["Meetings"])
|
||||
|
||||
# ---- helpers ----
|
||||
|
||||
def _find_meeting_by_id_or_code(db: Session, identifier: str) -> Meeting | None:
|
||||
try:
|
||||
mid = int(identifier)
|
||||
meeting = db.query(Meeting).filter(Meeting.id == mid).first()
|
||||
if meeting:
|
||||
return meeting
|
||||
except (ValueError, TypeError):
|
||||
pass
|
||||
return db.query(Meeting).filter(Meeting.meeting_code == str(identifier)).first()
|
||||
def _find_meeting_by_code(db: Session, meeting_code: str) -> Meeting | None:
|
||||
return db.query(Meeting).filter(Meeting.meeting_code == str(meeting_code)).first()
|
||||
|
||||
|
||||
def _resolve_project_id(db: Session, project_code: str | None) -> int | None:
|
||||
@@ -64,16 +57,13 @@ def _serialize_meeting(db: Session, meeting: Meeting) -> dict:
|
||||
project = db.query(models.Project).filter(models.Project.id == meeting.project_id).first()
|
||||
milestone = db.query(Milestone).filter(Milestone.id == meeting.milestone_id).first()
|
||||
return {
|
||||
"id": meeting.id,
|
||||
"code": meeting.meeting_code,
|
||||
"meeting_code": meeting.meeting_code,
|
||||
"title": meeting.title,
|
||||
"description": meeting.description,
|
||||
"status": meeting.status.value if hasattr(meeting.status, "value") else meeting.status,
|
||||
"priority": meeting.priority.value if hasattr(meeting.priority, "value") else meeting.priority,
|
||||
"project_id": meeting.project_id,
|
||||
"project_code": project.project_code if project else None,
|
||||
"milestone_id": meeting.milestone_id,
|
||||
"milestone_code": milestone.milestone_code if milestone else None,
|
||||
"reporter_id": meeting.reporter_id,
|
||||
"meeting_time": meeting.scheduled_at.isoformat() if meeting.scheduled_at else None,
|
||||
@@ -155,6 +145,7 @@ def create_meeting(
|
||||
@router.get("/meetings")
|
||||
def list_meetings(
|
||||
project: str = None,
|
||||
project_code: str = None,
|
||||
status_value: str = Query(None, alias="status"),
|
||||
order_by: str = None,
|
||||
page: int = 1,
|
||||
@@ -163,8 +154,9 @@ def list_meetings(
|
||||
):
|
||||
query = db.query(Meeting)
|
||||
|
||||
if project:
|
||||
project_id = _resolve_project_id(db, project)
|
||||
effective_project = project_code or project
|
||||
if effective_project:
|
||||
project_id = _resolve_project_id(db, effective_project)
|
||||
if project_id:
|
||||
query = query.filter(Meeting.project_id == project_id)
|
||||
|
||||
@@ -197,9 +189,9 @@ def list_meetings(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/meetings/{meeting_id}")
|
||||
def get_meeting(meeting_id: str, db: Session = Depends(get_db)):
|
||||
meeting = _find_meeting_by_id_or_code(db, meeting_id)
|
||||
@router.get("/meetings/{meeting_code}")
|
||||
def get_meeting(meeting_code: str, db: Session = Depends(get_db)):
|
||||
meeting = _find_meeting_by_code(db, meeting_code)
|
||||
if not meeting:
|
||||
raise HTTPException(status_code=404, detail="Meeting not found")
|
||||
return _serialize_meeting(db, meeting)
|
||||
@@ -213,14 +205,14 @@ class MeetingUpdateBody(BaseModel):
|
||||
duration_minutes: Optional[int] = None
|
||||
|
||||
|
||||
@router.patch("/meetings/{meeting_id}")
|
||||
@router.patch("/meetings/{meeting_code}")
|
||||
def update_meeting(
|
||||
meeting_id: str,
|
||||
meeting_code: str,
|
||||
body: MeetingUpdateBody,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: models.User = Depends(get_current_user_or_apikey),
|
||||
):
|
||||
meeting = _find_meeting_by_id_or_code(db, meeting_id)
|
||||
meeting = _find_meeting_by_code(db, meeting_code)
|
||||
if not meeting:
|
||||
raise HTTPException(status_code=404, detail="Meeting not found")
|
||||
check_project_role(db, current_user.id, meeting.project_id, min_role="dev")
|
||||
@@ -248,13 +240,13 @@ def update_meeting(
|
||||
return _serialize_meeting(db, meeting)
|
||||
|
||||
|
||||
@router.delete("/meetings/{meeting_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
@router.delete("/meetings/{meeting_code}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
def delete_meeting(
|
||||
meeting_id: str,
|
||||
meeting_code: str,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: models.User = Depends(get_current_user_or_apikey),
|
||||
):
|
||||
meeting = _find_meeting_by_id_or_code(db, meeting_id)
|
||||
meeting = _find_meeting_by_code(db, meeting_code)
|
||||
if not meeting:
|
||||
raise HTTPException(status_code=404, detail="Meeting not found")
|
||||
check_project_role(db, current_user.id, meeting.project_id, min_role="dev")
|
||||
@@ -265,13 +257,13 @@ def delete_meeting(
|
||||
|
||||
# ---- Attend ----
|
||||
|
||||
@router.post("/meetings/{meeting_id}/attend")
|
||||
@router.post("/meetings/{meeting_code}/attend")
|
||||
def attend_meeting(
|
||||
meeting_id: str,
|
||||
meeting_code: str,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: models.User = Depends(get_current_user_or_apikey),
|
||||
):
|
||||
meeting = _find_meeting_by_id_or_code(db, meeting_id)
|
||||
meeting = _find_meeting_by_code(db, meeting_code)
|
||||
if not meeting:
|
||||
raise HTTPException(status_code=404, detail="Meeting not found")
|
||||
check_project_role(db, current_user.id, meeting.project_id, min_role="viewer")
|
||||
|
||||
Reference in New Issue
Block a user