257 lines
5.7 KiB
Markdown
257 lines
5.7 KiB
Markdown
# 🐛 Chapter Save Debugging Guide
|
|
|
|
## Vấn Đề Đã Fix
|
|
|
|
### ✅ Fix 1: Ownership Check (Line 932)
|
|
- **Vấn đề:** MOD không thể tạo chapter cho truyện mặc định (uploaderId = NULL)
|
|
- **Fix:** Thêm `OR uploaderId IS NULL` vào WHERE clause
|
|
- **Dòng:** 932, 1002
|
|
|
|
### ✅ Fix 2: Input Validation
|
|
- **Vấn đề:** Content có thể trống, number có thể âm
|
|
- **Fix:** Thêm validation trước insert
|
|
- **Dòng:** 920-927, 997-1004
|
|
|
|
### ✅ Fix 3: Data Consistency Logging
|
|
- **Vấn đề:** Nếu MongoDB insert succeed nhưng PostgreSQL fail → dữ liệu inconsistent
|
|
- **Fix:** Thêm separate error handling và logging [CRITICAL]
|
|
- **Dòng:** 956-974
|
|
|
|
---
|
|
|
|
## 🔍 Testing Checklist
|
|
|
|
### A. Network Debugging (Browser DevTools)
|
|
|
|
1. **Mở DevTools:** F12 → Network tab
|
|
2. **Ấn "Lưu chương"**
|
|
3. **Kiểm tra request `POST /api/mod/chuong`:**
|
|
- ✅ Status code: `201` = success, `4xx`/`5xx` = error
|
|
- ✅ Response body: Phần lấy `id`, `number`, `title`
|
|
- ❌ Status 403: Ownership issue
|
|
- ❌ Status 400: Duplicate or validation error
|
|
- ❌ Status 500: Server error (check [CRITICAL] logs)
|
|
|
|
### B. MongoDB Verification
|
|
|
|
```bash
|
|
# Access MongoDB
|
|
mongosh # hoặc mongo
|
|
|
|
# Switch to database
|
|
use reader_db # (thay bằng tên DB thực tế)
|
|
|
|
# List recent chapters
|
|
db.chapters.find({}, {novelId: 1, number: 1, title: 1, createdAt: 1})
|
|
.sort({_id: -1})
|
|
.limit(5)
|
|
|
|
# Check specific novel
|
|
db.chapters.countDocuments({novelId: "YOUR_NOVEL_ID"})
|
|
|
|
# Check for duplicates (race condition)
|
|
db.chapters.find({novelId: "YOUR_NOVEL_ID", number: 1})
|
|
```
|
|
|
|
### C. PostgreSQL Verification
|
|
|
|
```bash
|
|
# Access PostgreSQL
|
|
psql # hoặc your database client
|
|
|
|
# Check novel total chapters count
|
|
SELECT id, title, "totalChapters" FROM "Novel" WHERE id = 'YOUR_NOVEL_ID';
|
|
|
|
# Verify it matches MongoDB count
|
|
-- MongoDB should have same count as "totalChapters"
|
|
```
|
|
|
|
### D. Server Log Analysis
|
|
|
|
Look for these patterns in backend logs:
|
|
|
|
```
|
|
✅ Success:
|
|
[timestamp] POST /mod/chuong - Status 201
|
|
[timestamp] Inserted chapter id: xxx
|
|
|
|
❌ Issues:
|
|
[CRITICAL] ⚠️ INCONSISTENT STATE: Chapter inserted in MongoDB...
|
|
[timestamp] Lỗi MongoDB: [error message]
|
|
[timestamp] Ownership check failed: 403
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Common Scenarios & Solutions
|
|
|
|
### Scenario 1: Network Shows 201 But Chapter Not Visible
|
|
|
|
**Cause:** Chapter saved but not refreshed in UI
|
|
**Solution:**
|
|
- Press F5 to refresh page
|
|
- Check MongoDB to confirm chapter exists
|
|
- Check if `fetchChapters()` was called after save
|
|
|
|
### Scenario 2: Network Shows 403 Forbidden
|
|
|
|
**Cause:** Novel ownership check failed
|
|
**Solution:**
|
|
- Verify you are MOD or ADMIN user
|
|
- Verify novel exists in PostgreSQL:
|
|
```sql
|
|
SELECT id, title, "uploaderId" FROM "Novel" WHERE id = 'YOUR_ID';
|
|
```
|
|
- If uploaderId is NULL (default), ensure you're MOD user
|
|
|
|
### Scenario 3: Network Shows 400 Bad Request
|
|
|
|
**Causes:**
|
|
- Chapter number already exists
|
|
- Title or content empty
|
|
- Chapter number ≤ 0
|
|
|
|
**Solution:** Check response detail message and fix input
|
|
|
|
### Scenario 4: Network Shows 500 Server Error
|
|
|
|
**Cause:** MongoDB or PostgreSQL failure
|
|
**Solution:**
|
|
- Check server logs for [CRITICAL] message
|
|
- If MongoDB failed: Check MongoDB connection
|
|
- If PostgreSQL failed: Check PostgreSQL connection
|
|
- Contact admin with error message
|
|
|
|
---
|
|
|
|
## 🔧 Advanced Debug Commands
|
|
|
|
### Check MongoDB Connection Status
|
|
|
|
```bash
|
|
# From backend terminal
|
|
python3 -c "
|
|
import asyncio
|
|
from app.database import mongo_db
|
|
|
|
async def check():
|
|
await mongo_db.command('ping')
|
|
print('✓ MongoDB Connected!')
|
|
|
|
asyncio.run(check())
|
|
"
|
|
```
|
|
|
|
### Check PostgreSQL Connection Status
|
|
|
|
```bash
|
|
# From backend terminal
|
|
python3 -c "
|
|
import asyncio
|
|
from sqlalchemy.ext.asyncio import create_async_engine
|
|
from app.database import SessionLocal
|
|
|
|
async def check():
|
|
async with SessionLocal() as session:
|
|
result = await session.execute('SELECT 1')
|
|
print('✓ PostgreSQL Connected!')
|
|
|
|
asyncio.run(check())
|
|
"
|
|
```
|
|
|
|
### Manually Sync Total Chapters
|
|
|
|
```bash
|
|
# If totalChapters is out of sync
|
|
mongosh
|
|
use reader_db
|
|
|
|
# Get count
|
|
db.chapters.countDocuments({novelId: "YOUR_NOVEL_ID"})
|
|
|
|
# Then update PostgreSQL manually:
|
|
# psql
|
|
UPDATE "Novel" SET "totalChapters" = 123 WHERE id = 'YOUR_NOVEL_ID';
|
|
```
|
|
|
|
---
|
|
|
|
## 📋 Test Cases
|
|
|
|
### Test 1: Basic Chapter Save
|
|
```
|
|
1. Create novel
|
|
2. Save chapter #1
|
|
3. ✅ Should appear in chapter list
|
|
4. ✅ totalChapters should be 1
|
|
```
|
|
|
|
### Test 2: Sequential Chapters
|
|
```
|
|
1. Save chapters 1, 2, 3
|
|
2. ✅ All should appear with correct numbers
|
|
3. ✅ Next chapter field should suggest 4
|
|
```
|
|
|
|
### Test 3: Duplicate Prevention
|
|
```
|
|
1. Save chapter #5
|
|
2. Try to save chapter #5 again
|
|
3. ✅ Should show "Chương 5 đã tồn tại"
|
|
```
|
|
|
|
### Test 4: Default Novel (MOD Permission)
|
|
```
|
|
1. Verify a novel with uploaderId = NULL exists
|
|
2. As MOD user, save chapter to that novel
|
|
3. ✅ Should succeed (not 403 Forbidden)
|
|
```
|
|
|
|
### Test 5: No Empty Content
|
|
```
|
|
1. Try to save chapter with empty title
|
|
2. ✅ Should show "Tiêu đề chương không được trống"
|
|
3. Try to save chapter with empty content
|
|
4. ✅ Should show "Nội dung chương không được trống"
|
|
```
|
|
|
|
---
|
|
|
|
## 🆘 Still Having Issues?
|
|
|
|
1. **Run checklist A, B, C above** and collect outputs
|
|
2. **Screenshot of Network tab response**
|
|
3. **MongoDB output from `find()`**
|
|
4. **Server log output (especially [CRITICAL] lines)**
|
|
5. Share these with: [your-dev-contact]
|
|
|
|
---
|
|
|
|
## 📊 Monitoring
|
|
|
|
### Health Check Script
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# save as monitor-save.sh
|
|
|
|
echo "=== Chapter Save System Health Check ==="
|
|
echo ""
|
|
echo "1. MongoDB Connection:"
|
|
# mongosh check here
|
|
|
|
echo ""
|
|
echo "2. PostgreSQL Connection:"
|
|
# psql check here
|
|
|
|
echo ""
|
|
echo "3. Backend API:"
|
|
curl -s http://localhost:8000/docs | head -20
|
|
|
|
echo ""
|
|
echo "=== Done ==="
|
|
```
|
|
|
|
Run: `bash monitor-save.sh`
|