MIF_E31221305/TA_API/resources/views/api-docs-original.blade.php

1555 lines
60 KiB
PHP

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dokumentasi API Project Jahit</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
padding-top: 56px;
position: relative;
}
.sidebar {
position: sticky;
top: 70px;
height: calc(100vh - 70px);
overflow-y: auto;
}
.endpoint {
padding: 15px;
border-radius: 5px;
margin-bottom: 15px;
border-left: 5px solid #0d6efd;
background-color: #f8f9fa;
}
.get {
border-left-color: #0d6efd;
}
.post {
border-left-color: #198754;
}
.put,
.patch {
border-left-color: #ffc107;
}
.delete {
border-left-color: #dc3545;
}
.method {
display: inline-block;
padding: 5px 10px;
border-radius: 3px;
color: white;
font-weight: bold;
min-width: 80px;
text-align: center;
}
.get-method {
background-color: #0d6efd;
}
.post-method {
background-color: #198754;
}
.put-method,
.patch-method {
background-color: #ffc107;
color: #212529;
}
.delete-method {
background-color: #dc3545;
}
pre {
background-color: #212529;
color: #f8f9fa;
padding: 15px;
border-radius: 5px;
}
code {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
white-space: pre-wrap;
}
</style>
</head>
<body data-bs-spy="scroll" data-bs-target="#navbar-example">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top">
<div class="container">
<a class="navbar-brand" href="#">Dokumentasi API Project Jahit</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="#introduction">Pendahuluan</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#authentication">Autentikasi</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#endpoints">Endpoint</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#models">Model Data</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#examples">Contoh</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-md-3 col-lg-2 d-none d-md-block bg-light sidebar">
<div class="position-sticky pt-3" id="navbar-example">
<h5>Daftar Isi</h5>
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link" href="#introduction">Pendahuluan</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#authentication">Autentikasi</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#roles">Role & Hak Akses</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#endpoints">Endpoint API</a>
<ul class="nav flex-column ps-3">
<li class="nav-item">
<a class="nav-link" href="#public-endpoints">Endpoint Publik</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#auth-endpoints">Autentikasi</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#profile-endpoints">Profil</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#customer-endpoints">Pelanggan</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#tailor-endpoints">Penjahit</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#admin-endpoints">Admin</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#wallet-endpoints">Wallet & Withdrawal</a>
</li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="#models">Model Data</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#status-codes">Kode Status</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#examples">Contoh</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#files">File & Media</a>
</li>
</ul>
</div>
</div>
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
<div class="mt-4" id="introduction">
<h2>Pendahuluan</h2>
<p>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.</p>
<h4>Base URL</h4>
<pre><code>http://localhost:8000/api</code></pre>
</div>
<div class="mt-4" id="authentication">
<h2>Autentikasi</h2>
<p>API ini menggunakan Laravel Sanctum untuk autentikasi. Token akan diberikan setelah login dan
harus disertakan dalam header setiap permintaan ke endpoint yang terproteksi.</p>
<h4>Format Header</h4>
<pre><code>Authorization: Bearer {token}</code></pre>
</div>
<div class="mt-4" id="roles">
<h2>Role & Hak Akses</h2>
<p>Sistem memiliki 3 role pengguna:</p>
<ul>
<li><strong>admin</strong> - Administrator platform</li>
<li><strong>penjahit</strong> - Penjahit/Penyedia jasa</li>
<li><strong>pelanggan</strong> - Pelanggan/Pengguna jasa</li>
</ul>
</div>
<div class="mt-5" id="endpoints">
<h2>Endpoint API</h2>
<div id="public-endpoints" class="mt-4">
<h3>Endpoint Publik</h3>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/test</span>
<p class="mt-2">Tes koneksi API</p>
<h5>Response</h5>
<pre><code>{
"message": "API is working"
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/specializations</span>
<p class="mt-2">Mendapatkan semua spesialisasi penjahit</p>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/tailors/search?specialization={id}</span>
<p class="mt-2">Mencari penjahit berdasarkan spesialisasi</p>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/tailors/{id}</span>
<p class="mt-2">Mendapatkan detail informasi penjahit</p>
</div>
</div>
<div id="auth-endpoints" class="mt-4">
<h3>Autentikasi</h3>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/pelanggan/register</span>
<p class="mt-2">Registrasi akun pelanggan baru</p>
<h5>Headers</h5>
<pre><code>Content-Type: application/json</code></pre>
<h5>Request Body</h5>
<pre><code>{
"name": "John Doe",
"email": "john@example.com",
"password": "password123",
"password_confirmation": "password123",
"phone_number": "08123456789",
"address": "Jl. Example No. 123"
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>name</strong> - Wajib diisi, nama lengkap pengguna</li>
<li><strong>email</strong> - Wajib diisi, format email, harus unik</li>
<li><strong>password</strong> - Wajib diisi, minimal 8 karakter</li>
<li><strong>password_confirmation</strong> - Wajib diisi, harus sama dengan password</li>
<li><strong>phone_number</strong> - Wajib diisi, nomor telepon</li>
<li><strong>address</strong> - Wajib diisi, alamat lengkap</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"email": ["Email sudah digunakan."],
"password": ["Password minimal harus 8 karakter."]
},
"message": "Validation Error."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/pelanggan/login</span>
<p class="mt-2">Login sebagai pelanggan</p>
<h5>Headers</h5>
<pre><code>Content-Type: application/json</code></pre>
<h5>Request Body</h5>
<pre><code>{
"email": "john@example.com",
"password": "password123"
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>email</strong> - Wajib diisi, format email</li>
<li><strong>password</strong> - Wajib diisi</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Email atau password tidak valid"
},
"message": "Authentication Error."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/penjahit/register</span>
<p class="mt-2">Registrasi akun penjahit baru</p>
<h5>Headers</h5>
<pre><code>Content-Type: application/json</code></pre>
<h5>Request Body</h5>
<pre><code>{
"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]
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>name</strong> - Wajib diisi, nama lengkap penjahit</li>
<li><strong>email</strong> - Wajib diisi, format email, harus unik</li>
<li><strong>password</strong> - Wajib diisi, minimal 8 karakter</li>
<li><strong>password_confirmation</strong> - Wajib diisi, harus sama dengan password</li>
<li><strong>phone_number</strong> - Wajib diisi, nomor telepon</li>
<li><strong>address</strong> - Wajib diisi, alamat lengkap</li>
<li><strong>shop_description</strong> - Wajib diisi, deskripsi toko/jasa</li>
<li><strong>specializations</strong> - Wajib diisi, array ID spesialisasi</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"email": ["Email sudah digunakan."],
"specializations": ["Spesialisasi wajib diisi."]
},
"message": "Validation Error."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/penjahit/login</span>
<p class="mt-2">Login sebagai penjahit</p>
<h5>Headers</h5>
<pre><code>Content-Type: application/json</code></pre>
<h5>Request Body</h5>
<pre><code>{
"email": "tailor@example.com",
"password": "password123"
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>email</strong> - Wajib diisi, format email</li>
<li><strong>password</strong> - Wajib diisi</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Email atau password tidak valid"
},
"message": "Authentication Error."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/admin/login</span>
<p class="mt-2">Login sebagai admin</p>
<h5>Headers</h5>
<pre><code>Content-Type: application/json</code></pre>
<h5>Request Body</h5>
<pre><code>{
"email": "admin@example.com",
"password": "admin123"
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>email</strong> - Wajib diisi, format email</li>
<li><strong>password</strong> - Wajib diisi</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Email atau password tidak valid"
},
"message": "Authentication Error."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/logout</span>
<p class="mt-2">Logout pengguna (invalidasi token)</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Response</h5>
<pre><code>{
"success": true,
"data": {},
"message": "Berhasil logout"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Unauthenticated"
},
"message": "Error."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/email/verification-notification</span>
<p class="mt-2">Mengirim ulang email verifikasi</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Response</h5>
<pre><code>{
"success": true,
"data": {},
"message": "Email verifikasi telah dikirim"
}</code></pre>
</div>
</div>
<div id="profile-endpoints" class="mt-4">
<h3>Profil</h3>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/profile</span>
<p class="mt-2">Mendapatkan informasi profil pengguna</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Unauthenticated"
},
"message": "Error."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/profile</span>
<p class="mt-2">Mengupdate informasi profil pengguna</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}
Content-Type: application/json</code></pre>
<h5>Request Body</h5>
<pre><code>{
"name": "John Doe Updated",
"phone_number": "087654321",
"address": "Jl. Updated No. 456",
"shop_description": "Deskripsi toko yang diupdate" // khusus penjahit
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>name</strong> - Opsional, nama baru pengguna</li>
<li><strong>phone_number</strong> - Opsional, nomor telepon baru</li>
<li><strong>address</strong> - Opsional, alamat baru</li>
<li><strong>shop_description</strong> - Opsional, deskripsi toko baru (hanya untuk penjahit)</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"phone_number": ["Format nomor telepon tidak valid"]
},
"message": "Validation Error."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/profile/photo</span>
<p class="mt-2">Mengupload foto profil</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}
Content-Type: multipart/form-data</code></pre>
<h5>Request Body</h5>
<pre><code>{
"profile_photo": [file]
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>profile_photo</strong> - Wajib diisi, file gambar, maksimal 2MB</li>
</ul>
<h5>Response</h5>
<pre><code>{
"success": true,
"data": {
"id": 1,
"name": "John Doe",
"profile_photo": "profile_photos/user1_updated.jpg"
},
"message": "Foto profil berhasil diupload"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"profile_photo": ["File harus berupa gambar dengan ukuran maksimal 2MB"]
},
"message": "Validation Error."
}</code></pre>
</div>
</div>
<div id="customer-endpoints" class="mt-4">
<h3>Pelanggan</h3>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/dashboard</span>
<p class="mt-2">Mendapatkan data dashboard pelanggan</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/bookings/customer</span>
<p class="mt-2">Mendapatkan semua booking yang dilakukan pelanggan</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Query Parameters</h5>
<ul>
<li><strong>status</strong> (optional) - Filter berdasarkan status (reservasi, dikonfirmasi, diproses, selesai, dibatalkan)</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/bookings/customer/status/{status}</span>
<p class="mt-2">Mendapatkan booking pelanggan berdasarkan status</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Path Parameters</h5>
<ul>
<li><strong>status</strong> - Status booking (reservasi, dikonfirmasi, diproses, selesai, dibatalkan)</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Invalid status"
},
"message": "Invalid status"
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/tailors/{tailor}/book</span>
<p class="mt-2">Membuat booking baru ke penjahit</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}
Content-Type: multipart/form-data</code></pre>
<h5>Path Parameters</h5>
<ul>
<li><strong>tailor</strong> - ID penjahit yang akan dibooking</li>
</ul>
<h5>Request Body</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>appointment_date</strong> - Wajib diisi, format tanggal (YYYY-MM-DD), harus tanggal sekarang atau setelahnya</li>
<li><strong>appointment_time</strong> - Wajib diisi, format waktu (HH:MM)</li>
<li><strong>service_type</strong> - Wajib diisi, nilai valid: "Perbaikan", "Jahit Baru"</li>
<li><strong>category</strong> - Wajib diisi, nilai valid: "Atasan", "Bawahan", "Terusan"</li>
<li><strong>design_photo</strong> - Wajib diisi, file gambar, maksimal 2MB</li>
<li><strong>notes</strong> - Opsional, catatan tambahan</li>
<li><strong>payment_method</strong> - Wajib diisi, metode pembayaran</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"appointment": ["Jadwal tidak tersedia. Penjahit sudah memiliki booking pada tanggal yang sama"]
},
"message": "Error validasi."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/bookings/{booking}/cancel</span>
<p class="mt-2">Membatalkan booking</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Path Parameters</h5>
<ul>
<li><strong>booking</strong> - ID booking yang akan dibatalkan</li>
</ul>
<h5>Response</h5>
<pre><code>{
"success": true,
"data": {
"id": 5,
"status": "dibatalkan",
"updated_at": "2023-05-05T11:00:00.000000Z"
},
"message": "Booking berhasil dibatalkan."
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"status": ["Booking tidak dapat dibatalkan karena sudah diproses"]
},
"message": "Error validasi."
}</code></pre>
</div>
</div>
<div id="tailor-endpoints" class="mt-4">
<h3>Penjahit</h3>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/penjahit/dashboard</span>
<p class="mt-2">Mendapatkan data dashboard penjahit</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/penjahit/calendar/{month}/{year}</span>
<p class="mt-2">Mendapatkan jadwal booking untuk bulan dan tahun tertentu</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Path Parameters</h5>
<ul>
<li><strong>month</strong> - Bulan (1-12)</li>
<li><strong>year</strong> - Tahun (format 4 digit, contoh: 2023)</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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",
"service_type": "Jahit Baru",
"category": "Atasan",
"status": "dikonfirmasi"
}
]
}
},
"message": "Calendar data retrieved successfully"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Invalid date"
},
"message": "Invalid date"
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/bookings/{booking}/accept</span>
<p class="mt-2">Menerima booking dari pelanggan</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}
Content-Type: application/json</code></pre>
<h5>Path Parameters</h5>
<ul>
<li><strong>booking</strong> - ID booking yang akan diterima</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Booking tidak dapat dikonfirmasi karena status sudah berubah"
},
"message": "Error."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/bookings/{booking}/reject</span>
<p class="mt-2">Menolak booking dari pelanggan</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}
Content-Type: application/json</code></pre>
<h5>Path Parameters</h5>
<ul>
<li><strong>booking</strong> - ID booking yang akan ditolak</li>
</ul>
<h5>Request Body</h5>
<pre><code>{
"rejection_reason": "Jadwal sudah penuh"
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>rejection_reason</strong> - Wajib diisi, alasan penolakan</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"rejection_reason": ["Alasan penolakan wajib diisi"]
},
"message": "Error validasi."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/bookings/{booking}/payment</span>
<p class="mt-2">Mengubah status pembayaran booking menjadi paid</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}
Content-Type: application/json</code></pre>
<h5>Path Parameters</h5>
<ul>
<li><strong>booking</strong> - ID booking yang akan diubah status pembayarannya</li>
</ul>
<h5>Request Body</h5>
<pre><code>{
"payment_status": "paid"
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>payment_status</strong> - Wajib diisi, nilai valid: "paid" atau "success"</li>
</ul>
<h5>Response</h5>
<pre><code>{
"success": true,
"data": {
"id": 5,
"payment_status": "paid",
"updated_at": "2023-05-05T15:00:00.000000Z"
},
"message": "Status pembayaran berhasil diubah"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Unauthorized."
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/bookings/{booking}/completion-payment</span>
<p class="mt-2">Memproses pembayaran akhir dan mengatur tanggal pengambilan</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}
Content-Type: application/json</code></pre>
<h5>Path Parameters</h5>
<ul>
<li><strong>booking</strong> - ID booking yang akan diproses pembayaran akhirnya</li>
</ul>
<h5>Request Body</h5>
<pre><code>{
"pickup_date": "2023-05-20"
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>pickup_date</strong> - Wajib diisi, format tanggal (YYYY-MM-DD), harus tanggal sekarang atau setelahnya</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Invalid status",
"message": "Pembayaran hanya dapat dilakukan untuk pesanan yang sudah selesai"
},
"message": "Invalid status"
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/penjahit/bookings</span>
<p class="mt-2">Mendapatkan semua booking penjahit</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Query Parameters</h5>
<ul>
<li><strong>status</strong> (optional) - Filter berdasarkan status (reservasi, dikonfirmasi, diproses, selesai, dibatalkan)</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Unauthorized"
},
"message": "Error."
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/penjahit/bookings/status/{status}</span>
<p class="mt-2">Mendapatkan booking penjahit berdasarkan status</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Path Parameters</h5>
<ul>
<li><strong>status</strong> - Status booking (reservasi, dikonfirmasi, diproses, selesai, dibatalkan)</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Invalid status"
},
"message": "Invalid status"
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/penjahit/services</span>
<p class="mt-2">Mendapatkan semua layanan penjahit</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/penjahit/services</span>
<p class="mt-2">Menambahkan layanan baru</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}
Content-Type: application/json</code></pre>
<h5>Request Body</h5>
<pre><code>{
"name": "Jahit Jas",
"description": "Jasa pembuatan jas pria berkualitas tinggi",
"price": 500000
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>name</strong> - Wajib diisi, nama layanan</li>
<li><strong>description</strong> - Wajib diisi, deskripsi layanan</li>
<li><strong>price</strong> - Wajib diisi, harga layanan (angka)</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"price": ["Harga harus berupa angka"]
},
"message": "Validation Error."
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/penjahit/gallery</span>
<p class="mt-2">Mendapatkan semua galeri penjahit</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
</div>
<div class="endpoint post">
<span class="method post-method">POST</span>
<span class="ms-2">/penjahit/gallery</span>
<p class="mt-2">Menambahkan item galeri baru</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}
Content-Type: multipart/form-data</code></pre>
<h5>Request Body</h5>
<pre><code>{
"title": "Jas Pernikahan",
"description": "Jas pernikahan custom pesanan pelanggan",
"photo": [file]
}</code></pre>
<h5>Validasi</h5>
<ul>
<li><strong>title</strong> - Wajib diisi, judul item galeri</li>
<li><strong>description</strong> - Wajib diisi, deskripsi item galeri</li>
<li><strong>photo</strong> - Wajib diisi, file gambar, maksimal 2MB</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"photo": ["File harus berupa gambar dengan ukuran maksimal 2MB"]
},
"message": "Validation Error."
}</code></pre>
</div>
</div>
<div id="admin-endpoints" class="mt-4">
<h3>Admin</h3>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/admin/dashboard</span>
<p class="mt-2">Mendapatkan data dashboard admin</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
"error": "Unauthorized access"
},
"message": "Error."
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/customers</span>
<p class="mt-2">Mendapatkan semua data pelanggan</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Query Parameters</h5>
<ul>
<li><strong>search</strong> (optional) - Mencari berdasarkan nama atau email</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
</div>
</div>
<div id="wallet-endpoints" class="mt-4">
<h3>Wallet & Withdrawal</h3>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/wallet</span>
<p class="mt-2">Mendapatkan informasi wallet pengguna</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Response</h5>
<pre><code>{
"success": true,
"data": {
"balance": 1000000.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"
}</code></pre>
<h5>Error Response</h5>
<pre><code>{
"success": false,
"data": {
}
}</code></pre>
</div>
<div class="endpoint get">
<span class="method get-method">GET</span>
<span class="ms-2">/customers</span>
<p class="mt-2">Mendapatkan semua data pelanggan</p>
<h5>Headers</h5>
<pre><code>Authorization: Bearer {token}</code></pre>
<h5>Query Parameters</h5>
<ul>
<li><strong>search</strong> (optional) - Mencari berdasarkan nama atau email</li>
</ul>
<h5>Response</h5>
<pre><code>{
"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"
}</code></pre>
</div>
</div>
</div>
<div class="mt-5 mb-5" id="files">
<h2>File & Media</h2>
</div>
</main>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>