fix(project): 프로젝트 순서변경 라우트 충돌 수정 + 세션편집 제목/드래그 손잡이 표시

- PUT /api/projects/order 가 /api/projects/{project_id} 뒤에 등록돼 있어
  "order" 가 project_id(int) 파싱 실패로 422 나던 버그 수정(라우트 등록 순서
  변경 — 경로 매칭은 등록 순서라 path param 뒤에 두면 리터럴 경로가 항상
  가려진다). 홈 카드/좌측 프로젝트 트리 드래그 재정렬 둘 다 이 버그였음.
- 세션 편집 팝업 제목에 세션 이름 표시
- 좌측 프로젝트 트리에 드래그 가능 손잡이(⣿) 표시(관리자, hover 시 노출)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-17 12:02:29 +09:00
parent 003d29d349
commit 6922679f51
6 changed files with 34 additions and 23 deletions
+21 -16
View File
@@ -703,6 +703,27 @@ async def api_create_subproject(
return JSONResponse({"project": project}, status_code=201)
@router.put("/api/projects/order")
async def api_reorder_projects(
request: Request, payload: dict[str, Any] = Body(...)
) -> JSONResponse:
"""홈 화면 프로젝트 카드 드래그 순서 변경. 최상위 프로젝트만 대상이며,
순서는 이 화면을 보는 모든 사용자에게 공유되므로(세션 재정렬과 동일 원칙)
관리자 전용으로 제한한다.
⚠️ 반드시 `PUT /api/projects/{project_id}` 보다 먼저 등록해야 한다 — 아니면
"order" 가 project_id 로 매칭 시도되어(정수 변환 실패로 422) 이 라우트가
영영 실행되지 않는다(경로 매칭은 등록 순서, path param 특이도 무관).
"""
_require_admin(request)
st = _db_or_503(request)
ids = payload.get("ordered_ids") or []
if not isinstance(ids, list) or not ids:
raise HTTPException(status_code=400, detail="ordered_ids 가 필요합니다.")
st.reorder_projects(ordered_ids=[int(i) for i in ids])
return JSONResponse({"ok": True})
@router.put("/api/projects/{project_id}")
async def api_update_project(
request: Request, project_id: int, payload: dict[str, Any] = Body(...)
@@ -733,22 +754,6 @@ async def api_delete_project(request: Request, project_id: int) -> JSONResponse:
return JSONResponse({"ok": True})
@router.put("/api/projects/order")
async def api_reorder_projects(
request: Request, payload: dict[str, Any] = Body(...)
) -> JSONResponse:
"""홈 화면 프로젝트 카드 드래그 순서 변경. 최상위 프로젝트만 대상이며,
순서는 이 화면을 보는 모든 사용자에게 공유되므로(세션 재정렬과 동일 원칙)
관리자 전용으로 제한한다."""
_require_admin(request)
st = _db_or_503(request)
ids = payload.get("ordered_ids") or []
if not isinstance(ids, list) or not ids:
raise HTTPException(status_code=400, detail="ordered_ids 가 필요합니다.")
st.reorder_projects(ordered_ids=[int(i) for i in ids])
return JSONResponse({"ok": True})
# ────────────────────────────────────────────────────────────
# JSON API — 멤버 (관리자가 사용자 배정)
# ────────────────────────────────────────────────────────────