Skip to content
Snippets Groups Projects
Commit 68e5813f authored by Thibault Debatty's avatar Thibault Debatty
Browse files

create json dashboard

parent b3c09c62
No related branches found
No related tags found
No related merge requests found
Pipeline #13262 passed
......@@ -3,19 +3,19 @@
namespace App\Http\Controllers;
use App\Organization;
use Illuminate\Http\Request;
/**
* Public organization dashboard
*/
class OrganizationDashboardController extends Controller
{
public function dashboard(Organization $organization, string $token)
public function json(Organization $organization, string $token)
{
if ($organization->dashboard_token != $token) {
abort(403);
}
return view("organization.dashboard", array("organization" => $organization));
return response()->json($organization);
}
}
......@@ -28,7 +28,18 @@ use Illuminate\Database\Eloquent\Model;
*/
class Organization extends Model
{
// don't show dashboard token when serializing to json
protected $hidden = ['dashboard_token'];
// add servers when serializing to json
// https://laravel.com/docs/8.x/eloquent-serialization#appending-values-to-json
protected $appends = ['servers'];
protected function getServersAttribute()
{
return $this->servers()->orderBy("name")->get();
}
public function users()
{
......
......@@ -33,6 +33,36 @@ class Server extends Model
{
protected $fillable = ["token"];
// don't show tokens when serializing to json
protected $hidden = ['token', 'read_token'];
// add attributes when serializing to json
// https://laravel.com/docs/8.x/eloquent-serialization#appending-values-to-json
protected $appends = ['url', 'status', 'failing_sensors'];
public function getUrlAttribute() : string
{
return action("ServerController@show", ["server" => $this]);
}
public function getStatusAttribute() : array
{
return $this->status()->jsonSerialize();
}
public function getFailingSensorsAttribute() : array
{
$failing_sensors = [];
foreach ($this->getSensorsNOK() as $sensor) {
$failing_sensors[] = $sensor->name();
}
return $failing_sensors;
}
/**
* Last record from this server (used for caching).
......@@ -125,7 +155,7 @@ class Server extends Model
return Status::max($this->reports());
}
public function getSensorsNOK()
public function getSensorsNOK() : array
{
$sensorsNOK = [];
foreach ($this->reports() as $sensor) {
......
......@@ -32,6 +32,13 @@ class Status
return "Unknown";
}
}
public function jsonSerialize() : array
{
return [
"code" => $this->code,
"name" => $this->__toString()];
}
public function code() : int
{
......
......@@ -6,7 +6,7 @@
<h1>{{ $organization->name }}</h1>
<div class="row">
@foreach($organization->servers()->orderBy("name")->get() as $server)
@foreach($organization->servers->sortBy("name") as $server)
<div class="col-md-3">
<div class="card card-border-3 border-{{ $server->status()->color() }}">
<div class="card-header">
......@@ -31,7 +31,7 @@
<div class="card-footer">
<a class="btn btn-secondary btn-sm"
href="{{ action("ServerController@show", ["server" => $server]) }}">
href="{{ $server->getUrlAttribute() }}">
View
</a>
</div>
......
......@@ -13,14 +13,16 @@
<a class="btn btn-primary btn-sm"
href="{{ action("OrganizationController@dashboard",
["organization" => $organization]) }}">
Dashboard <i class="fas fa-lock ml-2"></i>
<i class="fas fa-tachometer-alt"></i> Dashboard
</a>
<a class="btn btn-primary btn-sm"
href="{{ route("organization.public.dashboard", [
href="{{ action("OrganizationDashboardController@json", [
"organization" => $organization,
"token" => $organization->dashboard_token]) }}">
Public dashboard <i class="fas fa-globe ml-2"></i>
"token" => $organization->dashboard_token]) }}">
<i class="fas fa-code"></i> JSON
</a>
<a class="btn btn-primary btn-sm"
href="{{ action("OrganizationController@resetToken", [
"organization" => $organization]) }}">
......
......@@ -46,6 +46,12 @@ Route::get(
'OrganizationDashboardController@dashboard'
)->name("organization.public.dashboard");
// public json dashboard
Route::get(
'app/organizations/{organization}/{token}/dashboard.json',
'OrganizationDashboardController@json'
);
Route::resource('app/organizations', 'OrganizationController');
Route::resource("app/organizations.user", "OrganizationUserController")->only(["create", "store", "destroy"]);
Route::resource('app/servers', 'ServerController')->except(["index"]);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment