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