lots of progress
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
abstract class Controller
|
||||
abstract class Controller extends \Illuminate\Routing\Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
@@ -29,4 +29,79 @@ class GameController extends Controller
|
||||
|
||||
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(12)->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'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Game;
|
||||
use App\Models\GameList;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class GameListController extends Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('auth');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$lists = Auth::user()->lists()->withCount('games')->get();
|
||||
return view('lists.index', compact('lists'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('lists.create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'description' => 'nullable|string'
|
||||
]);
|
||||
|
||||
Auth::user()->lists()->create([
|
||||
'name' => $request->name,
|
||||
'description' => $request->description
|
||||
]);
|
||||
|
||||
return redirect()->route('lists.index')->with('success', 'List created successfully.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(GameList $list)
|
||||
{
|
||||
$this->authorize('view', $list);
|
||||
|
||||
$games = $list->games()->paginate(12);
|
||||
return view('lists.show', compact('list', 'games'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(GameList $list)
|
||||
{
|
||||
$this->authorize('update', $list);
|
||||
return view('lists.edit', compact('list'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, GameList $list)
|
||||
{
|
||||
$this->authorize('update', $list);
|
||||
|
||||
$request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'description' => 'nullable|string'
|
||||
]);
|
||||
|
||||
$list->update([
|
||||
'name' => $request->name,
|
||||
'description' => $request->description
|
||||
]);
|
||||
|
||||
return redirect()->route('lists.show', $list)->with('success', 'List updated successfully.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(GameList $list)
|
||||
{
|
||||
$this->authorize('delete', $list);
|
||||
|
||||
if ($list->is_default) {
|
||||
return redirect()->back()->with('error', 'Cannot delete default lists.');
|
||||
}
|
||||
|
||||
$list->delete();
|
||||
return redirect()->route('lists.index')->with('success', 'List deleted successfully.');
|
||||
}
|
||||
|
||||
public function addGame(Request $request, GameList $list)
|
||||
{
|
||||
$this->authorize('update', $list);
|
||||
|
||||
$request->validate([
|
||||
'game_id' => 'required|exists:games,id'
|
||||
]);
|
||||
|
||||
$list->games()->attach($request->game_id);
|
||||
|
||||
return redirect()->back()->with('success', 'Game added to list successfully.');
|
||||
}
|
||||
|
||||
public function removeGame(GameList $list, Game $game)
|
||||
{
|
||||
$this->authorize('update', $list);
|
||||
|
||||
$list->games()->detach($game->id);
|
||||
|
||||
return redirect()->back()->with('success', 'Game removed from list successfully.');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Game;
|
||||
use App\Models\Review;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class ReviewController extends Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('auth', ['except' => ['index', 'show']]);
|
||||
}
|
||||
|
||||
public function index(Game $game)
|
||||
{
|
||||
$reviews = $game->reviews()->with('user')->latest()->paginate(10);
|
||||
return view('reviews.index', compact('game', 'reviews'));
|
||||
}
|
||||
|
||||
public function create(Game $game)
|
||||
{
|
||||
return view('reviews.create', compact('game'));
|
||||
}
|
||||
|
||||
public function store(Request $request, Game $game)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'content' => 'required|string|min:10|max:1000',
|
||||
'recommended' => 'required|boolean',
|
||||
'rating' => 'required|integer|between:1,10',
|
||||
]);
|
||||
|
||||
$review = new Review($validated);
|
||||
$review->user_id = Auth::id();
|
||||
$review->game_id = $game->id;
|
||||
$review->save();
|
||||
|
||||
return redirect()->route('games.show', $game->slug)
|
||||
->with('success', 'Review posted successfully!');
|
||||
}
|
||||
|
||||
public function show(Game $game, Review $review)
|
||||
{
|
||||
return view('reviews.show', compact('game', 'review'));
|
||||
}
|
||||
|
||||
public function edit(Game $game, Review $review)
|
||||
{
|
||||
$this->authorize('update', $review);
|
||||
return view('reviews.edit', compact('game', 'review'));
|
||||
}
|
||||
|
||||
public function update(Request $request, Game $game, Review $review)
|
||||
{
|
||||
$this->authorize('update', $review);
|
||||
|
||||
$validated = $request->validate([
|
||||
'content' => 'required|string|min:10|max:1000',
|
||||
'recommended' => 'required|boolean',
|
||||
'rating' => 'required|integer|between:1,10',
|
||||
]);
|
||||
|
||||
$review->update($validated);
|
||||
|
||||
return redirect()->route('games.show', $game->slug)
|
||||
->with('success', 'Review updated successfully!');
|
||||
}
|
||||
|
||||
public function destroy(Game $game, Review $review)
|
||||
{
|
||||
$this->authorize('delete', $review);
|
||||
$review->delete();
|
||||
|
||||
return redirect()->route('games.show', $game->slug)
|
||||
->with('success', 'Review deleted successfully!');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user