Files
superport_v2/doc/frontend_menu_permission_tasks.md
JiWoong Sul 753f76e952 feat(menu-permissions): 메뉴 API 연동으로 사이드바 권한 정비
- .env.development.example과 lib/core/config/environment.dart, lib/core/permissions/permission_manager.dart에서 PERMISSION__ 폴백을 view 전용으로 좁히고 기본 정책을 명시적으로 거부하도록 재정비했다

- lib/core/navigation/*, lib/core/routing/app_router.dart, lib/widgets/app_shell.dart, lib/main.dart에서 메뉴 매니페스트·카탈로그를 도입해 /menus 응답을 캐싱하고 라우터·사이드바·Breadcrumb가 동일 menu_code/route_path를 쓰도록 리팩터링했다

- lib/core/permissions/permission_resources.dart와 그룹 권한/메뉴 마스터 모듈을 menu_code 기반 CRUD 및 Catalog 경로 정합성 검사로 전환하고 PermissionSynchronizer·PermissionBootstrapper를 확장했다

- test/helpers/test_permissions.dart, test/widgets/app_shell_test.dart 등 신규 구조를 반영하는 테스트·골든과 doc/frontend_menu_permission_tasks.md 문서를 보강했다
2025-11-12 18:29:03 +09:00

4.6 KiB

프런트엔드 메뉴 권한 정합성 작업 리스트

백엔드가 menus/group_menu_permissions 구조를 정리하는 동안 프런트엔드에서 병행해야 하는 상세 작업을 아래와 같이 정리한다. 모든 작업은 AGENTS.md 가이드(주석 한국어, Clean Architecture, 테스트 필수)에 따라 진행하며, 완료 후 flutter analyze, flutter test를 실행한다.

1. 권한 리소스/폴백 정비

  1. PermissionResources 별칭 테이블 보강

    • 파일: lib/core/permissions/permission_resources.dart
    • 액션: /inventory/receipts|issues|rentals, /inventory/vendors|products|warehouses|customers, /settings/* 등 백엔드 menus.route_path 전부를 _aliases에 1:1 매핑.
    • 기대효과: 서버가 내려주는 menu_code/route_path와 사이드바 권한 체크가 정확히 연결.
  2. PermissionManager 기본 정책 수정

    • 파일: lib/core/permissions/permission_manager.dart, .env.development, .env.example
    • 액션:
      • 서버/오버라이드 권한이 없으면 Environment.hasPermission 결과를 사용하기 전에 기본 거부하도록 방어 로직 추가.
      • 개발용 .env에 필요한 최소 권한만 PERMISSION__/path=view 형태로 명시해 무제한 허용을 차단.
    • 기대효과: 권한 정보 미수신 시 UI가 안전하게 차단되고, 테스트/QA에서 화이트리스트가 그대로 재현.

2. 메뉴 데이터 소스 일원화

  1. 메뉴 라우트/사이드바 리팩터링

    • 파일: lib/widgets/app_shell.dart, lib/core/routing/app_router.dart, lib/core/navigation/menu_route_definitions.dart, 신규 헬퍼 모듈.
    • 액션:
      • appSections 상수를 폐지하고, GET /menus 결과(menu_code, parent_code, display_order, route_path)를 캐시해 사이드바를 구성.
      • menu_code → 위젯 builder 매핑 테이블을 별도 파일로 만들고 GoRouter 정의에서 사용.
      • 사이드바, 권한 드롭다운, 라우터가 모두 동일 menu_code/route_path를 참조하도록 구조화.
    • 기대효과: menus 테이블 변경이 자동으로 UI에 반영되고 경로 불일치 문제 제거.
  2. MenuCatalog(캐시) 도입 및 의존성 주입

    • 파일: lib/main.dart, lib/core/navigation/menu_catalog.dart(신규), lib/features/masters/menu/*
    • 액션:
      • 앱 시작 시 메뉴 목록을 한 번만 불러 캐시하는 Catalog를 만들고 PermissionScope 옆에서 주입.
      • 메뉴 관리 화면/권한 드롭다운이 Catalog 데이터를 재사용하도록 controller 로직 정리.

3. 그룹 권한 UI 연동

  1. 메뉴 선택 로직을 menu_code 기반으로 변경

    • 파일: lib/features/masters/group_permission/presentation/...
    • 액션:
      • 컨트롤러와 다이얼로그가 menu_id 대신 menu_code를 사용해 CRUD 요청을 보냄.
      • 메뉴 드롭다운 옵션을 Catalog(or /menus)에서 가져와 라벨/정렬 통일.
  2. 권한 동기화 시 menu_code 매칭 검증

    • 파일: lib/features/masters/group_permission/application/permission_synchronizer.dart
    • 액션: MenuRouteDefinition 또는 Catalog를 참조해 PermissionManager에 적용되는 리소스 키가 서버 route_path와 일치하는지 확인하는 테스트 추가.

4. 테스트 & CI

  1. 사이드바 권한 테스트 보강

    • 파일: test/widgets/app_shell_test.dart, test/navigation/navigation_flow_test.dart
    • 액션:
      • 서버에서 받은 menu_code/route_path에 따라 노출되는 메뉴가 달라지는 위젯 테스트 작성.
      • 개발 env 권한 없이도 테스트가 실패하지 않도록 PermissionManager 오버라이드 유틸 추가.
  2. CI 스크립트 추가

    • 파일: tool/check_menu_manifest.dart(신규), ci/scripts/*
    • 액션: menus 테이블 표(doc/stock_approval_system_spec_v4.md), 라우트 정의, 앱 메뉴 캐시 간 코드/경로 일관성을 검사하는 Dart 스크립트를 추가하고 CI 단계에서 실행.

5. 문서/QA

  1. 문서 업데이트

    • 파일: doc/frontend_backend_alignment_report.md, 신규 QA 체크리스트.
    • 액션: “사이드바=menus 테이블 1:1” 규칙, 권한 폴백 정책, 테스트 플로우를 문서화.
  2. QA 시나리오

    • 항목: 화이트리스트 그룹별 계정으로 로그인 → 사이드바 캡처 → 권한 드롭다운 메뉴 제한 확인 → 메뉴 관리에서 route_path 일치 여부 확인.
    • 산출물: doc/qa/menu_permission_alignment_checklist.md 등으로 공유.

각 작업은 백로그 티켓으로 분할해 순차 진행하며, 메뉴 API 변경 시점과 맞춰 릴리즈 플래그로 토글할 수 있도록 구성한다.