# 📋 SESSION_ID là gì và cách lấy?

## 🔍 SESSION_ID là gì?

**`session_id`** là **ID của record** trong bảng `student_study_sessions`. Đây là ID tự động tăng (AUTO_INCREMENT) được tạo khi học sinh click **Start**.

---

## 📊 Cấu trúc bảng `student_study_sessions`

```sql
CREATE TABLE student_study_sessions (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,  -- ← Đây là session_id
    student_id BIGINT NOT NULL,
    id_history_contest BIGINT NOT NULL,
    id_history BIGINT NOT NULL,
    session_start_at TIMESTAMP,
    session_end_at TIMESTAMP,
    status VARCHAR(20),  -- 'active', 'completed', 'auto_ended', etc.
    ...
);
```

---

## 🔑 CÁCH LẤY SESSION_ID

### **Cách 1: Từ API Response khi Start**

Khi gọi API `POST /api/heat-user/study-session/start`, response sẽ trả về `session_id`:

```json
{
  "success": true,
  "type": "new",
  "session_id": 123,  // ← Đây là session_id
  "message": "Bắt đầu session mới"
}
```

**Lưu lại `session_id` này để dùng khi Submit!**

---

### **Cách 2: Từ Database (SQL)**

```sql
-- Tìm session mới nhất của student
SELECT id, student_id, status, session_start_at, session_end_at
FROM student_study_sessions 
WHERE student_id = YOUR_STUDENT_ID 
ORDER BY session_start_at DESC 
LIMIT 1;

-- Tìm session active
SELECT id, student_id, status, session_start_at
FROM student_study_sessions 
WHERE student_id = YOUR_STUDENT_ID 
AND status = 'active'
ORDER BY session_start_at DESC 
LIMIT 1;
```

---

### **Cách 3: Từ Tinker (Laravel)**

```php
php artisan tinker

// Tìm session mới nhất
$session = \App\Models\HeatUser\StudentStudySession::where('student_id', YOUR_STUDENT_ID)
    ->latest('session_start_at')
    ->first();
echo $session->id;  // ← Đây là session_id

// Tìm session active
$session = \App\Models\HeatUser\StudentStudySession::where('student_id', YOUR_STUDENT_ID)
    ->where('status', 'active')
    ->latest('session_start_at')
    ->first();
echo $session->id;  // ← Đây là session_id
```

---

### **Cách 4: Dùng Command Test (Tự động tìm)**

Command đã được cải thiện để tự động tìm session:

```bash
# Tìm active session theo student_id
php artisan test:study-session-submit --student_id=456 --find-active

# Tìm latest session theo student_id
php artisan test:study-session-submit --student_id=456

# Với session_id cụ thể
php artisan test:study-session-submit 123
```

---

## 📝 VÍ DỤ THỰC TẾ

### **Luồng hoạt động:**

```
1. User click "Start"
   ↓
2. FE gọi: POST /api/heat-user/study-session/start
   ↓
3. API trả về:
   {
     "success": true,
     "session_id": 789,  // ← Lưu lại số này
     ...
   }
   ↓
4. FE lưu session_id = 789 vào localStorage
   ↓
5. User làm bài xong, click "Submit"
   ↓
6. FE gọi: POST /api/heat-user/study-session/submit
   Body: {
     "session_id": 789  // ← Dùng session_id đã lưu
   }
```

---

## 🔍 CÁCH TÌM SESSION_ID KHI DEBUG

### **1. Tìm session mới nhất:**

```sql
SELECT id, student_id, status, session_start_at, session_end_at
FROM student_study_sessions 
WHERE student_id = YOUR_STUDENT_ID 
ORDER BY id DESC 
LIMIT 5;
```

**Kết quả:**
```
+-----+------------+--------+---------------------+---------------------+
| id  | student_id | status | session_start_at    | session_end_at      |
+-----+------------+--------+---------------------+---------------------+
| 789 | 456        | active | 2025-12-05 10:00:00 | NULL                |
| 788 | 456        | completed | 2025-12-05 09:00:00 | 2025-12-05 09:15:00 |
+-----+------------+--------+---------------------+---------------------+
```

→ **session_id = 789** (session active mới nhất)

---

### **2. Tìm session active:**

```sql
SELECT id, student_id, status, session_start_at
FROM student_study_sessions 
WHERE student_id = YOUR_STUDENT_ID 
AND status = 'active'
ORDER BY session_start_at DESC;
```

---

### **3. Dùng Command tự động:**

```bash
# Tự động tìm active session
php artisan test:study-session-submit --student_id=456 --find-active --tenant_connection=tenant_db

# Output sẽ hiển thị:
# Step 1: Finding session...
#    Looking for active session for student_id: 456
# ✅ Session found:
#    ID: 789  ← Đây là session_id
#    Student ID: 456
#    Status: active
```

---

## ⚠️ LƯU Ý

1. **Session_id chỉ tồn tại sau khi Start:**
   - Nếu chưa Start → Không có session_id
   - Phải Start trước khi Submit

2. **Session_id có thể thay đổi:**
   - Mỗi lần Start → Tạo session_id mới
   - Continue → Tạo session_id mới (session cũ được pause)

3. **Session_id có thể bị auto-end:**
   - Nếu không heartbeat trong 10 phút → Status = 'auto_ended'
   - Vẫn có thể Submit session đã auto-ended (nếu status = 'auto_ended')

---

## ✅ CHECKLIST

- [ ] Đã Start session chưa? (Có session_id chưa?)
- [ ] Session_id có đúng không? (Kiểm tra trong DB)
- [ ] Session status là gì? ('active', 'auto_ended', 'completed'?)
- [ ] Session_id có thuộc đúng student_id không?

---

## 🎯 TÓM TẮT

| Cách | Command/Query | Khi nào dùng |
|------|---------------|--------------|
| **API Response** | Lưu từ response khi Start | Khi đang làm bài (FE) |
| **SQL Query** | `SELECT id FROM student_study_sessions WHERE ...` | Khi debug trong DB |
| **Tinker** | `StudentStudySession::find($id)` | Khi test trong Laravel |
| **Command** | `php artisan test:study-session-submit --student_id=...` | Khi test tự động |

**Session_id = ID của record trong bảng `student_study_sessions`** 🎯

