Lewati ke isi

Sentra Membership — API Documentation

Integrasi front-end dan edge turnstile gate berkomunikasi melalui RESTful API terenkripsi.

5.1 POST /api/v1/bookings

Mencoba mengunci slot kelas secara atomik menggunakan memori Redis sebelum menulis data ke PostgreSQL.

Request Header:

Content-Type: application/json
Authorization: Bearer <jwt_token>

Request Body:

{
  "class_id": "89cf8721-a01c-4b92-809c-7c01bda8f212",
  "member_id": "7ac16c72-911a-4c22-9e8d-8c17b01b63ef"
}

Response 201 Created — Slot Sukses Terkunci:

{
  "status": "success",
  "data": {
    "booking_id": "ea91b01c-7f12-411a-82ee-001bc93bc8ff",
    "class_id": "89cf8721-a01c-4b92-809c-7c01bda8f212",
    "member_id": "7ac16c72-911a-4c22-9e8d-8c17b01b63ef",
    "booking_status": "CONFIRMED",
    "ticket_qr_token": "dynqr:booking_ea91b01c_token_valid_5m",
    "created_at": "2026-05-21T20:20:00+07:00"
  }
}

Response 200 OK — Slot Penuh, Masuk Waiting List:

{
  "status": "waiting_list",
  "message": "Class quota is full. You have been placed in the waiting list.",
  "data": {
    "booking_id": "ea91b01c-7f12-411a-82ee-001bc93bc8ff",
    "queue_position": 3,
    "booking_status": "WAITING"
  }
}


5.2 POST /api/v1/checkin/gate

Dipanggil oleh Raspberry Pi Edge Gateway untuk menanyakan kelayakan akses seorang member berdasarkan scan QR/wajah. Endpoint ini juga memvalidasi aturan Anti-Passback.

Request Body:

{
  "branch_id": "99ea7b42-1200-4b32-8411-d00db60ab292",
  "verification_method": "FACE",
  "biometric_vector_input": [0.128, -0.045, 0.892, 0.432, "...", -0.562],
  "access_type": "IN"
}

Response 200 OK — Akses Diberikan:

{
  "access_granted": true,
  "member_id": "7ac16c72-911a-4c22-9e8d-8c17b01b63ef",
  "member_name": "Budi Santoso",
  "member_number": "MEM-2026-0091",
  "unlock_signal": "MQTT_CMD_OPEN_GATE_01",
  "anti_passback_status": "VALID_IN"
}

Response 403 Forbidden — Akses Ditolak (Anti-Passback Violation):

{
  "access_granted": false,
  "reason": "ANTI_PASSBACK_VIOLATION",
  "message": "Member is already checked in. Exit scan required before entry."
}

Field unlock_signal digunakan oleh Edge Gateway sebagai topik MQTT yang dipublikasikan ke Mosquitto broker lokal untuk membuka relay gerbang turnstile fisik.


5.3 POST /api/v1/wallet/topup

Menerima pemberitahuan pembayaran real-time dari Midtrans dan meningkatkan saldo dompet secara aman dengan validasi signature.

Request Body (Midtrans Webhook Payload):

{
  "transaction_id": "midtrans-tx-90182",
  "order_id": "TOPUP-7ac16c72-260521-001",
  "gross_amount": "250000.00",
  "payment_type": "qris",
  "transaction_status": "settlement",
  "signature_key": "6cf8721c8fa9012be84aefc902bde309da4dcf9c8b7762a11b01c3098e912ba0"
}

Response 200 OK:

{
  "status": "success",
  "message": "Wallet balance credited and transaction signed successfully",
  "data": {
    "new_balance": 350000.00,
    "transaction_id": "ea91b01c-7f12-411a-82ee-001bc93bc8ff"
  }
}

Sistem memvalidasi signature_key dari Midtrans sebelum mengkreditkan saldo. Idempotency key berbasis order_id mencegah duplikasi kredit jika webhook dikirim berulang.