# Modul 2: Journal Management

## 1. User Flow
- **Dashboard Akses**: User dengan role `super_admin` atau `journal_manager` login dan melihat menu "Journal Settings" di Dashboard.
- **Daftar Jurnal**: Menampilkan tabel daftar jurnal di sistem beserta statusnya (Aktif/Nonaktif).
- **Tambah Jurnal**: `super_admin` dapat mengklik "Create New Journal", mengisi form berisi Nama, ISSN, Scope, Guideline, Review Policy, Editorial Board, Frequency, dan DOI.
- **Edit Jurnal**: Mengklik tombol Edit pada baris jurnal yang dipilih untuk memperbarui data kebijakan jurnal.
- **Ubah Status**: `super_admin` dapat menonaktifkan jurnal yang sudah tidak menerima publikasi.

## 2. SQL CREATE TABLE

```sql
-- database/modul2_journal.sql
CREATE TABLE journals (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    issn_print VARCHAR(50),
    issn_online VARCHAR(50),
    focus_scope TEXT,
    author_guidelines TEXT,
    review_policy TEXT,
    editorial_board TEXT,
    publication_frequency VARCHAR(100),
    doi_prefix VARCHAR(50),
    status ENUM('active', 'inactive') DEFAULT 'active',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```

## 3. Model PHP
File `app/models/Journal.php` menggunakan PDO dengan fungsionalitas CRUD dan mitigasi SQL Injection (param bound).

## 4. Controller PHP
File `app/controllers/JournalController.php` bertugas mengamankan route, memvalidasi CSRF token, dan menyimpan field HTML secara aman tanpa XSS (menggunakan `htmlspecialchars` saat render).

## 5. Route
```php
$router->get('/journals', 'JournalController', 'index');
$router->get('/journals/create', 'JournalController', 'create');
$router->post('/journals/store', 'JournalController', 'store');
$router->get('/journals/edit/{id}', 'JournalController', 'edit');
$router->post('/journals/update/{id}', 'JournalController', 'update');
$router->post('/journals/delete/{id}', 'JournalController', 'delete');
```

## 6. View PHP
- `app/views/journal/index.php`: Menggunakan tabel TailwindCSS murni.
- `app/views/journal/create.php`: Form pembuatan dengan input teks, area, dsb.
- `app/views/journal/edit.php`: Form edit dengan data terisi.

## 7. Validasi Form
Melakukan *trim()* pada teks, mengecek apakah input wajib (`name`) terisi. Jika tidak terisi, menampilkan *flash message* error lalu mengembalikan ke form semula. 

## 8. Access Control
Menggunakan helper `require_login()` dan memeriksa apakah user punya role `super_admin` atau `journal_manager` sebelum mengeksekusi aksi di Controller.

## 9. Testing Scenario
1. Login dengan akun `reader`. Coba akses `/journals` di address bar, sistem harus menolak dengan error 403 Forbidden.
2. Login sebagai `journal_manager`. Masuk ke menu Journal Settings -> Create New Journal. Buka `devtools` dan ubah token input CSRF dengan angka acak lalu klik Save. Harapan: Proses berhenti / die karena Token CSRF gagal.
3. Submit form jurnal dengan judul `Testing Journal`, lalu verifikasi database terisi dengan benar.
4. Klik Edit dan ubah status jurnal menjadi *Inactive*.
