feat(M02): 복사본 길 모양 맞춤 — 미리 가져오기 몸 {layer, owner, key}(이름은 층 SS 줄) · 목록에 원본판 · 입력연결은 sub4 층 읽기(_Inputs.read_file)로 (PLAN 25-2b)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BU9gbNE3aWFUvE61pS2WGt
This commit is contained in:
2026-09-29 23:31:44 +09:00
co-authored by Claude Opus 5.5
parent 98b1adac34
commit b038e99d8d
4 changed files with 45 additions and 8 deletions
+17 -4
View File
@@ -1,7 +1,7 @@
"""프로젝트 집계 항목 복사본 길 — `/api/projects/{id}/items…` (PLAN 25-1b · 25-2b · 25-2e).
GET …/items 목록(이름 · 원본 · 가져온날 · 마스터 바뀜)
POST …/items {summary_item} 미리 가져오기(구조물에 안 이은 항목)
POST …/items {layer, owner, key} 미리 가져오기(구조물에 안 이은 항목) → {폴더, 만듦, 가져온날}
GET …/items/{폴더}/{종류} {종류, 판, 내용}
PUT …/items/{폴더}/{종류} {판, 내용} — 판이 다르면 409 · 면적 · 재료는 서버 계산값
POST …/items/{폴더}/refresh 새로 가져오기(입력값 · 고른자재는 같은 키면 살림)
@@ -23,6 +23,7 @@ from common_util.common_util_auth import verify_session
from common_util.common_util_summary_item import parse_summary_item
from M02_MasterTemplete import M02_Item_Copy as copies
from M02_MasterTemplete import M02_MasterTemplete_Router_Layers as layer_routes
from M02_MasterTemplete.M02_Item_Source import item_name
router = APIRouter(prefix="/api/projects", tags=["M02 Project Items"])
@@ -35,7 +36,13 @@ class WriteBody(BaseModel):
class PrefetchBody(BaseModel):
summary_item: dict[str, Any]
"""`{layer, owner, key}`(이름은 층 SS 줄에서) — 옛 모양 `{summary_item}` 도 받음."""
layer: str | None = None
owner: str | None = None
key: str | None = None
name: str | None = None
summary_item: dict[str, Any] | None = None
async def _root(session: dict[str, Any], project_id: str):
@@ -66,10 +73,16 @@ async def list_items(
async def prefetch_item(
project_id: str, body: PrefetchBody, session: dict[str, Any] = Depends(verify_session)
) -> dict[str, Any]:
try:
item = parse_summary_item(body.summary_item)
raw = body.summary_item or {"layer": body.layer, "owner": body.owner, "key": body.key}
try: # 모양 먼저(이름은 자리만) — 그다음 층 SS 줄에서 이름
item = parse_summary_item({**raw, "name": raw.get("name") or body.name or "-"})
except ValueError as error:
raise HTTPException(status_code=400, detail=str(error)) from error
if not (raw.get("name") or body.name):
try:
item["name"] = item_name(item)
except LookupError as error:
raise HTTPException(status_code=404, detail=str(error)) from error
return await _run(copies.prefetch, await _root(session, project_id), item)