feat: leaderboard
This commit is contained in:
parent
df09fe07ce
commit
9e6680c1c0
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
});
|
||||
Loading…
Reference in New Issue