with(["winner", "player1", "player2"]); if ($request->has("type") && in_array($request->type, ["3", "9"])) { $query->where("type", $request->type); } if ( $request->has("status") && in_array($request->status, [ "Pending", "Playing", "Ended", "Interrupted", ]) ) { $query->where("status", $request->status); } if ($request->has("sort_direction") && in_array($request->sort_direction, ["asc", "desc"])) { $query->orderBy("began_at", $request->sort_direction); }else{ $query->orderBy("began_at", "desc"); } return response()->json($query->paginate(15)); } public function store(Request $request) { $validated = $request->validate([ "type" => "required|in:3,9", ]); $user = Auth::user(); $activeMatch = MatchGame::where(function ($q) use ($user) { $q->where("player1_user_id", $user->id)->orWhere( "player2_user_id", $user->id, ); }) ->whereIn("status", ["Pending", "Playing"]) ->exists(); $activeGame = Game::where(function ($q) use ($user) { $q->where("player1_user_id", $user->id)->orWhere( "player2_user_id", $user->id, ); }) ->whereIn("status", ["Pending", "Playing"]) ->exists(); if ($activeMatch || $activeGame) { return response()->json( ["message" => "You already have an active game or match."], 400, ); } $game = Game::create([ "type" => $validated["type"], "status" => "Pending", "player1_user_id" => $user->id, "player2_user_id" => null, "winner_user_id" => null, "loser_user_id" => null, "began_at" => now(), "player1_points" => 0, "player2_points" => 0, "custom" => null, ]); return response()->json( [ "message" => "Multiplayer game room created", "game" => $game, ], 201, ); } public function join(Game $game) { $user = Auth::user(); if ($game->player1_user_id == $user->id) { return response()->json( [ "message" => "Waiting for opponent...", "game" => $game, ], 200, ); } if ($game->status !== "Pending") { return response()->json( ["message" => "Game is full or already started"], 400, ); } $activeGame = Game::where(function ($query) use ($user) { $query ->where("player1_user_id", $user->id) ->orWhere("player2_user_id", $user->id); }) ->whereIn("status", ["Pending", "Playing"]) ->exists(); if ($activeGame) { return response()->json( ["message" => "You are already in another active game."], 400, ); } $game->update([ "status" => "Playing", "player2_user_id" => $user->id, ]); return response()->json( [ "message" => "Joined successfully! Game starts now.", "game" => $game, ], 200, ); } public function show(Game $game) { $game->load(["player1", "player2", "winner"]); return response()->json($game); } public function update(Request $request, Game $game) { if ($game->status == "Ended") { return response()->json(["message" => "Game already ended"], 400); } $data = $request->validate([ "status" => "in:Playing,Ended,Interrupted", "winner_user_id" => "exists:users,id", "loser_user_id" => "exists:users,id", "player1_points" => "integer", "player2_points" => "integer", "is_draw" => "boolean", "total_time" => "numeric", ]); if (isset($data["status"]) && $data["status"] === "Ended") { $data["ended_at"] = now(); } $game->update($data); return response()->json($game); } }