Fixes 10 issues from Blueprint extension code review: - CurseForge API key now reads via Blueprint dbGet() matching admin save - PRO-tier fields (webhook, interval) enforced server-side, not just UI - json_decode results validated before accessing parsed data - Null user guard on getStatus() endpoint - 429 response uses consistent error key format - Modrinth slug derivation strips special chars, documented as fallback - Check interval dropdown reflects saved value - API key input changed to password type - TypeScript error typing narrowed from any to unknown - Removed unused DB import from ModpackApiService Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
88 lines
3.2 KiB
PHP
88 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace Pterodactyl\Http\Controllers\Admin\Extensions\modpackchecker;
|
|
|
|
use Illuminate\View\View;
|
|
use Illuminate\View\Factory as ViewFactory;
|
|
use Pterodactyl\Http\Controllers\Controller;
|
|
use Pterodactyl\BlueprintFramework\Libraries\ExtensionLibrary\Admin\BlueprintAdminLibrary as BlueprintExtensionLibrary;
|
|
use Pterodactyl\Http\Requests\Admin\AdminFormRequest;
|
|
use Illuminate\Http\RedirectResponse;
|
|
|
|
class modpackcheckerExtensionController extends Controller
|
|
{
|
|
public function __construct(
|
|
private ViewFactory $view,
|
|
private BlueprintExtensionLibrary $blueprint,
|
|
) {}
|
|
|
|
public function index(): View
|
|
{
|
|
// Get current settings
|
|
$curseforge_api_key = $this->blueprint->dbGet('modpackchecker', 'curseforge_api_key');
|
|
$discord_webhook_url = $this->blueprint->dbGet('modpackchecker', 'discord_webhook_url');
|
|
$check_interval = $this->blueprint->dbGet('modpackchecker', 'check_interval');
|
|
$tier = $this->blueprint->dbGet('modpackchecker', 'tier');
|
|
|
|
// Set defaults if empty
|
|
if ($check_interval == '') {
|
|
$this->blueprint->dbSet('modpackchecker', 'check_interval', 'daily');
|
|
$check_interval = 'daily';
|
|
}
|
|
if ($tier == '') {
|
|
$this->blueprint->dbSet('modpackchecker', 'tier', 'standard');
|
|
$tier = 'standard';
|
|
}
|
|
|
|
return $this->view->make(
|
|
'admin.extensions.modpackchecker.index', [
|
|
'curseforge_api_key' => $curseforge_api_key,
|
|
'discord_webhook_url' => $discord_webhook_url,
|
|
'check_interval' => $check_interval,
|
|
'tier' => $tier,
|
|
'root' => '/admin/extensions/modpackchecker',
|
|
'blueprint' => $this->blueprint,
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
|
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
|
*/
|
|
public function update(modpackcheckerSettingsFormRequest $request): RedirectResponse
|
|
{
|
|
$this->blueprint->dbSet('modpackchecker', 'curseforge_api_key', $request->input('curseforge_api_key') ?? '');
|
|
|
|
// Only save PRO-tier fields if the user is on the pro tier
|
|
$tier = $this->blueprint->dbGet('modpackchecker', 'tier') ?: 'standard';
|
|
if ($tier === 'pro') {
|
|
$this->blueprint->dbSet('modpackchecker', 'discord_webhook_url', $request->input('discord_webhook_url') ?? '');
|
|
$this->blueprint->dbSet('modpackchecker', 'check_interval', $request->input('check_interval') ?? 'daily');
|
|
}
|
|
|
|
return redirect()->route('admin.extensions.modpackchecker.index')->with('success', 'Settings saved successfully.');
|
|
}
|
|
}
|
|
|
|
class modpackcheckerSettingsFormRequest extends AdminFormRequest
|
|
{
|
|
public function rules(): array
|
|
{
|
|
return [
|
|
'curseforge_api_key' => 'nullable|string|max:500',
|
|
'discord_webhook_url' => 'nullable|url|max:500',
|
|
'check_interval' => 'nullable|in:daily,12h,6h',
|
|
];
|
|
}
|
|
|
|
public function attributes(): array
|
|
{
|
|
return [
|
|
'curseforge_api_key' => 'CurseForge API Key',
|
|
'discord_webhook_url' => 'Discord Webhook URL',
|
|
'check_interval' => 'Check Interval',
|
|
];
|
|
}
|
|
}
|