Skip to content
Snippets Groups Projects
Server.php 5.42 KiB
Newer Older
Tibo's avatar
Tibo committed
<?php

namespace App;

use League\CommonMark\CommonMarkConverter;

Tibo's avatar
Tibo committed
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Collection as DatabaseCollection;
use Illuminate\Support\Collection;
Tibo's avatar
Tibo committed

Thibault Debatty's avatar
Thibault Debatty committed
/**
 * App\Server
 *
 * @property int $id
 * @property int $organization_id
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property string $name
 * @property string $description
Tibo's avatar
Tibo committed
 * @property int $size rack size, expressed in "U"
 * @property int $position position in rack, expressed in "U", starting from the bottom
Thibault Debatty's avatar
Thibault Debatty committed
 * @property string $token
 * @property string $read_token
 * @property ?\App\ServerInfo $info
Tibo's avatar
Tibo committed
 * @property \App\Organization $organization
Thibault Debatty's avatar
Thibault Debatty committed
 * @method static \Illuminate\Database\Eloquent\Builder|Server newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Server newQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Server query()
 * @method static \Illuminate\Database\Eloquent\Builder|Server whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Server whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Server whereName($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Server whereOrganizationId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Server whereReadToken($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Server whereToken($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Server whereUpdatedAt($value)
 * @mixin \Eloquent
 */
Tibo's avatar
Tibo committed
class Server extends Model
{
Tibo's avatar
Tibo committed
    protected $fillable = ["token"];
    // don't show tokens when serializing to json
    protected $hidden = ['token', 'read_token'];

    // define attributes that can be appended when serializing to json
    // used in OrganizationDashboardController@json
    // https://laravel.com/docs/8.x/eloquent-serialization#appending-values-to-json
    protected $appends = ['url', 'status', 'failing_sensors', 'last_record_time'];
    public function getUrlAttribute() : string
    {
        return action("ServerController@show", ["server" => $this]);
    }
    public function getStatusAttribute() : array
    {
        return $this->status()->jsonSerialize();
    }
    public function getFailingSensorsAttribute() : array
    {
        $failing_sensors = [];
Thibault Debatty's avatar
Thibault Debatty committed
        foreach ($this->getSensorsNOK() as $report) {
            $failing_sensors[] = $report->title;
        return $failing_sensors;
    }
Thibault Debatty's avatar
Thibault Debatty committed
    public function getLastRecordTimeAttribute() : int
    // -------------------------------------
Tibo's avatar
Tibo committed
    public function __construct(array $attributes = array())
    {
Tibo's avatar
Tibo committed
        $attributes["token"] = str_random(32);
        parent::__construct($attributes);
    }

Tibo's avatar
Tibo committed
    public function organization()
    {
Tibo's avatar
Tibo committed
        return $this->belongsTo("App\Organization");
    }
    public function records()
    {
        return $this->hasMany(Record::class);
    }
Tibo's avatar
Tibo committed

    public function lastRecord(string $label) : ?Record
Tibo's avatar
Tibo committed
    {
                ->where("label", $label)
                ->orderBy("time", "desc")->first();
Tibo's avatar
Tibo committed
    }

Tibo's avatar
Tibo committed
    /**
     * Get the last day of data.
    public function lastRecords(string $label) : DatabaseCollection
    {
        $start = time() - 24 * 3600;
        return $this->records()
                ->where("label", $label)
                ->where("time", ">", $start)
                ->orderBy("time")
                ->get();
Tibo's avatar
Tibo committed
    {
        return $this->hasOne(ServerInfo::class);
Tibo's avatar
Tibo committed
    }
Tibo's avatar
Tibo committed

Tibo's avatar
Tibo committed
    /**
Tibo's avatar
Tibo committed
     */
Tibo's avatar
Tibo committed
    public function status() : Status
Tibo's avatar
Tibo committed
    {
Tibo's avatar
Tibo committed
    }

Thibault Debatty's avatar
Thibault Debatty committed
    /**
Thibault Debatty's avatar
Thibault Debatty committed
     *
Thibault Debatty's avatar
Thibault Debatty committed
     * @return Collection<Report>
     */
Tibo's avatar
Tibo committed
    {
        if ($summary->status_code == 0) {
            return new Collection();
Tibo's avatar
Tibo committed
        }
        return $summary->reports()->filter(
            function (Report $report) {
                return $report->status_code > 0;
            }
        );
Tibo's avatar
Tibo committed
    }
Tibo's avatar
Tibo committed
    public function reports()
Tibo's avatar
Tibo committed
    {
        return $this->hasMany(Report::class);
    }
    public function summaries()
    {
        return $this->hasMany(ReportSummary::class);
    }
        if (! is_null($this->last_summary)) {
            return $this->last_summary;
        }
        // try to fetch from DB
        $summary = $this->summaries()->orderByDesc("id")->first();
        if (! is_null($summary)) {
            $this->last_summary = $summary;
            return $this->last_summary;
        $this->last_summary = ReportSummary::default($this);
    public function changes()
Tibo's avatar
Tibo committed
    {
        return $this->hasMany(StatusChange::class);
Tibo's avatar
Tibo committed
    }
    public function lastChanges($count = 10)
    {
        return $this->changes()->orderBy("time", "desc")->limit($count)->get();
    }
    public function lastChange() : ?StatusChange
Tibo's avatar
Tibo committed
    {
        return $this->changes()->latest("time")->first();
Tibo's avatar
Tibo committed
    }
    public function descriptionAsHTML() : string
    {
        $converter = new CommonMarkConverter();
        return $converter->convertToHtml($this->description ?? '');
    }
Thibault Debatty's avatar
Thibault Debatty committed
    public function rack()
    {
        return $this->belongsTo(Rack::class);
    }
Tibo's avatar
Tibo committed
}