15 KiB
Project Jahit API Documentation
Deskripsi Proyek
Project Jahit adalah platform yang menghubungkan pelanggan dengan penjahit. API ini menyediakan endpoint untuk mengelola registrasi pengguna, pencarian penjahit, pemesanan jasa, manajemen galeri dan layanan penjahit, serta sistem rating.
Base URL
http://localhost:8000/api
Autentikasi
API ini menggunakan Laravel Sanctum untuk autentikasi. Token akan diberikan setelah login dan harus disertakan dalam header setiap permintaan ke endpoint yang terproteksi.
Format header:
Authorization: Bearer {token}
Roles dan Hak Akses
Sistem memiliki 3 role pengguna:
- admin - Administrator platform
- penjahit - Penjahit/Penyedia jasa
- pelanggan - Pelanggan/Pengguna jasa
Endpoint API
Endpoint Publik
Test API
GET /test
Response:
{
"message": "API is working"
}
Spesialisasi
GET /specializations
Mendapatkan semua spesialisasi penjahit yang tersedia.
GET /specializations/all
Mendapatkan semua spesialisasi dengan detail lengkap.
Pencarian Penjahit
GET /tailors/search?specialization={id}
Mencari penjahit berdasarkan spesialisasi.
Detail Penjahit
GET /tailors/{id}
Mendapatkan detail informasi penjahit berdasarkan ID.
GET /tailors/{tailor}/services
Mendapatkan daftar layanan yang disediakan penjahit.
GET /tailors/{tailor}/gallery
Mendapatkan galeri foto penjahit.
GET /tailors/{tailor}/ratings
Mendapatkan ulasan dan rating untuk penjahit.
Autentikasi
Pelanggan
POST /pelanggan/register
Registrasi akun pelanggan baru.
Body:
{
"name": "Nama Pelanggan",
"email": "pelanggan@example.com",
"password": "password",
"password_confirmation": "password",
"phone_number": "08123456789",
"address": "Alamat Lengkap"
}
POST /pelanggan/login
Login sebagai pelanggan.
Body:
{
"email": "pelanggan@example.com",
"password": "password"
}
Response:
{
"user": {
"id": 1,
"name": "Nama Pelanggan",
"email": "pelanggan@example.com",
"role": "pelanggan",
...
},
"token": "access_token_string"
}
Penjahit
POST /penjahit/register
Registrasi akun penjahit baru.
Body:
{
"name": "Nama Penjahit",
"email": "penjahit@example.com",
"password": "password",
"password_confirmation": "password",
"phone_number": "08123456789",
"address": "Alamat Lengkap",
"shop_description": "Deskripsi toko jahit",
"latitude": -6.123456,
"longitude": 106.123456,
"specializations": [1, 2]
}
POST /penjahit/login
Login sebagai penjahit.
Body:
{
"email": "penjahit@example.com",
"password": "password"
}
Admin
POST /admin/login
Login sebagai admin.
Body:
{
"email": "admin@example.com",
"password": "password"
}
Lupa Password
POST /pelanggan/forgot-password
POST /penjahit/forgot-password
Mengirimkan email reset password.
Body:
{
"email": "user@example.com"
}
POST /pelanggan/reset-password
POST /penjahit/reset-password
Reset password dengan token.
Body:
{
"email": "user@example.com",
"password": "new_password",
"password_confirmation": "new_password",
"token": "reset_token"
}
Logout
POST /logout
Logout pengguna (invalidasi token).
Header:
Authorization: Bearer {token}
Endpoint Profil
GET /profile
Mendapatkan informasi profil pengguna yang terautentikasi.
POST /profile
Mengupdate informasi profil pengguna.
Body:
{
"name": "Nama Baru",
"phone_number": "08123456789",
"address": "Alamat Baru"
}
POST /profile/photo
Mengupload foto profil.
Body (multipart/form-data):
profile_photo: [file]
Endpoint Pelanggan
Dashboard
GET /dashboard
Mendapatkan data dashboard pelanggan.
Booking
GET /bookings/customer
Mendapatkan semua booking yang dilakukan pelanggan.
GET /bookings/customer/status/{status}
Mendapatkan booking pelanggan berdasarkan status (reservasi, diproses, selesai, dibatalkan).
GET /bookings/{booking}
Mendapatkan detail booking.
POST /tailors/{tailor}/book
Membuat booking baru ke penjahit.
Body:
{
"appointment_date": "2023-05-01",
"appointment_time": "10:00",
"service_type": "Jahit Baju",
"category": "Baju Wanita",
"notes": "Catatan tambahan",
"total_price": 150000
}
POST /bookings
Membuat booking baru.
Body (multipart/form-data):
customer_id: 1
tailor_id: 2
appointment_date: 2023-05-01
appointment_time: 10:00
service_type: Jahit Baju
category: Baju Wanita
notes: Catatan tambahan
design_photo: [file]
total_price: 150000
POST /bookings/{booking}/cancel
Membatalkan booking.
POST /bookings/{booking}/rate
Memberikan rating dan ulasan.
Body:
{
"rating": 5,
"review": "Pelayanan sangat baik"
}
PUT /ratings/{rating}
Mengupdate rating dan ulasan.
Body:
{
"rating": 4,
"review": "Pelayanan baik"
}
POST /bookings/{booking}/completion-payment
Menyelesaikan pembayaran akhir booking.
Endpoint Penjahit
Dashboard
GET /penjahit/dashboard
Mendapatkan data dashboard penjahit.
Pembayaran
POST /bookings/{booking}/payment
Mengubah status pembayaran booking menjadi paid (hanya penjahit yang dapat melakukan).
Body:
{
"payment_status": "paid"
}
POST /bookings/{booking}/completion-payment
Menyelesaikan pembayaran akhir booking dan mengatur tanggal pengambilan (hanya penjahit yang dapat melakukan).
Body:
{
"pickup_date": "2023-05-15"
}
Spesialisasi
POST /penjahit/specializations
Mengupdate spesialisasi penjahit.
Body:
{
"specializations": [1, 3, 5]
}
Kalender
GET /penjahit/calendar/{month}/{year}
Mendapatkan jadwal booking dalam bulan dan tahun tertentu.
GET /penjahit/calendar/date/{date}
Mendapatkan jadwal booking pada tanggal tertentu.
Profil Toko
GET /penjahit/shop-profile
Mendapatkan profil toko penjahit.
POST /penjahit/shop-profile
Mengupdate profil toko penjahit.
Body:
{
"shop_description": "Deskripsi toko baru",
"address": "Alamat toko baru",
"latitude": -6.123456,
"longitude": 106.123456
}
DELETE /penjahit/shop-profile/photo
Menghapus foto profil toko.
Galeri
GET /penjahit/gallery
Mendapatkan semua galeri penjahit.
POST /penjahit/gallery
Menambahkan foto ke galeri penjahit.
Body (multipart/form-data):
photo: [file]
description: Deskripsi foto
PUT /penjahit/gallery/{gallery}
Mengupdate deskripsi foto galeri.
Body:
{
"description": "Deskripsi baru"
}
DELETE /penjahit/gallery/{gallery}
Menghapus foto dari galeri.
Layanan
GET /penjahit/services
Mendapatkan semua layanan penjahit.
POST /penjahit/services
Menambahkan layanan baru.
Body:
{
"name": "Nama Layanan",
"description": "Deskripsi layanan",
"price": 100000,
"is_available": true
}
PUT /penjahit/services/{service}
Mengupdate informasi layanan.
Body:
{
"name": "Nama Layanan Baru",
"description": "Deskripsi baru",
"price": 150000,
"is_available": true
}
DELETE /penjahit/services/{service}
Menghapus layanan.
PATCH /penjahit/services/{service}/toggle
Mengaktifkan/menonaktifkan layanan.
Booking
GET /penjahit/bookings
Mendapatkan semua booking penjahit.
GET /penjahit/bookings/status/{status}
Mendapatkan booking penjahit berdasarkan status.
POST /bookings/{booking}/accept
Menerima booking baru.
POST /bookings/{booking}/reject
Menolak booking.
Body:
{
"rejection_reason": "Jadwal penuh"
}
PATCH /bookings/{booking}/status
Mengupdate status booking.
Body:
{
"status": "diproses"
}
PATCH /bookings/{booking}/price
Mengupdate harga booking.
Body:
{
"total_price": 200000
}
POST /bookings/{booking}/measurements
Mengupdate ukuran jahitan.
Body:
{
"measurements": {
"lingkar_dada": 90,
"lingkar_pinggang": 70,
"panjang_lengan": 60
}
}
POST /bookings/{booking}/repair
Mengupdate detail perbaikan.
Body (multipart/form-data):
repair_details: {"jenis_perbaikan": "Ubah ukuran", "bagian": "Lengan"}
repair_notes: Catatan perbaikan
repair_photo: [file]
POST /bookings/{booking}/complete
Menyelesaikan booking.
Body (multipart/form-data):
completion_notes: Catatan penyelesaian
completion_photo: [file]
pickup_date: 2023-05-15
Endpoint Admin
Dashboard
GET /admin/dashboard
Mendapatkan data dashboard admin.
Manajemen Pelanggan
GET /customers
Mendapatkan semua data pelanggan.
GET /customers/{id}
Mendapatkan detail pelanggan.
Manajemen Booking
GET /bookings
Mendapatkan semua data booking.
Manajemen Penjahit
GET /tailors
Mendapatkan semua data penjahit.
GET /tailors/all
Mendapatkan semua data penjahit tanpa filter rating.
Model Data
User
- id
- name
- password
- role (admin, penjahit, pelanggan)
- phone_number
- address
- shop_description (untuk penjahit)
- profile_photo
- latitude
- longitude
- created_at
- updated_at
Booking
- id
- customer_id
- tailor_id
- appointment_date
- appointment_time
- service_type
- category
- design_photo
- notes
- status (reservasi, diproses, selesai, dibatalkan)
- total_price
- payment_status (unpaid, paid)
- measurements
- repair_details
- repair_photo
- repair_notes
- completion_photo
- completion_notes
- accepted_at
- rejected_at
- completed_at
- rejection_reason
- pickup_date
- created_at
- updated_at
TailorSpecialization
- id
- name
- description
- photo
- created_at
- updated_at
TailorService
- id
- user_id
- name
- description
- price
- is_available
- created_at
- updated_at
TailorGallery
- id
- user_id
- photo
- description
- created_at
- updated_at
TailorRating
- id
- booking_id
- tailor_id
- customer_id
- rating
- review
- created_at
- updated_at
Kode Status HTTP
- 200 OK - Request berhasil
- 201 Created - Resource berhasil dibuat
- 400 Bad Request - Request tidak valid
- 401 Unauthorized - Tidak terotentikasi
- 403 Forbidden - Tidak memiliki izin
- 404 Not Found - Resource tidak ditemukan
- 422 Unprocessable Entity - Validasi gagal
- 500 Internal Server Error - Kesalahan server
Format Error Response
{
"message": "Pesan error",
"errors": {
"field1": ["Error message 1", "Error message 2"],
"field2": ["Error message"]
}
}
Contoh Penggunaan
Registrasi Pelanggan
Request:
POST /api/pelanggan/register
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com",
"password": "password123",
"password_confirmation": "password123",
"phone_number": "08123456789",
"address": "Jl. Example No. 123"
}
Response:
200 OK
Content-Type: application/json
{
"user": {
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"role": "pelanggan",
"phone_number": "08123456789",
"address": "Jl. Example No. 123",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
},
"token": "access_token_string"
}
Penjahit Mengubah Status Pembayaran
Request:
POST /api/bookings/1/payment
Content-Type: application/json
Authorization: Bearer {token_penjahit}
{
"payment_status": "paid"
}
Response:
200 OK
Content-Type: application/json
{
"status": "success",
"message": "Status pembayaran berhasil diubah menjadi paid oleh penjahit.",
"data": {
"booking": {
"id": 1,
"customer_name": "John Doe",
"payment_status": "paid",
"status": "reservasi",
"total_price": "150000.00",
"appointment_date": "2023-05-10"
}
}
}
Penjahit Menyelesaikan Pembayaran Akhir
Request:
POST /api/bookings/1/completion-payment
Content-Type: application/json
Authorization: Bearer {token_penjahit}
{
"pickup_date": "2023-05-15"
}
Response:
200 OK
Content-Type: application/json
{
"status": "success",
"message": "Pembayaran telah dikonfirmasi dan tanggal pengambilan berhasil diatur",
"data": {
"booking": {
"id": 1,
"customer_name": "John Doe",
"customer_phone": "08123456789",
"payment_status": "paid",
"status": "selesai",
"pickup_date": "2023-05-15"
},
"message": "Pembayaran telah dikonfirmasi oleh penjahit",
"pickup_info": {
"date": "2023-05-15",
"status": "Sudah dibayar"
}
}
}
Pencarian Penjahit
Request:
GET /api/tailors/search?specialization=1
Authorization: Bearer {token}
Response:
200 OK
Content-Type: application/json
{
"tailors": [
{
"id": 2,
"name": "Tailor Shop",
"address": "Jl. Tailor No. 456",
"shop_description": "Toko jahit profesional",
"profile_photo": "storage/profile_photos/photo.jpg",
"rating": 4.5,
"specializations": [
{
"id": 1,
"name": "Jahit Baju Wanita"
}
]
}
]
}
Membuat Booking
Request:
POST /api/bookings
Content-Type: multipart/form-data
Authorization: Bearer {token}
customer_id: 1
tailor_id: 2
appointment_date: 2023-05-10
appointment_time: 14:00
service_type: Jahit Baju
category: Kemeja
notes: Bahan sudah tersedia
design_photo: [file upload]
total_price: 150000
Response:
201 Created
Content-Type: application/json
{
"booking": {
"id": 1,
"customer_id": 1,
"tailor_id": 2,
"appointment_date": "2023-05-10",
"appointment_time": "14:00",
"service_type": "Jahit Baju",
"category": "Kemeja",
"notes": "Bahan sudah tersedia",
"design_photo": "storage/design_photos/design.jpg",
"status": "reservasi",
"total_price": "150000.00",
"payment_status": "unpaid",
"created_at": "2023-05-01T10:30:00.000000Z",
"updated_at": "2023-05-01T10:30:00.000000Z"
}
}
File dan Media
Upload File
Untuk endpoint yang memerlukan upload file, gunakan format multipart/form-data
dan kirimkan file sebagai form field.
Akses File Media
File media bisa diakses dengan URL:
http://localhost:8000/storage/{path}
Contoh:
http://localhost:8000/storage/design_photos/file.jpg
http://localhost:8000/storage/gallery_photos/photo.jpg
http://localhost:8000/storage/profile_photos/avatar.jpg