"""M02 구조물 옵션 보이기 · 그룹 길 — 정본 `M02_SO_Options.py` · `M02_SO_Groups.py`. `router` = 고쳐 씀 · 관리 읽기(`main.py` 가 `system_admin_only` 로 붙임) · `read_router` = 읽기만(로그인 누구나 · `main.py` 가 `protected` 로 붙임). """ from __future__ import annotations from typing import Any from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from common_util.common_util_auth import verify_session from M02_MasterTemplete import M02_Layer_Access as access from M02_MasterTemplete import M02_MasterTemplete_Store as store from M02_MasterTemplete.StructOptions import M02_SO_Groups as groups from M02_MasterTemplete.StructOptions import M02_SO_Options as options router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete"]) read_router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete"]) class OptionsBody(BaseModel): 판: str = "" # 옵션 표시 표 판 — 어긋나면 409 표시: dict[str, Any] # {종류: {옵션 키: 참 · 거짓}} — 거짓만 남김 class GroupsBody(BaseModel): 판: str = "" # 그룹 표 판 — 어긋나면 409 그룹: dict[str, Any] # {종류: [{id, 이름, 옵션[]}]} def _call(fn, *args): with store.at(store.FOLDER): try: return fn(*args) except store.StoreError as e: raise HTTPException(status_code=e.status, detail=e.detail) from e @router.get("/structure-options") def get_structure_options() -> dict: """`{판, 표시, 종류}` — 표시 = 숨긴 것만 · 종류 = 옵션 있는 종류와 그 옵션.""" return _call(options.listing) @router.put("/structure-options") def put_structure_options(body: OptionsBody) -> dict: """고쳐 씀(낡은 판이면 409 · 없는 종류 · 키는 422) — 돌려주는 것 = 새 `{판, 표시, 종류}`.""" return _call(options.save, body.표시, body.판) @router.get("/structure-option-groups") def get_structure_option_groups() -> dict: """`{판, 그룹, 종류}` — 그룹 = `{type_id: [{id, 이름, 옵션}]}` · 종류 = 레지스트리 전부.""" return _call(groups.listing) @router.put("/structure-option-groups") def put_structure_option_groups(body: GroupsBody) -> dict: """고쳐 씀(낡은 판 409 · 없는 종류 · 키 · 겹침 422) — 돌려주는 것 = 새 `{판, 그룹, 종류}`.""" return _call(groups.save, body.그룹, body.판) @read_router.get("/layers/system/structure-options") def get_structure_options_read(session=Depends(verify_session)) -> dict: """구조물 옵션 보이기 읽기 — 로그인 누구나(마스터 한 벌 · 고쳐 씀은 시스템 관리자만).""" access.require(session, "system", None) return _call(options.listing)