"""M02 단가산출(SK) 수식 길(PLAN 802-4a 4) — `M02_Doc_Sk_Path` 를 층 권한 안에서. GET /api/m02/layers/{층}/sangeun/{키}/doc 읽기(층 읽기) → {문서, 부름, 끊음, 셈, 사본, 판} POST /api/m02/layers/{층}/sangeun/{키}/doc/preview 미리 셈(층 쓰기) {문서?, 끊음?, 할일?} → {…, 전, 후, 바뀐자원?, 버림?} POST /api/m02/layers/{층}/sangeun/{키}/doc/save 저장(층 쓰기) {문서?, 끊음?, 할일?, 판} → 읽기 꼴 POST /api/m02/layers/{층}/sangeun/{키}/match {할일 찾기|바꾸기|되돌리기, 판?}(층 쓰기 · 810-4) → {연결후보?, 판}(바꾸기 = 확정만 · 아니면 409) ⚠ 등록은 `main.py`(로그인만 · 층 권한은 길 안에서). """ from __future__ import annotations from typing import Any from fastapi import APIRouter, Depends from pydantic import BaseModel from common_util.common_util_auth import verify_session from M02_MasterTemplete import M02_Doc_Sk_Path as path from M02_MasterTemplete.M02_MasterTemplete_Router_Items import Layer, Session, _call, _root router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete Sangeun Doc"]) class DocBody(BaseModel): 문서: dict[str, Any] | None = None 끊음: dict[str, Any] | None = None 할일: str | None = None 판: str | None = None 단가기준: str | None = None # 가져온 식만(807-1 · 엑셀 | 우리) @router.get("/layers/{layer}/sangeun/{key}/doc") def read_doc( layer: Layer, key: str, owner: str | None = None, session: Session = Depends(verify_session) ) -> dict: return _call(_root(session, layer, owner), path.read, key) @router.post("/layers/{layer}/sangeun/{key}/doc/preview") def preview_doc( layer: Layer, key: str, body: DocBody, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: folder = _root(session, layer, owner, write=True) return _call(folder, path.preview, key, body.model_dump(exclude_none=True)) class MatchBody(BaseModel): 할일: str = "찾기" # 찾기 | 바꾸기 | 되돌리기(810-4) 판: str | None = None @router.post("/layers/{layer}/sangeun/{key}/match") def match_doc( layer: Layer, key: str, body: MatchBody, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: """가져온 식 ↔ 우리 기초(810-4) — 찾기(연결후보 적음) · 바꾸기(확정만 · M01 사본 SK) · 되돌리기.""" from fastapi import HTTPException from M02_MasterTemplete import M02_Doc_MatchSk as msk jobs = {"찾기": msk.find, "바꾸기": msk.swap, "되돌리기": msk.back} if body.할일 not in jobs: raise HTTPException(status_code=400, detail="찾기 · 바꾸기 · 되돌리기") folder = _root(session, layer, owner, write=True) return _call(folder, jobs[body.할일], key, body.판 or "") @router.post("/layers/{layer}/sangeun/{key}/doc/save") def save_doc( layer: Layer, key: str, body: DocBody, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: folder = _root(session, layer, owner, write=True) return _call(folder, path.save, key, body.model_dump(exclude_none=True))