/api/auth/login{
"success": true,
"data": {
"user": {
"id": 1,
"username": "john_doe",
"email": "john@example.com",
"full_name": "John Doe",
"role": "user",
"avatar": "https://example.com/avatars/john.jpg",
"last_login": "2025-06-30 11:30:00"
},
"tokens": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
"expires_in": 3600,
"token_type": "Bearer"
}
},
"message": "เข้าสู่ระบบสำเร็จ",
"timestamp": "2025-06-30 11:30:00"
}{
"success": false,
"error": {
"code": "INVALID_CREDENTIALS",
"message": "อีเมลหรือรหัสผ่านไม่ถูกต้อง",
"details": "ไม่พบผู้ใช้หรือรหัสผ่านผิด"
},
"timestamp": "2025-06-30 11:30:00"
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "ข้อมูลไม่ถูกต้อง",
"errors": {
"email": ["รูปแบบอีเมลไม่ถูกต้อง"],
"password": ["รหัสผ่านต้องมีอย่างน้อย 8 ตัวอักษร"]
}
},
"timestamp": "2025-06-30 11:30:00"
}{
"success": false,
"error": {
"code": "ACCOUNT_SUSPENDED",
"message": "บัญชีถูกระงับการใช้งาน",
"details": "กรุณาติดต่อผู้ดูแลระบบ"
},
"timestamp": "2025-06-30 11:30:00"
}/api/users?page=1&limit=10&search=john&role=user{
"success": true,
"data": {
"users": [
{
"id": 1,
"username": "john_doe",
"email": "john@example.com",
"full_name": "John Doe",
"role": "user",
"avatar": "https://example.com/avatars/john.jpg",
"status": "active",
"created_at": "2025-01-15 10:00:00",
"last_login": "2025-06-30 09:00:00"
},
{
"id": 5,
"username": "johnny_smith",
"email": "johnny@example.com",
"full_name": "Johnny Smith",
"role": "user",
"avatar": null,
"status": "active",
"created_at": "2025-02-20 14:30:00",
"last_login": "2025-06-29 16:45:00"
}
],
"pagination": {
"current_page": 1,
"per_page": 10,
"total": 25,
"total_pages": 3,
"has_next": true,
"has_prev": false,
"next_page": 2,
"prev_page": null
},
"filters": {
"search": "john",
"role": "user",
"status": "active"
}
},
"message": "ดึงข้อมูลผู้ใช้สำเร็จ",
"timestamp": "2025-06-30 11:30:00"
}{
"success": true,
"data": {
"users": [],
"pagination": {
"current_page": 1,
"per_page": 10,
"total": 0,
"total_pages": 0,
"has_next": false,
"has_prev": false,
"next_page": null,
"prev_page": null
},
"filters": {
"search": "nonexistent",
"role": "user",
"status": "active"
}
},
"message": "ไม่พบข้อมูลผู้ใช้",
"timestamp": "2025-06-30 11:30:00"
}{
"success": false,
"error": {
"code": "INSUFFICIENT_PERMISSION",
"message": "ไม่มีสิทธิ์เข้าถึงข้อมูลผู้ใช้",
"details": "จำเป็นต้องมีสิทธิ์ admin หรือ manager"
},
"timestamp": "2025-06-30 11:30:00"
}{
"success": false,
"error": {
"code": "TOKEN_EXPIRED",
"message": "Token หมดอายุ",
"details": "กรุณาเข้าสู่ระบบใหม่"
},
"timestamp": "2025-06-30 11:30:00"
}{
"success": false,
"error": {
"code": "INVALID_PARAMETER",
"message": "พารามิเตอร์ไม่ถูกต้อง",
"errors": {
"page": ["หน้าต้องเป็นตัวเลขมากกว่า 0"],
"limit": ["จำนวนต่อหน้าต้องอยู่ระหว่าง 1-100"],
"role": ["บทบาทที่ระบุไม่ถูกต้อง"]
}
},
"timestamp": "2025-06-30 11:30:00"
}// Login function
async function login(email, password) {
try {
const response = await fetch('/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken
},
body: JSON.stringify({ email, password })
});
const result = await response.json();
if (result.success) {
// บันทึก token
localStorage.setItem('access_token', result.data.tokens.access_token);
localStorage.setItem('refresh_token', result.data.tokens.refresh_token);
// redirect หรือ update UI
window.location.href = '/dashboard';
} else {
// แสดง error message
showError(result.error.message);
// handle validation errors
if (result.error.errors) {
displayValidationErrors(result.error.errors);
}
}
} catch (error) {
showError('เกิดข้อผิดพลาดในการเชื่อมต่อ');
}
}// Fetch users function
async function fetchUsers(page = 1, limit = 10, filters = {}) {
const params = new URLSearchParams({
page,
limit,
...filters
});
try {
const response = await fetch(`/api/users?${params}`, {
headers: {
'Authorization': `Bearer ${localStorage.getItem('access_token')}`,
'Content-Type': 'application/json'
}
});
const result = await response.json();
if (result.success) {
// แสดงข้อมูลผู้ใช้
renderUsers(result.data.users);
// แสดง pagination
renderPagination(result.data.pagination);
// แสดงข้อมูล filter ปัจจุบัน
updateFilterDisplay(result.data.filters);
} else {
// handle errors
if (result.error.code === 'TOKEN_EXPIRED') {
// redirect to login
window.location.href = '/login';
} else {
showError(result.error.message);
}
}
} catch (error) {
showError('เกิดข้อผิดพลาดในการดึงข้อมูล');
}
}// สำเร็จ
return response()->json([
'success' => true,
'data' => [
'user' => $user->makeHidden(['password']),
'tokens' => [
'access_token' => $accessToken,
'refresh_token' => $refreshToken,
'expires_in' => 3600,
'token_type' => 'Bearer'
]
],
'message' => 'เข้าสู่ระบบสำเร็จ',
'timestamp' => now()
], 200);
// ล้มเหลว
return response()->json([
'success' => false,
'error' => [
'code' => 'INVALID_CREDENTIALS',
'message' => 'อีเมลหรือรหัสผ่านไม่ถูกต้อง',
'details' => 'ไม่พบผู้ใช้หรือรหัสผ่านผิด'
],
'timestamp' => now()
], 401);$users = User::query()
->when($request->search, function($query) use ($request) {
$query->where('full_name', 'like', '%' . $request->search . '%')
->orWhere('email', 'like', '%' . $request->search . '%');
})
->when($request->role, function($query) use ($request) {
$query->where('role', $request->role);
})
->paginate($request->limit ?? 10);
return response()->json([
'success' => true,
'data' => [
'users' => $users->items(),
'pagination' => [
'current_page' => $users->currentPage(),
'per_page' => $users->perPage(),
'total' => $users->total(),
'total_pages' => $users->lastPage(),
'has_next' => $users->hasMorePages(),
'has_prev' => $users->currentPage() > 1,
'next_page' => $users->hasMorePages() ? $users->currentPage() + 1 : null,
'prev_page' => $users->currentPage() > 1 ? $users->currentPage() - 1 : null,
],
'filters' => $request->only(['search', 'role', 'status'])
],
'message' => 'ดึงข้อมูลผู้ใช้สำเร็จ',
'timestamp' => now()
], 200);