feat: leaderboard
This commit is contained in:
parent
df09fe07ce
commit
9e6680c1c0
|
|
@ -12,6 +12,11 @@ class UsersController extends Controller
|
||||||
return $user;
|
return $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function leaderboard()
|
||||||
|
{
|
||||||
|
return User::orderBy('xp', 'desc')->get();
|
||||||
|
}
|
||||||
|
|
||||||
public function updateAvatar(Request $request, User $user)
|
public function updateAvatar(Request $request, User $user)
|
||||||
{
|
{
|
||||||
if ($request->user()->id !== $user->id) {
|
if ($request->user()->id !== $user->id) {
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ use Laravel\Sanctum\HasApiTokens;
|
||||||
class User extends Authenticatable
|
class User extends Authenticatable
|
||||||
{
|
{
|
||||||
/** @use HasFactory<\Database\Factories\UserFactory> */
|
/** @use HasFactory<\Database\Factories\UserFactory> */
|
||||||
use HasApiTokens, Notifiable, SoftDeletes;
|
use HasApiTokens, HasFactory, Notifiable, SoftDeletes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The attributes that are mass assignable.
|
* The attributes that are mass assignable.
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ Route::middleware(['auth:sanctum', EnsureUserIsOrga::class])->group(function ()
|
||||||
// Auth middleware
|
// Auth middleware
|
||||||
Route::middleware('auth:sanctum')->group(function (): void {
|
Route::middleware('auth:sanctum')->group(function (): void {
|
||||||
// User
|
// User
|
||||||
|
Route::get('users/leaderboard', [UsersController::class, 'leaderboard']);
|
||||||
Route::get('users/{user}', [UsersController::class, 'show']);
|
Route::get('users/{user}', [UsersController::class, 'show']);
|
||||||
Route::post('users/{user}/avatar', [UsersController::class, 'updateAvatar']);
|
Route::post('users/{user}/avatar', [UsersController::class, 'updateAvatar']);
|
||||||
Route::post('hunts/{hunt}/participate', [HuntsController::class, 'participate']);
|
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