diff --git a/app/Events/Discord/DiscordThread/DiscordThreadDeleted.php b/app/Events/Discord/DiscordThread/DiscordThreadDeleted.php index 6b23d27ee..73ce3ef3b 100644 --- a/app/Events/Discord/DiscordThread/DiscordThreadDeleted.php +++ b/app/Events/Discord/DiscordThread/DiscordThreadDeleted.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace App\Events\Discord\DiscordThread; -use App\Actions\Discord\DiscordThreadAction; use App\Events\Base\Admin\AdminDeletedEvent; use App\Models\Discord\DiscordThread; @@ -16,21 +15,10 @@ class DiscordThreadDeleted extends AdminDeletedEvent public function __construct(DiscordThread $thread) { parent::__construct($thread); - $this->deleteThread(); } protected function getDiscordMessageDescription(): string { return "Discord Thread '**{$this->getModel()->getName()}**' has been deleted."; } - - /** - * Delete the thread on discord. - */ - protected function deleteThread(): void - { - DiscordThreadAction::getHttp() - ->delete('/thread', ['id' => $this->getModel()->getKey()]) - ->throw(); - } } diff --git a/app/Events/Discord/DiscordThread/DiscordThreadUpdated.php b/app/Events/Discord/DiscordThread/DiscordThreadUpdated.php index f759c1f6d..a0c62f141 100644 --- a/app/Events/Discord/DiscordThread/DiscordThreadUpdated.php +++ b/app/Events/Discord/DiscordThread/DiscordThreadUpdated.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace App\Events\Discord\DiscordThread; -use App\Actions\Discord\DiscordThreadAction; use App\Events\Base\Admin\AdminUpdatedEvent; use App\Models\Discord\DiscordThread; @@ -16,7 +15,6 @@ class DiscordThreadUpdated extends AdminUpdatedEvent public function __construct(DiscordThread $thread) { parent::__construct($thread); - $this->updateThread(); $this->initializeEmbedFields($thread); } @@ -24,14 +22,4 @@ class DiscordThreadUpdated extends AdminUpdatedEvent { return "Discord Thread '**{$this->getModel()->getName()}**' has been updated."; } - - /** - * Update the thread on discord. - */ - protected function updateThread(): void - { - DiscordThreadAction::getHttp() - ->put('/thread', $this->getModel()->toArray()) - ->throw(); - } } diff --git a/app/Events/Wiki/Anime/Theme/ThemeCreated.php b/app/Events/Wiki/Anime/Theme/ThemeCreated.php index b2dc3456e..550e6e41d 100644 --- a/app/Events/Wiki/Anime/Theme/ThemeCreated.php +++ b/app/Events/Wiki/Anime/Theme/ThemeCreated.php @@ -18,8 +18,6 @@ class ThemeCreated extends WikiCreatedEvent implements UpdateRelatedIndicesEvent public function __construct(AnimeTheme $theme) { parent::__construct($theme); - - $this->updateFirstTheme(); } protected function getDiscordMessageDescription(): string @@ -36,17 +34,4 @@ class ThemeCreated extends WikiCreatedEvent implements UpdateRelatedIndicesEvent $entry->videos->each(fn (Video $video) => $video->searchable()); }); } - - /** - * Update the sequence attribute of the first theme when creating a new sequence theme. - */ - protected function updateFirstTheme(): void - { - if ($this->getModel()->sequence >= 2) { - $this->getModel()->anime->animethemes()->getQuery() - ->where(AnimeTheme::ATTRIBUTE_SEQUENCE) - ->where(AnimeTheme::ATTRIBUTE_TYPE, $this->getModel()->type) - ->update([AnimeTheme::ATTRIBUTE_SEQUENCE => 1]); - } - } } diff --git a/app/Events/Wiki/Group/GroupCreated.php b/app/Events/Wiki/Group/GroupCreated.php index 0e289b6d4..439b8e0ee 100644 --- a/app/Events/Wiki/Group/GroupCreated.php +++ b/app/Events/Wiki/Group/GroupCreated.php @@ -4,33 +4,16 @@ declare(strict_types=1); namespace App\Events\Wiki\Group; -use App\Contracts\Events\UpdateRelatedIndicesEvent; use App\Events\Base\Wiki\WikiCreatedEvent; -use App\Models\Wiki\Anime\AnimeTheme; -use App\Models\Wiki\Anime\Theme\AnimeThemeEntry; use App\Models\Wiki\Group; -use App\Models\Wiki\Video; /** * @extends WikiCreatedEvent */ -class GroupCreated extends WikiCreatedEvent implements UpdateRelatedIndicesEvent +class GroupCreated extends WikiCreatedEvent { protected function getDiscordMessageDescription(): string { return "Group '**{$this->getModel()->getName()}**' has been created."; } - - public function updateRelatedIndices(): void - { - $group = $this->getModel()->load(Group::RELATION_VIDEOS); - - $group->animethemes->each(function (AnimeTheme $theme): void { - $theme->searchable(); - $theme->animethemeentries->each(function (AnimeThemeEntry $entry): void { - $entry->searchable(); - $entry->videos->each(fn (Video $video) => $video->searchable()); - }); - }); - } } diff --git a/app/Events/Wiki/Group/GroupDeleted.php b/app/Events/Wiki/Group/GroupDeleted.php index c7ba7cef4..ee25c55cb 100644 --- a/app/Events/Wiki/Group/GroupDeleted.php +++ b/app/Events/Wiki/Group/GroupDeleted.php @@ -4,18 +4,14 @@ declare(strict_types=1); namespace App\Events\Wiki\Group; -use App\Contracts\Events\UpdateRelatedIndicesEvent; use App\Events\Base\Wiki\WikiDeletedEvent; use App\Filament\Resources\Wiki\Group as GroupFilament; -use App\Models\Wiki\Anime\AnimeTheme; -use App\Models\Wiki\Anime\Theme\AnimeThemeEntry; use App\Models\Wiki\Group; -use App\Models\Wiki\Video; /** * @extends WikiDeletedEvent */ -class GroupDeleted extends WikiDeletedEvent implements UpdateRelatedIndicesEvent +class GroupDeleted extends WikiDeletedEvent { protected function getDiscordMessageDescription(): string { @@ -31,17 +27,4 @@ class GroupDeleted extends WikiDeletedEvent implements UpdateRelatedIndicesEvent { return GroupFilament::getUrl('view', ['record' => $this->getModel()]); } - - public function updateRelatedIndices(): void - { - $group = $this->getModel()->load(Group::RELATION_VIDEOS); - - $group->animethemes->each(function (AnimeTheme $theme): void { - $theme->searchable(); - $theme->animethemeentries->each(function (AnimeThemeEntry $entry): void { - $entry->searchable(); - $entry->videos->each(fn (Video $video) => $video->searchable()); - }); - }); - } } diff --git a/app/Events/Wiki/Group/GroupDeleting.php b/app/Events/Wiki/Group/GroupDeleting.php index c21793375..47f989842 100644 --- a/app/Events/Wiki/Group/GroupDeleting.php +++ b/app/Events/Wiki/Group/GroupDeleting.php @@ -7,9 +7,7 @@ namespace App\Events\Wiki\Group; use App\Contracts\Events\UpdateRelatedIndicesEvent; use App\Events\BaseEvent; use App\Models\Wiki\Anime\AnimeTheme; -use App\Models\Wiki\Anime\Theme\AnimeThemeEntry; use App\Models\Wiki\Group; -use App\Models\Wiki\Video; /** * @extends BaseEvent @@ -26,11 +24,6 @@ class GroupDeleting extends BaseEvent implements UpdateRelatedIndicesEvent $theme->group()->dissociate(); $theme->save(); }); - $theme->searchable(); - $theme->animethemeentries->each(function (AnimeThemeEntry $entry): void { - $entry->searchable(); - $entry->videos->each(fn (Video $video) => $video->searchable()); - }); }); } } diff --git a/app/Events/Wiki/Group/GroupRestored.php b/app/Events/Wiki/Group/GroupRestored.php index 15806f076..5b7bc8993 100644 --- a/app/Events/Wiki/Group/GroupRestored.php +++ b/app/Events/Wiki/Group/GroupRestored.php @@ -4,33 +4,16 @@ declare(strict_types=1); namespace App\Events\Wiki\Group; -use App\Contracts\Events\UpdateRelatedIndicesEvent; use App\Events\Base\Wiki\WikiRestoredEvent; -use App\Models\Wiki\Anime\AnimeTheme; -use App\Models\Wiki\Anime\Theme\AnimeThemeEntry; use App\Models\Wiki\Group; -use App\Models\Wiki\Video; /** * @extends WikiRestoredEvent */ -class GroupRestored extends WikiRestoredEvent implements UpdateRelatedIndicesEvent +class GroupRestored extends WikiRestoredEvent { protected function getDiscordMessageDescription(): string { return "Group '**{$this->getModel()->getName()}**' has been restored."; } - - public function updateRelatedIndices(): void - { - $group = $this->getModel()->load(Group::RELATION_VIDEOS); - - $group->animethemes->each(function (AnimeTheme $theme): void { - $theme->searchable(); - $theme->animethemeentries->each(function (AnimeThemeEntry $entry): void { - $entry->searchable(); - $entry->videos->each(fn (Video $video) => $video->searchable()); - }); - }); - } } diff --git a/app/Events/Wiki/Group/GroupUpdated.php b/app/Events/Wiki/Group/GroupUpdated.php index 87c721f6f..427297bda 100644 --- a/app/Events/Wiki/Group/GroupUpdated.php +++ b/app/Events/Wiki/Group/GroupUpdated.php @@ -4,17 +4,13 @@ declare(strict_types=1); namespace App\Events\Wiki\Group; -use App\Contracts\Events\UpdateRelatedIndicesEvent; use App\Events\Base\Wiki\WikiUpdatedEvent; -use App\Models\Wiki\Anime\AnimeTheme; -use App\Models\Wiki\Anime\Theme\AnimeThemeEntry; use App\Models\Wiki\Group; -use App\Models\Wiki\Video; /** * @extends WikiUpdatedEvent */ -class GroupUpdated extends WikiUpdatedEvent implements UpdateRelatedIndicesEvent +class GroupUpdated extends WikiUpdatedEvent { public function __construct(Group $group) { @@ -26,17 +22,4 @@ class GroupUpdated extends WikiUpdatedEvent implements UpdateRelatedIndicesEvent { return "Group '**{$this->getModel()->getName()}**' has been updated."; } - - public function updateRelatedIndices(): void - { - $group = $this->getModel()->load(Group::RELATION_VIDEOS); - - $group->animethemes->each(function (AnimeTheme $theme): void { - $theme->searchable(); - $theme->animethemeentries->each(function (AnimeThemeEntry $entry): void { - $entry->searchable(); - $entry->videos->each(fn (Video $video) => $video->searchable()); - }); - }); - } } diff --git a/app/Models/Admin/ActionLog.php b/app/Models/Admin/ActionLog.php index 1071b0fae..c21b59adb 100644 --- a/app/Models/Admin/ActionLog.php +++ b/app/Models/Admin/ActionLog.php @@ -10,8 +10,10 @@ use App\Discord\DiscordEmbedField; use App\Enums\Models\Admin\ActionLogStatus; use App\Models\Auth\User; use App\Models\BaseModel; +use App\Observers\Admin\ActionLogObserver; use Filament\Actions\Action; use Filament\Facades\Filament; +use Illuminate\Database\Eloquent\Attributes\ObservedBy; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\MorphTo; @@ -41,6 +43,7 @@ use Throwable; * @property int $user_id * @property User $user */ +#[ObservedBy(ActionLogObserver::class)] class ActionLog extends Model implements Nameable { final public const string TABLE = 'action_logs'; @@ -104,26 +107,6 @@ class ActionLog extends Model implements Nameable */ protected $primaryKey = ActionLog::ATTRIBUTE_ID; - /** - * Boostrap the model. - */ - protected static function boot(): void - { - parent::boot(); - - static::creating(function (ActionLog $actionLog): void { - if ($actionLog->status === ActionLogStatus::RUNNING) { - Session::put('currentActionLog', $actionLog->batch_id); - } - }); - - static::updating(function (ActionLog $actionLog): void { - if ($actionLog->status === ActionLogStatus::FINISHED || $actionLog->status === ActionLogStatus::FAILED) { - Session::forget('currentActionLog'); - } - }); - } - /** * When an exception is thrown, the current action logs should be handled. */ diff --git a/app/Models/Discord/DiscordThread.php b/app/Models/Discord/DiscordThread.php index fcee587b3..73ced9f61 100644 --- a/app/Models/Discord/DiscordThread.php +++ b/app/Models/Discord/DiscordThread.php @@ -8,7 +8,9 @@ use App\Events\Discord\DiscordThread\DiscordThreadDeleted; use App\Events\Discord\DiscordThread\DiscordThreadUpdated; use App\Models\BaseModel; use App\Models\Wiki\Anime; +use App\Observers\Discord\DiscordThreadObserver; use Database\Factories\Discord\DiscordThreadFactory; +use Illuminate\Database\Eloquent\Attributes\ObservedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -20,6 +22,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * * @method static DiscordThreadFactory factory(...$parameters) */ +#[ObservedBy(DiscordThreadObserver::class)] class DiscordThread extends BaseModel { use HasFactory; diff --git a/app/Models/User/Submission/SubmissionVirtual.php b/app/Models/User/Submission/SubmissionVirtual.php index d9e934442..8c758c63f 100644 --- a/app/Models/User/Submission/SubmissionVirtual.php +++ b/app/Models/User/Submission/SubmissionVirtual.php @@ -6,6 +6,8 @@ namespace App\Models\User\Submission; use App\Models\Auth\User; use App\Models\BaseModel; +use App\Observers\User\Submission\SubmissionVirtualObserver; +use Illuminate\Database\Eloquent\Attributes\ObservedBy; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\Relation; @@ -18,6 +20,7 @@ use Illuminate\Database\Eloquent\Relations\Relation; * @property int $user_id * @property User $user */ +#[ObservedBy(SubmissionVirtualObserver::class)] class SubmissionVirtual extends BaseModel { final public const string TABLE = 'submission_virtuals'; @@ -68,17 +71,6 @@ class SubmissionVirtual extends BaseModel 'model', ]; - protected static function boot() - { - parent::boot(); - - static::creating(function (SubmissionVirtual $virtual): void { - if (class_exists($model = $virtual->model_type)) { - $virtual->model_type = Relation::getMorphAlias($model); - } - }); - } - public function getName(): string { return strval($this->getKey()); diff --git a/app/Models/Wiki/Anime/AnimeTheme.php b/app/Models/Wiki/Anime/AnimeTheme.php index 2f8663e17..ae2c5f6ac 100644 --- a/app/Models/Wiki/Anime/AnimeTheme.php +++ b/app/Models/Wiki/Anime/AnimeTheme.php @@ -21,9 +21,11 @@ use App\Models\Wiki\Anime; use App\Models\Wiki\Anime\Theme\AnimeThemeEntry; use App\Models\Wiki\Group; use App\Models\Wiki\Song; +use App\Observers\Wiki\Anime\AnimeThemeObserver; use App\Scopes\WithoutInsertSongScope; use Database\Factories\Wiki\Anime\AnimeThemeFactory; use Elastic\ScoutDriverPlus\Searchable; +use Illuminate\Database\Eloquent\Attributes\ObservedBy; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -47,6 +49,7 @@ use Illuminate\Support\Stringable; * * @method static AnimeThemeFactory factory(...$parameters) */ +#[ObservedBy(AnimeThemeObserver::class)] class AnimeTheme extends BaseModel implements InteractsWithSchema, SoftDeletable { use HasFactory; diff --git a/app/Observers/Admin/ActionLogObserver.php b/app/Observers/Admin/ActionLogObserver.php new file mode 100644 index 000000000..5e21cd815 --- /dev/null +++ b/app/Observers/Admin/ActionLogObserver.php @@ -0,0 +1,32 @@ +status === ActionLogStatus::RUNNING) { + Session::put('currentActionLog', $actionLog->batch_id); + } + } + + /** + * Handle the ActionLog "updating" event. + */ + public function updating(ActionLog $actionLog): void + { + if ($actionLog->status === ActionLogStatus::RUNNING) { + Session::put('currentActionLog', $actionLog->batch_id); + } + } +} diff --git a/app/Observers/Discord/DiscordThreadObserver.php b/app/Observers/Discord/DiscordThreadObserver.php new file mode 100644 index 000000000..d1de6716e --- /dev/null +++ b/app/Observers/Discord/DiscordThreadObserver.php @@ -0,0 +1,31 @@ +put('/thread', $thread->toArray()) + ->throw(); + } + + /** + * Handle the DiscordThread "deleted" event. + */ + public function deleted(DiscordThread $thread): void + { + DiscordThreadAction::getHttp() + ->delete('/thread', ['id' => $thread->getKey()]) + ->throw(); + } +} diff --git a/app/Observers/User/Submission/SubmissionVirtualObserver.php b/app/Observers/User/Submission/SubmissionVirtualObserver.php new file mode 100644 index 000000000..af389acda --- /dev/null +++ b/app/Observers/User/Submission/SubmissionVirtualObserver.php @@ -0,0 +1,21 @@ +model_type)) { + $virtual->model_type = Relation::getMorphAlias($model); + } + } +} diff --git a/app/Observers/Wiki/Anime/AnimeThemeObserver.php b/app/Observers/Wiki/Anime/AnimeThemeObserver.php new file mode 100644 index 000000000..eaf7ce810 --- /dev/null +++ b/app/Observers/Wiki/Anime/AnimeThemeObserver.php @@ -0,0 +1,24 @@ +sequence >= 2) { + $theme->anime->animethemes()->getQuery() + ->where(AnimeTheme::ATTRIBUTE_SEQUENCE) + ->where(AnimeTheme::ATTRIBUTE_TYPE, $theme->type) + ->update([AnimeTheme::ATTRIBUTE_SEQUENCE => 1]); + } + } +}