API Documentation
Base URL: /api
Semua request dan response menggunakan format JSON. Authentication menggunakan JWT Bearer token.
Response Format
{
"success": true,
"message": "OK",
"data": { /* payload */ }
}
List Response (dengan pagination)
{
"success": true,
"data": [ /* items */ ],
"pagination": {
"total": 100, "page": 1, "per_page": 10, "total_pages": 10
}
}
Error Response
{
"success": false,
"message": "Validasi gagal",
"errors": { "name": "Name wajib diisi" }
}
HTTP Status Codes
200OK201Created400Bad Request401Unauthorized (token invalid/expired)403Forbidden (tidak punya permission)404Not Found422Unprocessable Entity (validasi gagal)500Internal Server Error
Auth Header
Authorization: Bearer {jwt_token}
Authentication
Login dengan username (email) dan password.
Request Body
{
"username": "[email protected]",
"password": "Admin@123"
}
Response
{
"success": true,
"message": "Login berhasil",
"data": {
"token": "eyJ...",
"expires_in": 86400,
"user": { "id": 1, "name": "Administrator", "username": "[email protected]",
"role_id": 1, "role_name": "Super Admin" },
"permissions": {
"users": { "view":1, "create":1, "edit":1, "delete":1, "export":1 }
}
}
}
Logout (butuh auth).
Info user yang sedang login (butuh auth).
Users
List users dengan pagination.
Query params: page, per_page, search, role_id, status
{
"name": "John Doe",
"username": "[email protected]",
"password": "secret123",
"role_id": 2,
"status": "active"
}
Field password opsional saat update.
Soft delete. Tidak bisa hapus user yang sedang login.
Roles
{
"name": "Editor",
"description": "Akses edit saja",
"status": "active",
"permissions": {
"users": { "view": 1, "create": 0, "edit": 1, "delete": 0, "export": 0 },
"templates": { "view": 1, "create": 1, "edit": 1, "delete": 0, "export": 1 }
}
}
Tidak bisa hapus role Super Admin (id=1) atau role yang masih digunakan user.
Audit Logs
Query params: user_id, username, method, status (2xx/3xx/4xx/5xx atau angka), endpoint, date_start, date_end
Export CSV dengan filter yang sama seperti list endpoint.
Categories
{"name":"Monthly","description":"...","status":"active"}
Clients
{"name":"ABC Corp","description":"...","status":"active"}
Projects
Query params: client_id untuk filter by client.
{"name":"Campaign Q4","client_id":1,"status":"active"}
Slides
Query: search (judul atau file_name), status, page, per_page. Tiap item memuat thumbnail_path dan file_name.
List semua slide aktif (untuk popup pilih slide di template). Tiap item menyertakan thumbnail_path (URL relatif, mis. /uploads/slides/... atau null) dan file_name untuk preview kartu & zoom gambar di UI template.
JSON (Content-Type: application/json) atau multipart/form-data (field teks + file thumbnail).
Field: title (wajib), status (active|inactive), description, html_content, sort_order, variables (array JSON, atau string koma di multipart), file_name (opsional, acuan unik, contoh slide_2.html — huruf/angka, _, -, ., harus berakhiran .html), thumbnail (file gambar multipart), atau thumbnail_path (JSON saja, path publik yang sudah ada di /uploads/slides/...).
Thumbnail multipart: JPEG/PNG/WebP/GIF, maks. 2MB. Tersimpan di server dengan path publik /uploads/slides/slide_{id}_xxxxxxxx.ext.
{
"title": "Overview",
"description": "...",
"file_name": "slide_overview.html",
"html_content": "<div class=\"slide-container\">...</div>",
"variables": ["client_name","date_range"],
"status": "active",
"sort_order": 1
}
Update dengan body JSON (sama field seperti POST). Jika thumbnail_path dikirim kosong/null, thumbnail di DB dihapus (file lama dihapus dari disk). Jika key tidak dikirim, thumbnail lama dipertahankan.
Sama seperti PUT tetapi untuk multipart/form-data agar field thumbnail (file) terisi di PHP. Field teks sama seperti create. Tanpa file thumbnail, gambar yang ada tidak diubah.
Report Templates
{
"name": "Monthly SM Report",
"category_id": 1,
"description": "...",
"status": "active",
"slide_ids": [1, 2, 3]
}
Urutan slide_ids menentukan urutan slide di template.
Detail template termasuk array slides berurutan: id, title, description, thumbnail_path, file_name, variables, sort_order.
Slide aktif milik template (untuk generate report): html_content, variables, sort_order, serta thumbnail_path dan file_name bila perlu di sisi klien.
Reports
{
"name": "Report Jan 2026",
"template_id": 1,
"client_id": 1,
"project_ids": [1, 2],
"channel": "Twitter",
"sentiment": "all",
"date_start": "2026-01-01",
"date_end": "2026-01-31"
}
Hanya name, channel, sentiment, date_start, date_end yang bisa diubah.
Ambil slides dari report (berdasarkan template yang dipakai).
Configuration
{
"config_key": "max_upload_size",
"config_value": "10485760",
"config_type": "number",
"label": "Max Upload Size",
"group_name": "system"
}
config_type boleh: text, number, boolean, textarea, select.
Batch update semua config values sekaligus.
{
"values": {
"app_name": "Report Generator",
"items_per_page": "10",
"maintenance_mode": "0"
}
}