Middleware

Middleware adalah fungsi yang dijalankan sebelum handler utama — biasanya untuk autentikasi, logging, atau pembatasan akses.

Middleware Bawaan

app/middleware/auth.ns
// wajib_login(req) — verifikasi token JWT, kembalikan klaim atau nihil
fungsi wajib_login(req) {
    buat auth = header_req(req, "Authorization")
    jika auth == "" { kembalikan nihil }

    // Hapus prefix "Bearer "
    buat token = auth
    jika muat(auth, "Bearer ") { token = potong(auth, 7) }

    buat klaim = jwt_verifikasi(token, RAHASIA_JWT)
    kembalikan klaim
}

// wajib_admin(req) — verifikasi token DAN peran admin
fungsi wajib_admin(req) {
    buat klaim = wajib_login(req)
    jika klaim == nihil { kembalikan nihil }
    jika ambil(klaim, "peran") != "admin" { kembalikan nihil }
    kembalikan klaim
}

// buat_token_pengguna(user) — buat JWT token
fungsi buat_token_pengguna(user) {
    kembalikan jwt_buat({
        "id"    : ambil(user, "id"),
        "email" : ambil(user, "email"),
        "nama"  : ambil(user, "nama"),
        "peran" : ambil(user, "peran")
    }, RAHASIA_JWT, EXPIRE_JWT)
}

Cara Menggunakan di Kontroler

Contoh Penggunaan
// Rute butuh login (pengguna biasa)
fungsi aksi_profil(req) {
    buat klaim = wajib_login(req)
    jika klaim == nihil {
        kembalikan resp_error("Token tidak valid atau tidak ada")
    }
    // klaim berisi: id, email, nama, peran
    kembalikan resp_ok(klaim, "Profil berhasil diambil")
}

// Rute butuh admin
fungsi aksi_hapus_pengguna(req) {
    buat klaim = wajib_admin(req)
    jika klaim == nihil {
        kembalikan resp_error("Hanya admin yang bisa mengakses ini")
    }
    // Lanjutkan proses...
}

Membuat Middleware Kustom

Contoh: Rate Limiter Sederhana
// app/middleware/ratelimit.ns
buat hitungan_ip = {}

fungsi batasi_request(req, maks_per_menit) {
    buat ip = header_req(req, "X-Forwarded-For")
    jika ip == "" { ip = "127.0.0.1" }

    buat sekarang  = waktu_sekarang()
    buat kunci_ip  = ip + "_" + format_waktu(sekarang, "2006-01-02T15:04")
    buat hitungan  = ambil(hitungan_ip, kunci_ip)

    jika hitungan == nihil { hitungan = 0 }
    jika hitungan >= maks_per_menit {
        kembalikan salah  // tolak
    }

    hitungan_ip = atur(hitungan_ip, kunci_ip, hitungan + 1)
    kembalikan benar   // izinkan
}

// Gunakan di kontroler:
// jika !batasi_request(req, 60) {
//     kembalikan resp_error("Terlalu banyak request")
// }