Kembali ke Studio

Blueprint Backend & AI API

Backend API-first, cloud-native, event-driven, dan queue-based: 16 service modular, 20 tabel inti dengan soft delete, 21 endpoint REST v1, dan adapter AI yang dapat ditukar tanpa menyentuh logika aplikasi.

Service
16
Tabel inti
20
Endpoint v1
21
Antrean
7

Peta service

Stateless, horizontal scaling, REST untuk publik & gRPC antar-service

Authentication Service

REST

JWT, refresh token, OAuth Google, email login, RBAC.

Project Service

REST

CRUD proyek, metadata, lifecycle, soft delete.

AI Workflow Service

gRPC

Orkestrasi antrean, dependensi tahap, retry, resume.

Story Service

gRPC

Analisis naskah, optimasi, storyboard.

Character Service

gRPC

Character Bible & Environment Library.

Image Service

gRPC

Prompt gambar, render, konsistensi karakter.

Video Service

gRPC

Motion prompt, image-to-video, klip per scene.

Voice Service

gRPC

TTS multi-bahasa, emosi, pitch, speed.

Music Service

gRPC

Pemilihan/generasi musik dan ducking.

Subtitle Service

gRPC

Subtitle sinkron, SRT/VTT, terjemahan.

Thumbnail Service

REST

Variasi thumbnail dan skor CTR.

SEO Service

REST

Judul, deskripsi, tag, keyword, hook.

Rendering Service

gRPC

Komposisi timeline, transcode, multi-resolusi.

Notification Service

WS/SSE

Event realtime ke klien.

Analytics Service

REST

Metrik proyek, biaya, performa provider.

Admin Service

REST

Kuota, moderasi, feature flag, rotasi kunci.

Struktur database

PostgreSQL + Prisma · setiap tabel memakai kolom dasar berikut

id uuid pk default gen_random_uuid()
created_at timestamptz default now()
updated_at timestamptz default now()
status text not null
deleted_at timestamptz null

REST API /api/v1

Validasi request/response konsisten, job async mengembalikan 202 + jobId

POST/api/v1/projectsbearer · 30/menit

Membuat proyek dan Project Memory baru.

req { title, narration, language, style } → 201 { project } · err: 422 VALIDATION_ERROR, 429 RATE_LIMITED

GET/api/v1/projectsbearer · 120/menit

Daftar proyek milik pengguna (paginated, filter status).

req ?page&limit&status → 200 { items, page, total } · err: 401 UNAUTHORIZED

GET/api/v1/projects/{id}bearer · 120/menit

Detail proyek + snapshot Project Memory.

200 { project, memory } · err: 403 FORBIDDEN, 404 NOT_FOUND

PUT/api/v1/projects/{id}bearer · 60/menit

Memperbarui metadata/narasi proyek.

req { title?, narration?, style? } → 200 { project } · err: 409 CONFLICT_VERSION, 422 VALIDATION_ERROR

DELETE/api/v1/projects/{id}bearer · 30/menit

Soft delete proyek (deleted_at).

204 · err: 403 FORBIDDEN

POST/api/v1/script/analyzebearer · 20/menit

Menjalankan Script Analyst + Story Optimizer.

req { projectId } → 202 { jobId } · err: 409 STAGE_ALREADY_RUNNING

POST/api/v1/storyboard/generatebearer · 20/menit

Membuat 10 scene × 2 detik.

req { projectId } → 202 { jobId } · err: 424 MISSING_DEPENDENCY

POST/api/v1/images/generatebearer · 10/menit

Render gambar per scene (batch atau tunggal).

req { projectId, sceneIds?, strategy? } → 202 { jobId } · err: 402 QUOTA_EXCEEDED, 451 CONTENT_BLOCKED

POST/api/v1/video/generatebearer · 6/menit

Image-to-video per scene dengan motion prompt.

req { projectId, sceneIds? } → 202 { jobId } · err: 402 QUOTA_EXCEEDED, 504 PROVIDER_TIMEOUT

POST/api/v1/voice/generatebearer · 20/menit

Voice over dengan konfigurasi emosi & bahasa.

req { projectId, voice } → 202 { jobId } · err: 422 VALIDATION_ERROR

POST/api/v1/music/generatebearer · 20/menit

Memilih atau menghasilkan musik latar.

req { projectId, mood? } → 202 { jobId } · err: 424 MISSING_DEPENDENCY

POST/api/v1/subtitle/generatebearer · 20/menit

Subtitle sinkron + terjemahan opsional.

req { projectId, locales? } → 202 { jobId } · err: 424 MISSING_DEPENDENCY

POST/api/v1/thumbnail/generatebearer · 10/menit

Variasi thumbnail beserta skor CTR.

req { projectId, variants? } → 202 { jobId } · err: 402 QUOTA_EXCEEDED

POST/api/v1/seo/generatebearer · 20/menit

Paket SEO YouTube lengkap.

req { projectId } → 200 { seo } · err: 424 MISSING_DEPENDENCY

POST/api/v1/render/startbearer · 6/menit

Komposisi master timeline dan mulai render.

req { projectId, resolution, format } → 202 { jobId } · err: 409 RENDER_IN_PROGRESS

GET/api/v1/render/statusbearer · 600/menit

Status job render, progres, dan ETA.

req ?jobId → 200 { status, progress, etaSec } · err: 404 JOB_NOT_FOUND

POST/api/v1/exportbearer · 6/menit

Export MP4/MOV/WebM pada 720p–4K.

req { projectId, targets[] } → 202 { jobId } · err: 402 QUOTA_EXCEEDED

POST/api/v1/uploads/initbearer · 60/menit

Inisiasi chunk upload (resumable) + signed URL.

req { filename, size, mime, checksum } → 201 { uploadId, chunkUrls } · err: 413 FILE_TOO_LARGE, 415 UNSUPPORTED_MEDIA

POST/api/v1/uploads/{id}/completebearer · 60/menit

Finalisasi upload: virus scan, kompresi, versioning.

200 { asset } · err: 422 CHECKSUM_MISMATCH, 451 INFECTED_FILE

GET/api/v1/events/streambearer · 5 koneksi/pengguna

SSE realtime: render, aset siap, error, retry, selesai.

200 text/event-stream · err: 401 UNAUTHORIZED

GET/api/v1/analytics/summarybearer+apikey · 60/menit

Metrik proyek, biaya, dan performa provider.

req ?from&to → 200 { projects, successRate, avgRenderSec, costUsd } · err: 403 FORBIDDEN

AI Provider Adapter

Satu antarmuka per kapabilitas: adapter, retry, timeout, validasi, error mapping

Estimasi biaya per video: $1.138
AdapterKapabilitasBiayaKualitasp95Timeout/Retry
llm.gateway.flashllm$0.002923.2s45s / 3×
llm.gateway.prollm$0.011977.4s60s / 3×
image.gateway.nanoimage$0.012909.0s90s / 4×
image.gateway.proimage$0.0389616.0s120s / 3×
video.img2vid.fastvideo$0.0908842.0s180s / 4×
video.img2vid.cinevideo$0.2409578.0s240s / 3×
tts.gateway.multitts$0.004915.2s60s / 3×
stt.gateway.whisperstt$0.003934.1s60s / 2×
translate.llmtranslation$0.001902.1s30s / 2×
music.librarymusic$0.000840.8s15s / 2×
music.generativemusic$0.0609328.0s120s / 2×
thumbnail.gatewaythumbnail$0.0149211.0s90s / 3×

PROVIDER_RATE_LIMITED · HTTP 429

retryableBackoff eksponensial + failover provider.

PROVIDER_QUOTA_EXCEEDED · HTTP 402

non-retryableEskalasi billing, hentikan job.

PROVIDER_TIMEOUT · HTTP 504

retryableRetry pada adapter fallback.

PROVIDER_INVALID_INPUT · HTTP 422

non-retryableValidasi Zod gagal sebelum kirim.

PROVIDER_CONTENT_BLOCKED · HTTP 451

non-retryableRegenerasi prompt oleh Prompt Engineer AI.

PROVIDER_UNAVAILABLE · HTTP 503

retryableCircuit breaker terbuka 60 detik.

INTERNAL_ADAPTER_ERROR · HTTP 500

retryableLog + alert on-call.

Workflow engine berbasis antrean

BullMQ + Redis · idempoten, resumable, dead-letter queue

q.story

concurrency 32

Script Analysis, Story Optimization, Storyboard

q.design

concurrency 24

Character, Environment, Prompt Generation

q.image

concurrency 64

Image Generation (10 scene paralel)

q.video

concurrency 32

Video Prompt, Video Generation

q.audio

concurrency 32

Voice, Music, SFX, Subtitle

q.render

concurrency 16

Composition, Thumbnail, SEO, Render, Export

q.dlq

concurrency 4

Dead-letter: job gagal permanen, tunggu tindakan manual

Setiap job menyimpan projectId, stage, dan attempts di database — restart server tidak menghilangkan status, dan hanya tahap yang gagal yang dijalankan ulang (bukan seluruh pipeline).

Upload & storage

Supabase Storage / S3-compatible / Cloudinary via satu storage adapter

Caching & notifikasi realtime

Redis namespace + SSE/WebSocket event

Redis

  • session:{userId}Sesi & refresh token metadata · TTL 7 hari
  • workflow:{projectId}State workflow & posisi resume · TTL 24 jam
  • queue:{queueName}:statsKedalaman antrean & throughput · TTL 30 detik
  • prompt:{hash}Prompt sementara & hasil dedup · TTL 6 jam
  • thumb:{assetId}Cache thumbnail terkompresi · TTL 30 hari
  • api:{route}:{hash}Response cache endpoint GET · TTL 60 detik
  • project:{projectId}Snapshot Project Memory · TTL 10 menit

Event realtime

render.startedrender.finishedimage.readyvideo.readyjob.errorjob.retryexport.completeproject.completed

Strategi keamanan

Defense in depth dari edge sampai database

Monitoring, logging & analytics

Prometheus + Grafana · Winston → Loki · trace terkorelasi requestId

MetrikTargetAlert
api_request_duration_secondsp95 < 300 msp95 > 800 ms selama 5 menit
queue_depth< 500 job> 2000 job selama 10 menit
ai_provider_latency_secondsp95 sesuai SLA adapter3× baseline
render_duration_secondsp95 < 180 sp95 > 420 s
job_success_rate> 98%< 95% dalam 15 menit
storage_usage_bytes< 80% kuota> 90% kuota
db_connections_active< 70% pool> 90% pool
cost_per_project_usdsesuai budget paket> 150% baseline

Analytics menghitung jumlah proyek, video sukses, rata-rata waktu render, provider tercepat & terakurat, penggunaan API, serta biaya per proyek dan per pengguna dari tabel logs + render_jobs.

Deployment & CI/CD

Docker → Kubernetes · canary + rollback otomatis

  1. 1.Push ke GitHub memicu GitHub Actions.
  2. 2.Lint, typecheck, unit & integration test, contract test OpenAPI.
  3. 3.Security scan: dependency audit, SAST, secret scanning, image scan.
  4. 4.Build image Docker multi-stage, tag imutabel per commit.
  5. 5.Deploy bertahap (canary 10% → 50% → 100%) ke Kubernetes.
  6. 6.Health check + smoke test; gagal → rollback otomatis ke revisi sebelumnya.
  7. 7.Migrasi database forward-only dengan expand/contract agar zero-downtime.
  8. 8.Backup harian (PITR 7 hari) dan mingguan (retensi 90 hari) untuk DB, aset, konfigurasi.

Catatan implementasi pada stack ini

Jalur tercepat dari blueprint ke produksi di Lovable