Study
Vapor

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.

Editor Latihan

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.