Study
Rocket

Tugas Akhir

Penjelasan

Saatnya menggabungkan semua yang sudah dipelajari — routing dengan attribute macro, path/query parameter, JSON body, managed state, request guard, dan catcher — menjadi satu REST API Catatan yang utuh, versi Rocket. Sama seperti capstone Axum, ini simulasi kecil aplikasi nyata: sebuah service untuk mengelola daftar catatan (notes) dengan create, read, dan list, disimpan sementara di memori memakai managed state. Endpoint yang harus kamu buat: - `GET /notes?<limit>` — daftar semua catatan, mendukung query opsional `limit` untuk membatasi jumlah hasil - `GET /notes/<id>` — detail satu catatan, mengembalikan 404 (lewat catcher) kalau id tidak ditemukan - `POST /notes` — membuat catatan baru dari body JSON (`title`, `body`), WAJIB melewati request guard `AuthUser` (memeriksa header `x-user`) sebelum boleh membuat catatan, mengembalikan status 201 State (daftar catatan) harus dibagikan lewat `&State<Mutex<Vec<Note>>>` (atau struct pembungkus) karena datanya perlu ditambah, mengikuti pola yang sudah kamu pelajari di topik Managed State.

Tugas

Lengkapi kode REST API Catatan di bawah ini. Kamu perlu: (1) mengimplementasikan handler `list_notes` yang mendukung query `limit`, (2) mengimplementasikan handler `get_note` yang mengembalikan status 404 kalau id tidak ada (pakai `Option` sebagai Responder), (3) mengimplementasikan handler `create_note` yang WAJIB melewati guard `AuthUser`, menambahkan catatan baru ke state, dan mengembalikan status 201.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Rocket meng-implementasi `Responder` untuk `Option<T>` secara bawaan: `Some(value)` menghasilkan response normal dari `value`, sedangkan `None` otomatis menghasilkan 404 tanpa kamu perlu menulis enum error kustom seperti `AppError` di Axum — ini salah satu contoh nyata bagaimana sistem tipe Rocket menyederhanakan pola yang di Axum butuh lebih banyak boilerplate. Kunci `Mutex` tetap sesaat saja seperti di Axum untuk menghindari blocking request lain terlalu lama.