Pendahuluan
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}
Role & Hak Akses
Sistem memiliki 3 role pengguna:
- admin - Administrator platform
- penjahit - Penjahit/Penyedia jasa
- pelanggan - Pelanggan/Pengguna jasa
Endpoint API
Endpoint Publik
Tes koneksi API
Response
{
"message": "API is working"
}
Mendapatkan semua spesialisasi penjahit
Mencari penjahit berdasarkan spesialisasi
Mendapatkan detail informasi penjahit
Autentikasi
Registrasi akun pelanggan baru
Headers
Content-Type: application/json
Request Body
{
"name": "John Doe",
"email": "john@example.com",
"password": "password123",
"password_confirmation": "password123",
"phone_number": "08123456789",
"address": "Jl. Example No. 123"
}
Validasi
- name - Wajib diisi, nama lengkap pengguna
- email - Wajib diisi, format email, harus unik
- password - Wajib diisi, minimal 8 karakter
- password_confirmation - Wajib diisi, harus sama dengan password
- phone_number - Wajib diisi, nomor telepon
- address - Wajib diisi, alamat lengkap
Response
{
"success": true,
"data": {
"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": "1|laravel_sanctum_token..."
},
"message": "Pendaftaran berhasil"
}
Error Response
{
"success": false,
"data": {
"email": ["Email sudah digunakan."],
"password": ["Password minimal harus 8 karakter."]
},
"message": "Validation Error."
}
Login sebagai pelanggan
Headers
Content-Type: application/json
Request Body
{
"email": "john@example.com",
"password": "password123"
}
Validasi
- email - Wajib diisi, format email
- password - Wajib diisi
Response
{
"success": true,
"data": {
"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": "1|laravel_sanctum_token..."
},
"message": "Login berhasil"
}
Error Response
{
"success": false,
"data": {
"error": "Email atau password tidak valid"
},
"message": "Authentication Error."
}
Registrasi akun penjahit baru
Headers
Content-Type: application/json
Request Body
{
"name": "John Doe",
"email": "tailor@example.com",
"password": "password123",
"password_confirmation": "password123",
"phone_number": "08123456789",
"address": "Jl. Example No. 123",
"shop_description": "Jasa jahit profesional dengan pelayanan terbaik",
"specializations": [1, 2, 3]
}
Validasi
- name - Wajib diisi, nama lengkap penjahit
- email - Wajib diisi, format email, harus unik
- password - Wajib diisi, minimal 8 karakter
- password_confirmation - Wajib diisi, harus sama dengan password
- phone_number - Wajib diisi, nomor telepon
- address - Wajib diisi, alamat lengkap
- shop_description - Wajib diisi, deskripsi toko/jasa
- specializations - Wajib diisi, array ID spesialisasi
Response
{
"success": true,
"data": {
"user": {
"id": 2,
"name": "John Doe",
"email": "tailor@example.com",
"role": "penjahit",
"phone_number": "08123456789",
"address": "Jl. Example No. 123",
"shop_description": "Jasa jahit profesional dengan pelayanan terbaik",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z",
"specializations": [
{
"id": 1,
"name": "Kemeja"
},
{
"id": 2,
"name": "Gaun"
},
{
"id": 3,
"name": "Celana"
}
]
},
"token": "1|laravel_sanctum_token..."
},
"message": "Pendaftaran berhasil"
}
Error Response
{
"success": false,
"data": {
"email": ["Email sudah digunakan."],
"specializations": ["Spesialisasi wajib diisi."]
},
"message": "Validation Error."
}
Login sebagai penjahit
Headers
Content-Type: application/json
Request Body
{
"email": "tailor@example.com",
"password": "password123"
}
Validasi
- email - Wajib diisi, format email
- password - Wajib diisi
Response
{
"success": true,
"data": {
"user": {
"id": 2,
"name": "John Doe",
"email": "tailor@example.com",
"role": "penjahit",
"phone_number": "08123456789",
"address": "Jl. Example No. 123",
"shop_description": "Jasa jahit profesional dengan pelayanan terbaik",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
},
"token": "1|laravel_sanctum_token..."
},
"message": "Login berhasil"
}
Error Response
{
"success": false,
"data": {
"error": "Email atau password tidak valid"
},
"message": "Authentication Error."
}
Login sebagai admin
Headers
Content-Type: application/json
Request Body
{
"email": "admin@example.com",
"password": "admin123"
}
Validasi
- email - Wajib diisi, format email
- password - Wajib diisi
Response
{
"success": true,
"data": {
"user": {
"id": 3,
"name": "Admin",
"email": "admin@example.com",
"role": "admin",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
},
"token": "1|laravel_sanctum_token..."
},
"message": "Login berhasil"
}
Error Response
{
"success": false,
"data": {
"error": "Email atau password tidak valid"
},
"message": "Authentication Error."
}
Logout pengguna (invalidasi token)
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": {},
"message": "Berhasil logout"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthenticated"
},
"message": "Error."
}
Mengirim ulang email verifikasi
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": {},
"message": "Email verifikasi telah dikirim"
}
Profil
Mendapatkan informasi profil pengguna
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": {
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"role": "pelanggan",
"phone_number": "08123456789",
"address": "Jl. Example No. 123",
"profile_photo": "profile_photos/user1.jpg",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
},
"message": "Profil berhasil ditemukan"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthenticated"
},
"message": "Error."
}
Mengupdate informasi profil pengguna
Headers
Authorization: Bearer {token}
Content-Type: application/json
Request Body
{
"name": "John Doe Updated",
"phone_number": "087654321",
"address": "Jl. Updated No. 456",
"shop_description": "Deskripsi toko yang diupdate" // khusus penjahit
}
Validasi
- name - Opsional, nama baru pengguna
- phone_number - Opsional, nomor telepon baru
- address - Opsional, alamat baru
- shop_description - Opsional, deskripsi toko baru (hanya untuk penjahit)
Response
{
"success": true,
"data": {
"id": 1,
"name": "John Doe Updated",
"email": "john@example.com",
"role": "pelanggan",
"phone_number": "087654321",
"address": "Jl. Updated No. 456",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-02T10:00:00.000000Z"
},
"message": "Profil berhasil diupdate"
}
Error Response
{
"success": false,
"data": {
"phone_number": ["Format nomor telepon tidak valid"]
},
"message": "Validation Error."
}
Mengupload foto profil
Headers
Authorization: Bearer {token}
Content-Type: multipart/form-data
Request Body
{
"profile_photo": [file]
}
Validasi
- profile_photo - Wajib diisi, file gambar, maksimal 2MB
Response
{
"success": true,
"data": {
"id": 1,
"name": "John Doe",
"profile_photo": "profile_photos/user1_updated.jpg"
},
"message": "Foto profil berhasil diupload"
}
Error Response
{
"success": false,
"data": {
"profile_photo": ["File harus berupa gambar dengan ukuran maksimal 2MB"]
},
"message": "Validation Error."
}
Pelanggan
Mendapatkan data dashboard pelanggan
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": {
"user": {
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"phone_number": "08123456789"
},
"bookings_count": {
"total": 5,
"ongoing": 2,
"completed": 3
},
"latest_bookings": [
{
"id": 3,
"transaction_code": "TRX-003",
"tailor_name": "Penjahit ABC",
"category": "Atasan",
"service_type": "Jahit Baru",
"status": "diproses",
"appointment_date": "2023-05-10"
}
]
},
"message": "Dashboard data retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}
Mendapatkan semua booking yang dilakukan pelanggan
Headers
Authorization: Bearer {token}
Query Parameters
- status (optional) - Filter berdasarkan status (reservasi, dikonfirmasi, diproses, selesai, dibatalkan)
Response
{
"success": true,
"data": [
{
"id": 1,
"transaction_code": "TRX-001",
"customer_id": 1,
"tailor_id": 2,
"appointment_date": "2023-05-05",
"appointment_time": "10:00",
"service_type": "Jahit Baru",
"category": "Atasan",
"design_photo": "design_photos/design1.jpg",
"notes": "Mohon dibuat sesuai ukuran",
"status": "selesai",
"total_price": 150000,
"payment_status": "paid",
"payment_method": "Midtrans",
"completed_at": "2023-05-10T14:00:00.000000Z",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-10T14:00:00.000000Z",
"tailor": {
"id": 2,
"name": "Penjahit ABC",
"profile_photo": "profile_photos/tailor1.jpg",
"address": "Jl. Penjahit No. 123"
},
"rating": {
"id": 1,
"rating": 5,
"review": "Sangat puas dengan hasilnya"
}
}
],
"message": "Booking list retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}
Mendapatkan booking pelanggan berdasarkan status
Headers
Authorization: Bearer {token}
Path Parameters
- status - Status booking (reservasi, dikonfirmasi, diproses, selesai, dibatalkan)
Response
{
"success": true,
"data": [
{
"id": 1,
"transaction_code": "TRX-001",
"tailor_name": "Penjahit ABC",
"tailor_photo": "profile_photos/tailor1.jpg",
"appointment_date": "2023-05-05",
"service_type": "Jahit Baru",
"category": "Atasan",
"payment_method": "Midtrans",
"payment_status": "paid"
}
],
"message": "Booking list retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Invalid status"
},
"message": "Invalid status"
}
Membuat booking baru ke penjahit
Headers
Authorization: Bearer {token}
Content-Type: multipart/form-data
Path Parameters
- tailor - ID penjahit yang akan dibooking
Request Body
{
"appointment_date": "2023-05-15",
"appointment_time": "14:00",
"service_type": "Jahit Baru",
"category": "Atasan",
"design_photo": [file],
"notes": "Mohon dibuat sesuai ukuran",
"payment_method": "Midtrans"
}
Validasi
- appointment_date - Wajib diisi, format tanggal (YYYY-MM-DD), harus tanggal sekarang atau setelahnya
- appointment_time - Wajib diisi, format waktu (HH:MM). Setiap booking memiliki durasi 2 jam. Jika ada booking pada jam 08:00, slot 08:00-10:00 akan terisi
- service_type - Wajib diisi, nilai valid: "Perbaikan", "Jahit Baru"
- category - Wajib diisi, nilai valid: "Atasan", "Bawahan", "Terusan"
- design_photo - Wajib diisi, file gambar, maksimal 2MB
- notes - Opsional, catatan tambahan
- payment_method - Wajib diisi, metode pembayaran
Response
{
"success": true,
"data": {
"booking": {
"id": 5,
"transaction_code": "TRX-005",
"customer_id": 1,
"tailor_id": 2,
"appointment_date": "2023-05-15",
"appointment_time": "14:00",
"service_type": "Jahit Baru",
"category": "Atasan",
"design_photo": "design_photos/design5.jpg",
"notes": "Mohon dibuat sesuai ukuran",
"status": "reservasi",
"payment_status": "unpaid",
"payment_method": "Midtrans",
"created_at": "2023-05-05T10:00:00.000000Z",
"updated_at": "2023-05-05T10:00:00.000000Z"
},
"message": "Booking berhasil dibuat",
"next_steps": {
"payment": "Silakan lakukan pembayaran untuk mengkonfirmasi booking",
"cancellation": "Anda dapat membatalkan booking sebelum melakukan pembayaran"
}
},
"message": "Booking berhasil dibuat"
}
Error Response
{
"success": false,
"data": {
"appointment": ["Jadwal tidak tersedia. Penjahit sudah memiliki booking pada waktu tersebut (durasi 2 jam)"]
},
"message": "Error validasi."
}
Membatalkan booking
Headers
Authorization: Bearer {token}
Path Parameters
- booking - ID booking yang akan dibatalkan
Response
{
"success": true,
"data": {
"id": 5,
"status": "dibatalkan",
"updated_at": "2023-05-05T11:00:00.000000Z"
},
"message": "Booking berhasil dibatalkan."
}
Error Response
{
"success": false,
"data": {
"status": ["Booking tidak dapat dibatalkan karena sudah diproses"]
},
"message": "Error validasi."
}
Penjahit
Mendapatkan data dashboard penjahit
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": {
"user": {
"id": 2,
"name": "Penjahit ABC",
"email": "tailor@example.com"
},
"stats": {
"total_bookings": 10,
"ongoing_bookings": 5,
"completed_bookings": 4,
"cancelled_bookings": 1,
"average_rating": 4.5
},
"recent_bookings": [
{
"id": 10,
"transaction_code": "TRX-010",
"customer_name": "John Doe",
"appointment_date": "2023-05-20",
"service_type": "Jahit Baru",
"status": "reservasi",
"created_at": "2023-05-10T10:00:00.000000Z"
}
],
"earnings": {
"this_month": 750000,
"last_month": 500000,
"total": 1250000
}
},
"message": "Dashboard data retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}
Mendapatkan jadwal booking untuk bulan dan tahun tertentu
Headers
Authorization: Bearer {token}
Path Parameters
- month - Bulan (1-12)
- year - Tahun (format 4 digit, contoh: 2023)
Response
{
"success": true,
"data": {
"2023-05-01": {
"date": "2023-05-01",
"day": "01",
"day_name": "Senin",
"bookings": []
},
"2023-05-02": {
"date": "2023-05-02",
"day": "02",
"day_name": "Selasa",
"bookings": [
{
"id": 1,
"transaction_code": "TRX-001",
"customer_name": "John Doe",
"customer_phone": "08123456789",
"appointment_time": "10:00",
"appointment_end_time": "12:00", // Durasi 2 jam
"service_type": "Jahit Baru",
"category": "Atasan",
"status": "dikonfirmasi"
}
]
}
},
"message": "Calendar data retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Invalid date"
},
"message": "Invalid date"
}
Menerima booking dari pelanggan
Headers
Authorization: Bearer {token}
Content-Type: application/json
Path Parameters
- booking - ID booking yang akan diterima
Response
{
"success": true,
"data": {
"id": 5,
"status": "dikonfirmasi",
"accepted_at": "2023-05-05T14:00:00.000000Z",
"updated_at": "2023-05-05T14:00:00.000000Z"
},
"message": "Booking berhasil dikonfirmasi"
}
Error Response
{
"success": false,
"data": {
"error": "Booking tidak dapat dikonfirmasi karena status sudah berubah"
},
"message": "Error."
}
Menolak booking dari pelanggan
Headers
Authorization: Bearer {token}
Content-Type: application/json
Path Parameters
- booking - ID booking yang akan ditolak
Request Body
{
"rejection_reason": "Jadwal sudah penuh"
}
Validasi
- rejection_reason - Wajib diisi, alasan penolakan
Response
{
"success": true,
"data": {
"id": 5,
"status": "dibatalkan",
"rejection_reason": "Jadwal sudah penuh",
"rejected_at": "2023-05-05T14:00:00.000000Z",
"updated_at": "2023-05-05T14:00:00.000000Z"
},
"message": "Booking berhasil ditolak"
}
Error Response
{
"success": false,
"data": {
"rejection_reason": ["Alasan penolakan wajib diisi"]
},
"message": "Error validasi."
}
Mengubah status pembayaran booking menjadi paid
Headers
Authorization: Bearer {token}
Content-Type: application/json
Path Parameters
- booking - ID booking yang akan diubah status pembayarannya
Request Body
{
"payment_status": "paid"
}
Validasi
- payment_status - Wajib diisi, nilai valid: "paid" atau "success"
Response
{
"success": true,
"data": {
"id": 5,
"payment_status": "paid",
"updated_at": "2023-05-05T15:00:00.000000Z"
},
"message": "Status pembayaran berhasil diubah"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Unauthorized."
}
Memproses pembayaran akhir dan mengatur tanggal pengambilan
Headers
Authorization: Bearer {token}
Content-Type: application/json
Path Parameters
- booking - ID booking yang akan diproses pembayaran akhirnya
Request Body
{
"pickup_date": "2023-05-20"
}
Validasi
- pickup_date - Wajib diisi, format tanggal (YYYY-MM-DD), harus tanggal sekarang atau setelahnya
Response
{
"success": true,
"data": {
"id": 5,
"payment_status": "paid",
"pickup_date": "2023-05-20",
"updated_at": "2023-05-05T16:00:00.000000Z"
},
"message": "Pembayaran akhir berhasil diproses"
}
Error Response
{
"success": false,
"data": {
"error": "Invalid status",
"message": "Pembayaran hanya dapat dilakukan untuk pesanan yang sudah selesai"
},
"message": "Invalid status"
}
Mendapatkan semua booking penjahit
Headers
Authorization: Bearer {token}
Query Parameters
- status (optional) - Filter berdasarkan status (reservasi, dikonfirmasi, diproses, selesai, dibatalkan)
Response
{
"success": true,
"data": [
{
"id": 5,
"transaction_code": "TRX-005",
"customer_id": 1,
"appointment_date": "2023-05-15",
"appointment_time": "14:00",
"service_type": "Jahit Baru",
"category": "Atasan",
"status": "dikonfirmasi",
"total_price": 150000,
"payment_status": "paid",
"created_at": "2023-05-05T10:00:00.000000Z",
"updated_at": "2023-05-05T15:00:00.000000Z",
"customer": {
"id": 1,
"name": "John Doe",
"phone_number": "08123456789"
}
}
],
"message": "Booking list retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}
Mendapatkan booking penjahit berdasarkan status
Headers
Authorization: Bearer {token}
Path Parameters
- status - Status booking (reservasi, dikonfirmasi, diproses, selesai, dibatalkan)
Response
{
"success": true,
"data": [
{
"id": 5,
"transaction_code": "TRX-005",
"customer_name": "John Doe",
"customer_phone": "08123456789",
"appointment_date": "2023-05-15",
"service_type": "Jahit Baru",
"payment_status": "paid"
}
],
"message": "Booking list retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Invalid status"
},
"message": "Invalid status"
}
Mendapatkan semua layanan penjahit
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": [
{
"id": 1,
"tailor_id": 2,
"name": "Jahit Kemeja",
"description": "Jasa jahit kemeja pria dan wanita",
"price": 150000,
"is_available": true,
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
}
],
"message": "Services retrieved successfully"
}
Menambahkan layanan baru
Headers
Authorization: Bearer {token}
Content-Type: application/json
Request Body
{
"name": "Jahit Jas",
"description": "Jasa pembuatan jas pria berkualitas tinggi",
"price": 500000
}
Validasi
- name - Wajib diisi, nama layanan
- description - Wajib diisi, deskripsi layanan
- price - Wajib diisi, harga layanan (angka)
Response
{
"success": true,
"data": {
"id": 2,
"tailor_id": 2,
"name": "Jahit Jas",
"description": "Jasa pembuatan jas pria berkualitas tinggi",
"price": 500000,
"is_available": true,
"created_at": "2023-05-05T10:00:00.000000Z",
"updated_at": "2023-05-05T10:00:00.000000Z"
},
"message": "Service created successfully"
}
Error Response
{
"success": false,
"data": {
"price": ["Harga harus berupa angka"]
},
"message": "Validation Error."
}
Mendapatkan semua galeri penjahit
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": [
{
"id": 1,
"tailor_id": 2,
"title": "Kemeja Batik",
"description": "Kemeja batik pesanan pelanggan",
"photo_path": "gallery_photos/kemeja_batik.jpg",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
}
],
"message": "Gallery items retrieved successfully"
}
Menambahkan item galeri baru
Headers
Authorization: Bearer {token}
Content-Type: multipart/form-data
Request Body
{
"title": "Jas Pernikahan",
"description": "Jas pernikahan custom pesanan pelanggan",
"photo": [file]
}
Validasi
- title - Wajib diisi, judul item galeri
- description - Wajib diisi, deskripsi item galeri
- photo - Wajib diisi, file gambar, maksimal 2MB
Response
{
"success": true,
"data": {
"id": 2,
"tailor_id": 2,
"title": "Jas Pernikahan",
"description": "Jas pernikahan custom pesanan pelanggan",
"photo_path": "gallery_photos/jas_pernikahan.jpg",
"created_at": "2023-05-05T10:00:00.000000Z",
"updated_at": "2023-05-05T10:00:00.000000Z"
},
"message": "Gallery item created successfully"
}
Error Response
{
"success": false,
"data": {
"photo": ["File harus berupa gambar dengan ukuran maksimal 2MB"]
},
"message": "Validation Error."
}
Admin
Mendapatkan data dashboard admin
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": {
"stats": {
"total_users": {
"customers": 50,
"tailors": 20,
"admins": 2
},
"bookings": {
"total": 100,
"ongoing": 40,
"completed": 55,
"cancelled": 5
},
"revenue": {
"this_month": 5000000,
"last_month": 4500000,
"total": 15000000
},
"ratings": {
"average": 4.7,
"count": 75
}
},
"recent_bookings": [
{
"id": 10,
"transaction_code": "TRX-010",
"customer_name": "John Doe",
"tailor_name": "Penjahit ABC",
"service_type": "Jahit Baru",
"status": "diproses",
"total_price": 150000,
"created_at": "2023-05-10T10:00:00.000000Z"
}
],
"recent_users": [
{
"id": 70,
"name": "Jane Smith",
"role": "pelanggan",
"created_at": "2023-05-10T10:00:00.000000Z"
}
]
},
"message": "Dashboard data retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthorized access"
},
"message": "Error."
}
Mendapatkan semua data pelanggan
Headers
Authorization: Bearer {token}
Query Parameters
- search (optional) - Mencari berdasarkan nama atau email
Response
{
"success": true,
"data": [
{
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"phone_number": "08123456789",
"address": "Jl. Example No. 123",
"profile_photo": "profile_photos/user1.jpg",
"created_at": "2023-05-01T10:00:00.000000Z",
"bookings_count": 5
}
],
"message": "Customers retrieved successfully"
}
Mendapatkan daftar permintaan penarikan dana yang perlu diproses
Headers
Authorization: Bearer {token}
Response
{\n "success": true,\n "data": [\n {\n "id": 1,\n "amount": 500000.00,\n "status": "pending",\n "created_at": "2024-05-03T10:00:00.000000Z",\n "wallet": {\n "user": {\n "id": 1,\n "name": "John Doe",\n "email": "john@example.com"\n }\n },\n "bank_account": {\n "bank_name": "BCA",\n "account_number": "1234567890",\n "account_holder_name": "John Doe"\n }\n }\n ],\n "message": "Pending withdrawals retrieved successfully"\n}
Mendapatkan daftar rekening bank yang perlu diverifikasi
Headers
Authorization: Bearer {token}
Response
{\n "success": true,\n "data": [\n {\n "id": 1,\n "user_id": 2,\n "bank_name": "BCA",\n "account_number": "1234567890",
"account_holder_name": "John Doe",\n "status": "pending",\n "created_at": "2024-05-03T10:00:00.000000Z",\n "updated_at": "2024-05-03T10:00:00.000000Z",\n "user": {\n "id": 2,\n "name": "John Doe",\n "email": "john@example.com",\n "role": "penjahit"\n }\n }\n ],\n "message": "Pending bank accounts retrieved successfully"\n}
Memproses permintaan penarikan (approve/reject)
Headers
Authorization: Bearer {token}
Content-Type: multipart/form-data
Path Parameters
- withdrawal - ID permintaan penarikan
Request Body
{
"status": "completed", // atau "rejected"
"rejection_reason": "", // wajib diisi jika status = "rejected"
"proof_of_payment": [file] // wajib diupload jika status = "completed"
}
Validasi
- status - Wajib diisi, nilai yang valid: "completed" atau "rejected"
- rejection_reason - Wajib diisi jika status = "rejected"
- proof_of_payment - Wajib diisi jika status = "completed", file bukti pembayaran
Response (Completed)
{
"success": true,
"data": {
"id": 1,
"wallet_id": 1,
"bank_account_id": 1,
"amount": 500000.00,
"status": "completed",
"rejection_reason": null,
"proof_of_payment": "proof_of_payments/withdrawal_1_proof.jpg",
"processed_at": "2024-05-03T10:30:00.000000Z",
"created_at": "2024-05-03T10:00:00.000000Z",
"updated_at": "2024-05-03T10:30:00.000000Z"
},
"message": "Withdrawal completed successfully"
}
Response (Rejected)
{
"success": true,
"data": {
"id": 1,
"wallet_id": 1,
"bank_account_id": 1,
"amount": 500000.00,
"status": "rejected",
"rejection_reason": "Informasi rekening tidak valid",
"proof_of_payment": null,
"processed_at": "2024-05-03T10:30:00.000000Z",
"created_at": "2024-05-03T10:00:00.000000Z",
"updated_at": "2024-05-03T10:30:00.000000Z"
},
"message": "Withdrawal rejected successfully"
}
Error Response
{
"success": false,
"data": {
"status": ["The status field is required."],
"rejection_reason": ["The rejection reason field is required when status is rejected."],
"proof_of_payment": ["The proof of payment field is required when status is completed."]
},
"message": "Validation Error."
}
Wallet & Withdrawal
Midtrans Payment
Memulai proses pembayaran Midtrans
Headers
Authorization: Bearer {token}
Path Parameters
- booking - ID booking yang akan dibayar
Response
{
"success": true,
"data": {
"snap_token": "66e4fa55-fdac-4ef9-91b5-733b97d1b862",
"redirect_url": "https://app.sandbox.midtrans.com/snap/v2/vtweb/66e4fa55-fdac-4ef9-91b5-733b97d1b862",
"booking": {
"id": 1,
"transaction_code": "TRX-20240503-A1B2C3",
"total_price": 150000,
"status": "selesai"
}
},
"message": "Token pembayaran berhasil dibuat"
}
Memeriksa status pembayaran
Headers
Authorization: Bearer {token}
Path Parameters
- booking - ID booking yang akan diperiksa status pembayarannya
Response
{
"success": true,
"data": {
"booking_id": 1,
"transaction_code": "TRX-20240503-A1B2C3",
"payment_status": "pending",
"payment_method": "bank_transfer",
"total_price": 150000,
"status": "selesai",
"midtrans_snap_token": "66e4fa55-fdac-4ef9-91b5-733b97d1b862"
},
"message": "Status pembayaran berhasil diambil"
}
Memeriksa dan mengupdate status pembayaran secara manual
Headers
Authorization: Bearer {token}
Path Parameters
- booking - ID booking yang akan diupdate status pembayarannya
Response
{
"success": true,
"data": {
"booking_id": 1,
"transaction_code": "TRX-20240503-A1B2C3",
"payment_status": "paid",
"payment_method": "bank_transfer",
"total_price": 150000,
"status": "selesai",
"midtrans_status": "settlement",
"midtrans_snap_token": "66e4fa55-fdac-4ef9-91b5-733b97d1b862"
},
"message": "Status pembayaran berhasil diperbarui"
}
Mendapatkan informasi wallet
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": {
"balance": 1000000.00,
"pending_withdrawals": 300000.00,
"available_balance": 700000.00,
"transactions": [
{
"id": 1,
"type": "credit",
"amount": 500000.00,
"description": "Pembayaran booking #TRX-001",
"status": "success",
"created_at": "2024-05-03T10:00:00.000000Z",
"booking": {
"id": 1,
"transaction_code": "TRX-001",
"service_type": "jahit",
"category": "baju"
}
}
]
},
"message": "Wallet information retrieved successfully"
}
Catatan
- balance - Total saldo dalam wallet
- pending_withdrawals - Total semua penarikan yang masih dalam status "pending" atau "processing"
- available_balance - Saldo yang tersedia untuk penarikan (balance - pending_withdrawals)
Mendapatkan daftar rekening bank penjahit
Headers
Authorization: Bearer {token}
Response
{
"success": true,
"data": [
{
"id": 1,
"user_id": 2,
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe",
"status": "active",
"rejection_reason": null,
"verified_at": "2024-05-03T10:00:00.000000Z",
"created_at": "2024-05-03T09:00:00.000000Z",
"updated_at": "2024-05-03T10:00:00.000000Z"
}
],
"message": "Bank accounts retrieved successfully"
}
Mendaftarkan rekening bank baru
Headers
Authorization: Bearer {token}
Content-Type: application/json
Request Body
{
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe"
}
Validasi
- bank_name - Wajib diisi, nama bank
- account_number - Wajib diisi, nomor rekening
- account_holder_name - Wajib diisi, nama pemilik rekening
Response
{
"success": true,
"data": {
"id": 1,
"user_id": 2,
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe",
"status": "pending",
"created_at": "2024-05-03T10:00:00.000000Z",
"updated_at": "2024-05-03T10:00:00.000000Z"
},
"message": "Bank account registered successfully"
}
Membuat permintaan penarikan dana
Headers
Authorization: Bearer {token}
Content-Type: application/json
Request Body
{
"bank_account_id": 1,
"amount": 500000
}
Validasi
- bank_account_id - Wajib diisi, ID rekening bank yang sudah terverifikasi
- amount - Wajib diisi, jumlah penarikan (minimal 10000)
- Jumlah penarikan harus kurang dari atau sama dengan saldo tersedia (available_balance)
- Saldo tersedia dihitung dari: saldo total (balance) dikurangi total penarikan tertunda (pending_withdrawals)
Response
{
"success": true,
"data": {
"withdrawal": {
"id": 1,
"wallet_id": 1,
"bank_account_id": 1,
"amount": 500000.00,
"status": "pending",
"created_at": "2024-05-03T10:00:00.000000Z",
"updated_at": "2024-05-03T10:00:00.000000Z"
},
"wallet": {
"balance": 1000000.00,
"pending_withdrawals": 500000.00,
"available_balance": 500000.00
}
},
"message": "Withdrawal request submitted successfully"
}
Error Response
{
"success": false,
"data": {
"balance": 1000000.00,
"pending_withdrawals": 800000.00,
"available_balance": 200000.00,
"requested_amount": 500000.00
},
"message": "Insufficient available balance."
}
Mendapatkan riwayat penarikan dana
Headers
Authorization: Bearer {token}
Query Parameters
- status (optional) - Filter berdasarkan status penarikan. Nilai yang diperbolehkan: "pending", "processing", "completed", "rejected"
Response
{
"success": true,
"data": [
{
"id": 1,
"amount": 500000.00,
"status": "completed",
"created_at": "2024-05-03T10:00:00.000000Z",
"processed_at": "2024-05-03T11:00:00.000000Z",
"bank_account": {
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe"
}
}
],
"message": "Withdrawal history retrieved successfully"
}
Manajemen Rekening Bank
Memverifikasi akun bank
Headers
Authorization: Bearer {token}
Content-Type: application/json
Path Parameters
- bankAccount - ID akun bank
Request Body
{
"status": "active", // atau "rejected"
"rejection_reason": null // wajib diisi jika status = "rejected", boleh null jika status = "active"
}
Validasi
- status - Wajib diisi, nilai yang valid: "active" atau "rejected"
- rejection_reason - Wajib diisi jika status = "rejected", boleh null jika status = "active"
Response
{
"success": true,
"data": {
"id": 1,
"user_id": 2,
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe",
"status": "active",
"rejection_reason": null,
"verified_at": "2024-05-03T10:00:00.000000Z",
"created_at": "2024-05-02T10:00:00.000000Z",
"updated_at": "2024-05-03T10:00:00.000000Z"
},
"message": "Bank account verification completed"
}
Error Response
{
"success": false,
"data": {
"status": ["The status field must be one of: active, rejected."],
"rejection_reason": ["The rejection reason field is required when status is rejected."]
},
"message": "Validation Error."
}
Mendapatkan riwayat akun bank yang sudah diverifikasi (disetujui atau ditolak)
Headers
Authorization: Bearer {token}
Query Parameters
- status (optional) - Filter berdasarkan status ("active" atau "rejected")
- search (optional) - Pencarian berdasarkan nama penjahit, nama bank, nomor rekening, atau nama pemilik rekening
Response
{
"success": true,
"data": [
{
"id": 1,
"user_id": 2,
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe",
"status": "active",
"rejection_reason": null,
"verified_at": "2024-05-03T10:00:00.000000Z",
"created_at": "2024-05-01T10:00:00.000000Z",
"updated_at": "2024-05-03T10:00:00.000000Z",
"user": {
"id": 2,
"name": "John Doe",
"email": "john@example.com",
"role": "penjahit"
}
},
{
"id": 2,
"user_id": 3,
"bank_name": "Mandiri",
"account_number": "9876543210",
"account_holder_name": "Jane Smith",
"status": "rejected",
"rejection_reason": "Data tidak sesuai dengan identitas penjahit",
"verified_at": "2024-05-02T11:00:00.000000Z",
"created_at": "2024-05-01T09:00:00.000000Z",
"updated_at": "2024-05-02T11:00:00.000000Z",
"user": {
"id": 3,
"name": "Jane Smith",
"email": "jane@example.com",
"role": "penjahit"
}
}
],
"message": "Verified bank accounts retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}
Mendapatkan detail akun bank beserta riwayat penarikannya
Headers
Authorization: Bearer {token}
Path Parameters
- bankAccount - ID akun bank
Response
{
"success": true,
"data": {
"id": 1,
"user_id": 2,
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe",
"status": "active",
"rejection_reason": null,
"verified_at": "2024-05-03T10:00:00.000000Z",
"created_at": "2024-05-02T10:00:00.000000Z",
"updated_at": "2024-05-03T10:00:00.000000Z",
"user": {
"id": 2,
"name": "John Doe",
"email": "john@example.com",
"phone_number": "08123456789",
"role": "penjahit"
},
"withdrawals": [
{
"id": 1,
"wallet_id": 1,
"bank_account_id": 1,
"amount": 500000.00,
"status": "completed",
"rejection_reason": null,
"proof_of_payment": "proof_of_payments/withdrawal_1.jpg",
"processed_at": "2024-05-04T14:00:00.000000Z",
"created_at": "2024-05-04T10:00:00.000000Z",
"updated_at": "2024-05-04T14:00:00.000000Z"
}
]
},
"message": "Bank account detail retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Bank account not found"
},
"message": "Error."
}
Mendapatkan riwayat penarikan dana yang telah diproses (completed & rejected)
Headers
Authorization: Bearer {token}
Query Parameters
- status (optional) - Filter berdasarkan status penarikan. Nilai yang diperbolehkan: "completed", "rejected"
- search (optional) - Pencarian berdasarkan nama pengguna, nomor rekening, atau nama bank
- from_date (optional) - Filter dari tanggal tertentu (format: YYYY-MM-DD)
- to_date (optional) - Filter sampai tanggal tertentu (format: YYYY-MM-DD)
- sort_by (optional) - Kolom yang digunakan untuk pengurutan. Nilai yang diperbolehkan: "created_at", "amount", "processed_at" (default: "processed_at")
- sort_order (optional) - Arah pengurutan. Nilai yang diperbolehkan: "asc", "desc" (default: "desc")
- per_page (optional) - Jumlah item per halaman (default: 15)
Response
{
"success": true,
"data": {
"current_page": 1,
"data": [
{
"id": 1,
"wallet_id": 1,
"bank_account_id": 1,
"amount": 500000.00,
"status": "completed",
"rejection_reason": null,
"proof_of_payment": "proof_of_payments/withdrawal_1.jpg",
"processed_at": "2024-05-04T14:00:00.000000Z",
"created_at": "2024-05-04T10:00:00.000000Z",
"updated_at": "2024-05-04T14:00:00.000000Z",
"wallet": {
"id": 1,
"user_id": 2,
"balance": 1500000,
"user": {
"id": 2,
"name": "John Doe",
"email": "john@example.com",
"role": "penjahit"
}
},
"bank_account": {
"id": 1,
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe"
}
},
{
"id": 2,
"wallet_id": 1,
"bank_account_id": 1,
"amount": 300000.00,
"status": "rejected",
"rejection_reason": "Informasi rekening tidak sesuai dengan identitas penjahit",
"proof_of_payment": null,
"processed_at": "2024-05-05T15:00:00.000000Z",
"created_at": "2024-05-05T11:00:00.000000Z",
"updated_at": "2024-05-05T15:00:00.000000Z",
"wallet": {
"id": 1,
"user_id": 2,
"balance": 1500000,
"user": {
"id": 2,
"name": "John Doe",
"email": "john@example.com",
"role": "penjahit"
}
},
"bank_account": {
"id": 1,
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe"
}
}
],
"first_page_url": "http://localhost:8000/api/admin/withdrawals/history?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "http://localhost:8000/api/admin/withdrawals/history?page=1",
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "http://localhost:8000/api/admin/withdrawals/history?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"next_page_url": null,
"path": "http://localhost:8000/api/admin/withdrawals/history",
"per_page": 15,
"prev_page_url": null,
"to": 2,
"total": 2
},
"message": "Withdrawal history retrieved successfully"
}
Error Response
{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}
Model Data
Berikut adalah struktur model data utama yang digunakan dalam API Project Jahit.
User
Representasi pengguna dalam sistem, bisa berupa admin, penjahit, atau pelanggan.
{
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"role": "penjahit", // atau "pelanggan", "admin"
"phone_number": "08123456789",
"address": "Jl. Example No. 123",
"shop_description": "Jasa jahit profesional dengan pelayanan terbaik", // hanya untuk penjahit
"profile_photo": "profile_photos/user1.jpg",
"latitude": -6.123456,
"longitude": 106.789012,
"email_verified_at": "2023-05-01T10:00:00.000000Z",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
}
Booking
Data pemesanan jasa jahit.
{
"id": 1,
"transaction_code": "TRX-20230501-A1B2C3",
"customer_id": 1,
"tailor_id": 2,
"appointment_date": "2023-05-05",
"appointment_time": "10:00",
"service_type": "Jahit Baru", // atau "Perbaikan"
"category": "Atasan", // atau "Bawahan", "Terusan"
"design_photo": "design_photos/design1.jpg",
"notes": "Mohon dibuat sesuai ukuran",
"status": "reservasi", // atau "dikonfirmasi", "diproses", "selesai", "dibatalkan"
"total_price": 150000,
"payment_status": "unpaid", // atau "pending", "paid", "expired", "failed", "cancelled"
"payment_method": "Midtrans",
"midtrans_snap_token": "66e4fa55-fdac-4ef9-91b5-733b97d1b862",
"completed_at": null,
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
}
TailorSpecialization
Kategori spesialisasi penjahit.
{
"id": 1,
"name": "Kemeja",
"icon": "icons/kemeja.png",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
}
TailorService
Layanan yang ditawarkan oleh penjahit.
{
"id": 1,
"user_id": 2,
"name": "Jahit Kemeja",
"description": "Jasa jahit kemeja pria dan wanita",
"price": 150000,
"is_available": true,
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
}
TailorGallery
Item galeri karya penjahit.
{
"id": 1,
"user_id": 2,
"title": "Kemeja Batik",
"description": "Kemeja batik pesanan pelanggan",
"photo_path": "gallery_photos/kemeja_batik.jpg",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-01T10:00:00.000000Z"
}
TailorRating
Penilaian yang diberikan pelanggan untuk penjahit.
{
"id": 1,
"booking_id": 1,
"customer_id": 1,
"tailor_id": 2,
"rating": 5, // 1-5
"review": "Sangat puas dengan hasilnya",
"created_at": "2023-05-10T10:00:00.000000Z",
"updated_at": "2023-05-10T10:00:00.000000Z"
}
Wallet
Dompet digital penjahit untuk menerima pembayaran.
{
"id": 1,
"user_id": 2,
"balance": 1000000.00,
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-10T10:00:00.000000Z"
}
BankAccount
Akun bank penjahit untuk penarikan dana.
{
"id": 1,
"user_id": 2,
"bank_name": "BCA",
"account_number": "1234567890",
"account_holder_name": "John Doe",
"status": "active", // atau "pending", "rejected"
"rejection_reason": null,
"verified_at": "2023-05-03T10:00:00.000000Z",
"created_at": "2023-05-01T10:00:00.000000Z",
"updated_at": "2023-05-03T10:00:00.000000Z"
}
Withdrawal
Permintaan penarikan dana dari wallet ke rekening bank.
{
"id": 1,
"wallet_id": 1,
"bank_account_id": 1,
"amount": 500000.00,
"status": "pending", // atau "processing", "completed", "rejected"
"rejection_reason": null,
"proof_of_payment": null,
"processed_at": null,
"created_at": "2023-05-10T10:00:00.000000Z",
"updated_at": "2023-05-10T10:00:00.000000Z"
}
Kode Status
Berikut adalah kode status HTTP yang digunakan dalam API Project Jahit:
| Kode | Status | Deskripsi |
|---|---|---|
| 200 | OK | Permintaan berhasil diproses |
| 201 | Created | Sumber daya baru berhasil dibuat |
| 400 | Bad Request | Format permintaan tidak valid |
| 401 | Unauthorized | Kredensial autentikasi tidak valid atau tidak ada |
| 403 | Forbidden | Klien tidak memiliki hak akses ke sumber daya yang diminta |
| 404 | Not Found | Sumber daya yang diminta tidak ditemukan |
| 422 | Unprocessable Entity | Validasi data gagal |
| 500 | Internal Server Error | Terjadi kesalahan pada server |
Contoh
Alur Registrasi dan Login Pelanggan
- Registrasi akun pelanggan:
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", "latitude": -6.123456, "longitude": 106.789012 } - Verifikasi email (jika diperlukan)
- Login untuk mendapatkan token:
POST /api/pelanggan/login Content-Type: application/json { "email": "john@example.com", "password": "password123" } - Simpan token untuk permintaan berikutnya:
Authorization: Bearer 1|laravel_sanctum_token...
Alur Booking Jasa Jahit
- Cari penjahit berdasarkan spesialisasi:
GET /api/tailors/search?specialization=1 - Lihat detail penjahit:
GET /api/tailors/2 - Buat booking baru:
POST /api/tailors/2/book Content-Type: multipart/form-data { "appointment_date": "2023-05-15", "appointment_time": "14:00", "service_type": "Jahit Baru", "category": "Atasan", "design_photo": [file], "notes": "Mohon dibuat sesuai ukuran" } - Lakukan pembayaran:
POST /api/bookings/5/midtrans/pay - Cek status pembayaran secara manual:
POST /api/bookings/5/payment-status/check
Alur Penarikan Dana Penjahit
- Daftarkan rekening bank:
POST /api/bank-accounts Content-Type: application/json { "bank_name": "BCA", "account_number": "1234567890", "account_holder_name": "John Doe" } - Admin memverifikasi rekening bank:
POST /api/admin/bank-accounts/1/verify Content-Type: application/json { "status": "active" } - Penjahit melakukan permintaan penarikan dana:
POST /api/withdrawals Content-Type: application/json { "bank_account_id": 1, "amount": 500000 } - Admin memproses permintaan penarikan:
POST /api/admin/withdrawals/1/process Content-Type: multipart/form-data { "status": "processing", "proof_of_payment": [file] } - Admin menyelesaikan proses penarikan:
POST /api/admin/withdrawals/1/complete
File & Media
Berikut adalah informasi tentang manajemen file dan media dalam API Project Jahit.
Upload File
Untuk mengupload file seperti foto profil, desain pakaian, bukti pembayaran, atau gambar galeri, gunakan format multipart/form-data dalam permintaan API.
Endpoint yang Mendukung Upload File:
- /profile/photo - Upload foto profil pengguna
- /tailors/{tailor}/book - Upload desain pakaian saat membuat booking
- /penjahit/gallery - Upload foto untuk galeri penjahit
- /admin/withdrawals/{withdrawal}/process - Upload bukti pembayaran penarikan
Batasan Upload:
- Format yang didukung: JPG, JPEG, PNG, GIF
- Ukuran maksimum: 2MB per file
- Resolusi gambar yang direkomendasikan: minimal 300x300 pixel
Penyimpanan File
File yang diupload akan disimpan di server dengan struktur direktori sebagai berikut:
- profile_photos/ - Foto profil pengguna
- design_photos/ - Foto desain pakaian
- gallery_photos/ - Foto galeri penjahit
- proof_of_payments/ - Bukti pembayaran penarikan
Mengakses File
File yang telah diupload dapat diakses melalui URL yang dikembalikan dalam respons API. Contoh URL:
https://api.project-jahit.com/storage/profile_photos/user1.jpg
Menghapus File
Beberapa endpoint menyediakan operasi untuk menghapus file, seperti:
- DELETE /penjahit/shop-profile/photo - Menghapus foto profil toko
- DELETE /penjahit/gallery/{gallery} - Menghapus item galeri