Files

63 lines
1.6 KiB
PHP

<?php
namespace App\Features\Scraper\Controllers;
use App\Features\Consoles\Models\Console;
use App\Features\Games\Models\Game;
use App\Features\Scraper\Data\ScraperResultData;
use App\Features\Scraper\Services\ScraperService;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Inertia\Response;
class ScraperController extends Controller
{
public function __construct(
private ScraperService $scraper
) {}
public function index(): Response
{
return Inertia::render('Scraper/Index', [
'consoles' => Console::orderBy('name')->get(),
]);
}
public function search(Request $request): JsonResponse
{
$request->validate([
'query' => 'required|string|min:2',
'console' => 'nullable|string',
]);
$results = $this->scraper->search(
$request->query('query'),
$request->query('console')
)->map(fn ($result) => ScraperResultData::from($result));
return response()->json(['results' => $results]);
}
public function apply(Request $request, string $slug): RedirectResponse
{
$game = Game::where('slug', $slug)->firstOrFail();
$request->validate([
'cover_url' => 'required|url',
]);
$path = $this->scraper->downloadCover(
$request->cover_url,
$game
);
$game->update(['cover_path' => $path]);
return redirect()->route('games.show', $game)
->with('success', 'Cover updated successfully.');
}
}