Lewati ke konten utama
menjadi.dev
Chapter 17.20 Backend Lanjutan

Supabase: Edge Functions dan Production

Serverless functions, triggers, dan deployment best practices

Tujuan Pembelajaran

  • Bisa membuat Edge Functions
  • Mengerti database triggers
  • Mengerti production deployment dan security

Analogi

Diagram

      Edge Functions:
├── Deno runtime
├── TypeScript native
├── Hono-compatible
└── Deploy globally

Triggers:
└── Database webhooks → Edge Function
    

Edge Functions memungkinkan logic serverless tanpa manage server

Penjelasan Konsep

Fitur terakhir Supabase yang akan kita pelajari adalah Edge Functions — serverless functions yang berjalan dekat dengan user (edge network). Ini memungkinkan logic backend tanpa manage server sendiri.

Supabase Edge Functions

Edge Functions menggunakan Deno runtime dan berjalan di edge network Supabase. Keunggulannya:

  1. Low latency: Berjalan di edge node terdekat dengan user
  2. TypeScript native: Deno support TypeScript out-of-the-box
  3. Hono compatible: Bisa pakai Hono untuk routing
  4. Database access: Akses Supabase database langsung
  5. Triggers: Dipanggil oleh database events

Membuat Edge Function

# Create function
supabase functions new hello

# Implement (functions/hello/index.ts)
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts';

serve(async (req) => {
  const { name } = await req.json();
  return new Response(JSON.stringify({ message: `Hello ${name}!` }), {
    headers: { 'Content-Type': 'application/json' },
  });
});

# Deploy
supabase functions deploy hello

Edge Function dengan Hono

Karena Edge Functions menggunakan standard fetch API, kamu bisa pakai Hono:

import { Hono } from 'npm:hono';
const app = new Hono();
app.get('/hello',

(c) => c.json({ message: 'Hello from Edge!' }));
Deno.serve(app.fetch);

Database Triggers

Triggers memungkinkan kamu menjalankan code saat event database terjadi:

CREATE FUNCTION notify_new_todo() RETURNS TRIGGER AS $$
BEGIN
  PERFORM net.http_post(
    url := 'https://<project>.supabase.co/functions/v1/notify',
    body := json_build_object('todo', row_to_json(NEW))
  );
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER todo_created
AFTER INSERT ON todos FOR EACH ROW
EXECUTE FUNCTION notify_new_todo();

Production Checklist

  1. RLS policies: Pastikan semua tabel punya RLS
  2. API limits: Monitor usage dan rate limits
  3. Backups: Supabase auto-backup daily (paid tier)
  4. Migrations: Gunakan supabase db push untuk schema changes
  5. Environment: Gunakan branches untuk staging/production
  6. Monitoring: Dashboard analytics di Supabase console

Contoh Kode

typescript
// Edge Function dengan Hono dan Supabase
// functions/api/index.ts
import { createClient } from 'npm:@supabase/supabase-js@2';
import { Hono } from 'npm:hono';
import { cors } from 'npm:hono/cors';

const app = new Hono();
app.use('*', cors());

app.use('*', async (c, next) => {
  const supabase = createClient(
    Deno.env.get('SUPABASE_URL')!,
    Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!,
  );
  c.set('supabase', supabase);
  await next();
});

app.get('/todos', async (c) => {
  const supabase = c.get('supabase');
  const { data, error } = await supabase.from('todos').select('*');
  if (error) return c.json({ error: error.message }, 500);
  return c.json(data);
});

app.post('/todos', async (c) => {
  const supabase = c.get('supabase');
  const body = await c.req.json();
  const { data, error } = await supabase.from('todos').insert(body).select();
  if (error) return c.json({ error: error.message }, 500);
  return c.json(data, 201);
});

Deno.serve(app.fetch);

Penjelasan Kode

Service role key bypass RLS — hanya untuk server-side. npm: specifier untuk npm packages di Deno.

Prompt AI

Buat Edge Function untuk webhook: terima event dari payment gateway, update database berdasarkan payment status.

Pertanyaan Reflektif

Edge Functions punya cold start. Untuk latency critical, pertimbangkan keep-warm strategies.