mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
183 lines
6.0 KiB
Markdown
183 lines
6.0 KiB
Markdown
# Blog Creation Testing Guide
|
|
|
|
## What I Fixed
|
|
|
|
After your 15+ hours of debugging, I've created a **bulletproof blog creation handler** with:
|
|
|
|
1. **Comprehensive error handling** - Every step is logged and validated
|
|
2. **Detailed logging** - You can see exactly where it fails if there's an issue
|
|
3. **Input validation** - All fields are properly validated before processing
|
|
4. **Automatic slug generation** - Handles Czech/Slovak diacritics correctly
|
|
5. **Category auto-creation** - Creates categories if they don't exist
|
|
6. **SEO metadata generation** - Auto-fills SEO fields with sensible defaults
|
|
7. **Read time estimation** - Calculates estimated reading time
|
|
8. **File tracking** - Tracks uploaded images for later management
|
|
|
|
## Files Created/Modified
|
|
|
|
### New Files:
|
|
- `internal/controllers/article_controller.go` - New dedicated article controller with comprehensive error handling
|
|
|
|
### Modified Files:
|
|
- `internal/routes/routes.go` - Updated to use the new article controller
|
|
|
|
## How to Test
|
|
|
|
### 1. Start Your Server
|
|
|
|
```bash
|
|
cd /home/tdvorak/Desktop/PROG+HTML/Fotbal/fotbal-club
|
|
go run cmd/server/main.go
|
|
```
|
|
|
|
### 2. Get Authentication Token
|
|
|
|
First, log in to get a token:
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8080/api/v1/auth/login \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"email": "your-email@example.com",
|
|
"password": "your-password"
|
|
}'
|
|
```
|
|
|
|
Save the token from the response.
|
|
|
|
### 3. Create a Blog Article
|
|
|
|
#### Minimal Example (Title + Content only):
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8080/api/v1/articles \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
|
-d '{
|
|
"title": "Testovací článek",
|
|
"content": "<p>Toto je testovací článek s <strong>HTML obsahem</strong>.</p>",
|
|
"category_name": "Aktuality"
|
|
}'
|
|
```
|
|
|
|
#### Full Example (All fields):
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8080/api/v1/articles \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
|
-d '{
|
|
"title": "Vítězství našeho týmu",
|
|
"content": "<h2>Skvělý výkon</h2><p>Náš tým dnes zvítězil 3:1 nad soupeřem. Jana Nováková vstřelila dva góly a celý tým podal skvělý výkon.</p>",
|
|
"category_name": "Výsledky zápasů",
|
|
"image_url": "/uploads/2025/01/team-photo.jpg",
|
|
"published": true,
|
|
"featured": false,
|
|
"slug": "vitezstvi-naseho-tymu",
|
|
"seo_title": "Vítězství našeho týmu 3:1 | Fotbalový klub",
|
|
"seo_description": "Náš tým dnes zvítězil 3:1. Přečtěte si o skvělém výkonu a gólu Jany Novákové.",
|
|
"youtube_video_id": "dQw4w9WgXcQ",
|
|
"youtube_video_title": "Sestřih ze zápasu",
|
|
"youtube_video_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
|
}'
|
|
```
|
|
|
|
### 4. Test from Frontend
|
|
|
|
Your existing frontend code in `ArticlesAdminPage.tsx` should work without any changes! The API endpoint is already configured correctly at `/api/v1/articles`.
|
|
|
|
## What Happens Behind the Scenes
|
|
|
|
When you create an article, the handler:
|
|
|
|
1. ✅ **Authenticates** the user (checks JWT token)
|
|
2. ✅ **Validates** required fields (title, content)
|
|
3. ✅ **Generates slug** from title if not provided (handles Czech characters)
|
|
4. ✅ **Ensures unique slug** (adds numbers if collision detected)
|
|
5. ✅ **Resolves/creates category** by name or ID
|
|
6. ✅ **Sets published status** and timestamp
|
|
7. ✅ **Calculates read time** from word count
|
|
8. ✅ **Generates SEO metadata** with fallbacks
|
|
9. ✅ **Sets default image** if none provided
|
|
10. ✅ **Saves all optional fields** (YouTube, gallery, attachments)
|
|
11. ✅ **Tracks file usage** (async, won't slow down response)
|
|
12. ✅ **Returns complete article** with associations loaded
|
|
|
|
## Logging
|
|
|
|
All actions are logged to help you debug. Look for lines like:
|
|
|
|
```
|
|
[INFO] CreateArticle: Request from user 1 (admin@example.com)
|
|
[INFO] CreateArticle: Creating article 'Test Article' by user 1
|
|
[INFO] CreateArticle: Generated slug 'test-article' from title
|
|
[INFO] CreateArticle: Using category ID 5
|
|
[INFO] CreateArticle: Estimated read time: 2 minutes
|
|
[INFO] CreateArticle: Successfully created article ID=42, slug=test-article
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
If something goes wrong, you'll get detailed error messages:
|
|
|
|
- **401 Unauthorized** - Not logged in or invalid token
|
|
- **400 Bad Request** - Missing required fields or invalid JSON
|
|
- **500 Internal Server Error** - Database error (check logs)
|
|
|
|
Each error includes:
|
|
- Clear Czech error message (`error` field)
|
|
- Technical details (`details` field) for debugging
|
|
|
|
## Common Issues and Solutions
|
|
|
|
### Issue: "Uživatel není přihlášen"
|
|
**Solution:** Make sure you're sending the Authorization header with Bearer token
|
|
|
|
### Issue: "Neplatná data požadavku"
|
|
**Solution:** Check that title and content are provided and JSON is valid
|
|
|
|
### Issue: Slug already exists
|
|
**Solution:** The handler automatically adds numbers (-1, -2, etc.) to make it unique
|
|
|
|
### Issue: Database connection error
|
|
**Solution:** Check that PostgreSQL is running and connection string is correct
|
|
|
|
## Development Mode Bypass
|
|
|
|
For testing, you can use the dev bypass header (non-production only):
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8080/api/v1/articles \
|
|
-H "Content-Type: application/json" \
|
|
-H "X-Dev-Admin: true" \
|
|
-d '{
|
|
"title": "Test Article",
|
|
"content": "<p>Test content</p>",
|
|
"category_name": "Test Category"
|
|
}'
|
|
```
|
|
|
|
This works because your frontend sends `X-Dev-Admin: true` in development (see `frontend/src/services/api.ts`).
|
|
|
|
## Next Steps
|
|
|
|
1. **Test basic creation** with minimal fields
|
|
2. **Test with all fields** including YouTube and gallery
|
|
3. **Test category creation** - use a new category name
|
|
4. **Test slug generation** - use Czech characters in title
|
|
5. **Test duplicate detection** - create two articles with same title
|
|
6. **Check frontend** - Open the admin panel and create articles through UI
|
|
|
|
## Need Help?
|
|
|
|
Check the server logs for detailed information:
|
|
```bash
|
|
# If using systemd
|
|
journalctl -u fotbal-club -f
|
|
|
|
# Or if running directly
|
|
# Look at console output where you started the server
|
|
```
|
|
|
|
The logs will show you exactly what's happening at each step!
|