NEW: app/Services/ModpackApiService.php
- Centralized API logic for all 4 platforms
- Technic build number cached for 12 hours (RV-Ready)
- Single source of truth for API calls
Controller (ModpackAPIController.php):
- Now uses injected ModpackApiService instead of duplicated code
- Added RateLimiter: 2 requests/minute per server on manualCheck()
- Returns 429 with countdown when rate limited
- Removed 400+ lines of duplicated API code
Console Command (CheckModpackUpdates.php):
- FIXED: updateDatabase() now uses server_uuid (not server_id)
- FIXED: status column uses strings ('update_available', 'up_to_date', 'error')
- FIXED: Technic API now uses dynamic build via service
- Now uses injected ModpackApiService
SECURITY:
- Rate limiting prevents API key abuse via button spam
- Technic build caching reduces external API calls
Reviewed by: Gemini AI (Architecture Consultant)
Signed-off-by: Claude (Chronicler #63) <claude@firefrostgaming.com>
BUG: Was using server_id (column doesn't exist) instead of server_uuid
BUG: Was using update_available (column doesn't exist) instead of status
FIXED:
- Changed whereIn('server_id', $serverIds) to whereIn('server_uuid', $serverUuids)
- Changed pluck('id') to pluck('uuid')
- Changed (bool) $status->update_available to $status->status === 'update_available'
This fix makes the dashboard badge API actually work!
Signed-off-by: Claude (Chronicler #63) <claude@firefrostgaming.com>
ROOT CAUSE (Gemini consultation):
Technic blocks requests with old/deprecated build numbers. The hardcoded
'?build=1' was being rejected as an ancient launcher version.
SOLUTION:
- Fetch current stable launcher build from /launcher/version/stable4
- Use that build number in the modpack request
- Fallback to 999 if version check fails
This 'RV-Ready' approach requires zero maintenance as Technic updates
their launcher versions over time.
ALL 4 PLATFORMS NOW WORKING:
✅ Modrinth
✅ FTB
✅ CurseForge
✅ Technic
Signed-off-by: Claude (Chronicler #63) <claude@firefrostgaming.com>
BREAKING CHANGES - folder structure reorganized:
OLD STRUCTURE (broken):
Controllers/ModpackAPIController.php
console/CheckModpackUpdates.php
NEW STRUCTURE (working):
app/Http/Controllers/ModpackAPIController.php
app/Console/Commands/CheckModpackUpdates.php
CHANGES:
1. Moved controller to app/Http/Controllers/
- Namespace changed: Pterodactyl\Http\Controllers
- This aligns with Laravel's PSR-4 autoloading
- Blueprint's requests.app field merges into Pterodactyl's app/
2. Moved console command to app/Console/Commands/
- Now properly registered with Laravel's command system
- Run with: php artisan modpackchecker:check
3. Updated conf.yml:
- Set requests.app: 'app' (enables app/ folder merging)
- Cleared data.directory (was pointing to non-existent folder)
- Cleared dashboard.wrapper (TSX not supported, use build.sh)
4. Updated routes/client.php:
- Fixed use statement to match new namespace
TESTED AND VERIFIED:
- blueprint -build: SUCCESS
- yarn build:production: SUCCESS
- php artisan modpackchecker:check: SUCCESS
- API tests passed: Modrinth ✅, FTB ✅, CurseForge ✅
- Technic API now requires auth (needs investigation)
This commit represents the WORKING state deployed on Dev Panel.
Signed-off-by: Claude (Chronicler #63) <claude@firefrostgaming.com>