108 lines
3.4 KiB
PHP
108 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Game;
|
|
use Illuminate\Http\Request;
|
|
|
|
class GameController extends Controller
|
|
{
|
|
public function store(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'igdb_id' => 'required|integer|unique:games',
|
|
'name' => 'required|string|max:255',
|
|
'summary' => 'nullable|string',
|
|
'storyline' => 'nullable|string',
|
|
'cover_url' => 'nullable|url',
|
|
'slug' => 'required|string|max:255|unique:games',
|
|
'first_release_date' => 'nullable|date',
|
|
'rating' => 'nullable|numeric|between:0,100',
|
|
'rating_count' => 'nullable|integer|min:0',
|
|
'category' => 'nullable|integer',
|
|
'status' => 'nullable|integer',
|
|
'url' => 'nullable|url',
|
|
'version_title' => 'nullable|string|max:255',
|
|
]);
|
|
|
|
$game = Game::create($validated);
|
|
|
|
return response()->json($game, 201);
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$query = Game::query();
|
|
|
|
// Apply search
|
|
if ($request->has('search')) {
|
|
$search = $request->get('search');
|
|
$query->where(function($q) use ($search) {
|
|
$q->where('name', 'like', "%{$search}%")
|
|
->orWhere('summary', 'like', "%{$search}%");
|
|
});
|
|
}
|
|
|
|
// Apply sorting
|
|
$sort = $request->get('sort', 'first_release_date');
|
|
$direction = $request->get('direction', 'desc');
|
|
|
|
if ($sort === 'rating') {
|
|
$query->orderBy('rating', $direction);
|
|
} elseif ($sort === 'rating_count') {
|
|
$query->orderBy('rating_count', $direction);
|
|
} else {
|
|
$query->orderBy('first_release_date', $direction);
|
|
}
|
|
|
|
// Apply filters
|
|
if ($request->has('platform')) {
|
|
$query->whereHas('platforms', function ($q) use ($request) {
|
|
$q->where('slug', $request->platform);
|
|
});
|
|
}
|
|
|
|
if ($request->has('genre')) {
|
|
$query->whereHas('genres', function ($q) use ($request) {
|
|
$q->where('slug', $request->genre);
|
|
});
|
|
}
|
|
|
|
if ($request->has('year')) {
|
|
$query->whereYear('first_release_date', $request->year);
|
|
}
|
|
|
|
if ($request->has('rating_range')) {
|
|
$range = explode('-', $request->rating_range);
|
|
if (count($range) === 2) {
|
|
$min = (float)$range[0];
|
|
$max = (float)$range[1];
|
|
$query->whereBetween('rating', [$min, $max]);
|
|
}
|
|
}
|
|
|
|
$games = $query->paginate(36)->withQueryString();
|
|
|
|
// Get data for filter dropdowns
|
|
$platforms = \App\Models\Platform::orderBy('name')->get();
|
|
$genres = \App\Models\Genre::orderBy('name')->get();
|
|
|
|
// Get unique years from games
|
|
$years = Game::selectRaw('YEAR(first_release_date) as year')
|
|
->whereNotNull('first_release_date')
|
|
->distinct()
|
|
->orderBy('year', 'desc')
|
|
->pluck('year')
|
|
->filter()
|
|
->values();
|
|
|
|
return view('games.index', compact('games', 'platforms', 'genres', 'years'));
|
|
}
|
|
|
|
public function show(Game $game)
|
|
{
|
|
$game->load(['platforms', 'genres', 'screenshots', 'videos', 'similar_games', 'dlcs', 'reviews.user']);
|
|
return view('games.show', compact('game'));
|
|
}
|
|
}
|