Use Cases

Mempercepat API Development dengan Claude Code: Dari Desain hingga Testing

Mempercepat API Development menggunakan Claude Code. Dari Desain hingga Testing. Dilengkapi contoh kode praktis.

Menghilangkan Bottleneck API Development

API development melibatkan banyak task berulang — desain endpoint, validasi, error handling, dan pembuatan test. Claude Code bisa menangani semua ini dengan cepat dan efisien.

Generate Endpoint Secara Batch

Buat semua CRUD endpoint sekaligus dengan Claude Code.

> Buat RESTful API untuk resource berikut.
> Framework: Express + TypeScript.
>
> Resource: Task
> Fields: id, title, description, status, dueDate, createdAt, updatedAt
> Endpoints: GET /tasks, GET /tasks/:id, POST /tasks, PUT /tasks/:id, DELETE /tasks/:id
> Validasi: gunakan zod
> Format respons: { data, meta, error }

Contoh Kode yang Di-generate

import { Router, Request, Response } from "express";
import { z } from "zod";

const TaskSchema = z.object({
  title: z.string().min(1).max(200),
  description: z.string().optional(),
  status: z.enum(["todo", "in_progress", "done"]).default("todo"),
  dueDate: z.string().datetime().optional(),
});

const router = Router();

router.get("/tasks", async (req: Request, res: Response) => {
  const page = Number(req.query.page) || 1;
  const limit = Number(req.query.limit) || 20;
  const offset = (page - 1) * limit;

  const tasks = await taskRepository.findAll({ offset, limit });
  const total = await taskRepository.count();

  res.json({
    data: tasks,
    meta: { page, limit, total, totalPages: Math.ceil(total / limit) },
  });
});

router.post("/tasks", async (req: Request, res: Response) => {
  const parsed = TaskSchema.safeParse(req.body);
  if (!parsed.success) {
    return res.status(400).json({
      error: { message: "Validation error", details: parsed.error.issues },
    });
  }

  const task = await taskRepository.create(parsed.data);
  res.status(201).json({ data: task });
});

export default router;

Generate dari OpenAPI Specs

Jika sudah ada spesifikasi API, kamu bisa meneruskannya untuk men-generate implementasi.

> Implementasikan semua endpoint berdasarkan definisi di openapi.yaml.
> Sesuaikan validasi dengan definisi schema.
> Buat juga test untuk setiap endpoint.

Auto-Generate API Test

Membuat implementasi dan test secara bersamaan memastikan kualitas.

> Buat test untuk endpoint POST /tasks.
> Cakup success case, error case, dan boundary value.
import request from "supertest";
import { app } from "../app";

describe("POST /tasks", () => {
  it("mengembalikan 201 dengan data valid", async () => {
    const res = await request(app)
      .post("/tasks")
      .send({ title: "Test task", status: "todo" });

    expect(res.status).toBe(201);
    expect(res.body.data.title).toBe("Test task");
    expect(res.body.data.id).toBeDefined();
  });

  it("mengembalikan 400 ketika title kosong", async () => {
    const res = await request(app)
      .post("/tasks")
      .send({ title: "", status: "todo" });

    expect(res.status).toBe(400);
    expect(res.body.error).toBeDefined();
  });

  it("mengembalikan 400 untuk status tidak valid", async () => {
    const res = await request(app)
      .post("/tasks")
      .send({ title: "Task", status: "invalid" });

    expect(res.status).toBe(400);
  });
});

Untuk strategi desain test yang detail, lihat Panduan Lengkap Strategi Testing.

Generate Middleware

Middleware umum untuk authentication, rate limiting, logging, dan lainnya juga bisa di-generate.

> Buat middleware JWT authentication.
> - Ekstrak token dari header Authorization
> - Periksa expiration
> - Set decoded user info pada req.user
> - Kembalikan HTTP status yang sesuai saat error
import { Request, Response, NextFunction } from "express";
import jwt from "jsonwebtoken";

interface AuthRequest extends Request {
  user?: { id: string; email: string; role: string };
}

export function authenticate(
  req: AuthRequest,
  res: Response,
  next: NextFunction
) {
  const header = req.headers.authorization;

  if (!header?.startsWith("Bearer ")) {
    return res.status(401).json({ error: { message: "Authentication required" } });
  }

  try {
    const token = header.slice(7);
    const decoded = jwt.verify(token, process.env.JWT_SECRET!) as AuthRequest["user"];
    req.user = decoded;
    next();
  } catch (err) {
    if (err instanceof jwt.TokenExpiredError) {
      return res.status(401).json({ error: { message: "Token expired" } });
    }
    return res.status(403).json({ error: { message: "Invalid token" } });
  }
}

Unified Error Handling

Untuk mendesain respons error yang konsisten di seluruh API, lihat Pola Desain Error Handling.

Integrasi Database

Repository layer dan migrasi juga bisa dibuat secara bersamaan. Untuk mengotomatisasi operasi database, lihat Otomasi DB Migration.

Summary

Kunci API development dengan Claude Code adalah mendefinisikan spesifikasi yang jelas dan memberikan instruksi yang komprehensif. Biarkan Claude Code menangani task CRUD yang berulang agar kamu bisa fokus pada desain business logic.

Untuk best practice API, lihat dokumentasi resmi Anthropic dan panduan resmi Express.

#Claude Code #API development #REST API #Express #backend