# Implementasi Pembatasan Akses Guru

## Deskripsi
Implementasi pembatasan akses untuk user dengan role 'guru' agar hanya dapat melihat dan mengelola data mereka sendiri di berbagai modul.

## Tanggal Implementasi
6 Agustus 2026

## Perubahan yang Dilakukan

### 1. JurnalMengajarController
**File**: `app/Http/Controllers/Simaju/JurnalMengajarController.php`

**Perubahan**:
- Guru hanya melihat jurnal mereka sendiri di index
- Dropdown guru hanya menampilkan nama guru yang login
- Validasi saat create/update/delete untuk memastikan guru hanya mengelola data sendiri

**Logika**:
```php
// Di index, create, edit
if (auth()->user()->role === 'guru' && auth()->user()->guru) {
    $guruList = Guru::where('id', auth()->user()->guru->id)->get();
}

// Di index query
if (auth()->user()->role === 'guru' && auth()->user()->guru) {
    $query->where('guru_id', auth()->user()->guru->id);
}

// Di store, update, destroy
if (auth()->user()->role === 'guru' && auth()->user()->guru) {
    if ($validated['guru_id'] != auth()->user()->guru->id) {
        return back()->with('error', 'Anda hanya dapat ... untuk diri sendiri.');
    }
}
```

### 2. ProtaController
**File**: `app/Http/Controllers/Simaju/ProtaController.php`

**Perubahan**:
- Guru hanya melihat prota mereka sendiri
- Dropdown guru hanya menampilkan nama guru yang login
- Validasi ketat pada semua operasi CRUD

### 3. PromesController
**File**: `app/Http/Controllers/Simaju/PromesController.php`

**Perubahan**:
- Guru hanya melihat promes mereka sendiri
- Dropdown guru hanya menampilkan nama guru yang login
- Validasi ketat pada semua operasi CRUD

### 4. ModulAjarController (Sudah Ada Sebelumnya)
**File**: `app/Http/Controllers/Simaju/ModulAjarController.php`

**Status**: Sudah menggunakan WaliKelasAccess trait dengan logika pembatasan

### 5. DokumenGuruController (Sudah Ada Sebelumnya)
**File**: `app/Http/Controllers/Simaju/DokumenGuruController.php`

**Status**: Sudah menggunakan WaliKelasAccess trait dengan logika pembatasan

## Pola Implementasi

### Template untuk Controller Lain
Jika ingin menambahkan pembatasan serupa di controller lain, gunakan pola berikut:

```php
// 1. Di method index()
public function index(Request $request)
{
    $query = Model::with(['guru', ...]);
    
    // Batasi query untuk guru
    if (auth()->user()->role === 'guru' && auth()->user()->guru) {
        $query->where('guru_id', auth()->user()->guru->id);
    }
    
    // ... filter lainnya ...
    
    $items = $query->paginate(20);
    
    // Batasi dropdown guru
    if (auth()->user()->role === 'guru' && auth()->user()->guru) {
        $guruList = Guru::where('id', auth()->user()->guru->id)->get();
    } else {
        $guruList = Guru::orderBy('nama')->get();
    }
    
    return view('...', compact('items', 'guruList', ...));
}

// 2. Di method create()
public function create()
{
    if (auth()->user()->role === 'guru' && auth()->user()->guru) {
        $guruList = Guru::where('id', auth()->user()->guru->id)->get();
    } else {
        $guruList = Guru::orderBy('nama')->get();
    }
    
    return view('...', compact('guruList', ...));
}

// 3. Di method store()
public function store(Request $request)
{
    $validated = $request->validate([...]);
    
    // Validasi guru hanya bisa create untuk dirinya
    if (auth()->user()->role === 'guru' && auth()->user()->guru) {
        if ($validated['guru_id'] != auth()->user()->guru->id) {
            return back()->with('error', 'Anda hanya dapat membuat data untuk diri sendiri.');
        }
    }
    
    Model::create($validated);
    // ...
}

// 4. Di method edit()
public function edit(Model $model)
{
    // Validasi kepemilikan
    if (auth()->user()->role === 'guru' && auth()->user()->guru) {
        if ($model->guru_id != auth()->user()->guru->id) {
            return redirect()->route('...')
                ->with('error', 'Anda hanya dapat mengedit data milik Anda sendiri.');
        }
    }
    
    // Batasi dropdown
    if (auth()->user()->role === 'guru' && auth()->user()->guru) {
        $guruList = Guru::where('id', auth()->user()->guru->id)->get();
    } else {
        $guruList = Guru::orderBy('nama')->get();
    }
    
    return view('...', compact('model', 'guruList', ...));
}

// 5. Di method update()
public function update(Request $request, Model $model)
{
    // Validasi kepemilikan
    if (auth()->user()->role === 'guru' && auth()->user()->guru) {
        if ($model->guru_id != auth()->user()->guru->id) {
            return back()->with('error', 'Anda hanya dapat mengupdate data milik Anda sendiri.');
        }
    }
    
    $validated = $request->validate([...]);
    
    // Validasi tidak bisa ubah ke guru lain
    if (auth()->user()->role === 'guru' && auth()->user()->guru) {
        if ($validated['guru_id'] != auth()->user()->guru->id) {
            return back()->with('error', 'Anda hanya dapat mengupdate data untuk diri sendiri.');
        }
    }
    
    $model->update($validated);
    // ...
}

// 6. Di method destroy()
public function destroy(Model $model)
{
    // Validasi kepemilikan
    if (auth()->user()->role === 'guru' && auth()->user()->guru) {
        if ($model->guru_id != auth()->user()->guru->id) {
            return back()->with('error', 'Anda hanya dapat menghapus data milik Anda sendiri.');
        }
    }
    
    $model->delete();
    // ...
}
```

## Testing

### Cara Testing Manual
1. Login sebagai user dengan role 'guru'
2. Akses modul Jurnal Mengajar / Prota / Promes
3. Verifikasi:
   - ✅ Dropdown guru hanya menampilkan nama guru yang login
   - ✅ Hanya data guru yang login yang muncul di list
   - ✅ Tidak bisa create/update dengan memilih guru lain
   - ✅ Tidak bisa edit/delete data guru lain
4. Login sebagai admin
5. Verifikasi:
   - ✅ Dropdown guru menampilkan semua guru
   - ✅ Semua data guru muncul di list
   - ✅ Bisa mengelola data semua guru

## Role yang Terpengaruh
- **guru**: Dibatasi hanya melihat dan mengelola data mereka sendiri
- **admin**: Tetap bisa melihat dan mengelola semua data
- **wali_kelas**: Tergantung implementasi di masing-masing controller

## Catatan Penting
1. Pembatasan ini menggunakan `auth()->user()->role === 'guru'` dan `auth()->user()->guru`
2. Setiap user guru harus memiliki relasi ke tabel `gurus` melalui kolom `guru_id`
3. Admin tidak terpengaruh pembatasan ini
4. Pesan error dalam Bahasa Indonesia untuk user experience yang lebih baik

## Controller yang Sudah Diupdate
- ✅ JurnalMengajarController
- ✅ ProtaController
- ✅ PromesController
- ✅ ModulAjarController (sudah ada sebelumnya)
- ✅ DokumenGuruController (sudah ada sebelumnya)

## Controller yang Mungkin Perlu Update
Jika ada controller lain yang memiliki dropdown guru atau mengelola data per guru, pertimbangkan untuk menerapkan pola yang sama.

## Referensi
- User Model: `app/Models/User.php`
- Guru Model: `app/Models/Guru.php`
- WaliKelasAccess Trait: `app/Http/Controllers/Simaju/Traits/WaliKelasAccess.php`
