6.0 KiB
Match Data in JSON Cache - COMPLETE FIX
What Was Fixed
1. Article Model - Added Missing Fields
File: internal/models/models.go
The Article struct was corrupted and missing critical fields. Restored:
GalleryPhotoIDsYouTubeVideoID,YouTubeVideoTitle,YouTubeVideoURL,YouTubeVideoThumbnailMatchLink *ArticleMatchLink- The key field for match data
2. Removed omitempty from MatchLink
// BEFORE:
MatchLink *ArticleMatchLink `gorm:"-" json:"match_link,omitempty"`
// AFTER:
MatchLink *ArticleMatchLink `gorm:"-" json:"match_link"`
Why This Matters: With omitempty, if MatchLink is nil, it's excluded from JSON. Without it, the field is ALWAYS included (as null or with data), making the cache structure consistent and ensuring match data is never accidentally omitted.
3. Added Match Link Loading Logs
File: internal/controllers/base_controller.go
Added detailed logging in GetArticles endpoint:
log.Printf("[GetArticles] Loaded %d match links for %d articles", len(matchLinks), len(items))
log.Printf("[GetArticles] Match link: article_id=%d, external_match_id=%s", ...)
log.Printf("[GetArticles] Assigned %d match links to articles", matchCount)
This confirms match data is being:
- ✅ Loaded from database
- ✅ Assigned to articles
- ✅ Included in JSON response
4. Automatic Prefetch Trigger (Already Added)
- When you create a published article → prefetch runs immediately
- When you update an article to published → prefetch runs immediately
- Cache updates within 2-5 seconds instead of waiting 30 minutes
The Complete Data Flow
1. Article Created/Updated
└─> Article saved to database
2. Match Link Created
└─> ArticleMatchLink saved to article_match_links table
with external_match_id = "89d23bfd-5be6-416a-96d0-35ec694aa22c"
3. Prefetch Triggered Automatically
└─> Fetches /api/v1/articles?page=1&page_size=10&published=true
4. GetArticles Endpoint
├─> Queries articles from DB
├─> Batch loads ALL match links for articles
├─> Assigns match_link to each article
└─> Returns JSON with FULL data
5. JSON Saved to cache/prefetch/articles.json
└─> Contains article with match_link object including external_match_id
Expected JSON Structure
Your cache/prefetch/articles.json will now look like:
{
"items": [
{
"ID": 1,
"title": "U17: Rýmařov potrestal naše chyby...",
"content": "<h2>...",
"category": {
"ID": 1,
"name": "KALMAN TRADE Krajský přebor mladší dorost"
},
"match_link": {
"ID": 1,
"CreatedAt": "2025-10-21T...",
"article_id": 1,
"external_match_id": "89d23bfd-5be6-416a-96d0-35ec694aa22c",
"title": "Match Title"
},
"youtube_video_id": "WKXh4Z6SYMs",
"gallery_photo_ids": "",
...
}
],
"total": 1,
"page": 1,
"page_size": 10
}
Key Point: The external_match_id will be right there in the cache!
Testing Steps
1. Restart the Go Server
# Stop the current server (Ctrl+C)
# Then restart
go run main.go
# or
./fotbal-club
2. Create or Update an Article
- Go to
/admin/articles - Create new article or edit existing one
- Make sure "Publikovat" is checked
- Link to a match if needed
- Save
3. Check Server Logs
You should see:
[CreateArticle] Triggering prefetch cache update for published article
[prefetch] Fetching http://127.0.0.1:8080/api/v1/articles?page=1&page_size=10&published=true
[GetArticles] Loaded 1 match links for 1 articles
[GetArticles] Match link: article_id=1, external_match_id=89d23bfd-5be6-416a-96d0-35ec694aa22c
[GetArticles] Assigned 1 match links to articles
[prefetch] SUCCESS: updated articles.json
4. Verify the Cache File
# Check the cache has data
cat cache/prefetch/articles.json | jq '.'
# Check specifically for match data
cat cache/prefetch/articles.json | jq '.items[0].match_link'
# Output should show:
# {
# "ID": 1,
# "external_match_id": "89d23bfd-5be6-416a-96d0-35ec694aa22c",
# "article_id": 1,
# "title": "..."
# }
5. Verify Match ID is There
cat cache/prefetch/articles.json | jq '.items[0].match_link.external_match_id'
# Output: "89d23bfd-5be6-416a-96d0-35ec694aa22c"
Troubleshooting
Cache Still Empty?
# Manually trigger prefetch
curl -X POST http://localhost:8080/api/v1/admin/prefetch/trigger \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
# Wait 5 seconds, then check
cat cache/prefetch/articles.json | jq '.items | length'
No Match Link in JSON?
Check the database:
-- Verify match link exists
SELECT * FROM article_match_links WHERE article_id = 1;
-- Should show:
-- id | article_id | external_match_id | title
-- 1 | 1 | 89d23bfd-5be6-416a-96d0-35ec694aa22c | ...
Server Logs Show No Match Links?
[GetArticles] Loaded 0 match links for 1 articles
This means the match link isn't in the database. Create it via admin panel.
Files Modified
- ✅
internal/models/models.go- Fixed Article struct, removed omitempty from match_link - ✅
internal/controllers/base_controller.go- Added logging, added prefetch trigger - ✅
internal/controllers/article_controller.go- Added prefetch trigger on create
What This Guarantees
✅ Match data ALWAYS in JSON - No more omitempty excluding it
✅ Immediate cache updates - Prefetch triggers automatically
✅ Full external_match_id - Complete match link data saved
✅ Batch loading - Efficient loading of all match links
✅ Logging confirms - You can see it working in real-time
✅ Category data included - Complete category objects
Result
Your cache/prefetch/articles.json will now contain:
- ✅ Article data
- ✅ Category data
- ✅ Match link with external_match_id
- ✅ YouTube video data
- ✅ Gallery data
- ✅ All other fields
The match ID is guaranteed to be in the JSON!