diff --git a/CURRENT_WORKS.md b/CURRENT_WORKS.md index 3f9de11..1bf7e9f 100644 --- a/CURRENT_WORKS.md +++ b/CURRENT_WORKS.md @@ -1,5 +1,106 @@ # SAM API 작업 현황 +## 2025-12-02 (월) - 메뉴 통합관리 시스템 구현 (Phase 1-2) + +### 작업 목표 +- 글로벌 메뉴-테넌트 메뉴 연결 시스템 구현 +- Phase 1: DB 스키마 변경 및 모델 수정 +- Phase 2: 서비스 및 API 엔드포인트 개발 + +### Phase 1 완료 (DB 스키마 및 모델) + +**추가된 파일:** +- `database/migrations/2025_12_02_100000_add_global_menu_link_columns_to_menus_table.php` + - `global_menu_id` 컬럼: 원본 글로벌 메뉴 ID + - `is_customized` 컬럼: 테넌트 커스터마이징 여부 + - 인덱스 추가 + +**수정된 파일:** +- `app/Models/Commons/Menu.php` + - fillable: `global_menu_id`, `is_customized` 추가 + - casts: `is_customized => boolean` 등 추가 + - 관계 메서드: `globalMenu()`, `tenantMenus()` + - 헬퍼 메서드: `isGlobal()`, `isClonedFromGlobal()`, `isCustomized()` + - 스코프: `scopeGlobal()`, `scopeActive()`, `scopeVisible()`, `scopeRoots()` + - `getSyncFields()`: 동기화 비교 대상 필드 목록 + +- `app/Services/MenuBootstrapService.php` + - `cloneGlobalMenusForTenant()`: global_menu_id 저장 추가 + - 활성 메뉴만 복제 (is_active=true) + +### Phase 2 완료 (서비스 및 API) + +**추가된 파일:** +- `app/Services/GlobalMenuService.php` (신규) + - 글로벌 메뉴 CRUD (tenant_id = NULL) + - `syncToAllTenants()`: 특정 메뉴를 모든 테넌트에 동기화 + - `stats()`: 글로벌 메뉴 통계 + +- `app/Services/MenuSyncService.php` (신규) + - 동기화 상태 상수: NEW, UP_TO_DATE, UPDATABLE, CUSTOMIZED, DELETED + - `getSyncStatus()`: 동기화 상태 목록 조회 + - `syncMenus()`: 선택 동기화 (신규/업데이트) + - `importNewMenus()`: 신규 글로벌 메뉴 일괄 가져오기 + - `syncUpdates()`: 변경된 메뉴 일괄 업데이트 (커스텀 제외) + - `getAvailableGlobalMenus()`: 복제 가능한 글로벌 메뉴 목록 + +- `app/Http/Controllers/Api/Admin/GlobalMenuController.php` (신규) + - 시스템 관리자용 글로벌 메뉴 관리 + - index, tree, show, store, update, destroy, reorder + - syncToTenants, stats + +**수정된 파일:** +- `app/Services/MenuService.php` + - `update()`: 글로벌 복제 메뉴 수정 시 is_customized=true 자동 설정 + - `restore()`: 삭제된 메뉴 복원 추가 + - `trashedList()`: 삭제된 메뉴 목록 조회 추가 + +- `app/Http/Controllers/Api/V1/MenuController.php` + - MenuSyncService DI 추가 + - restore, trashed, availableGlobal, syncStatus, sync, syncNew, syncUpdates 메서드 추가 + +- `routes/api.php` + - GlobalMenuController use 문 추가 + - 테넌트 메뉴 동기화 라우트 6개 추가 (trashed, available-global, sync-status, sync, sync-new, sync-updates, restore) + - 글로벌 메뉴 관리 라우트 9개 추가 (admin/global-menus/*) + +### API 엔드포인트 + +**테넌트 메뉴 동기화 (V1):** +| Method | Path | 설명 | +|--------|------|------| +| GET | /v1/menus/trashed | 삭제된 메뉴 목록 | +| GET | /v1/menus/available-global | 복제 가능한 글로벌 메뉴 | +| GET | /v1/menus/sync-status | 동기화 상태 조회 | +| POST | /v1/menus/sync | 선택 동기화 | +| POST | /v1/menus/sync-new | 신규 메뉴 일괄 가져오기 | +| POST | /v1/menus/sync-updates | 변경된 메뉴 일괄 업데이트 | +| POST | /v1/menus/{id}/restore | 삭제된 메뉴 복원 | + +**글로벌 메뉴 관리 (Admin):** +| Method | Path | 설명 | +|--------|------|------| +| GET | /v1/admin/global-menus | 글로벌 메뉴 목록 | +| POST | /v1/admin/global-menus | 글로벌 메뉴 생성 | +| GET | /v1/admin/global-menus/tree | 글로벌 메뉴 트리 | +| GET | /v1/admin/global-menus/stats | 통계 조회 | +| POST | /v1/admin/global-menus/reorder | 순서 변경 | +| GET | /v1/admin/global-menus/{id} | 단건 조회 | +| PUT | /v1/admin/global-menus/{id} | 수정 | +| DELETE | /v1/admin/global-menus/{id} | 삭제 | +| POST | /v1/admin/global-menus/{id}/sync-to-tenants | 모든 테넌트에 동기화 | + +### 검증 결과 +- PHP 문법 검사: ✅ 모든 파일 통과 +- 라우트 등록: ✅ 9개 글로벌 메뉴 + 7개 테넌트 동기화 라우트 확인 + +### 다음 작업 (Phase 3-4) +- [ ] Phase 3: MNG 글로벌 메뉴 관리 화면 +- [ ] Phase 3: MNG 동기화 센터 화면 +- [ ] Phase 4: 마이그레이션 실행 및 테스트 + +--- + ## 2025-12-01 (일) - 메뉴 통합관리 시스템 설계 ### 작업 목표 diff --git a/LOGICAL_RELATIONSHIPS.md b/LOGICAL_RELATIONSHIPS.md index 7a3fbe9..52105c9 100644 --- a/LOGICAL_RELATIONSHIPS.md +++ b/LOGICAL_RELATIONSHIPS.md @@ -1,6 +1,6 @@ # 논리적 데이터베이스 관계 문서 -> **자동 생성**: 2025-11-28 17:41:00 +> **자동 생성**: 2025-12-02 20:39:31 > **소스**: Eloquent 모델 관계 분석 ## 📊 모델별 관계 현황 @@ -69,10 +69,18 @@ ### files - **shareLinks()**: hasMany → `file_share_links` - **fileable()**: morphTo → `(Polymorphic)` +### global_menus +**모델**: `App\Models\Commons\GlobalMenu` + +- **parent()**: belongsTo → `global_menus` +- **children()**: hasMany → `global_menus` +- **tenantMenus()**: hasMany → `menus` + ### menus **모델**: `App\Models\Commons\Menu` - **parent()**: belongsTo → `menus` +- **globalMenu()**: belongsTo → `global_menus` - **children()**: hasMany → `menus` ### tags