Dalam lanskap rekayasa perangkat lunak modern, otomatisasi alur kerja (workflow automation) dan orkestrasi tugas (task orchestration) merupakan pilar penting bagi efisiensi operasional perusahaan. Perusahaan skala menengah hingga besar membutuhkan platform yang tangguh untuk mengintegrasikan berbagai API eksternal, mengeksekusi skrip komputasi kustom, menetapkan jeda waktu (delay), serta mengambil keputusan dinamis berdasarkan evaluasi kondisi (conditional branching) secara terarah dan terjadwal.
Platform orkestrasi populer seperti Zapier (yang mengedepankan kemudahan integrasi API konsumen) dan GitHub Actions (yang mengedepankan ketangguhan pipeline eksekusi berbasis kode) menjadi inspirasi utama bagi lahirnya FlowForge. FlowForge dirancang sebagai simulasi platform orkestrasi alur kerja real-time berbasis multi-tenant yang aman, observable, dan berkinerja tinggi.
Assessment ini dikembangkan sebagai bagian dari evaluasi kompetensi rekayasa perangkat lunak (Technical Assessment) untuk posisi Fullstack Engineer. Proyek ini tidak hanya menguji kemampuan penulisan kode fungsional, melainkan juga menguji pemahaman kandidat pada 7 dimensi kompetensi rekayasa perangkat lunak:
- Emerging Tech & AI: Pemanfaatan Large Language Models (LLM) untuk antarmuka generatif alur kerja.
- Core Programming: Desain struktur data graf DAG, deteksi siklus, dan algoritma sorting dependensi.
- Networking & Security: Isolasi data ketat antar organisasi (tenant) dan kontrol akses berbasis peran (RBAC).
- System Design & Real-Time: Orkestrasi tugas latar belakang asinkronus dan komunikasi server-sent real-time.
- Database: Rancangan skema relasional transaksional dan versioning data yang aman.
- DevOps & Observability: Strategi deployment lokal terintegrasi, logging tertelusuri (
request_id), dan pipeline CI/CD. - Software Engineering Practices: Dokumentasi teknis, riwayat commit Git terstandardisasi, serta penulisan laporan audit berkala.
Pengembangan sistem FlowForge menjawab beberapa tantangan teknis spesifik sebagai berikut:
- Eksekusi Graf Terarah Bebas Siklus (DAG Engine): Alur kerja didefinisikan sebagai graf terarah. Bagaimana merancang mesin eksekusi yang mampu mendeteksi adanya siklus (cycles) secara dinamis agar tidak terjadi eksekusi tanpa batas (infinite loops), serta mengurutkan prioritas eksekusi tugas paralel dan berurutan secara logis.
- Isolasi Data Multi-Tenant Tingkat Database: Aplikasi digunakan secara bersamaan oleh banyak organisasi (tenant) berbeda. Bagaimana memastikan bahwa setiap transaksi data, eksekusi alur kerja, dan pembacaan log dari tenant A sama sekali tidak dapat diakses atau diubah oleh tenant B (kebocoran data) tanpa membuat database terpisah per tenant.
- Visualisasi Status Real-Time yang Efisien: Dashboard frontend perlu menampilkan status eksekusi per langkah alur kerja secara langsung. Bagaimana mengirimkan sinyal perubahan status dari backend worker asinkronus ke layar pengguna secara instan (<2 detik) tanpa membebani browser dengan pemanggilan HTTP polling berulang.
- Robustness AI Generator: Antarmuka berbasis AI Gemini digunakan untuk menerjemahkan bahasa alami pengguna menjadi skema JSON DAG alur kerja. Bagaimana menangani respons AI yang tidak konsisten (misalnya, keluaran dibungkus kode markdown atau teks tambahan) agar tidak merusak fungsi parser JSON backend.
- Mengimplementasikan DAG Engine di backend yang mampu melakukan validasi siklus menggunakan algoritma DFS 3-warna, melakukan pengurutan dependensi menggunakan Kahn's Algorithm, serta mengeksekusi langkah alur kerja secara paralel dan berurutan.
- Membangun sistem otorisasi multi-tenant yang tangguh dengan memanfaatkan JWT token, dekorator
@Roles(), guard otorisasi RBAC (Admin, Editor, Viewer), sertaAsyncLocalStorageuntuk isolasi query database secara implisit. - Membuat jalur komunikasi real-time dua arah menggunakan Socket.io WebSocket Gateway untuk memancarkan perubahan status eksekusi langkah langsung dari BullMQ Worker ke layar visualizer ReactFlow frontend.
- Merancang antarmuka Workflow Generator berbasis AI Google Gemini dengan parser tangguh yang mampu memotong blok kode Markdown dan mengekstrak JSON valid secara presisi.
- Memperbarui estetika antarmuka frontend menjadi Minimalist Editorial bersih menggunakan paduan font profesional (Plus Jakarta Sans & Inter), menipiskan elemen visual, serta menerapkan client-side router kustom yang menyinkronkan alamat URL browser secara dinamis.
- Efisiensi Operasional Organisasi: Memungkinkan otomatisasi proses bisnis berulang (seperti sinkronisasi inventaris harian, pengiriman email konfirmasi terkomputasi, dsb.) secara terjadwal (cron) maupun terpicu webhook eksternal secara otomatis.
- Pengalaman Pengguna yang Intuitif: Pengguna non-teknis dapat dengan mudah merancang dan merekayasa otomasi alur kerja tanpa perlu memahami sintaks JSON, cukup menggunakan instruksi bahasa manusia biasa atau memuat template siap pakai.
- Kepatuhan Standar Rekayasa Tinggi: Memastikan proyek aman dari kesalahan kode berkat pengujian otomatis (Unit, Integration, dan E2E), linting format kode terstandarisasi, dan dokumentasi arsitektur infrastruktur cloud yang matang.
Proyek diselesaikan melalui metodologi iteratif berbasis fitur (Feature-Driven Development) yang dibagi menjadi beberapa fase terstruktur:
gantt
title Metodologi Pengembangan Proyek FlowForge
dateFormat YYYY-MM-DD
section Fase 1: Fondasi
Setup Monorepo & NestJS Skeleton :active, 2026-07-13, 1d
Skema Database & Migration :active, 2026-07-13, 1d
DAG Parser, DFS & Topological Sort :active, 2026-07-13, 1d
section Fase 2: Core & API
Auth JWT, TenantGuard & RBAC :active, 2026-07-14, 1d
Antrean BullMQ & Step Executor :active, 2026-07-14, 1d
API CRUD & Isolasi Query :active, 2026-07-14, 1d
section Fase 3: Real-Time & Web
WebSocket Gateway & Event Emitter :active, 2026-07-15, 1d
Integrasi ReactFlow & UI Setup :active, 2026-07-15, 1d
Docker Compose & CI Pipeline Setup :active, 2026-07-15, 1d
section Fase 4: AI & Polishing
Integrasi Gemini & Fallback Candidates :active, 2026-07-16, 1d
Pembersihan JSON & Fix Lint Prettier :active, 2026-07-16, 1d
UI Overhaul & Navigasi Path URL :active, 2026-07-16, 1d
FlowForge dibangun menggunakan arsitektur monorepo modern dengan pemisahan tugas yang jelas:
- Backend API (
apps/api):- NestJS: Framework Node.js progresif dengan modulasi kuat untuk menjaga kode tetap modular.
- Prisma Client: Toolkit ORM modern tipe-aman (type-safe) untuk interaksi database PostgreSQL.
- BullMQ (Redis-based): Library antrean tugas latar belakang untuk memproses alur kerja secara asinkronus tanpa memblokir thread HTTP utama.
- vm (Node.js standard library): Digunakan untuk mengisolasi eksekusi langkah skrip kustom JavaScript di sandbox yang aman.
- Frontend SPA (
apps/web):- React & Vite: Bundler modern dan library UI untuk membangun aplikasi SPA yang cepat dan ringan.
- TailwindCSS: Utilitas kelas CSS untuk implementasi visual antarmuka secara presisi.
- ReactFlow: Pustaka khusus untuk merender node-edge alur kerja secara visual pada kanvas HTML5.
- Database & Broker:
- PostgreSQL: Sebagai media penyimpanan relasional utama untuk tenant, user, definisi alur kerja, dan log sejarah eksekusi.
- Redis: Bertindak sebagai server memori data-store berkecepatan tinggi untuk antrean tugas BullMQ.
Skema basis data dirancang secara efisien menggunakan kode relasional Prisma. Berikut adalah cuplikan model inti dalam database PostgreSQL FlowForge:
model Tenant {
id String @id @default(uuid())
name String
slug String @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
users User[]
workflowDefinitions WorkflowDefinition[]
}
model User {
id String @id @default(uuid())
email String @unique
password String
role String // admin | editor | viewer
tenantId String
createdAt DateTime @default(now())
tenant Tenant @relation(fields: [tenantId], references: [id])
}
model WorkflowDefinition {
id String @id @default(uuid())
name String
description String?
cronExpression String?
webhookToken String @unique
isActive Boolean @default(true)
tenantId String
currentVersionId String? @unique
createdBy String
createdAt DateTime @default(now())
tenant Tenant @relation(fields: [tenantId], references: [id])
versions WorkflowVersion[]
workflowRuns WorkflowRun[]
}
model WorkflowVersion {
id String @id @default(uuid())
workflowId String
versionNumber Int
definitionJson Json // Menyimpan node dan edge DAG
createdBy String
createdAt DateTime @default(now())
workflow WorkflowDefinition @relation(fields: [workflowId], references: [id])
runs WorkflowRun[]
}
model WorkflowRun {
id String @id @default(uuid())
workflowId String
versionId String
status String // queued | running | completed | failed | timed_out
triggerType String // manual | webhook | cron
startedAt DateTime?
completedAt DateTime?
tenantId String
createdAt DateTime @default(now())
workflow WorkflowDefinition @relation(fields: [workflowId], references: [id])
version WorkflowVersion @relation(fields: [versionId], references: [id])
stepRuns StepRun[]
}
model StepRun {
id String @id @default(uuid())
workflowRunId String
stepKey String
status String // queued | running | success | failed
output Json?
error String?
startedAt DateTime @default(now())
completedAt DateTime?
workflowRun WorkflowRun @relation(fields: [workflowRunId], references: [id])
}Mekanisme Isolasi: Menggunakan Proxy Pattern di dalam file prisma.service.ts yang mengintersepsi seluruh method findMany, findFirst, update, dan delete. Jika PrismaService.tenantStorage.getStore() mengembalikan ID tenant aktif (yang disuntikkan dari middleware JWT token), sistem secara otomatis menyisipkan filter { tenantId: activeTenantId } ke dalam klausa where kueri database secara implisit.
Integrasi AI di ai.service.ts memanfaatkan Google Generative AI SDK.
- Pendefinisian Struktur: AI diperkenalkan dengan skema JSON target (array
nodesdengan propertiid,type,configdan arrayedgesdengan propertifrom,to,conditionValue). - Batasan Ketat (Constraints):
- AI dilarang keras mengembalikan teks tambahan di luar JSON.
- AI dilarang membungkus respons dalam blok kode Markdown (misalnya
```json). - Alur kerja yang dibuat tidak boleh memiliki siklus berulang (harus DAG valid).
- Contoh Few-Shot dengan URL Aktif: Kami menyajikan contoh alur kerja yang menggunakan URL tiruan publik yang valid (
https://jsonplaceholder.typicode.com/usersatauhttps://httpbin.org/get) agar model Gemini tidak menggunakan alamat palsu/mati yang dapat menyebabkan kegagalan saat dieksekusi oleh pengguna.
Berikut adalah visualisasi alur kronologis bagaimana tim Developer (User) dan AI Agent berkolaborasi mengatasi tantangan teknis dalam proyek ini:
graph TD
A["Fase Inisialisasi: Setup & Core Engine"] --> B["Fase Integrasi Frontend & Login Tenant"]
B --> C["Fase Perbaikan Visualisasi DAG Run History"]
C --> D["Fase Migrasi Model AI & Clean Build Cache"]
D --> E["Fase Penanganan Error Format Output LLM"]
E --> F["Fase Resolusi Prettier Lint Check CI/CD"]
F --> G["Fase Pemolesan UI Editorial & Navigasi URL Path"]
- Tahap 1: Inisialisasi Proyek & Mesin DAG (Hari 1-2)
- Detail: AI Agent membantu menyusun algoritma topological sorting untuk paralelisasi langkah eksekusi serta DFS cycle check di backend.
- Tahap 2: Pembatasan Tenant & Login Dinamis (Hari 3)
- Masalah: Pengguna tidak dapat masuk karena validasi menuntut parameter
tenantSlugyang belum dikirim oleh frontend. - Solusi: Menambahkan kolom input "Organization Slug" pada frontend LoginPage.tsx dan meneruskan data tersebut ke backend. Membuat script
seed.tsdi Prisma untuk inisialisasi user Admin, Editor, dan Viewer.
- Masalah: Pengguna tidak dapat masuk karena validasi menuntut parameter
- Tahap 3: Perbaikan DAG Visualizer History (Hari 3)
- Masalah: Halaman Run History menampilkan grafik kanvas kosong (abu-abu gelap) untuk alur kerja yang sudah selesai.
- Solusi: Memodifikasi DagCanvas.tsx untuk memanggil API detail run terbaru saat halaman dimuat, lalu memetakan status
stepRunslangsung ke warna visualizer node.
- Tahap 4: Penanganan Depresiasi Model Gemini (Hari 4)
- Masalah: Gemini API melempar error 404 Not Found karena model
gemini-1.5-flashtidak didukung pada API v1beta, dangemini-2.5-flashdidepresiasi bagi pengguna baru di Juli 2026. - Solusi: Mengimplementasikan array model kandidat fallback (
gemini-3.5-flash,gemini-3.1-flash-lite,gemini-2.5-flash) pada ai.service.ts. Jika model primer mengalami 503, backend secara otomatis beralih menggunakangemini-3.1-flash-lite.
- Masalah: Gemini API melempar error 404 Not Found karena model
- Tahap 5: Pembersihan Cache NestJS Build (Hari 4)
- Masalah: Perubahan model AI tidak terbaca oleh server backend karena adanya konflik berkas kompilasi usang di folder
apps/api/dist. - Solusi: Menghapus folder
dist/secara permanen dan melakukan kompilasi ulang dari nol.
- Masalah: Perubahan model AI tidak terbaca oleh server backend karena adanya konflik berkas kompilasi usang di folder
- Tahap 6: Ekstraksi Output JSON LLM yang Tangguh (Hari 4)
- Masalah: LLM membungkus respons dengan blok Markdown kode (seperti
```json ... ```) yang menyebabkan kegagalan parsing JSON pada backend. - Solusi: Menambahkan fungsi pembantu
cleanJsonTextuntuk memotong tag markdown dan mengekstrak teks hanya di antara kurung kurawal{dan}terluar.
- Masalah: LLM membungkus respons dengan blok Markdown kode (seperti
- Tahap 7: Perbaikan Format Kode Prettier (Hari 4)
- Masalah: Pekerjaan
Lintdi GitHub Actions gagal karena ada pelanggaran aturan format Prettier pada baris kode baru. - Solusi: Menjalankan perintah pemformatan otomatis Prettier lokal sebelum kode di-push.
- Masalah: Pekerjaan
- Tahap 8: Navigasi URL Path & Estetika Minimalist Editorial (Hari 4)
- Masalah: Alamat URL browser stuck di
/loginmeskipun pengguna sudah masuk ke dashboard. Selain itu, elemen antarmuka dinilai terlalu bercorak chatbot AI mentah dengan banyak emoji. - Solusi:
- Membuat router client-side kustom di App.tsx menggunakan HTML5 History API (
window.history.pushState) untuk mensinkronisasi URL path browser (/,/workflows,/history,/ai-builder). - Merombak visual menjadi tema Minimalist Editorial bersih menggunakan paduan font profesional Plus Jakarta Sans (untuk heading, button, logo) dan Inter (untuk tulisan tubuh), serta menghapus seluruh emoji dan hiasan chatbot yang mengganggu pada sidebar dan tajuk halaman.
- Masalah: Alamat URL browser stuck di
Berikut adalah catatan riwayat commit git di dalam repositori proyek FlowForge yang mendokumentasikan pengembangan sistem secara kronologis:
| Commit Hash | Judul Commit | Penjelasan Rinci Perubahan Teknis |
|---|---|---|
8559599 |
feat(web,api): add tenant users CRUD management page and backend module |
Menambahkan endpoint API users untuk data tenant terisolasi, serta halaman pemantauan dan pengelolaan CRUD anggota organisasi (Admin, Editor, Viewer). |
e97475f |
fix(web): add Edit and Version History modals to WorkflowsPage for complete CRUD and Rollback capability |
Menambahkan tombol Edit dan Versions di antarmuka Workflows frontend, serta modal visual penampil versi dan pengeksekusi rollback. |
4ab1f69 |
docs: update README to reflect TailwindCSS migration and Gemini 3.5 fallbacks |
Memperbarui status Tech Stack, diagram struktur folder, dan tabel keputusan implementasi pada berkas README.md. |
f5f60e6 |
docs: expand final report with highly comprehensive sections and sub-section 6.5 detailing commit history |
Mengembangkan detail Laporan Akhir Proyek dan menambahkan tabel riwayat commit GitHub pada bab 6.5. |
f9b55f5 |
feat: overhaul UI to minimalist editorial, add browser URL routing, and generate final report |
Mengubah font pairing ke Plus Jakarta Sans & Inter, menipiskan garis elemen visual, menyinkronkan URL path browser menggunakan HTML5 History API, serta menyusun berkas laporan akhir. |
ae8bcb6 |
fix(ai): update few-shot examples in system prompt to use reachable target URLs |
Mengganti alamat domain palsu (http://api.com) pada system prompt Gemini menjadi target API publik aktif (httpbin.org, jsonplaceholder.typicode.com) agar hasil generate alur kerja sukses dieksekusi. |
e6bfdf3 |
fix(ai): strip markdown wrappers and extract JSON blocks from Gemini responses robustly |
Menambahkan pembersih string cleanJsonText pada backend untuk memotong blok markdown kode ```json agar proses parsing JSON berjalan 100% andal. |
8547672 |
feat(web): add super overpowered complex branching workflow template to dropdown |
Menambahkan template alur kerja kompleks baru "Super Overpowered Pipeline" berisi 7 langkah kombinasi HTTP, Delay, Script, dan Condition ke form pembuatan alur. |
84fb1f5 |
fix(web): resolve workflows list empty rendering bug by using data array directly |
Mengubah rujukan pembacaan daftar alur kerja pada frontend dari data.data menjadi data langsung untuk mengatasi bug daftar alur kosong. |
e877382 |
fix(lint): resolve prettier linter violations in ai.service and app.controller |
Menjalankan Prettier format otomatis pada berkas controller dan service agar lolos pemeriksaan linter pada pipeline CI/CD GitHub Actions. |
47d1b05 |
fix(ai): implement multi-model fallback candidates array for Gemini builder |
Mengatur daftar model kandidat cadangan Gemini (gemini-3.5-flash, gemini-3.1-flash-lite, gemini-2.5-flash) untuk menghindari kesalahan pembatasan model. |
4c6abb4 |
chore: delete stale dist build files and document in audit |
Menghapus paksa direktori dist/ backend NestJS yang usang agar server memuat kode model Gemini terbaru dengan benar. |
da85143 |
ui: revamp web to neo-brutalism clean style, install tailwindcss, fix login redirect, and write audit |
Mengintegrasikan pustaka TailwindCSS di frontend, mengatur visualisasi awal neo-brutalisme, serta memperbaiki transisi navigasi login. |
a54115e |
fix(ai,web): change Gemini model to 2.5-flash, fix run history DAG canvas load issue, and add audits folder |
Mengalihkan target AI ke gemini-2.5-flash, memperbaiki grafik DAG Run History kosong dengan menarik data stepRuns dari database, serta inisialisasi folder audits/. |
a8d089e |
fix(web): add tenantSlug to login page and seed demo database |
Menambahkan isian Organization Slug pada form login frontend, serta membuat script pengisi data awal (database seed) otomatis. |
7072e13 |
docs: complete Swagger annotations for AppController and update checklist |
Menyelesaikan anotasi Swagger UI OpenAPI pada berkas AppController untuk memfasilitasi pengetesan API yang transparan. |
b6bbf92 |
fix(ci): grant packages write permission to docker-build-push job |
Mengonfigurasi hak akses repositori paket Docker pada berkas CI workflow agar proses build container berjalan sukses di GitHub Actions. |
FlowForge telah berhasil dibangun sebagai sistem orkestrasi alur kerja multi-tenant yang memenuhi seluruh kriteria kelulusan teknis (Definition of Done). Integrasi cerdas antara database relasional (PostgreSQL + Prisma) dengan isolasi context thread-safe, sistem antrean andal (Redis + BullMQ), gateway WebSocket real-time, generator AI tangguh dengan penanganan kesalahan luaran (Google Gemini), pemformatan linter kode otomatis, serta antarmuka minimalis editorial terpadu dengan navigasi URL browser, membuktikan terapkannya standar rekayasa perangkat lunak profesional tingkat tinggi pada proyek ini.
- Repository Sumber: GitHub - Himdeunn/flowforge
- Kredensial Akun Pengujian (Demo):
- Organization Slug:
sevima - Password:
password123 - Akun Admin:
admin@sevima.com - Akun Editor:
editor@sevima.com - Akun Viewer:
viewer@sevima.com
- Organization Slug:
- Laporan Audit Harian di Folder
audits/:audits/Audit_15-07-2026_21-04_fix(gemini-model_and_dag-visualizer-bug).mdaudits/Audit_21-12_15-07-2026_ui(revamp-neo-brutalism-and-redirect-login).mdaudits/Audit_21-41_15-07-2026_chore(clean-stale-dist-build-files).mdaudits/Audit_21-48_15-07-2026_fix(gemini-multi-model-fallback).mdaudits/Audit_22-15_15-07-2026_fix(workflows-list-rendering-bug).mdaudits/Audit_22-28_15-07-2026_feat(super-overpowered-complex-branching-workflow-template).mdaudits/Audit_22-42_15-07-2026_fix(robust-gemini-json-response-cleaning).mdaudits/Audit_00-43_16-07-2026_fix(prompt-reachable-mock-urls-for-ai-builder).mdaudits/Audit_12-25_16-07-2026_feat(minimalist-editorial-ui-and-clean-routing-with-final-report).mdaudits/Audit_17-47_17-07-2026_fix(add-workflows-edit-and-version-history-ui-modals).mdaudits/Audit_20-52_17-07-2026_feat(add-users-management-crud-monitoring-page).md