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

GET /test

Tes koneksi API

Response
{
  "message": "API is working"
}
GET /specializations

Mendapatkan semua spesialisasi penjahit

GET /tailors/search?specialization={id}

Mencari penjahit berdasarkan spesialisasi

GET /tailors/{id}

Mendapatkan detail informasi penjahit

Autentikasi

POST /pelanggan/register

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."
}
POST /pelanggan/login

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."
}
POST /penjahit/register

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."
}
POST /penjahit/login

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."
}
POST /admin/login

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."
}
POST /logout

Logout pengguna (invalidasi token)

Headers
Authorization: Bearer {token}
Response
{
    "success": true,
    "data": {},
    "message": "Berhasil logout"
}
Error Response
{
    "success": false,
    "data": {
        "error": "Unauthenticated"
    },
    "message": "Error."
}
POST /email/verification-notification

Mengirim ulang email verifikasi

Headers
Authorization: Bearer {token}
Response
{
    "success": true,
    "data": {},
    "message": "Email verifikasi telah dikirim"
}

Profil

GET /profile

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."
}
POST /profile

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."
}
POST /profile/photo

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

GET /dashboard

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."
}
GET /bookings/customer

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."
}
GET /bookings/customer/status/{status}

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"
}
POST /tailors/{tailor}/book

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."
}
POST /bookings/{booking}/cancel

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

GET /penjahit/dashboard

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."
}
GET /penjahit/calendar/{month}/{year}

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"
}
POST /bookings/{booking}/accept

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."
}
POST /bookings/{booking}/reject

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."
}
POST /bookings/{booking}/payment

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."
}
POST /bookings/{booking}/completion-payment

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"
}
GET /penjahit/bookings

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."
}
GET /penjahit/bookings/status/{status}

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"
}
GET /penjahit/services

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"
}
POST /penjahit/services

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."
}
GET /penjahit/gallery

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"
}
POST /penjahit/gallery

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

GET /admin/dashboard

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."
}
GET /customers

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"
}
GET /admin/withdrawals/pending

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}
GET /admin/bank-accounts/pending

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}
POST /admin/withdrawals/{withdrawal}/process

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

POST /bookings/{booking}/midtrans/pay

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"
}
GET /bookings/{booking}/payment-status

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"
}
POST /bookings/{booking}/payment-status/check

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"
}
GET /wallet

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)
GET /bank-accounts

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"
}
POST /bank-accounts

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"
}
POST /withdrawals

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."
}
GET /withdrawals

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

POST /admin/bank-accounts/{bankAccount}/verify

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."
}
GET /admin/bank-accounts/verified

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."
}
GET /admin/bank-accounts/{bankAccount}

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."
}
GET /admin/withdrawals/history

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

  1. 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
    }
  2. Verifikasi email (jika diperlukan)
  3. Login untuk mendapatkan token:
    POST /api/pelanggan/login
    Content-Type: application/json
    
    {
        "email": "john@example.com",
        "password": "password123"
    }
  4. Simpan token untuk permintaan berikutnya:
    Authorization: Bearer 1|laravel_sanctum_token...

Alur Booking Jasa Jahit

  1. Cari penjahit berdasarkan spesialisasi:
    GET /api/tailors/search?specialization=1
  2. Lihat detail penjahit:
    GET /api/tailors/2
  3. 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"
    }
  4. Lakukan pembayaran:
    POST /api/bookings/5/midtrans/pay
  5. Cek status pembayaran secara manual:
    POST /api/bookings/5/payment-status/check

Alur Penarikan Dana Penjahit

  1. Daftarkan rekening bank:
    POST /api/bank-accounts
    Content-Type: application/json
    
    {
        "bank_name": "BCA",
        "account_number": "1234567890",
        "account_holder_name": "John Doe"
    }
  2. Admin memverifikasi rekening bank:
    POST /api/admin/bank-accounts/1/verify
    Content-Type: application/json
    
    {
        "status": "active"
    }
  3. Penjahit melakukan permintaan penarikan dana:
    POST /api/withdrawals
    Content-Type: application/json
    
    {
        "bank_account_id": 1,
        "amount": 500000
    }
  4. Admin memproses permintaan penarikan:
    POST /api/admin/withdrawals/1/process
    Content-Type: multipart/form-data
    
    {
        "status": "processing",
        "proof_of_payment": [file]
    }
  5. 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