# Setup và Testing Guide - Hướng dẫn Cài đặt và Kiểm tra

## 📋 Tổng quan các thay đổi

### Files đã tạo/cập nhật:
1. ✅ `app/Models/User.php` - Model với bảng `nguoi_dung`
2. ✅ `app/Http/Controllers/AuthController.php` - Controller xử lý authentication
3. ✅ `routes/api.php` - API routes cho login/logout/user
4. ✅ `database/migrations/2026_02_07_131108_create_nguoi_dung_table.php` - Migration
5. ✅ `database/factories/UserFactory.php` - Factory để tạo test data
6. ✅ `database/seeders/NguoiDungSeeder.php` - Seeder tạo users mẫu
7. ✅ `database/seeders/DatabaseSeeder.php` - Main seeder
8. ✅ `test_auth_setup.sh` - Script test tự động
9. ✅ `API_AUTHENTICATION_GUIDE.md` - Tài liệu API
10. ✅ `NGUOI_DUNG_MIGRATION_GUIDE.md` - Hướng dẫn migration

---

## 🚀 Các bước Setup (Thực hiện theo thứ tự)

### Bước 1: Cấu hình Database
Kiểm tra file `.env`:
```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database_name
DB_USERNAME=your_username
DB_PASSWORD=your_password
```

### Bước 2: Chạy Migration
```bash
# Tạo bảng nguoi_dung và các bảng Passport
php artisan migrate
```

**Kết quả mong đợi:**
```
Migration table created successfully.
Migrating: 2026_02_07_131108_create_nguoi_dung_table
Migrated:  2026_02_07_131108_create_nguoi_dung_table
Migrating: 2016_06_01_000001_create_oauth_auth_codes_table
Migrated:  2016_06_01_000001_create_oauth_auth_codes_table
...
```

### Bước 3: Cài đặt Laravel Passport
```bash
# Tạo encryption keys và OAuth clients
php artisan passport:install
```

**Kết quả mong đợi:**
```
Encryption keys generated successfully.
Personal access client created successfully.
Password grant client created successfully.
```

**⚠️ Lưu ý:** Lưu lại Client ID và Client Secret được tạo ra.

### Bước 4: Tạo dữ liệu test
```bash
# Chạy seeder để tạo 3 users mẫu
php artisan db:seed --class=NguoiDungSeeder
```

**Kết quả mong đợi:**
```
✓ Đã tạo 3 người dùng test thành công!
  - admin / password123
  - user01 / password123
  - user02 / password123
```

**Hoặc chạy tất cả seeders:**
```bash
php artisan db:seed
```

### Bước 5: Khởi động Server
```bash
# Khởi động Laravel development server
php artisan serve
```

**Kết quả mong đợi:**
```
Starting Laravel development server: http://127.0.0.1:8000
```

---

## 🧪 Testing

### Option 1: Sử dụng Script tự động (Khuyến nghị)

```bash
# Cấp quyền thực thi cho script
chmod +x test_auth_setup.sh

# Chạy script test
./test_auth_setup.sh
```

**Kết quả mong đợi:**
```
==========================================
Testing Authentication Setup
==========================================

Step 1: Testing Login Endpoint
POST http://localhost:8000/api/auth/login

Response:
{
  "success": true,
  "message": "Đăng nhập thành công",
  "data": {
    "token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
    "token_type": "Bearer",
    "user": { ... }
  }
}

✓ Login successful! Token received.
...
```

### Option 2: Test thủ công với cURL

#### 1. Test Login
```bash
curl -X POST http://localhost:8000/api/auth/login \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "ten_dang_nhap": "admin",
    "mat_khau": "password123"
  }'
```

**Response mong đợi:**
```json
{
    "success": true,
    "message": "Đăng nhập thành công",
    "data": {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
        "token_type": "Bearer",
        "user": {
            "id": 1,
            "ten_dang_nhap": "admin",
            "ho_ten": "Quản trị viên",
            "email": "admin@example.com",
            "don_vi_id": 1,
            "ngay_tao": "2024-01-01T00:00:00.000000Z",
            "ngay_cap_nhat": "2024-01-01T00:00:00.000000Z"
        }
    }
}
```

#### 2. Test Get User (thay YOUR_TOKEN bằng token từ bước 1)
```bash
curl -X GET http://localhost:8000/api/auth/user \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"
```

#### 3. Test Logout
```bash
curl -X POST http://localhost:8000/api/auth/logout \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"
```

### Option 3: Test với Postman

1. **Import Collection:**
   - Tạo collection mới tên "BE-San-Luong API"
   
2. **Login Request:**
   - Method: POST
   - URL: `http://localhost:8000/api/auth/login`
   - Headers:
     - `Content-Type: application/json`
     - `Accept: application/json`
   - Body (raw JSON):
     ```json
     {
         "ten_dang_nhap": "admin",
         "mat_khau": "password123"
     }
     ```
   - Send → Copy token từ response

3. **Get User Request:**
   - Method: GET
   - URL: `http://localhost:8000/api/auth/user`
   - Headers:
     - `Authorization: Bearer {paste_token_here}`
     - `Accept: application/json`

4. **Logout Request:**
   - Method: POST
   - URL: `http://localhost:8000/api/auth/logout`
   - Headers:
     - `Authorization: Bearer {paste_token_here}`
     - `Accept: application/json`

---

## 🔍 Kiểm tra Database

### Kiểm tra bảng nguoi_dung đã được tạo:
```bash
php artisan tinker
```

Trong tinker:
```php
// Kiểm tra số lượng users
\App\Models\User::count();

// Xem tất cả users
\App\Models\User::all();

// Tìm user theo username
\App\Models\User::where('ten_dang_nhap', 'admin')->first();

// Kiểm tra password hashing
$user = \App\Models\User::first();
\Illuminate\Support\Facades\Hash::check('password123', $user->mat_khau);
```

---

## ❌ Troubleshooting - Xử lý lỗi

### Lỗi 1: "SQLSTATE[42S02]: Base table or view not found"
**Nguyên nhân:** Chưa chạy migration

**Giải pháp:**
```bash
php artisan migrate
```

### Lỗi 2: "Class 'Laravel\Passport\Passport' not found"
**Nguyên nhân:** Chưa cài đặt Passport

**Giải pháp:**
```bash
composer require laravel/passport
php artisan passport:install
```

### Lỗi 3: "Unauthenticated" khi gọi API
**Nguyên nhân:** Token không hợp lệ hoặc đã hết hạn

**Giải pháp:**
1. Đăng nhập lại để lấy token mới
2. Kiểm tra header Authorization có đúng format: `Bearer {token}`
3. Clear cache:
```bash
php artisan config:clear
php artisan cache:clear
```

### Lỗi 4: "The given data was invalid" khi login
**Nguyên nhân:** Sai username hoặc password

**Giải pháp:**
1. Kiểm tra lại credentials
2. Tạo user mới:
```bash
php artisan db:seed --class=NguoiDungSeeder
```

### Lỗi 5: "Connection refused" khi test
**Nguyên nhân:** Server chưa chạy

**Giải pháp:**
```bash
php artisan serve
```

### Lỗi 6: Migration conflict với bảng users cũ
**Nguyên nhân:** Đã có bảng users từ trước

**Giải pháp:**
```bash
# Option 1: Drop tất cả tables và migrate lại (⚠️ MẤT DỮ LIỆU)
php artisan migrate:fresh

# Option 2: Rollback và migrate lại
php artisan migrate:rollback
php artisan migrate

# Option 3: Rename bảng users cũ trong database
# Sau đó chạy migration mới
```

---

## 📊 Kiểm tra kết quả

### ✅ Checklist hoàn thành:

- [ ] Database đã được cấu hình trong `.env`
- [ ] Migration chạy thành công (`php artisan migrate`)
- [ ] Passport đã được cài đặt (`php artisan passport:install`)
- [ ] Seeder đã tạo users test (`php artisan db:seed`)
- [ ] Server đang chạy (`php artisan serve`)
- [ ] Login API trả về token thành công
- [ ] Get User API với token hoạt động
- [ ] Logout API hoạt động

### 📈 Kết quả mong đợi:

1. **Bảng `nguoi_dung` trong database** với các cột:
   - id, ten_dang_nhap, mat_khau, ho_ten, email, don_vi_id, remember_token, ngay_tao, ngay_cap_nhat

2. **3 users test** trong database:
   - admin / password123
   - user01 / password123
   - user02 / password123

3. **API endpoints hoạt động:**
   - POST `/api/auth/login` → Trả về token
   - GET `/api/auth/user` → Trả về thông tin user
   - POST `/api/auth/logout` → Revoke token

---

## 📚 Tài liệu tham khảo

- `API_AUTHENTICATION_GUIDE.md` - Chi tiết về API endpoints
- `NGUOI_DUNG_MIGRATION_GUIDE.md` - Hướng dẫn migration từ users sang nguoi_dung
- [Laravel Passport Documentation](https://laravel.com/docs/10.x/passport)

---

## 🎯 Next Steps

Sau khi setup thành công, bạn có thể:

1. **Tạo thêm endpoints** cho các chức năng khác
2. **Thêm middleware** để bảo vệ routes
3. **Tạo bảng don_vi** và relationship với nguoi_dung
4. **Implement refresh token** mechanism
5. **Thêm validation rules** phức tạp hơn
6. **Setup CORS** cho frontend
7. **Deploy lên production**

---

## 💡 Tips

1. **Development:** Sử dụng Postman hoặc Insomnia để test API
2. **Debugging:** Kiểm tra `storage/logs/laravel.log` khi có lỗi
3. **Security:** Đổi APP_KEY trong production (`php artisan key:generate`)
4. **Performance:** Sử dụng cache cho token validation
5. **Testing:** Viết unit tests cho AuthController

---

**Chúc bạn setup thành công! 🎉**
