Tugas Akhir
Penjelasan
Saatnya menggabungkan seluruh materi Vapor jadi satu REST API utuh: model Catatan (Fluent Model + Content) yang dimiliki seorang Pengguna (relasi @Parent/@Children), migration untuk kedua tabel, endpoint CRUD lengkap (GET list dengan pagination, GET detail, POST buat baru dengan validasi, PUT update, DELETE hapus), autentikasi lewat Pengguna.authenticator() supaya hanya pengguna yang login yang bisa membuat/mengubah/menghapus catatan miliknya sendiri, serta error handling yang konsisten lewat Abort untuk kasus data tidak ditemukan atau input tidak valid. Struktur yang disarankan: routes.php dikelompokkan dalam grup /api/catatan, dengan grup terproteksi khusus untuk operasi tulis (POST/PUT/DELETE) yang mewajibkan autentikasi, sementara GET list dan GET detail boleh diakses publik tanpa login.
Tugas
Lengkapi kerangka API Catatan di bawah: (1) tambahkan @Parent(key: "pengguna_id") var pemilik pada model Catatan, (2) buat route group /api/catatan dengan GET (list dengan .paginate(for: req)) dan GET ":id" (detail, throw Abort(.notFound) kalau nil) yang boleh diakses publik, (3) buat route group terproteksi dengan Pengguna.authenticator() + Pengguna.guardMiddleware() berisi POST (validasi lewat BuatCatatanRequest.validate lalu simpan dengan pemilik dari req.auth.require(Pengguna.self)) dan DELETE ":id" (hanya berhasil kalau catatan.$pemilik.id sama dengan id pengguna yang login, selain itu throw Abort(.forbidden)).
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Uji API ini bertahap dengan XCTVapor: mulai dari test GET list tanpa autentikasi, lalu test POST yang harus gagal 401 tanpa token, baru test POST yang berhasil dengan token pengguna valid. Memecah pengujian per skenario begini memudahkan menemukan bug autentikasi/otorisasi lebih awal.