diff --git a/api/app/Http/Controllers/UserController.php b/api/app/Http/Controllers/UserController.php index 98a063d..4e6a608 100644 --- a/api/app/Http/Controllers/UserController.php +++ b/api/app/Http/Controllers/UserController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Models\Game; use App\Models\User; +use App\Models\MatchGame; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; @@ -178,72 +179,87 @@ class UserController extends Controller } /** - * GET /api/users/{user}/matches - * Histórico de Jogos Multiplayer do Utilizador + * GET /api/users/{user}/games + * Histórico de Partidas Individuais (Cartas) */ - public function getMatches(Request $request, User $user) + public function getGames(Request $request, User $user) { $this->authorize('view', $user); - $outcomeSql = "CASE - WHEN is_draw = 1 THEN 'DRAW' - WHEN winner_user_id = {$user->id} THEN 'WIN' - ELSE 'LOSS' - END"; - - $query = Game::query() - ->select('*') - ->selectRaw("($outcomeSql) as outcome_text") - ->where(function ($q) use ($user) { - $q->where('player1_user_id', $user->id) - ->orWhere('player2_user_id', $user->id); - }) - ->with(['winner', 'player1', 'player2']); + // Define a query base para GAMES + $query = \App\Models\Game::query() + ->where(function ($q) use ($user) { + $q->where('player1_user_id', $user->id) + ->orWhere('player2_user_id', $user->id); + }) + ->with(['winner', 'player1', 'player2']); if ($request->has('type')) { - $query->where('type', $request->type); + $query->where('type', $request->type); } if ($request->has('status')) { $query->where('status', $request->status); } - if ($request->filled('outcome')) { - switch ($request->outcome) { - case 'win': - $query->where('winner_user_id', $user->id) - ->where('is_draw', 0); - break; - case 'loss': - case 'forfeit': // Forfeit treated as loss for now - $query->where('loser_user_id', $user->id) - ->where('is_draw', 0); - break; - case 'draw': - $query->where('is_draw', 1); - break; - } + $sortDirection = $request->get('sort_direction', 'desc'); + $query->orderBy('began_at', $sortDirection); + + + $games = $query->paginate(10); + + $games->getCollection()->transform(function ($game) use ($user) { + if ($game->winner_user_id == $user->id) { + $game->outcome = 'win'; + } elseif ($game->is_draw) { + $game->outcome = 'draw'; + } else { + $game->outcome = 'loss'; + } + return $game; + }); + + return response()->json($games); } - if ($request->has('date_from')) { - $query->whereDate('began_at', '>=', $request->date_from); + /** + * GET /api/users/{user}/matches + * Histórico de Matches (Apostas / Marcas) + */ + public function getMatches(Request $request, User $user) + { + $this->authorize('view', $user); + + $query = MatchGame::query() + ->where(function ($q) use ($user) { + $q->where('player1_user_id', $user->id) + ->orWhere('player2_user_id', $user->id); + }) + ->with(['winner', 'player1', 'player2']); + + if ($request->has('type')) { + $query->where('type', $request->type); + } + + if ($request->has('status')) { + $query->where('status', $request->status); } - if ($request->has('date_to')) { - $query->whereDate('ended_at', '<=', $request->date_to); - } + $sortDirection = $request->get('sort_direction', 'desc'); + $query->orderBy('began_at', $sortDirection); - $order = $request->get('sort_by', 'began_at'); - $direction = $request->get('sort_direction', 'desc'); + $matches = $query->paginate(10); - if ($order === 'outcome') { - $query->orderBy('outcome_text', $direction); - } else { - $query->orderBy($order, $direction); - } - - $matches = $query->orderBy($order, $direction) - ->paginate(10); + $matches->getCollection()->transform(function ($match) use ($user) { + if ($match->winner_user_id == $user->id) { + $match->outcome = 'win'; + } elseif ($match->winner_user_id && $match->winner_user_id != $user->id) { + $match->outcome = 'loss'; + } else { + $match->outcome = 'interrupted'; // Matches geralmente não empatam (alguém chega a 4 marcas) + } + return $match; + }); return response()->json($matches); } diff --git a/api/routes/api.php b/api/routes/api.php index 1809c01..a1c3ffd 100644 --- a/api/routes/api.php +++ b/api/routes/api.php @@ -40,11 +40,9 @@ Route::prefix('v1')->group(function () { // User Resources Route::prefix('/users')->group(function () { Route::get('/{user}', [UserController::class, 'show']); - Route::get('/{user}/matches', [ - UserController::class, - 'getMatches', - ]); Route::get('/{user}/transactions', [UserController::class, 'getTransactions']); + Route::get('/{user}/games', [UserController::class, 'getGames']); + Route::get('/{user}/matches', [UserController::class, 'getMatches']); }); Route::prefix('games')->group(function () { diff --git a/frontend/src/pages/user/UserPage.vue b/frontend/src/pages/user/UserPage.vue index e16057a..0ad8ad3 100644 --- a/frontend/src/pages/user/UserPage.vue +++ b/frontend/src/pages/user/UserPage.vue @@ -1,137 +1,244 @@