7.3 KiB
7.3 KiB
Client Name Check API Documentation
Overview
API endpoint untuk mengecek apakah nama client sudah ada atau belum dalam sistem. Endpoint ini mengembalikan status exist/not exist dengan pesan yang sesuai.
Endpoint
Check Client Name Exists
GET /clients/check-name/{name}
Description
Mengecek apakah nama client sudah ada dalam sistem atau belum.
Parameters
- name (path, required): Nama client yang akan dicek keberadaannya
Headers
- Tidak memerlukan authentication (public endpoint)
Response
Success Response (200) - Name Available
{
"success": true,
"messages": ["Client name is available"],
"data": {
"name": "My Company",
"exists": false
}
}
Success Response (200) - Name Already Used
{
"success": true,
"messages": ["Name has been used"],
"data": {
"name": "My Company",
"exists": true
}
}
Response Fields
- name (string): Nama client yang dicek
- exists (boolean): Status apakah nama sudah ada (
true) atau belum (false)
Error Responses
500 Internal Server Error
{
"success": false,
"messages": ["Database error message"]
}
Usage Examples
cURL Example
# Check if client name exists
curl -X GET "http://localhost:8080/clients/check-name/My%20Company"
# Response if name exists
{
"success": true,
"messages": ["Name has been used"],
"data": {
"name": "My Company",
"exists": true
}
}
# Response if name doesn't exist
{
"success": true,
"messages": ["Client name is available"],
"data": {
"name": "My Company",
"exists": false
}
}
JavaScript Example
const checkClientNameExists = async (name) => {
try {
const response = await fetch(`/clients/check-name/${encodeURIComponent(name)}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
const data = await response.json();
if (data.success) {
return {
exists: data.data.exists,
message: data.messages[0]
};
} else {
console.error('Check failed:', data.messages);
return null;
}
} catch (error) {
console.error('Error checking client name:', error);
return null;
}
};
// Usage
const result = await checkClientNameExists('My Company');
if (result) {
if (result.exists) {
console.log('Name is already used:', result.message);
} else {
console.log('Name is available:', result.message);
}
}
React Hook Example
import { useState, useEffect } from 'react';
const useClientNameCheck = (name) => {
const [exists, setExists] = useState(null);
const [message, setMessage] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
const checkName = async () => {
if (!name || name.length < 2) {
setExists(null);
setMessage('');
return;
}
try {
setLoading(true);
setError(null);
const response = await fetch(`/clients/check-name/${encodeURIComponent(name)}`);
const data = await response.json();
if (data.success) {
setExists(data.data.exists);
setMessage(data.messages[0]);
} else {
setError(data.messages[0]);
}
} catch (err) {
setError('Failed to check client name');
} finally {
setLoading(false);
}
};
// Debounce the check
const timeoutId = setTimeout(checkName, 500);
return () => clearTimeout(timeoutId);
}, [name]);
return { exists, message, loading, error };
};
// Usage in component
const ClientNameInput = () => {
const [name, setName] = useState('');
const { exists, message, loading, error } = useClientNameCheck(name);
return (
<div>
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="Enter client name"
/>
{loading && <span>Checking...</span>}
{error && <span style={{color: 'red'}}>Error: {error}</span>}
{exists === true && <span style={{color: 'red'}}>{message}</span>}
{exists === false && <span style={{color: 'green'}}>{message}</span>}
</div>
);
};
Form Validation Example
const validateClientName = async (name) => {
if (!name || name.length < 2) {
return { valid: false, message: 'Client name must be at least 2 characters' };
}
if (name.length > 100) {
return { valid: false, message: 'Client name must be less than 100 characters' };
}
try {
const response = await fetch(`/clients/check-name/${encodeURIComponent(name)}`);
const data = await response.json();
if (data.success) {
if (data.data.exists) {
return { valid: false, message: data.messages[0] };
} else {
return { valid: true, message: data.messages[0] };
}
} else {
return { valid: false, message: 'Unable to check client name availability' };
}
} catch (error) {
return { valid: false, message: 'Network error occurred' };
}
};
// Usage in form submission
const handleSubmit = async (formData) => {
const nameValidation = await validateClientName(formData.name);
if (!nameValidation.valid) {
setError(nameValidation.message);
return;
}
// Proceed with form submission
submitForm(formData);
};
Use Cases
- Client Registration: Mengecek ketersediaan nama client saat registrasi
- Real-time Validation: Validasi nama client secara real-time saat user mengetik
- Client Name Suggestion: Memberikan saran nama client alternatif jika nama sudah ada
- Profile Update: Mengecek nama client baru saat user ingin mengubah nama client
- Admin Panel: Admin mengecek ketersediaan nama client untuk client baru
Performance Considerations
- Endpoint ini tidak memerlukan authentication, sehingga lebih cepat
- Menggunakan query database yang efisien untuk pengecekan keberadaan
- Response yang minimal (hanya status exist/not exist) untuk performa optimal
- Cocok untuk real-time validation dengan debouncing
Security Notes
- Endpoint ini bersifat public dan tidak memerlukan authentication
- Tidak mengembalikan data sensitif client
- Hanya mengembalikan status boolean exist/not exist
- Nama client di-validate untuk mencegah injection attacks
Message Responses
| Status | Message | Description |
|---|---|---|
exists: false |
"Client name is available" | Nama client tersedia untuk digunakan |
exists: true |
"Name has been used" | Nama client sudah digunakan |
Comparison with Other Endpoints
| Endpoint | Purpose | Authentication | Response |
|---|---|---|---|
/clients/check-name/{name} |
Check client name exists | Not required | Boolean status only |
/clients/{id} |
Get client by ID | Required | Full client data |
/clients/profile |
Get current client profile | Required | Current client data |
Notes
- Endpoint ini menggunakan method
FindByNameuntuk pencarian berdasarkan nama - Jika terjadi error database, akan mengembalikan error 500
- Nama client case-sensitive (mengikuti konvensi sistem)
- Cocok untuk digunakan dalam form validation dan real-time checking
- URL encoding diperlukan untuk nama yang mengandung spasi atau karakter khusus