clean: remove old anime synonyms & media format (#1206)

This commit is contained in:
Kyrch
2026-05-12 04:13:07 -03:00
committed by GitHub
parent 7182fa39bd
commit af2bc6c2dc
91 changed files with 154 additions and 1048 deletions
@@ -8,9 +8,9 @@ use App\Actions\Models\Wiki\ExternalApiAction;
use App\Contracts\Actions\Models\Wiki\BackfillImages;
use App\Contracts\Actions\Models\Wiki\BackfillResources;
use App\Contracts\Actions\Models\Wiki\BackfillSynonyms;
use App\Enums\Models\Wiki\AnimeSynonymType;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
use App\Enums\Models\Wiki\SynonymType;
use App\Models\Wiki\Anime;
use App\Models\Wiki\ExternalResource;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
@@ -145,9 +145,9 @@ class AnilistAnimeExternalApiAction extends ExternalApiAction implements Backfil
public function getSynonymsMapping(): array
{
return [
AnimeSynonymType::ENGLISH->value => 'data.Media.title.english',
AnimeSynonymType::NATIVE->value => 'data.Media.title.native',
AnimeSynonymType::OTHER->value => 'data.Media.title.romaji',
SynonymType::ENGLISH->value => 'data.Media.title.english',
SynonymType::NATIVE->value => 'data.Media.title.native',
SynonymType::OTHER->value => 'data.Media.title.romaji',
];
}
}
@@ -197,10 +197,10 @@ class BackfillAudioAction extends BackfillAction
$orderByNameQuery = $sortRelation->getRelationExistenceQuery($sortRelation->getQuery(), $builder, [Anime::ATTRIBUTE_NAME]);
$orderBySeasonQuery = $sortRelation->getRelationExistenceQuery($sortRelation->getQuery(), $builder, [Anime::ATTRIBUTE_SEASON]);
$orderByYearQuery = $sortRelation->getRelationExistenceQuery($sortRelation->getQuery(), $builder, [Anime::ATTRIBUTE_YEAR]);
$orderByMediaFormatQuery = $sortRelation->getRelationExistenceQuery($sortRelation->getQuery(), $builder, [Anime::ATTRIBUTE_FORMAT]);
$orderByformatQuery = $sortRelation->getRelationExistenceQuery($sortRelation->getQuery(), $builder, [Anime::ATTRIBUTE_FORMAT]);
return $builder->whereHas(AnimeTheme::RELATION_VIDEOS, fn (Builder $relationBuilder) => $relationBuilder->whereKey($this->getModel()))
->orderBy($orderByMediaFormatQuery->toBase())
->orderBy($orderByformatQuery->toBase())
->orderBy($orderByYearQuery->toBase())
->orderBy($orderBySeasonQuery->toBase())
->orderBy($orderByNameQuery->toBase())
@@ -6,7 +6,6 @@ namespace App\Actions\Storage\Admin\Dump;
use App\Concerns\Repositories\Admin\ReconcilesDumpRepositories;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -46,19 +45,16 @@ class DumpContentAction extends DumpAction
Anime::TABLE,
AnimeSeries::TABLE,
AnimeStudio::TABLE,
AnimeSynonym::TABLE,
AnimeTheme::TABLE,
AnimeThemeEntry::TABLE,
AnimeThemeEntryVideo::TABLE,
Artist::TABLE,
ArtistMember::TABLE,
'artist_song',
Audio::TABLE,
ExternalResource::TABLE,
Group::TABLE,
Image::TABLE,
Imageable::TABLE,
'memberships',
Performance::TABLE,
Resourceable::TABLE,
Series::TABLE,
@@ -7,7 +7,6 @@ namespace App\Console\Commands\Models;
use App\Console\Commands\BaseCommand;
use App\Models\List\Playlist;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -48,7 +47,6 @@ class ImportModelsCommand extends BaseCommand
if ($this->option('flush')) {
$this->scoutFlush(Playlist::class);
$this->scoutFlush(Anime::class);
$this->scoutFlush(AnimeSynonym::class);
$this->scoutFlush(AnimeTheme::class);
$this->scoutFlush(AnimeThemeEntry::class);
$this->scoutFlush(Artist::class);
@@ -61,7 +59,6 @@ class ImportModelsCommand extends BaseCommand
$this->scoutImport(Playlist::class);
$this->scoutImport(Anime::class);
$this->scoutImport(AnimeSynonym::class);
$this->scoutImport(AnimeTheme::class);
$this->scoutImport(AnimeThemeEntry::class);
$this->scoutImport(Artist::class);
@@ -1,12 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Contracts\Events;
use Illuminate\Contracts\Events\ShouldHandleEventsAfterCommit;
interface UpdateAnimeSynonymsEvent extends ShouldHandleEventsAfterCommit
{
public function updateAnimeSynonyms(): void;
}
@@ -6,7 +6,6 @@ namespace App\Enums\GraphQL\Filter\Wiki;
use App\Contracts\GraphQL\EnumFilterableColumns;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\GraphQL\Filter\EnumFilter;
use App\GraphQL\Filter\Filter;
@@ -14,14 +13,11 @@ use App\GraphQL\Filter\IntFilter;
use App\GraphQL\Filter\StringFilter;
use App\GraphQL\Filter\TimestampFilter;
use App\Models\Wiki\Anime;
use GraphQL\Type\Definition\Deprecated;
enum AnimeFilterableColumns implements EnumFilterableColumns
{
case ID;
case NAME;
#[Deprecated('Use FORMAT instead')]
case MEDIA_FORMAT;
case FORMAT;
case SEASON;
case SYNOPSIS;
@@ -34,7 +30,6 @@ enum AnimeFilterableColumns implements EnumFilterableColumns
return match ($this) {
self::ID => new IntFilter($this->name, Anime::ATTRIBUTE_ID),
self::NAME => new StringFilter($this->name, Anime::ATTRIBUTE_NAME),
self::MEDIA_FORMAT => new EnumFilter($this->name, AnimeMediaFormat::class, Anime::ATTRIBUTE_MEDIA_FORMAT),
self::FORMAT => new EnumFilter($this->name, AnimeFormat::class, Anime::ATTRIBUTE_FORMAT),
self::SEASON => new EnumFilter($this->name, AnimeSeason::class, Anime::ATTRIBUTE_SEASON),
self::YEAR => new IntFilter($this->name, Anime::ATTRIBUTE_YEAR),
@@ -1,22 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Enums\Models\Wiki;
use App\Concerns\Enums\LocalizesName;
use Filament\Support\Contracts\HasLabel;
use GraphQL\Type\Definition\Deprecated;
#[Deprecated('Use \'AnimeFormat\' instead')]
enum AnimeMediaFormat: int implements HasLabel
{
use LocalizesName;
case TV = 0;
case TV_SHORT = 1;
case OVA = 2;
case MOVIE = 3;
case SPECIAL = 4;
case ONA = 5;
}
@@ -1,23 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Enums\Models\Wiki;
use App\Concerns\Enums\LocalizesName;
use Filament\Support\Contracts\HasLabel;
use GraphQL\Type\Definition\Deprecated as GraphQLDeprecated;
/**
* @deprecated Use SynonymType instead.
*/
#[GraphQLDeprecated('Use SynonymType instead.')]
enum AnimeSynonymType: int implements HasLabel
{
use LocalizesName;
case OTHER = 0;
case NATIVE = 1;
case ENGLISH = 2;
case SHORT = 3;
}
+1 -14
View File
@@ -4,11 +4,9 @@ declare(strict_types=1);
namespace App\Events\Wiki\Synonym;
use App\Contracts\Events\UpdateAnimeSynonymsEvent;
use App\Contracts\Events\UpdateRelatedIndicesEvent;
use App\Events\Base\Wiki\WikiCreatedEvent;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Series;
@@ -19,7 +17,7 @@ use Illuminate\Database\Eloquent\Relations\MorphTo;
/**
* @extends WikiCreatedEvent<Synonym>
*/
class SynonymCreated extends WikiCreatedEvent implements UpdateAnimeSynonymsEvent, UpdateRelatedIndicesEvent
class SynonymCreated extends WikiCreatedEvent implements UpdateRelatedIndicesEvent
{
protected function getDiscordMessageDescription(): string
{
@@ -49,15 +47,4 @@ class SynonymCreated extends WikiCreatedEvent implements UpdateAnimeSynonymsEven
});
}
}
public function updateAnimeSynonyms(): void
{
if ($this->getModel()->synonymable instanceof Anime) {
AnimeSynonym::query()->create([
AnimeSynonym::ATTRIBUTE_ANIME => $this->getModel()->synonymable_id,
AnimeSynonym::ATTRIBUTE_TEXT => $this->getModel()->text,
AnimeSynonym::ATTRIBUTE_TYPE => $this->getModel()->type->value,
]);
}
}
}
+1 -13
View File
@@ -4,12 +4,10 @@ declare(strict_types=1);
namespace App\Events\Wiki\Synonym;
use App\Contracts\Events\UpdateAnimeSynonymsEvent;
use App\Contracts\Events\UpdateRelatedIndicesEvent;
use App\Events\Base\Wiki\WikiDeletedEvent;
use App\Filament\Resources\Wiki\SynonymResource as SynonymFilament;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Series;
@@ -20,7 +18,7 @@ use Illuminate\Database\Eloquent\Relations\MorphTo;
/**
* @extends WikiDeletedEvent<Synonym>
*/
class SynonymDeleted extends WikiDeletedEvent implements UpdateAnimeSynonymsEvent, UpdateRelatedIndicesEvent
class SynonymDeleted extends WikiDeletedEvent implements UpdateRelatedIndicesEvent
{
protected function getDiscordMessageDescription(): string
{
@@ -60,14 +58,4 @@ class SynonymDeleted extends WikiDeletedEvent implements UpdateAnimeSynonymsEven
});
}
}
public function updateAnimeSynonyms(): void
{
if ($this->getModel()->synonymable instanceof Anime) {
AnimeSynonym::query()
->where(AnimeSynonym::ATTRIBUTE_ANIME, $this->getModel()->synonymable_id)
->where(AnimeSynonym::ATTRIBUTE_TEXT, $this->getModel()->text)
->{$this->getModel()->isForceDeleting() ? 'forceDelete' : 'delete'}();
}
}
}
+1 -15
View File
@@ -4,11 +4,9 @@ declare(strict_types=1);
namespace App\Events\Wiki\Synonym;
use App\Contracts\Events\UpdateAnimeSynonymsEvent;
use App\Contracts\Events\UpdateRelatedIndicesEvent;
use App\Events\Base\Wiki\WikiRestoredEvent;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Series;
@@ -19,7 +17,7 @@ use Illuminate\Database\Eloquent\Relations\MorphTo;
/**
* @extends WikiRestoredEvent<Synonym>
*/
class SynonymRestored extends WikiRestoredEvent implements UpdateAnimeSynonymsEvent, UpdateRelatedIndicesEvent
class SynonymRestored extends WikiRestoredEvent implements UpdateRelatedIndicesEvent
{
protected function getDiscordMessageDescription(): string
{
@@ -49,16 +47,4 @@ class SynonymRestored extends WikiRestoredEvent implements UpdateAnimeSynonymsEv
});
}
}
public function updateAnimeSynonyms(): void
{
if ($this->getModel()->synonymable instanceof Anime) {
AnimeSynonym::query()
->withTrashed()
->where(AnimeSynonym::ATTRIBUTE_ANIME, $this->getModel()->synonymable_id)
->where(AnimeSynonym::ATTRIBUTE_TEXT, $this->getModel()->text)
->first()
?->restore();
}
}
}
+1 -16
View File
@@ -4,11 +4,9 @@ declare(strict_types=1);
namespace App\Events\Wiki\Synonym;
use App\Contracts\Events\UpdateAnimeSynonymsEvent;
use App\Contracts\Events\UpdateRelatedIndicesEvent;
use App\Events\Base\Wiki\WikiUpdatedEvent;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Series;
@@ -19,7 +17,7 @@ use Illuminate\Database\Eloquent\Relations\MorphTo;
/**
* @extends WikiUpdatedEvent<Synonym>
*/
class SynonymUpdated extends WikiUpdatedEvent implements UpdateAnimeSynonymsEvent, UpdateRelatedIndicesEvent
class SynonymUpdated extends WikiUpdatedEvent implements UpdateRelatedIndicesEvent
{
public function __construct(Synonym $synonym)
{
@@ -55,17 +53,4 @@ class SynonymUpdated extends WikiUpdatedEvent implements UpdateAnimeSynonymsEven
});
}
}
public function updateAnimeSynonyms(): void
{
if ($this->getModel()->synonymable instanceof Anime) {
AnimeSynonym::query()
->where(AnimeSynonym::ATTRIBUTE_ANIME, $this->getModel()->getOriginal(Synonym::ATTRIBUTE_SYNONYMABLE_ID))
->where(AnimeSynonym::ATTRIBUTE_TEXT, $this->getModel()->getOriginal(Synonym::ATTRIBUTE_TEXT))
->update([
AnimeSynonym::ATTRIBUTE_TEXT => $this->getModel()->text,
AnimeSynonym::ATTRIBUTE_TYPE => $this->getModel()->type->value,
]);
}
}
}
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Filament\Submission\Resources\Schema;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Filament\Components\Fields\Select;
use App\Filament\Components\Fields\TextInput;
@@ -59,7 +59,7 @@ class AnimeForm
Select::make(SubmissionAnime::ATTRIBUTE_FORMAT)
->label(__('filament.fields.anime.format.name'))
->helperText(__('filament.fields.anime.format.help'))
->options(AnimeMediaFormat::class)
->options(AnimeFormat::class)
->required(),
MarkdownEditor::make(SubmissionAnime::ATTRIBUTE_SYNOPSIS)
@@ -17,7 +17,7 @@ class AnimeMediaFormatField extends EnumField implements CreatableField, Updatab
{
public function __construct(Schema $schema)
{
parent::__construct($schema, Anime::ATTRIBUTE_MEDIA_FORMAT, AnimeFormat::class, Anime::ATTRIBUTE_FORMAT);
parent::__construct($schema, 'media_format', AnimeFormat::class, Anime::ATTRIBUTE_FORMAT);
}
public function getCreationRules(Request $request): array
@@ -1,38 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Http\Api\Field\Wiki\Anime\Synonym;
use App\Contracts\Http\Api\Field\CreatableField;
use App\Contracts\Http\Api\Field\SelectableField;
use App\Http\Api\Field\Field;
use App\Http\Api\Query\Query;
use App\Http\Api\Schema\Schema;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class AnimeSynonymAnimeIdField extends Field implements CreatableField, SelectableField
{
public function __construct(Schema $schema)
{
parent::__construct($schema, AnimeSynonym::ATTRIBUTE_ANIME);
}
public function getCreationRules(Request $request): array
{
return [
'required',
'integer',
Rule::exists(Anime::class, Anime::ATTRIBUTE_ID),
];
}
public function shouldSelect(Query $query, Schema $schema): bool
{
// Needed to match anime relation.
return true;
}
}
@@ -1,39 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Http\Api\Field\Wiki\Anime\Synonym;
use App\Contracts\Http\Api\Field\CreatableField;
use App\Contracts\Http\Api\Field\UpdatableField;
use App\Http\Api\Field\StringField;
use App\Http\Api\Schema\Schema;
use App\Models\Wiki\Anime\AnimeSynonym;
use Illuminate\Http\Request;
class AnimeSynonymTextField extends StringField implements CreatableField, UpdatableField
{
public function __construct(Schema $schema)
{
parent::__construct($schema, AnimeSynonym::ATTRIBUTE_TEXT);
}
public function getCreationRules(Request $request): array
{
return [
'required',
'string',
'max:192',
];
}
public function getUpdateRules(Request $request): array
{
return [
'sometimes',
'required',
'string',
'max:192',
];
}
}
@@ -1,39 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Http\Api\Field\Wiki\Anime\Synonym;
use App\Contracts\Http\Api\Field\CreatableField;
use App\Contracts\Http\Api\Field\UpdatableField;
use App\Enums\Models\Wiki\AnimeSynonymType;
use App\Http\Api\Field\EnumField;
use App\Http\Api\Schema\Schema;
use App\Models\Wiki\Anime\AnimeSynonym;
use Illuminate\Http\Request;
use Illuminate\Validation\Rules\Enum;
class AnimeSynonymTypeField extends EnumField implements CreatableField, UpdatableField
{
public function __construct(Schema $schema)
{
parent::__construct($schema, AnimeSynonym::ATTRIBUTE_TYPE, AnimeSynonymType::class);
}
public function getCreationRules(Request $request): array
{
return [
'required',
new Enum(AnimeSynonymType::class),
];
}
public function getUpdateRules(Request $request): array
{
return [
'sometimes',
'required',
new Enum(AnimeSynonymType::class),
];
}
}
@@ -1,51 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Http\Api\Schema\Wiki\Anime;
use App\Contracts\Http\Api\Schema\SearchableSchema;
use App\Http\Api\Field\Base\IdField;
use App\Http\Api\Field\Field;
use App\Http\Api\Field\Wiki\Anime\Synonym\AnimeSynonymAnimeIdField;
use App\Http\Api\Field\Wiki\Anime\Synonym\AnimeSynonymTextField;
use App\Http\Api\Field\Wiki\Anime\Synonym\AnimeSynonymTypeField;
use App\Http\Api\Include\AllowedInclude;
use App\Http\Api\Schema\EloquentSchema;
use App\Http\Api\Schema\Wiki\AnimeSchema;
use App\Http\Resources\Wiki\Anime\Resource\AnimeSynonymJsonResource;
use App\Models\Wiki\Anime\AnimeSynonym;
class AnimeSynonymSchema extends EloquentSchema implements SearchableSchema
{
public function type(): string
{
return AnimeSynonymJsonResource::$wrap;
}
/**
* @return AllowedInclude[]
*/
public function allowedIncludes(): array
{
return $this->withIntermediatePaths([
new AllowedInclude(new AnimeSchema(), AnimeSynonym::RELATION_ANIME),
]);
}
/**
* @return Field[]
*/
public function fields(): array
{
return array_merge(
parent::fields(),
[
new IdField($this, AnimeSynonym::ATTRIBUTE_ID),
new AnimeSynonymTextField($this),
new AnimeSynonymTypeField($this),
new AnimeSynonymAnimeIdField($this),
],
);
}
}
+1 -2
View File
@@ -18,7 +18,6 @@ use App\Http\Api\Include\AllowedInclude;
use App\Http\Api\Schema\Auth\UserSchema;
use App\Http\Api\Schema\EloquentSchema;
use App\Http\Api\Schema\Pivot\Morph\ResourceableSchema;
use App\Http\Api\Schema\Wiki\Anime\AnimeSynonymSchema;
use App\Http\Api\Schema\Wiki\Anime\Theme\EntrySchema;
use App\Http\Api\Schema\Wiki\Anime\ThemeSchema;
use App\Http\Api\Schema\Wiki\Video\ScriptSchema;
@@ -60,7 +59,7 @@ class AnimeSchema extends EloquentSchema implements InteractsWithPivots, Searcha
new AllowedInclude(new SeriesSchema(), Anime::RELATION_SERIES),
new AllowedInclude(new SongSchema(), Anime::RELATION_SONG),
new AllowedInclude(new StudioSchema(), Anime::RELATION_STUDIOS),
new AllowedInclude(new AnimeSynonymSchema(), Anime::RELATION_ANIMESYNONYMS),
new AllowedInclude(new SynonymSchema(), Anime::RELATION_ANIMESYNONYMS),
new AllowedInclude(new SynonymSchema(), Anime::RELATION_SYNONYMS),
new AllowedInclude(new ThemeSchema(), Anime::RELATION_THEMES),
new AllowedInclude(new VideoSchema(), Anime::RELATION_VIDEOS),
+1 -2
View File
@@ -11,7 +11,6 @@ use App\Http\Api\Field\Wiki\Series\SeriesNameField;
use App\Http\Api\Field\Wiki\Series\SeriesSlugField;
use App\Http\Api\Include\AllowedInclude;
use App\Http\Api\Schema\EloquentSchema;
use App\Http\Api\Schema\Wiki\Anime\AnimeSynonymSchema;
use App\Http\Resources\Wiki\Resource\SeriesJsonResource;
use App\Models\Wiki\Series;
@@ -35,7 +34,7 @@ class SeriesSchema extends EloquentSchema implements SearchableSchema
new AllowedInclude(new VideoSchema(), 'anime.animethemes.animethemeentries.videos'),
new AllowedInclude(new GroupSchema(), 'anime.animethemes.group'),
new AllowedInclude(new SongSchema(), 'anime.animethemes.song'),
new AllowedInclude(new AnimeSynonymSchema(), 'anime.animesynonyms'),
new AllowedInclude(new SynonymSchema(), 'anime.animesynonyms'),
]);
}
@@ -1,91 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api\Wiki\Anime;
use App\Actions\Http\Api\DestroyAction;
use App\Actions\Http\Api\ForceDeleteAction;
use App\Actions\Http\Api\IndexAction;
use App\Actions\Http\Api\RestoreAction;
use App\Actions\Http\Api\ShowAction;
use App\Actions\Http\Api\StoreAction;
use App\Actions\Http\Api\UpdateAction;
use App\Http\Api\Query\Query;
use App\Http\Controllers\Api\BaseController;
use App\Http\Requests\Api\IndexRequest;
use App\Http\Requests\Api\ShowRequest;
use App\Http\Requests\Api\StoreRequest;
use App\Http\Requests\Api\UpdateRequest;
use App\Http\Resources\Wiki\Anime\Collection\AnimeSynonymCollection;
use App\Http\Resources\Wiki\Anime\Resource\AnimeSynonymJsonResource;
use App\Models\Wiki\Anime\AnimeSynonym;
use Illuminate\Http\JsonResponse;
class AnimeSynonymController extends BaseController
{
public function __construct()
{
parent::__construct(AnimeSynonym::class, 'animesynonym');
}
public function index(IndexRequest $request, IndexAction $action): AnimeSynonymCollection
{
$query = new Query($request->validated());
$synonyms = $query->hasSearchCriteria()
? $action->search($query, $request->schema())
: $action->index(AnimeSynonym::query(), $query, $request->schema());
return new AnimeSynonymCollection($synonyms, $query);
}
/**
* @param StoreAction<AnimeSynonym> $action
*/
public function store(StoreRequest $request, StoreAction $action): AnimeSynonymJsonResource
{
$synonym = $action->store(AnimeSynonym::query(), $request->validated());
return new AnimeSynonymJsonResource($synonym, new Query());
}
public function show(ShowRequest $request, AnimeSynonym $animesynonym, ShowAction $action): AnimeSynonymJsonResource
{
$query = new Query($request->validated());
$show = $action->show($animesynonym, $query, $request->schema());
return new AnimeSynonymJsonResource($show, $query);
}
public function update(UpdateRequest $request, AnimeSynonym $animesynonym, UpdateAction $action): AnimeSynonymJsonResource
{
$updated = $action->update($animesynonym, $request->validated());
return new AnimeSynonymJsonResource($updated, new Query());
}
public function destroy(AnimeSynonym $animesynonym, DestroyAction $action): AnimeSynonymJsonResource
{
$deleted = $action->destroy($animesynonym);
return new AnimeSynonymJsonResource($deleted, new Query());
}
public function restore(AnimeSynonym $animesynonym, RestoreAction $action): AnimeSynonymJsonResource
{
$restored = $action->restore($animesynonym);
return new AnimeSynonymJsonResource($restored, new Query());
}
public function forceDelete(AnimeSynonym $animesynonym, ForceDeleteAction $action): JsonResponse
{
$message = $action->forceDelete($animesynonym);
return new JsonResponse([
'message' => $message,
]);
}
}
@@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Http\Resources\Wiki\Anime\Collection;
use App\Http\Resources\BaseCollection;
use App\Http\Resources\Wiki\Anime\Resource\AnimeSynonymJsonResource;
use App\Models\Wiki\Anime\AnimeSynonym;
use Illuminate\Http\Request;
class AnimeSynonymCollection extends BaseCollection
{
/**
* The "data" wrapper that should be applied.
*
* @var string|null
*/
public static $wrap = 'animesynonyms';
/**
* Transform the resource into a JSON array.
*
*
* @noinspection PhpMissingParentCallCommonInspection
*/
public function toArray(Request $request): array
{
return $this->collection->map(
fn (AnimeSynonym $synonym): AnimeSynonymJsonResource => new AnimeSynonymJsonResource($synonym, $this->query)
)->all();
}
}
@@ -1,27 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Http\Resources\Wiki\Anime\Resource;
use App\Http\Api\Schema\Schema;
use App\Http\Api\Schema\Wiki\Anime\AnimeSynonymSchema;
use App\Http\Resources\BaseJsonResource;
class AnimeSynonymJsonResource extends BaseJsonResource
{
/**
* The "data" wrapper that should be applied.
*
* @var string|null
*/
public static $wrap = 'animesynonym';
/**
* Get the resource schema.
*/
protected function schema(): Schema
{
return new AnimeSynonymSchema();
}
}
@@ -1,16 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Listeners\Wiki;
use App\Contracts\Events\UpdateAnimeSynonymsEvent;
use Illuminate\Contracts\Events\ShouldHandleEventsAfterCommit;
class UpdateAnimeSynonyms implements ShouldHandleEventsAfterCommit
{
public function handle(UpdateAnimeSynonymsEvent $event): void
{
$event->updateAnimeSynonyms();
}
}
+1 -16
View File
@@ -5,10 +5,8 @@ declare(strict_types=1);
namespace App\Models\User\Submission;
use App\Concerns\Models\SubmissionModel;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Models\Wiki\Anime;
use Illuminate\Database\Eloquent\Attributes\Table;
use Illuminate\Support\Arr;
#[Table('submission_anime', 'id')]
class SubmissionAnime extends Anime
@@ -21,24 +19,11 @@ class SubmissionAnime extends Anime
* @var list<string>
*/
protected $fillable = [
Anime::ATTRIBUTE_FORMAT,
Anime::ATTRIBUTE_NAME,
Anime::ATTRIBUTE_SEASON,
Anime::ATTRIBUTE_SLUG,
Anime::ATTRIBUTE_SYNOPSIS,
Anime::ATTRIBUTE_YEAR,
'format',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return Arr::flatten([
parent::casts(),
'format' => AnimeMediaFormat::class,
]);
}
}
+4 -12
View File
@@ -11,7 +11,6 @@ use App\Contracts\Models\HasResources;
use App\Contracts\Models\HasSynonyms;
use App\Contracts\Models\SoftDeletable;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Events\Wiki\Anime\AnimeCreated;
use App\Events\Wiki\Anime\AnimeDeleted;
@@ -22,9 +21,7 @@ use App\Http\Resources\Pivot\Wiki\Resource\AnimeSeriesJsonResource;
use App\Http\Resources\Pivot\Wiki\Resource\AnimeStudioJsonResource;
use App\Models\BaseModel;
use App\Models\List\External\ExternalEntry;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Observers\Wiki\AnimeObserver;
use App\Pivots\Morph\Imageable;
use App\Pivots\Morph\Resourceable;
use App\Pivots\Wiki\AnimeSeries;
@@ -34,7 +31,6 @@ use App\Scout\Typesense\Models\Wiki\AnimeTypesenseModel;
use Database\Factories\Wiki\AnimeFactory;
use Deprecated;
use Elastic\ScoutDriverPlus\Searchable;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Attributes\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
@@ -54,7 +50,6 @@ use RuntimeException;
* @property Collection<int, ExternalEntry> $externalentries
* @property AnimeFormat|null $format
* @property Collection<int, Image> $images
* @property AnimeMediaFormat|null $media_format
* @property string $name
* @property Collection<int, ExternalResource> $resources
* @property AnimeSeason|null $season
@@ -67,7 +62,6 @@ use RuntimeException;
*
* @method static AnimeFactory factory(...$parameters)
*/
#[ObservedBy(AnimeObserver::class)]
#[Table(Anime::TABLE, Anime::ATTRIBUTE_ID)]
class Anime extends BaseModel implements Auditable, HasImages, HasResources, HasSynonyms, SoftDeletable
{
@@ -80,7 +74,6 @@ class Anime extends BaseModel implements Auditable, HasImages, HasResources, Has
final public const string TABLE = 'anime';
final public const string ATTRIBUTE_ID = 'anime_id';
final public const string ATTRIBUTE_MEDIA_FORMAT = 'media_format';
final public const string ATTRIBUTE_FORMAT = 'format';
final public const string ATTRIBUTE_NAME = 'name';
final public const string ATTRIBUTE_SEASON = 'season';
@@ -134,7 +127,7 @@ class Anime extends BaseModel implements Auditable, HasImages, HasResources, Has
Anime::ATTRIBUTE_SLUG,
Anime::ATTRIBUTE_SYNOPSIS,
Anime::ATTRIBUTE_YEAR,
Anime::ATTRIBUTE_MEDIA_FORMAT,
'media_format',
];
/**
@@ -147,7 +140,6 @@ class Anime extends BaseModel implements Auditable, HasImages, HasResources, Has
return [
Anime::ATTRIBUTE_FORMAT => AnimeFormat::class,
Anime::ATTRIBUTE_NAME => 'string',
Anime::ATTRIBUTE_MEDIA_FORMAT => AnimeMediaFormat::class,
Anime::ATTRIBUTE_SEASON => AnimeSeason::class,
Anime::ATTRIBUTE_SLUG => 'string',
Anime::ATTRIBUTE_SYNOPSIS => 'string',
@@ -197,12 +189,12 @@ class Anime extends BaseModel implements Auditable, HasImages, HasResources, Has
}
/**
* @return HasMany<AnimeSynonym, $this>
* @return MorphMany<Synonym, $this>
*/
#[Deprecated('Use synonyms() instead.')]
public function animesynonyms(): HasMany
public function animesynonyms(): MorphMany
{
return $this->hasMany(AnimeSynonym::class, AnimeSynonym::ATTRIBUTE_ANIME);
return $this->synonyms();
}
/**
-106
View File
@@ -1,106 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Models\Wiki\Anime;
use App\Concerns\Models\SoftDeletes;
use App\Contracts\Models\SoftDeletable;
use App\Enums\Models\Wiki\AnimeSynonymType;
use App\Models\BaseModel;
use App\Models\Wiki\Anime;
use App\Scout\Elasticsearch\Models\Wiki\Anime\AnimeSynonymElasticModel;
use App\Scout\Typesense\Models\Wiki\Anime\AnimeSynonymTypesenseModel;
use Elastic\ScoutDriverPlus\Searchable;
use Illuminate\Database\Eloquent\Attributes\Table;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\Config;
use OwenIt\Auditing\Auditable as HasAudits;
use OwenIt\Auditing\Contracts\Auditable;
use RuntimeException;
/**
* @property Anime $anime
* @property int $anime_id
* @property int $synonym_id
* @property string|null $text
* @property AnimeSynonymType $type
*
* @deprecated Use Synonym instead.
*/
#[Table(AnimeSynonym::TABLE, AnimeSynonym::ATTRIBUTE_ID)]
class AnimeSynonym extends BaseModel implements Auditable, SoftDeletable
{
use HasAudits;
use HasFactory;
use Searchable;
use SoftDeletes;
final public const string TABLE = 'anime_synonyms';
final public const string ATTRIBUTE_ANIME = 'anime_id';
final public const string ATTRIBUTE_ID = 'synonym_id';
final public const string ATTRIBUTE_TEXT = 'text';
final public const string ATTRIBUTE_TYPE = 'type';
final public const string RELATION_ANIME = 'anime';
final public const string RELATION_SERIES = 'anime.series';
final public const string RELATION_VIDEOS = 'anime.animethemes.animethemeentries.videos';
/**
* The attributes that are mass assignable.
*
* @var list<string>
*/
protected $fillable = [
AnimeSynonym::ATTRIBUTE_ANIME,
AnimeSynonym::ATTRIBUTE_TEXT,
AnimeSynonym::ATTRIBUTE_TYPE,
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
AnimeSynonym::ATTRIBUTE_ANIME => 'int',
AnimeSynonym::ATTRIBUTE_TEXT => 'string',
AnimeSynonym::ATTRIBUTE_TYPE => AnimeSynonymType::class,
];
}
/**
* Get the indexable data array for the model.
*/
public function toSearchableArray(): array
{
return match ($driver = Config::get('scout.driver')) {
'collection',
'elastic' => AnimeSynonymElasticModel::toSearchableArray($this),
'typesense' => AnimeSynonymTypesenseModel::toSearchableArray($this),
default => throw new RuntimeException("Unsupported {$driver} search driver configured."),
};
}
public function getName(): string
{
return $this->text;
}
public function getSubtitle(): string
{
return $this->anime->getName();
}
/**
* @return BelongsTo<Anime, $this>
*/
public function anime(): BelongsTo
{
return $this->belongsTo(Anime::class, AnimeSynonym::ATTRIBUTE_ANIME);
}
}
@@ -91,7 +91,7 @@ class AnimeThemeEntry extends BaseModel implements Auditable, HasAggregateLikes,
final public const string RELATION_RESOURCES = 'resources';
final public const string RELATION_SONG = 'animetheme.song';
final public const string RELATION_SONG_SHALLOW = 'song';
final public const string RELATION_SYNONYMS = 'animetheme.anime.animesynonyms';
final public const string RELATION_SYNONYMS = 'animetheme.anime.synonyms';
final public const string RELATION_THEME = 'animetheme';
final public const string RELATION_THEME_GROUP = 'animetheme.group';
final public const string RELATION_TRACKS = 'tracks';
+8
View File
@@ -119,6 +119,14 @@ class Synonym extends BaseModel implements Auditable, SoftDeletable
return $this->synonymable->getName();
}
/**
* @return MorphTo<Model, $this>
*/
public function anime(): MorphTo
{
return $this->synonymable();
}
/**
* @return MorphTo<Model, $this>
*/
-26
View File
@@ -1,26 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Observers\Wiki;
use App\Models\Wiki\Anime;
class AnimeObserver
{
/**
* Handle the Anime "creating" event.
*/
public function creating(Anime $anime): void
{
$anime->setAttribute(Anime::ATTRIBUTE_MEDIA_FORMAT, $anime->getAttribute(Anime::ATTRIBUTE_FORMAT)->value);
}
/**
* Handle the Anime "updating" event.
*/
public function updating(Anime $anime): void
{
$anime->setAttribute(Anime::ATTRIBUTE_MEDIA_FORMAT, $anime->getAttribute(Anime::ATTRIBUTE_FORMAT)->value);
}
}
@@ -1,9 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Policies\Wiki\Anime;
use App\Policies\BasePolicy;
class AnimeSynonymPolicy extends BasePolicy {}
-2
View File
@@ -17,7 +17,6 @@ use App\Models\User\Submission\SubmissionSong;
use App\Models\User\Submission\SubmissionStudio;
use App\Models\User\Submission\SubmissionSynonym;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -112,7 +111,6 @@ class AppServiceProvider extends ServiceProvider
Relation::morphMap([
'page' => Page::class,
'anime' => Anime::class,
'animesynonym' => AnimeSynonym::class,
'animetheme' => AnimeTheme::class,
'animethemeentry' => AnimeThemeEntry::class,
'artist' => Artist::class,
-4
View File
@@ -53,9 +53,7 @@ use App\Enums\Models\List\ExternalProfileVisibility;
use App\Enums\Models\List\PlaylistVisibility;
use App\Enums\Models\User\NotificationType;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\AnimeSynonymType;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
use App\Enums\Models\Wiki\SynonymType;
@@ -131,10 +129,8 @@ class GraphQLServiceProvider extends ServiceProvider
$typeRegistry->register(new PhpEnumType(ExternalProfileVisibility::class));
$typeRegistry->register(new PhpEnumType(PlaylistVisibility::class));
$typeRegistry->register(new PhpEnumType(NotificationType::class));
$typeRegistry->register(new PhpEnumType(AnimeMediaFormat::class));
$typeRegistry->register(new PhpEnumType(AnimeFormat::class));
$typeRegistry->register(new PhpEnumType(AnimeSeason::class));
$typeRegistry->register(new PhpEnumType(AnimeSynonymType::class));
$typeRegistry->register(new PhpEnumType(ImageFacet::class));
$typeRegistry->register(new PhpEnumType(ResourceSite::class));
$typeRegistry->register(new PhpEnumType(SynonymType::class));
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Field\Wiki\Anime;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Models\Wiki\Anime;
use App\Scout\Elasticsearch\Api\Field\EnumField;
use App\Scout\Elasticsearch\Api\Schema\Schema;
@@ -13,6 +13,6 @@ class AnimeMediaFormatField extends EnumField
{
public function __construct(Schema $schema)
{
parent::__construct($schema, Anime::ATTRIBUTE_MEDIA_FORMAT, AnimeMediaFormat::class, Anime::ATTRIBUTE_FORMAT);
parent::__construct($schema, 'media_format', AnimeFormat::class, Anime::ATTRIBUTE_FORMAT);
}
}
@@ -1,18 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Field\Wiki\Anime\Synonym;
use App\Enums\Models\Wiki\AnimeSynonymType;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Scout\Elasticsearch\Api\Field\EnumField;
use App\Scout\Elasticsearch\Api\Schema\Schema;
class SynonymTypeField extends EnumField
{
public function __construct(Schema $schema)
{
parent::__construct($schema, AnimeSynonym::ATTRIBUTE_TYPE, AnimeSynonymType::class);
}
}
@@ -2,9 +2,9 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Field\Wiki\Anime\Synonym;
namespace App\Scout\Elasticsearch\Api\Field\Wiki\Synonym;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Synonym;
use App\Scout\Elasticsearch\Api\Field\StringField;
use App\Scout\Elasticsearch\Api\Schema\Schema;
@@ -12,6 +12,6 @@ class SynonymTextField extends StringField
{
public function __construct(Schema $schema)
{
parent::__construct($schema, AnimeSynonym::ATTRIBUTE_TEXT);
parent::__construct($schema, Synonym::ATTRIBUTE_TEXT);
}
}
@@ -0,0 +1,18 @@
<?php
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Field\Wiki\Synonym;
use App\Enums\Models\Wiki\SynonymType;
use App\Models\Wiki\Synonym;
use App\Scout\Elasticsearch\Api\Field\EnumField;
use App\Scout\Elasticsearch\Api\Schema\Schema;
class SynonymTypeField extends EnumField
{
public function __construct(Schema $schema)
{
parent::__construct($schema, Synonym::ATTRIBUTE_TYPE, SynonymType::class);
}
}
@@ -1,32 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Scout\Criteria;
use App\Scout\Elasticsearch\Api\Query\ElasticQuery;
use Elastic\ScoutDriverPlus\Builders\SearchParametersBuilder;
use Elastic\ScoutDriverPlus\Support\Query;
class SynonymQuery extends ElasticQuery
{
public function build(Criteria $criteria): SearchParametersBuilder
{
$query = Query::bool()
->mustRaw([
'dis_max' => [
'queries' => [
[
'bool' => [
'should' => $this->createTextQuery('text', $criteria->getTerm()),
],
],
],
],
]);
return AnimeSynonym::searchQuery($query);
}
}
@@ -21,7 +21,6 @@ use App\Scout\Elasticsearch\Api\Field\Wiki\Anime\AnimeSlugField;
use App\Scout\Elasticsearch\Api\Field\Wiki\Anime\AnimeSynopsisField;
use App\Scout\Elasticsearch\Api\Field\Wiki\Anime\AnimeYearField;
use App\Scout\Elasticsearch\Api\Schema\Schema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\Anime\AnimeSynonymSchema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\Anime\Theme\EntrySchema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\Anime\ThemeSchema;
@@ -48,7 +47,7 @@ class AnimeSchema extends Schema
new AllowedInclude(new SeriesSchema(), Anime::RELATION_SERIES),
new AllowedInclude(new SongSchema(), Anime::RELATION_SONG),
new AllowedInclude(new StudioSchema(), Anime::RELATION_STUDIOS),
new AllowedInclude(new AnimeSynonymSchema(), Anime::RELATION_ANIMESYNONYMS),
new AllowedInclude(new SynonymSchema(), Anime::RELATION_ANIMESYNONYMS),
new AllowedInclude(new ThemeSchema(), Anime::RELATION_THEMES),
new AllowedInclude(new VideoSchema(), Anime::RELATION_VIDEOS),
]);
@@ -2,23 +2,22 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Schema\Wiki\Anime;
namespace App\Scout\Elasticsearch\Api\Schema\Wiki;
use App\Http\Api\Include\AllowedInclude;
use App\Http\Resources\Wiki\Anime\Resource\AnimeSynonymJsonResource;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Http\Resources\Wiki\Resource\SynonymJsonResource;
use App\Models\Wiki\Synonym;
use App\Scout\Elasticsearch\Api\Field\Base\IdField;
use App\Scout\Elasticsearch\Api\Field\Field;
use App\Scout\Elasticsearch\Api\Field\Wiki\Anime\Synonym\SynonymTextField;
use App\Scout\Elasticsearch\Api\Field\Wiki\Anime\Synonym\SynonymTypeField;
use App\Scout\Elasticsearch\Api\Field\Wiki\Synonym\SynonymTextField;
use App\Scout\Elasticsearch\Api\Field\Wiki\Synonym\SynonymTypeField;
use App\Scout\Elasticsearch\Api\Schema\Schema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\AnimeSchema;
class AnimeSynonymSchema extends Schema
class SynonymSchema extends Schema
{
public function type(): string
{
return AnimeSynonymJsonResource::$wrap;
return SynonymJsonResource::$wrap;
}
/**
@@ -27,7 +26,7 @@ class AnimeSynonymSchema extends Schema
public function allowedIncludes(): array
{
return $this->withIntermediatePaths([
new AllowedInclude(new AnimeSchema(), AnimeSynonym::RELATION_ANIME),
new AllowedInclude(new AnimeSchema(), 'anime'),
]);
}
@@ -39,7 +38,7 @@ class AnimeSynonymSchema extends Schema
return array_merge(
parent::fields(),
[
new IdField($this, AnimeSynonym::ATTRIBUTE_ID),
new IdField($this, Synonym::ATTRIBUTE_ID),
new SynonymTextField($this),
new SynonymTypeField($this),
],
@@ -12,7 +12,6 @@ use App\Http\Api\Schema\EloquentSchema;
use App\Http\Api\Scope\ScopeParser;
use App\Models\List\Playlist;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -28,7 +27,6 @@ use App\Scout\Elasticsearch\Api\Parser\PagingParser;
use App\Scout\Elasticsearch\Api\Parser\SortParser;
use App\Scout\Elasticsearch\Api\Query\ElasticQuery;
use App\Scout\Elasticsearch\Api\Query\List\PlaylistQuery;
use App\Scout\Elasticsearch\Api\Query\Wiki\Anime\SynonymQuery as AnimeSynonymQuery;
use App\Scout\Elasticsearch\Api\Query\Wiki\Anime\Theme\EntryQuery;
use App\Scout\Elasticsearch\Api\Query\Wiki\Anime\ThemeQuery;
use App\Scout\Elasticsearch\Api\Query\Wiki\AnimeQuery;
@@ -215,7 +213,6 @@ class Elasticsearch extends Search
return match ($model) {
Playlist::class => new PlaylistQuery(),
AnimeThemeEntry::class => new EntryQuery(),
AnimeSynonym::class => new AnimeSynonymQuery(),
AnimeTheme::class => new ThemeQuery(),
Anime::class => new AnimeQuery(),
Artist::class => new ArtistQuery(),
@@ -1,18 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
class AnimeSynonymElasticModel
{
/**
* @return array<string, mixed>
*/
public static function toSearchableArray(AnimeSynonym $synonym): array
{
return $synonym->attributesToArray();
}
}
@@ -1,21 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Scout\Typesense\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
class AnimeSynonymTypesenseModel
{
/**
* @return array<string, mixed>
*/
public static function toSearchableArray(AnimeSynonym $synonym): array
{
return [
'id' => (string) $synonym->getKey(),
'text' => $synonym->text,
];
}
}
-18
View File
@@ -5,7 +5,6 @@ declare(strict_types=1);
use App\Models\List\ExternalProfile;
use App\Models\List\Playlist;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -502,23 +501,6 @@ return [
'query_by' => 'name',
],
],
AnimeSynonym::class => [
'collection-schema' => [
'fields' => [
[
'name' => 'id',
'type' => 'string',
],
[
'name' => 'text',
'type' => 'string',
],
],
],
'search-parameters' => [
'query_by' => 'text',
],
],
Synonym::class => [
'collection-schema' => [
'fields' => [
-1
View File
@@ -47,7 +47,6 @@ class AnimeFactory extends Factory
Anime::ATTRIBUTE_SYNOPSIS => fake()->text(),
Anime::ATTRIBUTE_YEAR => fake()->numberBetween(1960, intval(date('Y')) + 1),
Anime::ATTRIBUTE_FORMAT => $format->value,
Anime::ATTRIBUTE_MEDIA_FORMAT => $format->value,
];
}
@@ -22,7 +22,7 @@ return new class extends Migration
$table->string('name');
$table->integer('year')->nullable();
$table->integer('season')->nullable();
$table->integer('media_format')->nullable();
$table->integer('format')->nullable();
$table->text('synopsis')->nullable();
});
}
@@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
if (! Schema::hasTable('artist_song')) {
Schema::create('artist_song', function (Blueprint $table) {
$table->id();
$table->timestamps(6);
$table->unsignedBigInteger('artist_id');
$table->foreign('artist_id')->references('artist_id')->on('artists')->cascadeOnDelete();
$table->unsignedBigInteger('song_id');
$table->foreign('song_id')->references('song_id')->on('songs')->cascadeOnDelete();
$table->string('as')->nullable();
$table->string('alias')->nullable();
$table->unique(['artist_id', 'song_id'], 'artist_song_unique');
});
}
}
};
@@ -1,22 +0,0 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
if (! Schema::hasColumn('anime', 'format')) {
Schema::table('anime', function (Blueprint $table) {
$table->integer('format')->nullable()->after('season');
});
}
}
};
@@ -26,7 +26,6 @@ use App\Models\User\Notification;
use App\Models\User\Submission;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -82,7 +81,6 @@ class PermissionSeeder extends Seeder
// Wiki Resources
$this->registerResource(Anime::class, $extendedCrudPermissions);
$this->registerResource(AnimeSynonym::class, $extendedCrudPermissions);
$this->registerResource(AnimeTheme::class, $extendedCrudPermissions);
$this->registerResource(AnimeThemeEntry::class, $extendedCrudPermissions);
$this->registerResource(Artist::class, $extendedCrudPermissions);
@@ -27,7 +27,6 @@ use App\Models\User\Notification;
use App\Models\User\Submission;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -90,7 +89,6 @@ class AdminSeeder extends RoleSeeder
// Wiki Resources
$this->configureResource($role, Anime::class, $extendedCrudPermissions);
$this->configureResource($role, AnimeSynonym::class, $extendedCrudPermissions);
$this->configureResource($role, AnimeTheme::class, $extendedCrudPermissions);
$this->configureResource($role, AnimeThemeEntry::class, $extendedCrudPermissions);
$this->configureResource($role, Artist::class, $extendedCrudPermissions);
@@ -18,7 +18,6 @@ use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -73,7 +72,6 @@ class ContentModeratorRoleSeeder extends RoleSeeder
// Wiki Resources
$this->configureResource($role, Anime::class, $extendedCrudPermissions);
$this->configureResource($role, AnimeSynonym::class, $extendedCrudPermissions);
$this->configureResource($role, AnimeTheme::class, $extendedCrudPermissions);
$this->configureResource($role, AnimeThemeEntry::class, $extendedCrudPermissions);
$this->configureResource($role, Artist::class, $extendedCrudPermissions);
@@ -17,7 +17,6 @@ use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -60,7 +59,6 @@ class ContributorRoleSeeder extends RoleSeeder
// Wiki Resources
$this->configureResource($role, Anime::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeSynonym::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeTheme::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeThemeEntry::class, [CrudPermission::VIEW]);
$this->configureResource($role, Artist::class, [CrudPermission::VIEW]);
@@ -17,7 +17,6 @@ use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -60,7 +59,6 @@ class DeveloperRoleSeeder extends RoleSeeder
// Wiki Resources
$this->configureResource($role, Anime::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeSynonym::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeTheme::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeThemeEntry::class, [CrudPermission::VIEW]);
$this->configureResource($role, Artist::class, [CrudPermission::VIEW]);
@@ -18,7 +18,6 @@ use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -73,7 +72,6 @@ class EncoderRoleSeeder extends RoleSeeder
// Wiki Resources
$this->configureResource($role, Anime::class, $extendedCrudPermissions);
$this->configureResource($role, AnimeSynonym::class, $extendedCrudPermissions);
$this->configureResource($role, AnimeTheme::class, $extendedCrudPermissions);
$this->configureResource($role, AnimeThemeEntry::class, $extendedCrudPermissions);
$this->configureResource($role, Artist::class, $extendedCrudPermissions);
@@ -17,7 +17,6 @@ use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -60,7 +59,6 @@ class PanelViewerRoleSeeder extends RoleSeeder
// Wiki Resources
$this->configureResource($role, Anime::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeSynonym::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeTheme::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeThemeEntry::class, [CrudPermission::VIEW]);
$this->configureResource($role, Artist::class, [CrudPermission::VIEW]);
@@ -17,7 +17,6 @@ use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Artist;
@@ -60,7 +59,6 @@ class PatronRoleSeeder extends RoleSeeder
// Wiki Resources
$this->configureResource($role, Anime::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeSynonym::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeTheme::class, [CrudPermission::VIEW]);
$this->configureResource($role, AnimeThemeEntry::class, [CrudPermission::VIEW]);
$this->configureResource($role, Artist::class, [CrudPermission::VIEW]);
@@ -1,78 +0,0 @@
<?php
declare(strict_types=1);
use App\Concerns\Elastic\ConfiguresTextAnalyzers;
use Elastic\Adapter\Indices\Mapping;
use Elastic\Adapter\Indices\Settings;
use Elastic\Migrations\Facades\Index;
use Elastic\Migrations\MigrationInterface;
final class CreateAnimeSynonymIndex implements MigrationInterface
{
use ConfiguresTextAnalyzers;
/**
* Run the migration.
*/
public function up(): void
{
Index::createIfNotExists('anime_synonyms', function (Mapping $mapping, Settings $settings) {
$this->configureTextAnalyzers($settings);
$mapping->nested('anime', [
'properties' => [
'anime_id' => [
'type' => 'long',
],
'created_at' => [
'type' => 'date',
],
'name' => [
'type' => 'text',
'analyzer' => 'name_search',
],
'format' => [
'type' => 'long',
],
'season' => [
'type' => 'long',
],
'slug' => [
'type' => 'text',
],
'synopsis' => [
'type' => 'text',
],
'updated_at' => [
'type' => 'date',
],
'year' => [
'type' => 'long',
],
],
]);
$mapping->long('anime_id');
$mapping->date('created_at');
$mapping->long('synonym_id');
$mapping->text('text', [
'analyzer' => 'name_search',
'fields' => [
'keyword' => [
'type' => 'keyword',
],
],
]);
$mapping->long('type');
$mapping->date('updated_at');
});
}
/**
* Reverse the migration.
*/
public function down(): void
{
Index::dropIfExists('anime_synonyms');
}
}
-8
View File
@@ -10,12 +10,6 @@ type Anime @model(class: "App\\Models\\Wiki\\Anime") {
"The primary title of the anime"
name: String!
"The media format of the anime"
mediaFormat: AnimeMediaFormat @rename(attribute: "media_format") @deprecated(reason: "Use 'format' instead")
"The formatted string value of the mediaFormat field"
mediaFormatLocalized: String @localized @deprecated(reason: "Use 'formatLocalized' instead")
"The format of the anime"
format: AnimeFormat
@@ -126,8 +120,6 @@ extend type Query {
search: String @search
name: String @eq
name_like: String @like(key: "name")
mediaFormat: AnimeMediaFormat @eq(key: "media_format") @deprecated(reason: "Use 'format' instead")
mediaFormat_in: [AnimeMediaFormat!] @in(key: "media_format") @deprecated(reason: "Use 'format_in' instead")
format: AnimeFormat @eq
format_in: [AnimeFormat!] @in(key: "format")
season: AnimeSeason @eq
-4
View File
@@ -21,8 +21,6 @@ type AnimeYearSeasons {
"The animes of the season year filtered"
anime(
name_like: String @like(key: "name")
mediaFormat: AnimeMediaFormat @eq(key: "media_format") @deprecated(reason: "Use 'format' instead")
mediaFormat_in: [AnimeMediaFormat!] @in(key: "media_format") @deprecated(reason: "Use 'format_in' instead")
format: AnimeFormat @eq(key: "format")
format_in: [AnimeFormat!] @in(key: "format")
season: AnimeSeason @eq
@@ -48,8 +46,6 @@ type AnimeYearSeason {
"The animes of the season year filtered"
anime(
name_like: String @like(key: "name")
mediaFormat: AnimeMediaFormat @eq(key: "media_format") @deprecated(reason: "Use 'format' instead")
mediaFormat_in: [AnimeMediaFormat!] @in(key: "media_format") @deprecated(reason: "Use 'format_in' instead")
format: AnimeFormat @eq(key: "format")
format_in: [AnimeFormat!] @in(key: "format")
season: AnimeSeason @eq
-2
View File
@@ -21,8 +21,6 @@ type Series @model(class: "App\\Models\\Wiki\\Series") {
anime(
name_like: String @like(key: "name")
mediaFormat: AnimeMediaFormat @eq(key: "media_format") @deprecated(reason: "Use 'format' instead")
mediaFormat_in: [AnimeMediaFormat!] @in(key: "media_format") @deprecated(reason: "Use 'format_in' instead")
format: AnimeFormat @eq
format_in: [AnimeFormat!] @in(key: "format")
season: AnimeSeason @eq
-2
View File
@@ -21,8 +21,6 @@ type Studio @model(class: "App\\Models\\Wiki\\Studio") {
anime(
name_like: String @like(key: "name")
mediaFormat: AnimeMediaFormat @eq(key: "media_format") @deprecated(reason: "Use 'format' instead")
mediaFormat_in: [AnimeMediaFormat!] @in(key: "media_format") @deprecated(reason: "Use 'format_in' instead")
format: AnimeFormat @eq
format_in: [AnimeFormat!] @in(key: "format")
season: AnimeSeason @eq
-16
View File
@@ -9,9 +9,7 @@ use App\Enums\Models\List\ExternalProfileVisibility;
use App\Enums\Models\List\PlaylistVisibility;
use App\Enums\Models\User\SubmissionStatus;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\AnimeSynonymType;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
use App\Enums\Models\Wiki\ThemeType;
@@ -33,26 +31,12 @@ return [
AnimeFormat::SPECIAL->name => 'Special',
AnimeFormat::ONA->name => 'ONA',
],
AnimeMediaFormat::class => [
AnimeMediaFormat::TV->name => 'TV',
AnimeMediaFormat::TV_SHORT->name => 'TV Short',
AnimeMediaFormat::OVA->name => 'OVA',
AnimeMediaFormat::MOVIE->name => 'Movie',
AnimeMediaFormat::SPECIAL->name => 'Special',
AnimeMediaFormat::ONA->name => 'ONA',
],
AnimeSeason::class => [
AnimeSeason::WINTER->name => 'Winter',
AnimeSeason::SPRING->name => 'Spring',
AnimeSeason::SUMMER->name => 'Summer',
AnimeSeason::FALL->name => 'Fall',
],
AnimeSynonymType::class => [
AnimeSynonymType::OTHER->name => 'Other',
AnimeSynonymType::NATIVE->name => 'Native',
AnimeSynonymType::ENGLISH->name => 'English',
AnimeSynonymType::SHORT->name => 'Short',
],
ExternalEntryStatus::class => [
ExternalEntryStatus::WATCHING->name => 'Watching',
ExternalEntryStatus::COMPLETED->name => 'Completed',
-2
View File
@@ -25,7 +25,6 @@ use App\Http\Controllers\Api\Pivot\Wiki\AnimeStudioController;
use App\Http\Controllers\Api\Pivot\Wiki\AnimeThemeEntryVideoController;
use App\Http\Controllers\Api\Pivot\Wiki\ArtistMemberController;
use App\Http\Controllers\Api\SearchController;
use App\Http\Controllers\Api\Wiki\Anime\AnimeSynonymController;
use App\Http\Controllers\Api\Wiki\Anime\Theme\EntryController;
use App\Http\Controllers\Api\Wiki\Anime\ThemeController;
use App\Http\Controllers\Api\Wiki\Anime\YearController;
@@ -263,7 +262,6 @@ apiResource('synonym', SynonymController::class);
apiResource('video', VideoController::class);
// Anime Routes
apiResource('animesynonym', AnimeSynonymController::class);
apiResource('animetheme', ThemeController::class);
Route::get('animeyear', [YearController::class, 'index'])->name('animeyear.index');
Route::get('animeyear/{year}', [YearController::class, 'show'])->name('animeyear.show');
@@ -5,7 +5,7 @@ declare(strict_types=1);
use App\Concerns\Actions\Http\Api\SortsModels;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Http\Api\Criteria\Paging\Criteria;
use App\Http\Api\Criteria\Paging\OffsetCriteria;
@@ -283,11 +283,11 @@ test('updated at filter', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => AnimeSeries::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Http\Api\Field\Field;
use App\Http\Api\Include\AllowedInclude;
@@ -123,11 +123,11 @@ test('sparse fieldsets', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => AnimeSeries::RELATION_ANIME,
];
@@ -5,7 +5,7 @@ declare(strict_types=1);
use App\Concerns\Actions\Http\Api\SortsModels;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Http\Api\Criteria\Paging\Criteria;
use App\Http\Api\Criteria\Paging\OffsetCriteria;
@@ -283,11 +283,11 @@ test('updated at filter', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => AnimeStudio::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Http\Api\Field\Field;
use App\Http\Api\Include\AllowedInclude;
@@ -123,11 +123,11 @@ test('sparse fieldsets', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => AnimeStudio::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
@@ -43,6 +43,7 @@ use App\Models\Wiki\Video;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Date;
@@ -201,11 +202,11 @@ test('season filter', function (): void {
});
test('media format filter', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
];
@@ -480,7 +481,7 @@ test('synonyms by type', function (): void {
->create();
$anime = Anime::with([
Anime::RELATION_ANIMESYNONYMS => function (HasMany $query) use ($typeFilter): void {
Anime::RELATION_ANIMESYNONYMS => function (MorphMany $query) use ($typeFilter): void {
$query->where(Synonym::ATTRIBUTE_TYPE, $typeFilter->value);
},
])
@@ -28,6 +28,7 @@ use App\Models\Wiki\Video;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Arr;
@@ -146,7 +147,7 @@ test('synonyms by type', function (): void {
->createOne();
$anime->unsetRelations()->load([
Anime::RELATION_ANIMESYNONYMS => function (HasMany $query) use ($typeFilter): void {
Anime::RELATION_ANIMESYNONYMS => function (MorphMany $query) use ($typeFilter): void {
$query->where(Synonym::ATTRIBUTE_TYPE, $typeFilter->value);
},
]);
@@ -3,7 +3,7 @@
declare(strict_types=1);
use App\Enums\Auth\CrudPermission;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Models\Auth\User;
use App\Models\Wiki\Anime;
@@ -50,11 +50,11 @@ test('required fields', function (): void {
test('create', function (): void {
$season = Arr::random(AnimeSeason::cases());
$mediaFormat = Arr::random(AnimeMediaFormat::cases());
$mediaFormat = Arr::random(AnimeFormat::cases());
$parameters = array_merge(
Anime::factory()->raw(),
[Anime::ATTRIBUTE_SEASON => $season->localize(), Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormat->localize()],
[Anime::ATTRIBUTE_SEASON => $season->localize(), 'media_format' => $mediaFormat->localize()],
);
$user = User::factory()->withPermissions(CrudPermission::CREATE->format(Anime::class))->createOne();
@@ -3,7 +3,7 @@
declare(strict_types=1);
use App\Enums\Auth\CrudPermission;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Models\Auth\User;
use App\Models\Wiki\Anime;
@@ -16,11 +16,11 @@ test('protected', function (): void {
$anime = Anime::factory()->createOne();
$season = Arr::random(AnimeSeason::cases());
$mediaFormat = Arr::random(AnimeMediaFormat::cases());
$mediaFormat = Arr::random(AnimeFormat::cases());
$parameters = array_merge(
Anime::factory()->raw(),
[Anime::ATTRIBUTE_SEASON => $season->localize(), Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormat->localize()],
[Anime::ATTRIBUTE_SEASON => $season->localize(), 'media_format' => $mediaFormat->localize()],
);
$response = put(route('api.anime.update', ['anime' => $anime] + $parameters));
@@ -32,11 +32,11 @@ test('forbidden', function (): void {
$anime = Anime::factory()->createOne();
$season = Arr::random(AnimeSeason::cases());
$mediaFormat = Arr::random(AnimeMediaFormat::cases());
$mediaFormat = Arr::random(AnimeFormat::cases());
$parameters = array_merge(
Anime::factory()->raw(),
[Anime::ATTRIBUTE_SEASON => $season->localize(), Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormat->localize()],
[Anime::ATTRIBUTE_SEASON => $season->localize(), 'media_format' => $mediaFormat->localize()],
);
$user = User::factory()->createOne();
@@ -52,11 +52,11 @@ test('trashed', function (): void {
$anime = Anime::factory()->trashed()->createOne();
$season = Arr::random(AnimeSeason::cases());
$mediaFormat = Arr::random(AnimeMediaFormat::cases());
$mediaFormat = Arr::random(AnimeFormat::cases());
$parameters = array_merge(
Anime::factory()->raw(),
[Anime::ATTRIBUTE_SEASON => $season->localize(), Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormat->localize()],
[Anime::ATTRIBUTE_SEASON => $season->localize(), 'media_format' => $mediaFormat->localize()],
);
$user = User::factory()->withPermissions(CrudPermission::UPDATE->format(Anime::class))->createOne();
@@ -72,11 +72,11 @@ test('update', function (): void {
$anime = Anime::factory()->createOne();
$season = Arr::random(AnimeSeason::cases());
$mediaFormat = Arr::random(AnimeMediaFormat::cases());
$mediaFormat = Arr::random(AnimeFormat::cases());
$parameters = array_merge(
Anime::factory()->raw(),
[Anime::ATTRIBUTE_SEASON => $season->localize(), Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormat->localize()],
[Anime::ATTRIBUTE_SEASON => $season->localize(), 'media_format' => $mediaFormat->localize()],
);
$user = User::factory()->withPermissions(CrudPermission::UPDATE->format(Anime::class))->createOne();
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ThemeType;
use App\Http\Api\Criteria\Filter\TrashedCriteria;
@@ -519,11 +519,11 @@ test('entries by version', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => AnimeThemeEntry::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ThemeType;
use App\Http\Api\Field\Field;
@@ -130,11 +130,11 @@ test('sparse fieldsets', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => AnimeThemeEntry::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ThemeType;
@@ -507,11 +507,11 @@ test('type filter', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => AnimeTheme::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\VideoOverlap;
@@ -149,11 +149,11 @@ test('sparse fieldsets', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => AnimeTheme::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
@@ -468,11 +468,11 @@ test('themes by type', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Artist::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
@@ -216,11 +216,11 @@ test('themes by type', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Artist::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ResourceSite;
use App\Http\Api\Criteria\Filter\TrashedCriteria;
@@ -402,11 +402,11 @@ test('site filter', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => ExternalResource::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Http\Api\Field\Field;
use App\Http\Api\Include\AllowedInclude;
@@ -121,11 +121,11 @@ test('sparse fieldsets', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => ExternalResource::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ThemeType;
use App\Http\Api\Criteria\Filter\TrashedCriteria;
@@ -451,11 +451,11 @@ test('themes by type', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Group::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ThemeType;
use App\Http\Api\Field\Field;
@@ -200,11 +200,11 @@ test('themes by type', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Group::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ImageFacet;
use App\Http\Api\Criteria\Filter\TrashedCriteria;
@@ -402,11 +402,11 @@ test('facet filter', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Image::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Http\Api\Field\Field;
use App\Http\Api\Include\AllowedInclude;
@@ -121,11 +121,11 @@ test('sparse fieldsets', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Image::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Http\Api\Criteria\Filter\TrashedCriteria;
use App\Http\Api\Criteria\Paging\Criteria;
@@ -367,11 +367,11 @@ test('deleted at filter', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Series::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Http\Api\Field\Field;
use App\Http\Api\Include\AllowedInclude;
@@ -120,11 +120,11 @@ test('sparse fieldsets', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Series::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ThemeType;
use App\Http\Api\Criteria\Filter\TrashedCriteria;
@@ -453,11 +453,11 @@ test('themes by type', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Song::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ThemeType;
use App\Http\Api\Field\Field;
@@ -202,11 +202,11 @@ test('themes by type', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Song::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
@@ -371,11 +371,11 @@ test('deleted at filter', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Studio::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
@@ -124,11 +124,11 @@ test('sparse fieldsets', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Studio::RELATION_ANIME,
];
@@ -7,7 +7,7 @@ use App\Constants\ModelConstants;
use App\Contracts\Http\Api\Field\SortableField;
use App\Enums\Http\Api\Filter\TrashedStatus;
use App\Enums\Http\Api\Sort\Direction;
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ThemeType;
use App\Enums\Models\Wiki\VideoOverlap;
@@ -809,11 +809,11 @@ test('themes by type', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Video::RELATION_ANIME,
];
@@ -2,7 +2,7 @@
declare(strict_types=1);
use App\Enums\Models\Wiki\AnimeMediaFormat;
use App\Enums\Models\Wiki\AnimeFormat;
use App\Enums\Models\Wiki\AnimeSeason;
use App\Enums\Models\Wiki\ThemeType;
use App\Http\Api\Field\Field;
@@ -332,11 +332,11 @@ test('themes by type', function (): void {
});
test('anime by media format', function (): void {
$mediaFormatFilter = Arr::random(AnimeMediaFormat::cases());
$mediaFormatFilter = Arr::random(AnimeFormat::cases());
$parameters = [
FilterParser::param() => [
Anime::ATTRIBUTE_MEDIA_FORMAT => $mediaFormatFilter->localize(),
'media_format' => $mediaFormatFilter->localize(),
],
IncludeParser::param() => Video::RELATION_ANIME,
];