Skip to content

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

KeyValue
Git Remotehttps://git.tlab.co.id/tarantula/service/database-connect.git
Branch Aktifmain
bash
git clone https://git.tlab.co.id/tarantula/service/database-connect.git
cd database-connect

Tech Stack

LayerTeknologi
RuntimeNode.js 18
FrameworkExpress 4
PostgreSQL Clientpg (node-postgres)
MariaDB/MySQL Clientmariadb
API Docsswagger-ui-express + swagger.json
Dev Runnernodemon
ContainerizationDocker (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.yml

Environment 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)

HeaderContohKeterangan
x-db-modepostgresqlMode database: postgresql, mariadb, atau mysql
x-db-host10.1.102.15Host database server
x-db-port5432Port database server
x-db-userpostgresUsername database
x-db-passwordsecretPassword database
x-db-nameraga_dbNama database / schema

Koneksi dibuat per-request (bukan connection pool) dengan timeout 15 detik. Koneksi ditutup otomatis setelah query selesai.

Catatan operasional: index.js saat ini menuliskan seluruh detail koneksi — termasuk x-db-password dalam bentuk plaintext — ke console.log setiap kali koneksi dibuat, dan isi query mentah ke log setiap kali /execute dipanggil. 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

MethodPathKeterangan
GET/healthHealth check service
GET/check-connectionTest koneksi ke database
GET/tablesDaftar semua tabel + kolom dalam database
POST/executeEksekusi query SQL raw
GET/api-docsSwagger UI (OpenAPI 3.0)

GET /check-connection

Test apakah koneksi ke database berhasil dibuat, lalu langsung tutup koneksi.

Response 200:

json
{ "status": "Connected successfully" }

Response 500:

json
{ "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:

json
{
  "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:

json
{
  "query": "SELECT id, name FROM users WHERE created_at > '2026-01-01' LIMIT 10"
}

Response 200:

json
{
  "result": [
    { "id": 1, "name": "Budi Santoso" },
    { "id": 2, "name": "Sari Dewi" }
  ]
}

Response 400:

json
{ "error": "Query is required" }

GET /health

json
{ "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 DBDikonversi keContoh
BigIntstring9007199254740993
DateISO 8601 string"2026-06-30T10:00:00.000Z"
BufferBase64 string"SGVsbG8="
LainnyaTidak diubah

Query per Database Engine

OperasiPostgreSQLMariaDB / MySQL
List tabelinformation_schema.tables WHERE table_schema='public'information_schema.tables WHERE table_schema = ?
List kolominformation_schema.columns WHERE table_name = $1information_schema.columns WHERE table_schema = ? AND table_name = ?

Build & Run

bash
# 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-connect

Contoh memanggil endpoint setelah service berjalan:

bash
# 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"}'