|
| 1 | +# Checklist Debug Backend Admin |
| 2 | + |
| 3 | +## 🔍 Kiểm Tra Lỗi 500 |
| 4 | + |
| 5 | +### Step 1: Kiểm Tra Database Connection |
| 6 | +```sql |
| 7 | +-- Test connection |
| 8 | +SELECT @@VERSION; |
| 9 | +``` |
| 10 | + |
| 11 | +### Step 2: Kiểm Tra Role Table |
| 12 | +```sql |
| 13 | +-- Xem tất cả roles |
| 14 | +SELECT * FROM Role; |
| 15 | + |
| 16 | +-- Nếu thiếu ADMIN role: |
| 17 | +INSERT INTO Role (id, name) VALUES (NEWID(), 'ADMIN'); |
| 18 | +``` |
| 19 | + |
| 20 | +### Step 3: Kiểm Tra Admin User |
| 21 | +```sql |
| 22 | +-- Xem users và roles |
| 23 | +SELECT |
| 24 | + u.id, |
| 25 | + u.email, |
| 26 | + u.username, |
| 27 | + u.isActive, |
| 28 | + r.id as role_id, |
| 29 | + r.name as role_name |
| 30 | +FROM Users u |
| 31 | +LEFT JOIN Role r ON u.Roleid = r.id; |
| 32 | + |
| 33 | +-- Kiểm tra admin user cụ thể |
| 34 | +SELECT u.*, r.name as role |
| 35 | +FROM Users u |
| 36 | +JOIN Role r ON u.Roleid = r.id |
| 37 | +WHERE u.email = 'admin@labverse.com'; |
| 38 | +``` |
| 39 | + |
| 40 | +### Step 4: Kiểm Tra Users Không Có Role |
| 41 | +```sql |
| 42 | +-- Users không có role sẽ gây lỗi |
| 43 | +SELECT u.* |
| 44 | +FROM Users u |
| 45 | +WHERE u.Roleid IS NULL; |
| 46 | + |
| 47 | +-- Fix: Gán role mặc định |
| 48 | +UPDATE Users |
| 49 | +SET Roleid = (SELECT TOP 1 id FROM Role WHERE name = 'RESEARCHER') |
| 50 | +WHERE Roleid IS NULL; |
| 51 | +``` |
| 52 | + |
| 53 | +### Step 5: Test Query Trực Tiếp |
| 54 | +```sql |
| 55 | +-- Test query với NULL |
| 56 | +DECLARE @search NVARCHAR(255) = NULL; |
| 57 | +DECLARE @role NVARCHAR(255) = NULL; |
| 58 | +DECLARE @isActive BIT = NULL; |
| 59 | + |
| 60 | +SELECT u.* |
| 61 | +FROM Users u |
| 62 | +LEFT JOIN Role r ON u.Roleid = r.id |
| 63 | +WHERE (@search IS NULL OR @search = '' OR |
| 64 | + LOWER(u.email) LIKE LOWER('%' + @search + '%') OR |
| 65 | + LOWER(u.username) LIKE LOWER('%' + @search + '%') OR |
| 66 | + LOWER(u.full_name) LIKE LOWER('%' + @search + '%')) |
| 67 | +AND (@role IS NULL OR @role = '' OR r.name = @role) |
| 68 | +AND (@isActive IS NULL OR u.is_active = @isActive); |
| 69 | +``` |
| 70 | + |
| 71 | +### Step 6: Kiểm Tra Application Logs |
| 72 | +Xem logs trong console để tìm stack trace cụ thể: |
| 73 | +``` |
| 74 | +ERROR ... Exception: ... |
| 75 | +at com.se1853_jv.service.impl.AdminServiceImpl.getAllUsers(...) |
| 76 | +``` |
| 77 | + |
| 78 | +--- |
| 79 | + |
| 80 | +## 🛠️ Common Fixes |
| 81 | + |
| 82 | +### Fix 1: Query Syntax Error |
| 83 | +Nếu lỗi về CONCAT, có thể SQL Server version không support: |
| 84 | +```java |
| 85 | +// Thay CONCAT bằng + operator (SQL Server) |
| 86 | +LOWER(u.email) LIKE LOWER('%' + :search + '%') |
| 87 | +``` |
| 88 | + |
| 89 | +### Fix 2: NullPointerException |
| 90 | +Đảm bảo tất cả users đều có role: |
| 91 | +```sql |
| 92 | +-- Check và fix |
| 93 | +UPDATE Users |
| 94 | +SET Roleid = (SELECT TOP 1 id FROM Role WHERE name = 'RESEARCHER') |
| 95 | +WHERE Roleid IS NULL; |
| 96 | +``` |
| 97 | + |
| 98 | +### Fix 3: LazyInitializationException |
| 99 | +Role đã có `FetchType.EAGER` nên không có vấn đề này. |
| 100 | + |
| 101 | +### Fix 4: Transaction Issue |
| 102 | +Đảm bảo `@Transactional` được dùng đúng: |
| 103 | +- `getAllUsers()` không cần `@Transactional` (read-only) |
| 104 | +- Các methods modify cần `@Transactional` |
| 105 | + |
| 106 | +--- |
| 107 | + |
| 108 | +## 📋 Test Checklist |
| 109 | + |
| 110 | +- [ ] Database connection OK |
| 111 | +- [ ] ADMIN role exists |
| 112 | +- [ ] Admin user exists và có ADMIN role |
| 113 | +- [ ] Tất cả users đều có role (không có NULL) |
| 114 | +- [ ] Query test trực tiếp trong SQL Server OK |
| 115 | +- [ ] Backend service đang chạy |
| 116 | +- [ ] JWT token hợp lệ |
| 117 | +- [ ] Authorization header đúng format |
| 118 | + |
| 119 | +--- |
| 120 | + |
| 121 | +## 🧪 Quick Test SQL |
| 122 | + |
| 123 | +```sql |
| 124 | +-- 1. Check roles |
| 125 | +SELECT * FROM Role; |
| 126 | + |
| 127 | +-- 2. Check admin user |
| 128 | +SELECT u.email, r.name |
| 129 | +FROM Users u |
| 130 | +JOIN Role r ON u.Roleid = r.id |
| 131 | +WHERE r.name = 'ADMIN'; |
| 132 | + |
| 133 | +-- 3. Check users without role |
| 134 | +SELECT COUNT(*) as users_without_role |
| 135 | +FROM Users |
| 136 | +WHERE Roleid IS NULL; |
| 137 | + |
| 138 | +-- 4. Test query |
| 139 | +SELECT COUNT(*) |
| 140 | +FROM Users u |
| 141 | +JOIN Role r ON u.Roleid = r.id |
| 142 | +WHERE (NULL IS NULL OR NULL = '' OR 1=1) |
| 143 | +AND (NULL IS NULL OR NULL = '' OR 1=1) |
| 144 | +AND (NULL IS NULL OR u.is_active = NULL); |
| 145 | +``` |
| 146 | + |
0 commit comments