Skip to content

Teknis — API Connect ​

Service HTTP proxy RAGA yang dibangun di atas Node.js + Express. Menerima konfigurasi koneksi API dan endpoint lewat request body, menangani otentikasi (Basic, Bearer, atau JWT auto-login), lalu meneruskan request ke API eksternal dan mengembalikan responsnya. Digunakan oleh Raga Engine (Text-to-API) di api-tarantula untuk memanggil API eksternal yang dikonfigurasi user tanpa perlu menyimpan kredensial di server.

Catatan: Service ini stateless — tidak ada konfigurasi API yang disimpan. Semua kredensial dan detail endpoint dikirim oleh caller di dalam request body setiap kali.

Repository ​

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

Tech Stack ​

LayerTeknologi
RuntimeNode.js 18
FrameworkExpress 4
HTTP Clientaxios
API Docsswagger-ui-express + swagger-jsdoc (JSDoc inline)
Dev Runnernodemon
ContainerizationDocker (node:18)

Struktur Folder ​

api-connect/
├── index.js             # Express app + semua logika proxy & auth
├── package.json
├── Dockerfile
├── Dockerfile.stag
└── docker-compose.dev.yml

Environment Variables ​

Service ini tidak menggunakan environment variable. Semua konfigurasi (host, auth, endpoint) dikirim per-request oleh caller di dalam request body.

Endpoints ​

MethodPathKeterangan
GET/healthHealth check service
POST/proxyForward request ke API eksternal
GET/api-docsSwagger UI (OpenAPI 3.0)

POST /proxy ​

Meneruskan HTTP request ke API eksternal dengan handling otentikasi otomatis.

Request body:

json
{
  "connection": {
    "host": "https://api.example.com",
    "name": "Nama koneksi (opsional, untuk logging)",
    "auth": { },
    "endpoint": {
      "path": "/v1/data",
      "method": "get",
      "params": [
        { "key": "search", "value": "query" }
      ],
      "body": { }
    },
    "headers": {
      "X-Custom-Header": "value"
    }
  }
}

Response: Response dari API target diteruskan langsung ke caller (pass-through).

Response 400: Jika connection, host, atau endpoint tidak ada di body.

Response 500: Jika proxy request gagal atau proses login JWT gagal.

Catatan operasional: index.js saat ini menuliskan URL, method, body/params, dan header lengkap (termasuk header Authorization hasil resolusi Basic/Bearer/JWT) ke console.log untuk setiap request yang diproxy. Karena auth dikirim penuh oleh caller dan tidak pernah dipersist, kredensial API eksternal apa pun yang dipakai lewat service ini akan ikut tercatat di log container selama baris log ini aktif — pastikan log tidak tersimpan di tempat yang bisa diakses luas.

Mode Otentikasi (auth) ​

Basic Auth ​

json
{
  "auth": {
    "type": "basic",
    "user": "username",
    "password": "password"
  }
}

Header yang dikirim ke API target: Authorization: Basic <base64(user:password)>

Bearer Token ​

json
{
  "auth": {
    "type": "bearer",
    "token": "your_access_token"
  }
}

Header yang dikirim ke API target: Authorization: Bearer <token>

JWT (Auto-login) ​

json
{
  "auth": {
    "type": "jwt",
    "user": "username",
    "password": "password",
    "loginPath": "/auth/login"
  }
}

Service melakukan POST {host}{loginPath} dengan { user, password } terlebih dahulu, mengambil token dari response, lalu menggunakan Bearer <token> untuk request utama.

Alur Request ​

Perilaku per HTTP Method ​

MethodBody dikirim sebagaiContent-Type otomatis
GET, HEADQuery params (params)—
POST, PUT, PATCH, DELETERequest body (data)application/x-www-form-urlencoded

Jika endpoint.body atau connection.body ada, nilainya digunakan sebagai body request. Custom headers dari connection.headers selalu di-merge ke setiap request.

Contoh Request ​

GET dengan Basic Auth ​

bash
curl -X POST http://localhost:3000/proxy \
  -H "Content-Type: application/json" \
  -d '{
    "connection": {
      "host": "https://api.example.com",
      "auth": {
        "type": "basic",
        "user": "admin",
        "password": "secret"
      },
      "endpoint": {
        "path": "/v1/users",
        "method": "get",
        "params": [
          { "key": "page", "value": "1" }
        ]
      }
    }
  }'

POST dengan JWT Auto-login ​

bash
curl -X POST http://localhost:3000/proxy \
  -H "Content-Type: application/json" \
  -d '{
    "connection": {
      "host": "https://api.internal.co.id",
      "auth": {
        "type": "jwt",
        "user": "service_account",
        "password": "pass123",
        "loginPath": "/api/auth/login"
      },
      "endpoint": {
        "path": "/api/v2/reports",
        "method": "post",
        "body": { "from": "2026-01-01", "to": "2026-06-30" }
      }
    }
  }'

GET /health ​

json
{ "status": "OK", "timestamp": "2026-06-30T10:00:00.000Z" }

Build & Run ​

bash
# Install dependencies
npm install

# Jalankan development (nodemon)
npm start

# Jalankan production (node langsung)
npm run start_stag

# Docker Compose (dev)
docker compose -f docker-compose.dev.yml up --build

# Docker build & run standalone
docker build -t api-connect .
docker run -p 3000:3000 api-connect