diff --git a/CLAUDE.md b/CLAUDE.md index 07cc8080..94ea71e1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -174,26 +174,57 @@ # API 앱에서 artisan 명령 실행 docker exec sam-api-1 php artisan <명령어> ``` -## 메뉴 관리 (DB 기반) +## 메뉴 관리 (DB 기반) - 수동 관리 필수! -### 메뉴 구조 -사이드바 메뉴는 DB에 저장되어 있으며 `MngMenuSeeder`로 관리합니다. +> **경고: 메뉴 시더(Seeder)를 절대 실행하지 마세요!** -### 메뉴 추가/수정 절차 (필수!) +### 배경 +사이드바 메뉴는 DB의 `menus` 테이블에 저장됩니다. +메뉴 시더 실행 시 **부서별 권한 설정(permission_overrides)이 초기화**되므로 시더 사용을 금지합니다. -1. **시더 파일 수정** - ``` - database/seeders/MngMenuSeeder.php - ``` +### 금지 사항 +``` +❌ php artisan db:seed --class=MngMenuSeeder 실행 금지 +❌ php artisan db:seed --class=*MenuSeeder 실행 금지 +❌ 메뉴 시더 파일 생성 금지 +❌ 메뉴 데이터를 일괄 삭제 후 재생성하는 방식 금지 +``` -2. **시더 실행 (Docker)** - ```bash - docker exec sam-mng-1 php artisan db:seed --class=MngMenuSeeder - ``` +### 메뉴 변경 시 올바른 절차 -3. **브라우저 새로고침**으로 확인 +메뉴 추가/수정/삭제/이동이 필요할 때는 **사용자에게 수동 실행 안내**를 제공합니다: + +1. **tinker 명령어를 안내** (사용자가 직접 실행) +2. **또는 SQL 쿼리를 안내** (사용자가 phpMyAdmin 등에서 직접 실행) +3. **절대 시더를 만들어 실행하지 않음** + +### 안내 예시 + +```bash +# 메뉴 추가 +ssh sam-server "cd /home/webservice/mng && php artisan tinker --execute=\" +App\\\\Models\\\\Commons\\\\Menu::create([ + 'tenant_id' => 1, + 'parent_id' => <부모ID>, + 'name' => '새 메뉴', + 'url' => '/new-menu', + 'icon' => 'icon-name', + 'sort_order' => 1, + 'is_active' => true, +]); +\"" + +# 메뉴 이름 변경 +ssh sam-server "cd /home/webservice/mng && php artisan tinker --execute=\" +App\\\\Models\\\\Commons\\\\Menu::withoutGlobalScopes()->find()->update(['name' => '새이름']); +\"" + +# 메뉴 비활성화 (삭제 대신) +ssh sam-server "cd /home/webservice/mng && php artisan tinker --execute=\" +App\\\\Models\\\\Commons\\\\Menu::withoutGlobalScopes()->find()->update(['is_active' => false]); +\"" +``` ### 주의사항 -- 시더 실행 시 기존 메뉴(tenant_id=1)가 삭제 후 재생성됨 -- 메뉴 코드 수정만으로는 적용 안 됨 → **반드시 시더 실행 필요** -- 라우트(`routes/web.php`)와 컨트롤러도 함께 추가해야 함 +- 메뉴 변경 시 라우트(`routes/web.php`)와 컨트롤러도 함께 추가해야 함 +- 새 메뉴 추가 후 부서별 권한 설정이 필요하면 사용자에게 안내