trove/app/Models/Page.php

67 lines
1.5 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace App\Models;
use App\Enums\PageStatusEnum;
use App\Observers\PageObserver;
use Database\Factories\PageFactory;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Lvl0\FediDiscover\Models\Instance;
#[ObservedBy([PageObserver::class])]
class Page extends Model
{
/** @use HasFactory<PageFactory> */
use HasFactory;
protected $fillable = [
'url',
'status',
'language',
'title',
'instance_id',
'posted_at',
'fetched_at',
'failed_at',
];
protected $casts = [
'status' => PageStatusEnum::class,
'posted_at' => 'datetime',
'fetched_at' => 'datetime',
'failed_at' => 'datetime',
];
public function instance(): BelongsTo
{
return $this->belongsTo(Instance::class);
}
public function outgoingLinks(): HasMany
{
return $this->hasMany(PageLink::class, 'source_page_id');
}
public function incomingLinks(): HasMany
{
return $this->hasMany(PageLink::class, 'target_page_id');
}
public function crawls(): HasMany
{
return $this->hasMany(PageCrawl::class);
}
public function latestCrawl(): HasOne
{
return $this->hasOne(PageCrawl::class)->latestOfMany('created_at');
}
}