# Architecture

## Aliran Data

```
                    ┌───────────────────┐
                    │  Admin Panel      │
                    │  (guard: admin)   │
                    └────────┬──────────┘
                             │ CRUD
                             ▼
              ┌──────────────────────────────┐
              │  frontend_menu_category      │
              │  frontend_menu               │
              │  frontend_role_mapping       │
              └──────────────────────────────┘
                             │
              ┌──────────────┴──────────────┐
              │                             │
              ▼                             ▼
┌──────────────────────┐      ┌──────────────────────┐
│  User Panel          │      │  Public CMS Site     │
│  (guard: user)       │      │  (no auth)           │
├──────────────────────┤      ├──────────────────────┤
│  Query:              │      │  PublicMenuComposer  │
│  role_code = user    │      │                      │
│  category_id =       │      │  home.layouts.master │
│  sidebar category    │      │                      │
└──────────────────────┘      │  Query:              │
                              │  role_code = public  │
                              │  category_id =       │
                              │  main-navbar         │
                              └──────────────────────┘
```

## View Composers

### 1. FrontendUserMenuComposer

**Lokasi:** `app/View/Composers/FrontendUserMenuComposer.php`  
**Didaftarkan di:** `AppServiceProvider` → `frontend.layouts.partials.sidebar`  
**Parameter:** `$categoryName` (nullable) — bila diisi, hanya ambil menu dengan category_id tertentu

**Logic:**
1. Ambil user dari guard `user`
2. Dapatkan role names user via Spatie `getRoleNames()`
3. Query `RoleMapping` where `role_code` = user's roles
4. Filter by `status = true`
5. Filter by `category_id = sidebar category`
6. Resolve URL (route name → full URL)
7. Hantar `$menuTree` ke view

### 2. PublicMenuComposer

**Lokasi:** `app/View/Composers/PublicMenuComposer.php`  
**Didaftarkan di:** `AppServiceProvider` → `home.layouts.master`  
**Parameter:** `$roleCode = 'public'`, `$categoryName = 'main-navbar'`

**Logic:**
1. Query `RoleMapping` where `role_code = 'public'`, `category_id = main-navbar category`
2. Jika data wujud → display sebagai navigation items
3. Jika tiada data → fallback ke query `Menu` model direct + hardcoded login links
4. Hantar `$navItems` ke view (format: array with `menu_name`, `menu_link`, `is_admin`)

## Fallback Behavior

Jika tiada assignment menu untuk role `public`, `PublicMenuComposer` akan:
1. Ambil semua menu aktif dari `Menu` model
2. Tambah link "User Login" dan "Admin Login" secara hardcoded
3. Papar macam navigation biasa

Ini memastikan landing page tetap berfungsi walaupun belum ada setup role/public menus.
