Tugas Akhir
Penjelasan
Saatnya menggabungkan semua yang sudah dipelajari — routing dasar, path/query extractor, JSON body, shared state, error handling, dan middleware — menjadi satu REST API Catatan yang utuh. Anggap ini simulasi kecil dari aplikasi nyata: sebuah service untuk mengelola daftar catatan (notes) dengan operasi create, read, dan list, disimpan sementara di memori memakai `State` (di aplikasi produksi, ini akan diganti database sungguhan seperti yang sudah kamu pelajari di topik integrasi sqlx). Endpoint yang harus kamu buat: - `GET /notes` — daftar semua catatan, mendukung query `?limit=N` untuk membatasi jumlah hasil - `GET /notes/{id}` — detail satu catatan, mengembalikan 404 (lewat `AppError`) kalau id tidak ditemukan - `POST /notes` — membuat catatan baru dari body JSON (`title`, `body`), mengembalikan status 201 Semua endpoint harus melalui `TraceLayer` supaya request tercatat di log, dan state (daftar catatan) harus dibagikan lewat `Arc<Mutex<Vec<Note>>>` karena datanya perlu ditambah (di-mutasi), bukan cuma dibaca.
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 `AppError::NotFound` kalau id tidak ada, (3) mengimplementasikan handler `create_note` yang menambahkan catatan baru ke state dan mengembalikan status 201.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Kunci `Mutex` dengan `.lock().unwrap()` HANYA sesaat, lalu segera lepas (biarkan keluar scope) sebelum melakukan operasi async lain — menahan lock terlalu lama di handler async bisa membuat request lain nge-block menunggu giliran. Untuk kasus nyata dengan banyak concurrent request, pertimbangkan struktur data yang lebih ramah async atau langsung pindah ke database sungguhan seperti di topik integrasi sqlx.