Skip to content

Commit

Permalink
Add server status API on /api/servers (closes Azuriom#273)
Browse files Browse the repository at this point in the history
  • Loading branch information
MrMicky-FR committed Dec 21, 2022
1 parent 126e89e commit 83d3194
Show file tree
Hide file tree
Showing 12 changed files with 109 additions and 30 deletions.
2 changes: 1 addition & 1 deletion app/Http/Controllers/Api/PostController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace Azuriom\Http\Controllers\Api;

use Azuriom\Http\Controllers\Controller;
use Azuriom\Http\Resources\Post as PostResource;
use Azuriom\Http\Resources\PostResource;
use Azuriom\Models\Post;

class PostController extends Controller
Expand Down
17 changes: 17 additions & 0 deletions app/Http/Controllers/Api/ServerController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,34 @@

use Azuriom\Games\Steam\SteamID;
use Azuriom\Http\Controllers\Controller;
use Azuriom\Http\Resources\ServerCollection;
use Azuriom\Models\Role;
use Azuriom\Models\Server;
use Azuriom\Models\ServerCommand;
use Azuriom\Models\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Hash;

class ServerController extends Controller
{
public function index()
{
$serverId = (int) setting('servers.default');
$servers = Server::where('home_display', true)
->when($serverId, function (Builder $query) use ($serverId) {
$query->orWhere('id', $serverId);
})
->get();

$servers = $servers->where('home_display', true);
$server = $servers->first(fn (Server $server) => $server->id === $serverId);

return new ServerCollection($servers, $server);
}

public function status()
{
return response()->noContent(headers: [
Expand Down
2 changes: 1 addition & 1 deletion app/Http/Controllers/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Azuriom\Http\Controllers;

use Azuriom\Http\Resources\User as UserResource;
use Azuriom\Http\Resources\UserResource;
use Azuriom\Models\User;
use Illuminate\Http\Request;

Expand Down
1 change: 0 additions & 1 deletion app/Http/Resources/AuthenticatedUser.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace Azuriom\Http\Resources;

use Azuriom\Http\Resources\Role as RoleResource;
use Illuminate\Http\Resources\Json\JsonResource;

/** @mixin \Azuriom\Models\User */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

namespace Azuriom\Http\Resources;

use Azuriom\Http\Resources\User as UserResource;
use Illuminate\Http\Resources\Json\JsonResource;

/** @mixin \Azuriom\Models\Comment */
class Comment extends JsonResource
class CommentResource extends JsonResource
{
/**
* Transform the resource into an array.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

namespace Azuriom\Http\Resources;

use Azuriom\Http\Resources\Comment as CommentResource;
use Azuriom\Http\Resources\User as UserResource;
use Illuminate\Http\Resources\Json\JsonResource;

/** @mixin \Azuriom\Models\Post */
class Post extends JsonResource
class PostResource extends JsonResource
{
/**
* Transform the resource into an array.
Expand All @@ -27,7 +25,7 @@ public function toArray($request)
'author' => new UserResource($this->author),
'published_at' => $this->published_at->toIso8601String(),
'comments' => CommentResource::collection($this->whenLoaded('comments')),
'image' => $this->imageUrl(),
'image' => $this->whenNotNull($this->imageUrl()),
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
use Illuminate\Http\Resources\Json\JsonResource;

/** @mixin \Azuriom\Models\Role */
class Role extends JsonResource
class RoleResource extends JsonResource
{
/**
* Transform the resource into an array.
Expand Down
35 changes: 35 additions & 0 deletions app/Http/Resources/ServerCollection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Azuriom\Http\Resources;

use Azuriom\Models\Server;
use Illuminate\Http\Resources\Json\ResourceCollection;

class ServerCollection extends ResourceCollection
{
protected mixed $servers;

protected ?Server $default;

public function __construct(mixed $servers, ?Server $default)
{
parent::__construct($servers);

$this->servers = $servers;
$this->default = $default;
}

/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'default' => new ServerResource($this->default),
'servers' => $this->collection,
];
}
}
27 changes: 27 additions & 0 deletions app/Http/Resources/ServerResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Azuriom\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

/** @mixin \Azuriom\Models\Server */
class ServerResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'name' => $this->name,
'address' => $this->when($this->join_url === null, $this->fullAddress()),
'join_url' => $this->whenNotNull($this->join_url),
'online' => $this->isOnline(),
'players' => $this->whenNotNull($this->getOnlinePlayers()),
'max_players' => $this->whenNotNull($this->getMaxPlayers()),
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

namespace Azuriom\Http\Resources;

use Azuriom\Http\Resources\Role as RoleResource;
use Illuminate\Http\Resources\Json\JsonResource;

/** @mixin \Azuriom\Models\User */
class User extends JsonResource
class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
Expand Down
39 changes: 21 additions & 18 deletions app/Models/Traits/Searchable.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,28 +29,31 @@ public function scopeSearch(Builder $query, string $search, array|string $column
$columns = $this->searchable;
}

return $query->where(function (Builder $query) use ($search, $columns) {
$models = [];
return $query->where(fn ($query) => $this->runSearch($query, $search, $columns));
}

foreach ($columns as $column) {
if (Str::contains($column, '.')) {
[$model, $column] = explode('.', $column);
protected function runSearch(Builder $query, string $search, array $columns)
{
$models = [];

$models[$model] = array_merge($models[$model] ?? [], [$column]);
} else {
$query->orWhere($column, 'like', "%{$search}%");
}
}
foreach ($columns as $column) {
if (Str::contains($column, '.')) {
[$model, $column] = explode('.', $column);

foreach ($models as $model => $column) {
$query->orWhereRelation($model, function (Builder $query) use ($column, $search) {
$query->search($search, $column);
});
$models[$model] = array_merge($models[$model] ?? [], [$column]);
} else {
$query->orWhere($column, 'like', "%{$search}%");
}
}

if (is_numeric($search) || $this->getKeyType() !== 'int') {
$query->orWhere($this->getKeyName(), $search);
}
});
foreach ($models as $model => $column) {
$query->orWhereRelation($model, function (Builder $query) use ($column, $search) {
$query->search($search, $column);
});
}

if (is_numeric($search) || $this->getKeyType() !== 'int') {
$query->orWhere($this->getKeyName(), $search);
}
}
}
2 changes: 2 additions & 0 deletions routes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

Route::apiResource('posts', PostController::class)->names('api.')->only(['index', 'show']);

Route::apiResource('servers', ServerController::class)->names('api.')->only('index');

Route::prefix('/auth')->name('auth.')->group(function () {
Route::post('/authenticate', [AuthController::class, 'authenticate'])->name('authenticate');
Route::post('/verify', [AuthController::class, 'verify'])->name('verify');
Expand Down

0 comments on commit 83d3194

Please sign in to comment.