Teknis — Database Connect
Service database proxy RAGA yang dibangun di atas Node.js + Express. Menerima parameter koneksi database lewat HTTP header per-request, lalu meneruskan query SQL ke PostgreSQL atau MariaDB/MySQL dan mengembalikan hasilnya dalam JSON. Digunakan oleh Raga Engine (Text-to-SQL) di api-tarantula untuk mengeksekusi query yang di-generate LLM terhadap database eksternal yang dikonfigurasi user.
Catatan: Service ini stateless — tidak ada konfigurasi database yang disimpan. Semua kredensial dikirim oleh caller via request header di setiap request.
Repository
| Key | Value |
|---|---|
| Git Remote | https://git.tlab.co.id/tarantula/service/database-connect.git |
| Branch Aktif | main |
git clone https://git.tlab.co.id/tarantula/service/database-connect.git
cd database-connectTech Stack
| Layer | Teknologi |
|---|---|
| Runtime | Node.js 18 |
| Framework | Express 4 |
| PostgreSQL Client | pg (node-postgres) |
| MariaDB/MySQL Client | mariadb |
| API Docs | swagger-ui-express + swagger.json |
| Dev Runner | nodemon |
| Containerization | Docker (node:18) |
Struktur Folder
database-connect/
├── index.js # Express app + semua logika koneksi & query
├── swagger.json # Swagger/OpenAPI 3.0 spec (mounted di /api-docs)
├── package.json
├── Dockerfile
├── Dockerfile.stag
└── docker-compose.dev.ymlEnvironment Variables
Service ini tidak menggunakan environment variable untuk konfigurasi database. Semua parameter koneksi dikirim via HTTP header per-request oleh caller.
Request Headers (Wajib di Setiap Request)
| Header | Contoh | Keterangan |
|---|---|---|
x-db-mode | postgresql | Mode database: postgresql, mariadb, atau mysql |
x-db-host | 10.1.102.15 | Host database server |
x-db-port | 5432 | Port database server |
x-db-user | postgres | Username database |
x-db-password | secret | Password database |
x-db-name | raga_db | Nama database / schema |
Koneksi dibuat per-request (bukan connection pool) dengan timeout 15 detik. Koneksi ditutup otomatis setelah query selesai.
Catatan operasional:
index.jssaat ini menuliskan seluruh detail koneksi — termasukx-db-passworddalam bentuk plaintext — keconsole.logsetiap kali koneksi dibuat, dan isiquerymentah ke log setiap kali/executedipanggil. Pastikan log container service ini tidak tersimpan di tempat yang bisa diakses luas (log aggregator bersama, dsb.) selama perilaku ini belum diubah untuk memasking kredensial.
Endpoints
| Method | Path | Keterangan |
|---|---|---|
GET | /health | Health check service |
GET | /check-connection | Test koneksi ke database |
GET | /tables | Daftar semua tabel + kolom dalam database |
POST | /execute | Eksekusi query SQL raw |
GET | /api-docs | Swagger UI (OpenAPI 3.0) |
GET /check-connection
Test apakah koneksi ke database berhasil dibuat, lalu langsung tutup koneksi.
Response 200:
{ "status": "Connected successfully" }Response 500:
{ "error": "Connection timeout" }GET /tables
Mengembalikan daftar semua tabel dalam database beserta nama kolom dan tipe datanya. Query information_schema disesuaikan per database engine.
Response 200:
{
"tables": {
"users": [
{ "column_name": "id", "data_type": "integer" },
{ "column_name": "name", "data_type": "character varying" },
{ "column_name": "created_at", "data_type": "timestamp without time zone" }
],
"orders": [
{ "column_name": "id", "data_type": "integer" },
{ "column_name": "user_id", "data_type": "integer" }
]
}
}POST /execute
Eksekusi query SQL raw (SELECT, INSERT, UPDATE, DELETE, dll) dan kembalikan hasilnya.
Request body:
{
"query": "SELECT id, name FROM users WHERE created_at > '2026-01-01' LIMIT 10"
}Response 200:
{
"result": [
{ "id": 1, "name": "Budi Santoso" },
{ "id": 2, "name": "Sari Dewi" }
]
}Response 400:
{ "error": "Query is required" }GET /health
{ "status": "OK", "timestamp": "2026-06-30T10:00:00.000Z" }Alur Request
Normalisasi Tipe Data
Response dari database dinormalisasi agar aman di-serialize ke JSON:
| Tipe DB | Dikonversi ke | Contoh |
|---|---|---|
BigInt | string | 9007199254740993 |
Date | ISO 8601 string | "2026-06-30T10:00:00.000Z" |
Buffer | Base64 string | "SGVsbG8=" |
| Lainnya | Tidak diubah | — |
Query per Database Engine
| Operasi | PostgreSQL | MariaDB / MySQL |
|---|---|---|
| List tabel | information_schema.tables WHERE table_schema='public' | information_schema.tables WHERE table_schema = ? |
| List kolom | information_schema.columns WHERE table_name = $1 | information_schema.columns WHERE table_schema = ? AND table_name = ? |
Build & Run
# Install dependencies
npm install
# Jalankan development (nodemon)
npm start
# Docker Compose (dev)
docker compose -f docker-compose.dev.yml up --build
# Docker build & run standalone
docker build -t database-connect .
docker run -p 3000:3000 database-connectContoh memanggil endpoint setelah service berjalan:
# Test koneksi PostgreSQL
curl -X GET http://localhost:3000/check-connection \
-H "x-db-mode: postgresql" \
-H "x-db-host: 10.1.102.15" \
-H "x-db-port: 5432" \
-H "x-db-user: postgres" \
-H "x-db-password: secret" \
-H "x-db-name: raga_db"
# Eksekusi query
curl -X POST http://localhost:3000/execute \
-H "Content-Type: application/json" \
-H "x-db-mode: postgresql" \
-H "x-db-host: 10.1.102.15" \
-H "x-db-port: 5432" \
-H "x-db-user: postgres" \
-H "x-db-password: secret" \
-H "x-db-name: raga_db" \
-d '{"query": "SELECT * FROM users LIMIT 5"}'