Marketing App API

Sistem Manajemen Leads dengan Hierarki Wilayah & Progress Tracking Otomatis

πŸ—ΊοΈ Alur Hierarki & Progress

API ini dirancang untuk mendukung alur pemilihan wilayah secara bertahap (Drill-down) dengan informasi progress pengerjaan di setiap levelnya.

Kategori
10/100 Selesai
Kota
1/5 Selesai
Kecamatan
1/10 Selesai
Kelurahan
Data Leads
Detail Leads
Input Kendala

Logika Progress: Sebuah lead dianggap "Selesai" jika statusnya telah diubah dari nilai default 'Belum Dikunjungi'.

πŸ” Autentikasi (Keamanan Ganda)

API ini menerapkan 2 lapis keamanan. Lapisan pertama adalah Fixed Token, dan lapisan kedua adalah JWT (Auth Token) untuk mengetahui session user yang login.

Header Name: x-api-key
Header Value: marketing-secret-key-123

Header Name: Authorization
Header Value: Bearer <jwt_token>

πŸ› οΈ Frontend Service

Tersedia helper class JavaScript untuk memudahkan integrasi di frontend. Kamu bisa menyertakan file /api-service.js di project kamu.

// Contoh penggunaan di browser
const service = new MarketingService('http://localhost:3000');

// 1. Ambil Kategori (dengan progress)
const categories = await service.getCategories();
console.log(categories[0]); // { id: 1, name: 'Mebel', total_leads: 150, finished_leads: 45 }

const selectedCat = categories[0].id; 

// 2. Ambil data kota berdasarkan kategori
const cities = await service.getCities(selectedCat);
console.log(cities); // [{ id: 1, name: 'Malang', total_leads: 5, finished_leads: 1 }]

πŸ” Endpoints Autentikasi & Akun

POST /api/auth/login

Login untuk mendapatkan JWT Token dan detail user. Akun harus sudah di-acc (is_approved=true).

// Request Body
{ "username": "...", "password": "..." }

// Response
{ "token": "jwt_token...", "user": { "id": 1, "username": "...", "role": "marketing" } }
POST /api/auth/register

Mendaftar akun baru. Akun baru tidak bisa langsung digunakan hingga disetujui oleh super admin.

// Request Body
{ "username": "...", "password": "...", "role": "marketing|admin" }
GET /api/users Requires Super Admin

Mengambil daftar pengguna untuk halaman admin panel.

PUT /api/users/:id/approve Requires Super Admin

Menyetujui pendaftaran user agar bisa login.

πŸš€ Endpoints Kategori

GET /api/categories Supports Progress

Mengambil daftar semua kategori yang tersedia beserta total progress leads di setiap kategori.

// Response Preview
[
  { 
    "id": 1, 
    "name": "Mebel",
    "total_leads": 150,
    "finished_leads": 45
  },
  { 
    "id": 2, 
    "name": "Sekolah",
    "total_leads": 80,
    "finished_leads": 10
  }
]

πŸ—ΊοΈ Endpoints Wilayah

GET /api/cities Supports Progress

Mengambil daftar semua kota beserta jumlah total leads dan leads yang sudah selesai di kota tersebut, **difilter berdasarkan kategori**.

ParamRequiredDescription
category_idβœ… YesID dari kategori yang dipilih.
// Response Preview
[
  {
    "id": 1,
    "name": "Kota Malang",
    "total_leads": 50,
    "finished_leads": 12
  }
]
GET /api/districts Supports Progress

Mengambil daftar kecamatan untuk kota tertentu dan kategori tertentu.

ParamRequiredDescription
city_idβœ… YesID dari kota yang dipilih.
category_idβœ… YesID dari kategori yang dipilih.
GET /api/villages Supports Progress

Mengambil daftar kelurahan/desa untuk kecamatan tertentu dan kategori tertentu.

ParamRequiredDescription
district_idβœ… YesID dari kecamatan yang dipilih.
category_idβœ… YesID dari kategori yang dipilih.

πŸ“¦ Endpoints Leads (Mebel)

GET /api/leads Supports Progress

Mengambil daftar leads. Bisa difilter berdasarkan village_id dan category_id untuk alur drill-down.

ParamTypeDescription
category_idnumberFilter berdasarkan kategori (Mebel, dll).
village_idnumberFilter leads di desa tertentu.
searchstringCari nama/alamat.
pagenumberPagination (Default: 1).
// Response Preview
{
  "data": [...],
  "summary": {
    "total": 15,
    "finished": 1
  },
  "pagination": {...}
}
PUT /api/leads/:id Requires Marketing/Super Admin

Mengupdate status pengerjaan dan kendala lapangan. Sistem otomatis akan mencatat *history* update ini berdasarkan Token JWT yang dikirimkan.

// Request Body (JSON)
{
  "status": "Sudah Dikunjungi",
  "keterangan": "Kendala: Pemilik toko sedang tidak ada di tempat."
}
GET /api/leads/:id

Mengambil detail lead beserta array history dari seluruh pembaruan status dan keterangan.