Move model observers onto attributes and tidy provider bindings.
Register observers with ObservedBy, bind the comment spam classifier, and keep AppServiceProvider focused on application wiring.
This commit is contained in:
@@ -4,9 +4,12 @@ declare(strict_types=1);
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Observers\ArtworkAwardObserver;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
#[ObservedBy([ArtworkAwardObserver::class])]
|
||||
class ArtworkAward extends Model
|
||||
{
|
||||
protected $table = 'artwork_medals';
|
||||
@@ -21,21 +24,21 @@ class ArtworkAward extends Model
|
||||
|
||||
protected $casts = [
|
||||
'artwork_id' => 'integer',
|
||||
'user_id' => 'integer',
|
||||
'weight' => 'integer',
|
||||
'user_id' => 'integer',
|
||||
'weight' => 'integer',
|
||||
];
|
||||
|
||||
public const MEDALS = ['gold', 'silver', 'bronze'];
|
||||
|
||||
public const WEIGHTS = [
|
||||
'gold' => 5,
|
||||
'gold' => 5,
|
||||
'silver' => 3,
|
||||
'bronze' => 1,
|
||||
];
|
||||
|
||||
public static function weightFor(string $medal): int
|
||||
{
|
||||
return (int) config('artwork_medals.weights.' . $medal, self::WEIGHTS[$medal] ?? 0);
|
||||
return (int) config('artwork_medals.weights.'.$medal, self::WEIGHTS[$medal] ?? 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,22 +2,25 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Observers\ArtworkFavouriteObserver;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
/**
|
||||
* Represents a user's "favourite" bookmark on an artwork.
|
||||
*
|
||||
* @property int $id
|
||||
* @property int $user_id
|
||||
* @property int $artwork_id
|
||||
* @property int|null $legacy_id Original favourite_id from the old site
|
||||
* @property \Carbon\Carbon $created_at
|
||||
* @property \Carbon\Carbon $updated_at
|
||||
*
|
||||
* @property int $id
|
||||
* @property int $user_id
|
||||
* @property int $artwork_id
|
||||
* @property int|null $legacy_id Original favourite_id from the old site
|
||||
* @property Carbon $created_at
|
||||
* @property Carbon $updated_at
|
||||
* @property-read User $user
|
||||
* @property-read Artwork $artwork
|
||||
*/
|
||||
#[ObservedBy([ArtworkFavouriteObserver::class])]
|
||||
class ArtworkFavourite extends Model
|
||||
{
|
||||
protected $table = 'artwork_favourites';
|
||||
@@ -29,9 +32,9 @@ class ArtworkFavourite extends Model
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'user_id' => 'integer',
|
||||
'user_id' => 'integer',
|
||||
'artwork_id' => 'integer',
|
||||
'legacy_id' => 'integer',
|
||||
'legacy_id' => 'integer',
|
||||
];
|
||||
|
||||
// ── Relations ──────────────────────────────────────────────────────────
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Observers\ArtworkFeatureObserver;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
#[ObservedBy([ArtworkFeatureObserver::class])]
|
||||
class ArtworkFeature extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
|
||||
@@ -2,15 +2,18 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Observers\ArtworkReactionObserver;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
* @property int $artwork_id
|
||||
* @property int $user_id
|
||||
* @property string $reaction ReactionType slug (e.g. thumbs_up, heart, fire…)
|
||||
* @property int $id
|
||||
* @property int $artwork_id
|
||||
* @property int $user_id
|
||||
* @property string $reaction ReactionType slug (e.g. thumbs_up, heart, fire…)
|
||||
*/
|
||||
#[ObservedBy([ArtworkReactionObserver::class])]
|
||||
class ArtworkReaction extends Model
|
||||
{
|
||||
public $timestamps = false;
|
||||
@@ -21,7 +24,7 @@ class ArtworkReaction extends Model
|
||||
|
||||
protected $casts = [
|
||||
'artwork_id' => 'integer',
|
||||
'user_id' => 'integer',
|
||||
'user_id' => 'integer',
|
||||
'created_at' => 'datetime',
|
||||
];
|
||||
|
||||
|
||||
@@ -2,15 +2,16 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Observers\ContentTypeObserver;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
|
||||
use App\Models\Artwork;
|
||||
|
||||
#[ObservedBy([ContentTypeObserver::class])]
|
||||
class ContentType extends Model
|
||||
{
|
||||
protected $fillable = ['name','slug','description','order','hide_from_menu','mascot_path','cover_art_path'];
|
||||
protected $fillable = ['name', 'slug', 'description', 'order', 'hide_from_menu', 'mascot_path', 'cover_art_path'];
|
||||
|
||||
protected $casts = [
|
||||
'order' => 'integer',
|
||||
@@ -81,6 +82,6 @@ class ContentType extends Model
|
||||
return $path;
|
||||
}
|
||||
|
||||
return rtrim((string) config('cdn.files_url', 'https://cdn.skinbase.org'), '/') . '/' . ltrim($path, '/');
|
||||
return rtrim((string) config('cdn.files_url', 'https://cdn.skinbase.org'), '/').'/'.ltrim($path, '/');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Observers\GroupReleaseObserver;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
@@ -11,29 +13,44 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
#[ObservedBy([GroupReleaseObserver::class])]
|
||||
class GroupRelease extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
use SoftDeletes;
|
||||
|
||||
public const STATUS_PLANNED = 'planned';
|
||||
|
||||
public const STATUS_IN_PROGRESS = 'in_progress';
|
||||
|
||||
public const STATUS_INTERNAL_REVIEW = 'internal_review';
|
||||
|
||||
public const STATUS_SCHEDULED = 'scheduled';
|
||||
|
||||
public const STATUS_RELEASED = 'released';
|
||||
|
||||
public const STATUS_ARCHIVED = 'archived';
|
||||
|
||||
public const STATUS_CANCELLED = 'cancelled';
|
||||
|
||||
public const STAGE_CONCEPT = 'concept';
|
||||
|
||||
public const STAGE_PRODUCTION = 'production';
|
||||
|
||||
public const STAGE_REVIEW = 'review';
|
||||
|
||||
public const STAGE_PACKAGING = 'packaging';
|
||||
|
||||
public const STAGE_APPROVAL = 'approval';
|
||||
|
||||
public const STAGE_PUBLISHING = 'publishing';
|
||||
|
||||
public const STAGE_RELEASED = 'released';
|
||||
|
||||
public const VISIBILITY_PUBLIC = 'public';
|
||||
|
||||
public const VISIBILITY_UNLISTED = 'unlisted';
|
||||
|
||||
public const VISIBILITY_PRIVATE = 'private';
|
||||
|
||||
protected $fillable = [
|
||||
@@ -151,6 +168,6 @@ class GroupRelease extends Model
|
||||
return $path;
|
||||
}
|
||||
|
||||
return rtrim((string) config('cdn.files_url', 'https://files.skinbase.org'), '/') . '/' . ltrim($path, '/');
|
||||
return rtrim((string) config('cdn.files_url', 'https://files.skinbase.org'), '/').'/'.ltrim($path, '/');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,10 +4,13 @@ declare(strict_types=1);
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Observers\GroupReleaseContributorObserver;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
#[ObservedBy([GroupReleaseContributorObserver::class])]
|
||||
class GroupReleaseContributor extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
@@ -28,4 +31,4 @@ class GroupReleaseContributor extends Model
|
||||
{
|
||||
return $this->belongsTo(User::class);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,48 +4,75 @@ declare(strict_types=1);
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Observers\HomepageAnnouncementObserver;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Support\Carbon;
|
||||
|
||||
#[ObservedBy([HomepageAnnouncementObserver::class])]
|
||||
class HomepageAnnouncement extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
|
||||
public const STATUS_DRAFT = 'draft';
|
||||
|
||||
public const STATUS_PUBLISHED = 'published';
|
||||
|
||||
public const STATUS_ARCHIVED = 'archived';
|
||||
|
||||
public const TYPE_ANNOUNCEMENT = 'announcement';
|
||||
|
||||
public const TYPE_LAUNCH = 'launch';
|
||||
|
||||
public const TYPE_NEWS = 'news';
|
||||
|
||||
public const TYPE_WORLD = 'world';
|
||||
|
||||
public const TYPE_EVENT = 'event';
|
||||
|
||||
public const TYPE_NOTICE = 'notice';
|
||||
|
||||
public const TYPE_MAINTENANCE = 'maintenance';
|
||||
|
||||
public const PLACEMENT_HOMEPAGE_AFTER_FEATURED = 'homepage_after_featured';
|
||||
|
||||
public const LINK_TYPE_NONE = 'none';
|
||||
|
||||
public const LINK_TYPE_CUSTOM_URL = 'custom_url';
|
||||
|
||||
public const LINK_TYPE_NEWS = 'news';
|
||||
|
||||
public const LINK_TYPE_WORLD = 'world';
|
||||
|
||||
public const LINK_TYPE_ARTWORK = 'artwork';
|
||||
|
||||
public const LINK_TYPE_COLLECTION = 'collection';
|
||||
|
||||
public const LINK_TYPE_GROUP = 'group';
|
||||
|
||||
public const LINK_TYPE_PROFILE = 'profile';
|
||||
|
||||
public const LINK_TYPE_EXPLORE = 'explore';
|
||||
|
||||
public const LINK_TYPE_UPLOAD = 'upload';
|
||||
|
||||
public const GRADIENT_NOVA_AURORA = 'nova_aurora';
|
||||
|
||||
public const GRADIENT_DEEP_SPACE = 'deep_space';
|
||||
|
||||
public const GRADIENT_SUNRISE = 'sunrise';
|
||||
|
||||
public const GRADIENT_OCEAN_GLOW = 'ocean_glow';
|
||||
|
||||
public const GRADIENT_SPRING_VIBES = 'spring_vibes';
|
||||
|
||||
public const GRADIENT_FANTASY_REALMS = 'fantasy_realms';
|
||||
|
||||
public const GRADIENT_MINIMAL_LIGHT = 'minimal_light';
|
||||
|
||||
public const GRADIENT_DARK_GLASS = 'dark_glass';
|
||||
|
||||
protected $table = 'homepage_announcements';
|
||||
@@ -194,4 +221,4 @@ class HomepageAnnouncement extends Model
|
||||
{
|
||||
return $this->belongsTo(User::class, 'updated_by');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user