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:
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_signaldigunakan 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_keydari Midtrans sebelum mengkreditkan saldo. Idempotency key berbasisorder_idmencegah duplikasi kredit jika webhook dikirim berulang.