1555 lines
60 KiB
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>
|