MATERI 27 DARI 28
Proyek akhir: membangun API catatan aman dengan bantuan AI
Gabungkan requirement, prompt workflow, validation, authorization, database, test, dan deployment dalam aplikasi kecil.
Tujuan pembelajaran
- Menyusun requirement capstone.
- Menerapkan CRUD terotorisasi.
- Membuktikan kontrol keamanan dengan test.
Konsep utama
Scope proyek
Pengguna login dapat membuat, membaca, mengubah, dan menghapus catatannya sendiri.
Security boundary
User ID berasal dari session terverifikasi, bukan request body.
Definition of done
Test ownership, CSRF/API auth, injection, validation, rate limit, dan backup.
Alur kerja teknis
- Tulis requirement dan threat model.
- Minta AI membuat rencana vertical slices.
- Implementasi test-first per endpoint.
- Review diff dan jalankan security regression suite.
- Deploy ke staging dengan backup dan health check.
Contoh implementasi
Service ownership Python
def update_note(db, actor_id, note_id, title):
if not title or len(title) > 120:
raise ValueError("Judul tidak valid")
updated = db.execute(
"UPDATE notes SET title=? WHERE id=? AND owner_id=?",
(title, note_id, actor_id),
)
if updated.rowcount != 1:
raise PermissionError("Catatan tidak tersedia")Route ownership Node.js
app.put("/notes/:id", requireUser, async (req, res) => {
const title = String(req.body.title ?? "").trim();
if (!title || title.length > 120) return res.status(422).json({ error: "invalid_title" });
const result = await notes.updateOne({ _id: req.params.id, ownerId: req.user.id }, { $set: { title } });
if (!result.matchedCount) return res.sendStatus(404);
res.sendStatus(204);
});Route ownership PHP
$note = $repo->findOwnedNote($noteId, $sessionUserId);
if (!$note) { http_response_code(404); exit; }
$title = trim((string)($_POST['title'] ?? ''));
if ($title === '' || mb_strlen($title) > 120) { http_response_code(422); exit; }
$repo->updateOwnedNote($noteId, $sessionUserId, $title);Aspek keamanan
- Gunakan fixture dummy dan database development.
- Pastikan user A tidak bisa mengakses note user B.
- Jangan memasukkan token nyata dalam README atau test.
Kesalahan umum
- Menerima kode AI tanpa membaca diff dan memahami alur data.
- Menguji hanya happy path dan mengabaikan input salah atau batas nilai.
- Menyimpan secret, token, atau data nyata di prompt dan source code.
Pengujian dan verifikasi
- Jalankan contoh dengan input normal.
- Ulangi dengan input kosong, tipe salah, dan nilai batas.
- Pastikan error tidak membocorkan secret atau detail internal.
Latihan
- Modifikasi contoh dengan satu kebutuhan baru dan tulis acceptance criteria-nya.
- Tambahkan satu negative test lalu jelaskan risiko yang dicegah.
Checklist
- Tujuan dan batas pekerjaan jelas.
- Input divalidasi di server.
- Secret tidak berada di source/prompt.
- Test lulus dan diff sudah dibaca.
Rangkuman
Gabungkan requirement, prompt workflow, validation, authorization, database, test, dan deployment dalam aplikasi kecil.