ASDEV logo

ASDEV

Asdev Solution Technology

IntermediateAPI

Pelatihan Full-Stack Modern Part 2: Membangun RESTful API Aman dengan JWT Authentication & RBAC

Bagian 2 dari seri pelatihan full-stack ASDEV: Mengimplementasikan endpoint Route Handler Next.js 15 yang aman, validasi payload Zod, dan enkripsi token JWT.

Ahmad Subadri (Lead Engineer)15 menit baca22 Oktober 20262 views
#Part 2#Pelatihan#REST API#JWT#RBAC#Zod

Melanjutkan Seri Pelatihan Full-Stack ASDEV (Part 2/3)

Pada Part 1, kita telah berhasil merancang fondasi skema database PostgreSQL dengan Prisma ORM. Kini pada Part 2, fokus kita adalah membangun lapisan backend API (Application Programming Interface) yang kokoh, cepat, dan aman dari ancaman manipulasi request.


1. Validasi Input Payload Menggunakan Zod

Jangan pernah mempercayai data mentah dari pengguna. Buat skema validasi deklaratif di src/validations/order.schema.ts:

typescript
import { z } from 'zod';

export const createOrderSchema = z.object({
  totalAmount: z.number().positive('Total nominal harus bernilai positif'),
  items: z.array(
    z.object({
      productName: z.string().min(2),
      quantity: z.number().int().min(1),
      price: z.number().positive(),
    })
  ).min(1, 'Pesanan minimal berisi 1 item barang'),
});

2. Membangun Route Handler Next.js 15 (src/app/api/orders/route.ts)

Gunakan fungsi Route Handler yang mengembalikan HTTP Response berformat JSON dengan status code yang tepat:

typescript
import { NextRequest, NextResponse } from 'next/server';
import { db } from '@/lib/db';
import { getAuthUser } from '@/lib/auth';
import { createOrderSchema } from '@/validations/order.schema';

export async function POST(req: NextRequest) {
  try {
    // 1. Verifikasi Session Token Pengguna
    const user = await getAuthUser(req);
    __MD_HL_25__ (!user) {
      return NextResponse.json({ success: false, message: 'Unauthorized' }, { status: 401 });
    }

    // 2. Validasi Struktur Payload
    const body = await req.json();
    const parsed = createOrderSchema.safeParse(body);
    __MD_HL_31__ (!parsed.success) {
      return NextResponse.json({ success: false, errors: parsed.error.issues }, { status: 400 });
    }

    // 3. Simpan ke Database PostgreSQL secara Atomik
    const newOrder = await db.order.create({
      data: {
        orderNumber: `ORD-${Date.now()}-${Math.floor(Math.random() * 1000)}`,
        totalAmount: parsed.data.totalAmount,
        userId: user.id,
      },
    });

    return NextResponse.json({ success: true, data: newOrder }, { status: 201 });
  } __MD_HL_38__ (err) {
    console.error('Order creation error:', err);
    return NextResponse.json({ success: false, message: 'Internal Server Error' }, { status: 500 });
  }
}

Tips Keamanan Backend:

  • Idempotency Key: Sertakan header X-Idempotency-Key untuk transaksi keuangan agar penekanan tombol ganda (double click) oleh user tidak memicu tagihan ganda.
  • Rate Limiting: Terapkan pembatasan frekuensi request untuk melindungi endpoint dari serangan Brute-Force.

Langkah Selanjutnya: Pada Part 3 (Final), kita akan menyatukan API ini ke frontend Next.js 15 dengan UI responsif, state management, dan konfigurasi deployment Docker di Virtual Private Server (VPS)!

Siap mendalami topik lainnya?

Koleksi tutorial arsitektur, clean code, dan DevOps kami diperbarui secara berkala.

Kembali ke Katalog Tutorial