Lewati ke konten utama

BAB 29. REST API SPECIFICATION

Standar API​

ItemNilai
Base URL/api/v1
FormatJSON (application/json)
AuthenticationLaravel Sanctum (Bearer Token)
VersioningURL Versioning (/api/v1/...)
Error FormatRFC 7807 Problem Details

Format Response Sukses​

{
"success": true,
"message": "Berhasil",
"data": { }
}

Format Response Error​

{
"success": false,
"message": "Pesan error",
"errors": { }
}

Authentication​

POST /api/v1/auth/login​

Login pengguna dengan NISN atau NIP.

Request:

{
"username": "1234567890",
"password": "1234567890"
}

Response 200 OK:

{
"success": true,
"data": {
"token": "1|abc123xyz...",
"user": {
"id": 1,
"name": "Thomas Andi",
"username": "1234567890",
"role": "student",
"must_change_password": false
}
}
}

POST /api/v1/auth/change-password​

🔒 Requires Auth

Request:

{
"current_password": "1234567890",
"password": "NewPass123",
"password_confirmation": "NewPass123"
}

POST /api/v1/auth/logout​

🔒 Requires Auth — Revoke token aktif.


Profile​

GET /api/v1/profile​

🔒 Requires Auth — Mengambil profil pengguna yang sedang login.

Response 200 OK:

{
"data": {
"id": 1,
"name": "Thomas Andi",
"role": "student",
"level": 5,
"xp": 1250,
"sis_score": 87.5,
"average_rating": 4.8,
"classroom": "XII IPA 1"
}
}

PUT /api/v1/profile​

🔒 Requires Auth — Update profil pengguna.

GET /api/v1/profile/skills​

🔒 Requires Auth — Daftar skill siswa.

PUT /api/v1/profile/skills​

🔒 Requires Auth — Update skill siswa.

Request:

{
"skill_ids": [1, 3, 7, 12]
}

Requests​

GET /api/v1/requests​

🔒 Requires Auth — Daftar request milik siswa yang login.

Query Params: status, per_page, page

POST /api/v1/requests​

🔒 Requires Auth (student) — Membuat request baru.

Request:

{
"subject_id": 2,
"topic_id": 8,
"description": "Saya tidak mengerti cara menghitung integral lipat dua",
"preferred_location": "Perpustakaan Lantai 2",
"latitude": -6.200000,
"longitude": 106.816666,
"preferred_time": "2026-08-10T14:00:00",
"duration_minutes": 90,
"tutor_count": 1
}

GET /api/v1/requests/{id}​

🔒 Detail satu request.

PUT /api/v1/requests/{id}​

🔒 Update request (hanya jika status pending).

DELETE /api/v1/requests/{id}​

🔒 Batalkan request (hanya jika belum on_going).


Booking​

POST /api/v1/bookings/{id}/accept​

🔒 Requires Auth (tutor) — Terima request.

Request:

{
"scheduled_at": "2026-08-10T14:00:00"
}

POST /api/v1/bookings/{id}/reject​

🔒 Requires Auth (tutor) — Tolak request.

Request:

{
"reason": "Saya sedang ada ujian"
}

POST /api/v1/bookings/{id}/reschedule​

🔒 Requires Auth (tutor) — Ajukan jadwal alternatif.

Request:

{
"reschedule_time": "2026-08-11T10:00:00"
}

Meeting​

POST /api/v1/meetings/check-in​

🔒 Requires Auth — Check-In sesi dengan QR + GPS.

Request:

{
"qr_token": "abc123...",
"latitude": -6.200000,
"longitude": 106.816666
}

Response 200 OK:

{
"success": true,
"message": "Check-In berhasil! Sesi dimulai.",
"data": {
"meeting_id": 42,
"check_in_at": "2026-08-10T14:02:35",
"status": "on_going"
}
}

POST /api/v1/meetings/check-out​

🔒 Requires Auth — Check-Out sesi.

Request:

{
"meeting_id": 42,
"summary": "Berhasil memahami konsep integral lipat dua"
}

POST /api/v1/meetings/{id}/summary​

🔒 Upload dokumentasi atau foto sesi.


Rating​

POST /api/v1/ratings​

🔒 Requires Auth — Submit rating setelah sesi selesai.

Request:

{
"meeting_id": 42,
"ratee_id": 7,
"score": 5,
"comment": "Penjelasannya sangat jelas dan sabar",
"is_solved": true
}

Leaderboard​

GET /api/v1/leaderboard​

🔒 Requires Auth — Daftar leaderboard berdasarkan SIS atau XP.

Query Params: type=sis|xp, period=2026-1, per_page=20


Dashboard​

GET /api/v1/dashboard/student​

🔒 Requires Role: student — Statistik dan ringkasan untuk siswa.

GET /api/v1/dashboard/teacher​

🔒 Requires Role: teacher — Monitoring dan statistik untuk guru.

GET /api/v1/dashboard/admin​

🔒 Requires Role: admin — Statistik sekolah untuk admin.


HTTP Status Codes​

KodeMakna
200 OKPermintaan berhasil
201 CreatedData berhasil dibuat
401 UnauthorizedToken tidak valid atau tidak ada
403 ForbiddenRole tidak memiliki izin
404 Not FoundData tidak ditemukan
422 Unprocessable EntityValidasi gagal
429 Too Many RequestsRate limit tercapai
500 Internal Server ErrorError sistem