Query Parameter & Pagination
Penjelasan
Endpoint yang mengembalikan banyak data (mis. daftar semua catatan) sebaiknya mendukung pagination supaya tidak mengirim seluruh isi tabel sekaligus saat datanya sudah besar. Fluent menyediakan .paginate(for: req) yang otomatis membaca query parameter standar ?page=&per= dari request, lalu mengembalikan Page<Model> berisi data halaman tersebut plus metadata (total item, halaman saat ini, dst) — semuanya sudah conform ke Content sehingga bisa langsung di-return dari handler. Untuk filter dan sorting berbasis query parameter kustom (bukan pagination), kamu baca lewat req.query[Tipe.self, at: "nama"] seperti yang sudah dibahas di topik Request & Response, lalu terapkan ke query builder Fluent lewat .filter(...) atau .sort(...) sebelum memanggil .paginate(for:) atau .all().
Contoh Konsep
import Fluent
import Vapor
func routes(_ app: Application) throws {
app.get("catatan") { req async throws -> Page<Catatan> in
var query = Catatan.query(on: req.db)
if let judul = req.query[String.self, at: "judul"] {
query = query.filter(\.$judul == judul)
}
return try await query
.sort(\.$judul)
.paginate(for: req)
}
}
// Contoh pemanggilan:
// GET /catatan?page=2&per=10
// GET /catatan?judul=Belanja&page=1&per=5
Praktikum
Buat route app.get("pengguna") yang mengembalikan Page<Pengguna>, mendukung filter opsional query parameter "nama" (kalau ada, tambahkan .filter), dan memanggil .paginate(for: req) di akhir.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Selalu beri batas maksimum ukuran halaman (per) di sisi server (Fluent punya default yang wajar), supaya client nakal tidak bisa meminta ?per=999999 dan membebani database dalam satu query.