feat: leaderboard

This commit is contained in:
Leon 2026-01-05 09:48:18 +01:00
parent df09fe07ce
commit 9e6680c1c0
4 changed files with 38 additions and 1 deletions

View File

@ -12,6 +12,11 @@ class UsersController extends Controller
return $user;
}
public function leaderboard()
{
return User::orderBy('xp', 'desc')->get();
}
public function updateAvatar(Request $request, User $user)
{
if ($request->user()->id !== $user->id) {

View File

@ -14,7 +14,7 @@ use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasApiTokens, Notifiable, SoftDeletes;
use HasApiTokens, HasFactory, Notifiable, SoftDeletes;
/**
* The attributes that are mass assignable.

View File

@ -34,6 +34,7 @@ Route::middleware(['auth:sanctum', EnsureUserIsOrga::class])->group(function ()
// Auth middleware
Route::middleware('auth:sanctum')->group(function (): void {
// User
Route::get('users/leaderboard', [UsersController::class, 'leaderboard']);
Route::get('users/{user}', [UsersController::class, 'show']);
Route::post('users/{user}/avatar', [UsersController::class, 'updateAvatar']);
Route::post('hunts/{hunt}/participate', [HuntsController::class, 'participate']);

View File

@ -0,0 +1,31 @@
<?php
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
test('leaderboard endpoint returns users sorted by xp in descending order', function () {
// Create users with different XP
$user1 = User::factory()->create(['xp' => 100, 'username' => 'User1']);
$user2 = User::factory()->create(['xp' => 300, 'username' => 'User2']);
$user3 = User::factory()->create(['xp' => 200, 'username' => 'User3']);
// Authenticate as one of the users
$this->actingAs($user1);
// Call the endpoint
$response = $this->getJson('/api/users/leaderboard');
// Assert response status
$response->assertOk();
// Assert the order of users in the response
$response->assertJson(fn ($json) =>
$json->has(3)
->where('0.id', $user2->id) // 300 XP
->where('1.id', $user3->id) // 200 XP
->where('2.id', $user1->id) // 100 XP
);
});