diff --git a/README.md b/README.md index ab15d6adb..3b7d2cb7e 100644 --- a/README.md +++ b/README.md @@ -24,4 +24,4 @@ Please review the [**Contributing Guide**](https://github.com/AnimeThemes/animet ## Resources -Please make use of the #development channel in the [**Discord Server**](https://discordapp.com/invite/m9zbVyQ) for questions pertaining to the AnimeThemes database or API. +Please make use of the #api channel in the [**Discord Server**](https://discordapp.com/invite/m9zbVyQ) for questions pertaining to the AnimeThemes database or API. diff --git a/app/Actions/Models/Wiki/ApiAction.php b/app/Actions/Models/Wiki/ApiAction.php index e224c49da..7ec26e886 100644 --- a/app/Actions/Models/Wiki/ApiAction.php +++ b/app/Actions/Models/Wiki/ApiAction.php @@ -55,7 +55,9 @@ abstract class ApiAction if ($this->response) { foreach ($this->getResourcesMapping() as $site => $key) { - $resources[$site] = Arr::get($this->response, $key); + if (Arr::get($this->response, $key) !== null) { + $resources[$site] = Arr::get($this->response, $key); + } } } @@ -73,7 +75,9 @@ abstract class ApiAction if ($this->response) { foreach ($this->getImagesMapping() as $facet => $key) { - $images[$facet] = Arr::get($this->response, $key); + if (Arr::get($this->response, $key) !== null) { + $images[$facet] = Arr::get($this->response, $key); + } } } diff --git a/app/Actions/Models/Wiki/BackfillAnimeAction.php b/app/Actions/Models/Wiki/BackfillAnimeAction.php index 08d4b8496..9eb6e786a 100644 --- a/app/Actions/Models/Wiki/BackfillAnimeAction.php +++ b/app/Actions/Models/Wiki/BackfillAnimeAction.php @@ -71,7 +71,6 @@ class BackfillAnimeAction extends BackfillWikiAction $this->forStudios($response); $this->forSynonyms($response); - Log::info("Commit try for api {$api->getSite()->localize()}"); DB::commit(); } } catch (Exception $e) { @@ -127,7 +126,9 @@ class BackfillAnimeAction extends BackfillWikiAction $this->ensureStudioHasResource($studio, $response->getSite(), $id); } - $this->toBackfill[self::STUDIOS] = false; + if ($this->getModel()->studios()->exists()) { + $this->toBackfill[self::STUDIOS] = false; + } } /** @@ -141,10 +142,12 @@ class BackfillAnimeAction extends BackfillWikiAction if (!$this->toBackfill[self::SYNONYMS]) return; foreach ($api->getSynonyms() as $type => $text) { - $this->createAnimeSynonym($text, $type, $this->getModel()); + $this->createAnimeSynonym($text, $type, $this->getModel()); } - $this->toBackfill[self::SYNONYMS] = false; + if ($this->getModel()->animesynonyms()->exists()) { + $this->toBackfill[self::SYNONYMS] = false; + } } /** diff --git a/app/Concerns/Models/CanCreateExternalResource.php b/app/Concerns/Models/CanCreateExternalResource.php index 8079175c9..ae2227a18 100644 --- a/app/Concerns/Models/CanCreateExternalResource.php +++ b/app/Concerns/Models/CanCreateExternalResource.php @@ -35,7 +35,7 @@ trait CanCreateExternalResource if (preg_match($urlPattern, $url, $matches)) { $url = $site->formatResourceLink($model::class, intval($matches[2]), $matches[2], $matches[1]); } - + if ($id !== null) { $url = $site->formatResourceLink($model::class, intval($id), $id); } diff --git a/app/Enums/Models/Wiki/ResourceSite.php b/app/Enums/Models/Wiki/ResourceSite.php index 9371aa190..ef471eaee 100644 --- a/app/Enums/Models/Wiki/ResourceSite.php +++ b/app/Enums/Models/Wiki/ResourceSite.php @@ -68,7 +68,7 @@ enum ResourceSite: int ResourceSite::ANILIST->value => 'anilist.co', ResourceSite::ANIME_PLANET->value => 'www.anime-planet.com', ResourceSite::ANN->value => 'www.animenewsnetwork.com', - ResourceSite::KITSU->value => 'kitsu.io', + ResourceSite::KITSU->value => 'kitsu.app', ResourceSite::LIVECHART->value => 'www.livechart.me', ResourceSite::MAL->value => 'myanimelist.net', ResourceSite::WIKI->value => 'wikipedia.org', @@ -166,7 +166,7 @@ enum ResourceSite: int protected static function parseKitsuIdFromLink(string $link): ?string { try { - if ($id = Str::match('/^https?:\/\/kitsu\.io\/anime\/(\d+)/', $link)) { + if ($id = Str::match('/^https?:\/\/kitsu\.app\/anime\/(\d+)/', $link)) { return $id; } @@ -280,7 +280,7 @@ enum ResourceSite: int ResourceSite::ANILIST => "https://anilist.co/anime/$id", ResourceSite::ANIME_PLANET => "https://www.anime-planet.com/anime/$slug", ResourceSite::ANN => "https://www.animenewsnetwork.com/encyclopedia/anime.php?id=$id", - ResourceSite::KITSU => "https://kitsu.io/anime/$id", + ResourceSite::KITSU => "https://kitsu.app/anime/$id", ResourceSite::LIVECHART => "https://www.livechart.me/anime/$id", ResourceSite::MAL => "https://myanimelist.net/anime/$id", ResourceSite::YOUTUBE => "https://www.youtube.com/@$slug", @@ -351,7 +351,7 @@ enum ResourceSite: int ResourceSite::ANILIST => '/^https:\/\/anilist\.co\/(anime)\/(\d+)$/', ResourceSite::ANIME_PLANET => '/^https:\/\/www\.anime-planet\.com\/(anime)\/([a-zA-Z0-9-]+)$/', ResourceSite::ANN => '/^https:\/\/www\.animenewsnetwork\.com\/encyclopedia\/(anime)\.php\?id=(\d+)$/', - ResourceSite::KITSU => '/^https:\/\/kitsu\.io\/(anime)\/([a-zA-Z0-9-]+)$/', + ResourceSite::KITSU => '/^https:\/\/kitsu\.app\/(anime)\/([a-zA-Z0-9-]+)$/', ResourceSite::LIVECHART => '/^https:\/\/www\.livechart\.me\/(anime)\/(\d+)$/', ResourceSite::MAL => '/^https:\/\/myanimelist\.net\/(anime)\/(\d+)$/', ResourceSite::YOUTUBE => '/^https:\/\/www\.(youtube)\.com\/\@([\w-]+)$/', @@ -423,7 +423,7 @@ enum ResourceSite: int ResourceSite::ANILIST => '/^https:\/\/anilist\.co\/anime\/\d+$/', ResourceSite::ANIME_PLANET => '/^https:\/\/www\.anime-planet\.com\/anime\/[a-zA-Z0-9-]+$/', ResourceSite::ANN => '/^https:\/\/www\.animenewsnetwork\.com\/encyclopedia\/anime\.php\?id=\d+$/', - ResourceSite::KITSU => '/^https:\/\/kitsu\.io\/anime\/[a-zA-Z0-9-]+$/', + ResourceSite::KITSU => '/^https:\/\/kitsu\.app\/anime\/[a-zA-Z0-9-]+$/', ResourceSite::LIVECHART => '/^https:\/\/www\.livechart\.me\/anime\/\d+$/', ResourceSite::MAL => '/^https:\/\/myanimelist\.net\/anime\/\d+$/', ResourceSite::YOUTUBE => '/^https:\/\/www\.youtube\.com\/\@[\w-]+$/', diff --git a/app/Filament/Components/Infolist/TextEntry.php b/app/Filament/Components/Infolist/TextEntry.php index d78bfd064..9f4c467e9 100644 --- a/app/Filament/Components/Infolist/TextEntry.php +++ b/app/Filament/Components/Infolist/TextEntry.php @@ -27,6 +27,7 @@ class TextEntry extends ComponentsTextEntry public function urlToRelated(string $resourceRelated, string $relation, ?bool $shouldUseName = false): static { return $this + ->placeholder('-') ->weight(FontWeight::SemiBold) ->html() ->url(function (BaseModel|Model $record) use ($resourceRelated, $relation, $shouldUseName) { diff --git a/app/Filament/Resources/Admin/FeaturedTheme.php b/app/Filament/Resources/Admin/FeaturedTheme.php index 81194773a..647635574 100644 --- a/app/Filament/Resources/Admin/FeaturedTheme.php +++ b/app/Filament/Resources/Admin/FeaturedTheme.php @@ -24,8 +24,10 @@ use App\Models\Wiki\Anime\Theme\AnimeThemeEntry as EntryModel; use App\Models\Wiki\Video; use App\Pivots\Wiki\AnimeThemeEntryVideo; use App\Rules\Admin\StartDateBeforeEndDateRule; +use Filament\Forms\Components\Hidden; use Filament\Forms\Form; use Filament\Forms\Get; +use Filament\Forms\Set; use Filament\Infolists\Components\Section; use Filament\Infolists\Infolist; use Filament\Resources\RelationManagers\RelationGroup; @@ -132,14 +134,16 @@ class FeaturedTheme extends BaseResource 'regex:/^\d{2}\/\d{2}\/\d{4} - \d{2}\/\d{2}\/\d{4}$/', new StartDateBeforeEndDateRule(), ]) - ->saveRelationshipsBeforeChildrenUsing(function (FeaturedThemeModel $record, string $state) { + ->live(true) + ->afterStateUpdated(function (string $state, Set $set) { $dates = explode(' - ', $state); - - $record->start_at = Carbon::createFromFormat('m/d/Y', $dates[0]); - $record->end_at = Carbon::createFromFormat('m/d/Y', $dates[1]); - $record->save(); + $set(FeaturedThemeModel::ATTRIBUTE_START_AT, Carbon::createFromFormat('m/d/Y', $dates[0])); + $set(FeaturedThemeModel::ATTRIBUTE_END_AT, Carbon::createFromFormat('m/d/Y', $dates[1])); }), + Hidden::make(FeaturedThemeModel::ATTRIBUTE_START_AT), + Hidden::make(FeaturedThemeModel::ATTRIBUTE_END_AT), + BelongsTo::make(FeaturedThemeModel::ATTRIBUTE_ENTRY) ->resource(EntryResource::class) ->live(true) @@ -259,11 +263,10 @@ class FeaturedTheme extends BaseResource ->placeholder('-') ->urlToRelated(VideoResource::class, FeaturedThemeModel::RELATION_VIDEO), - TextEntry::make(FeaturedThemeModel::RELATION_ENTRY.'.'.EntryModel::ATTRIBUTE_ID) + TextEntry::make(FeaturedThemeModel::RELATION_ENTRY) ->label(__('filament.resources.singularLabel.anime_theme_entry')) ->placeholder('-') - ->formatStateUsing(fn (string $state) => EntryModel::find(intval($state))->load(EntryModel::RELATION_ANIME)->getName()) - ->urlToRelated(EntryResource::class, FeaturedThemeModel::RELATION_ENTRY), + ->urlToRelated(EntryResource::class, FeaturedThemeModel::RELATION_ENTRY, true), TextEntry::make(FeaturedThemeModel::RELATION_USER.'.'.User::ATTRIBUTE_NAME) ->label(__('filament.resources.singularLabel.user')) diff --git a/app/Filament/Resources/List/Playlist/Track.php b/app/Filament/Resources/List/Playlist/Track.php index ac5a13ba8..d6364a452 100644 --- a/app/Filament/Resources/List/Playlist/Track.php +++ b/app/Filament/Resources/List/Playlist/Track.php @@ -259,6 +259,10 @@ class Track extends BaseResource TextEntry::make(TrackModel::ATTRIBUTE_ID) ->label(__('filament.fields.base.id')), + TextEntry::make(TrackModel::RELATION_ENTRY) + ->label(__('filament.resources.singularLabel.anime_theme_entry')) + ->urlToRelated(Entry::class, TrackModel::RELATION_ENTRY, true), + TextEntry::make(TrackModel::RELATION_VIDEO . '.' . VideoModel::ATTRIBUTE_FILENAME) ->label(__('filament.resources.singularLabel.video')) ->urlToRelated(VideoResource::class, TrackModel::RELATION_VIDEO), diff --git a/app/Http/Api/Schema/List/Playlist/TrackSchema.php b/app/Http/Api/Schema/List/Playlist/TrackSchema.php index 66b25e6f9..3671c45f6 100644 --- a/app/Http/Api/Schema/List/Playlist/TrackSchema.php +++ b/app/Http/Api/Schema/List/Playlist/TrackSchema.php @@ -58,6 +58,11 @@ class TrackSchema extends EloquentSchema new AllowedInclude(new TrackSchema(), PlaylistTrack::RELATION_NEXT), new AllowedInclude(new TrackSchema(), PlaylistTrack::RELATION_PREVIOUS), new AllowedInclude(new VideoSchema(), PlaylistTrack::RELATION_VIDEO), + + // TODO: These should be removed after client work + new AllowedInclude(new ArtistSchema(), 'video.animethemeentries.animetheme.song.artists'), + new AllowedInclude(new GroupSchema(), 'video.animethemeentries.animetheme.group'), + new AllowedInclude(new ImageSchema(), 'video.animethemeentries.animetheme.anime.images'), ]; } diff --git a/app/Http/Api/Schema/List/PlaylistSchema.php b/app/Http/Api/Schema/List/PlaylistSchema.php index 9446be0a6..a250e8607 100644 --- a/app/Http/Api/Schema/List/PlaylistSchema.php +++ b/app/Http/Api/Schema/List/PlaylistSchema.php @@ -67,6 +67,11 @@ class PlaylistSchema extends EloquentSchema implements SearchableSchema new AllowedInclude(new GroupSchema(), 'tracks.animethemeentry.animetheme.group'), new AllowedInclude(new TrackSchema(), 'tracks.previous'), new AllowedInclude(new TrackSchema(), 'tracks.next'), + + // TODO: These should be removed after client work + new AllowedInclude(new ArtistSchema(), 'tracks.video.animethemeentries.animetheme.song.artists'), + new AllowedInclude(new ImageSchema(), 'tracks.video.animethemeentries.animetheme.anime.images'), + new AllowedInclude(new GroupSchema(), 'tracks.video.animethemeentries.animetheme.group'), ]; } diff --git a/database/factories/List/PlaylistFactory.php b/database/factories/List/PlaylistFactory.php index 997191b68..296828067 100644 --- a/database/factories/List/PlaylistFactory.php +++ b/database/factories/List/PlaylistFactory.php @@ -65,21 +65,15 @@ class PlaylistFactory extends Factory /** @var PlaylistTrack|null $last */ $last = Arr::last($tracks); - $entry = AnimeThemeEntry::factory() - ->for(AnimeTheme::factory()->for(Anime::factory())) - ->create(); - - $video = Video::factory()->create(); - - AnimeThemeEntryVideo::query()->create([ - AnimeThemeEntryVideo::ATTRIBUTE_ENTRY => $entry->getKey(), - AnimeThemeEntryVideo::ATTRIBUTE_VIDEO => $video->getKey(), - ]); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); $track = PlaylistTrack::factory() ->for($playlist) - ->for($video) - ->for($entry) + ->for($entryVideo->video) + ->for($entryVideo->animethemeentry) ->createOne(); if ($index === 1) { diff --git a/database/seeders/SimulateExternalProfileSeeder.php b/database/seeders/SimulateExternalProfileSeeder.php deleted file mode 100644 index 8fe4e5f9f..000000000 --- a/database/seeders/SimulateExternalProfileSeeder.php +++ /dev/null @@ -1,34 +0,0 @@ - 'MiltonXerox', - 'site' => 'AniList', - 'visibility' => 'Public', - 'user_id' => 1, - ]; - - $action->store(ExternalProfile::query(), $validated); - } -} diff --git a/database/seeders/Wiki/KitsuResourceSeeder.php b/database/seeders/Wiki/KitsuResourceSeeder.php new file mode 100644 index 000000000..3eb3829f4 --- /dev/null +++ b/database/seeders/Wiki/KitsuResourceSeeder.php @@ -0,0 +1,29 @@ +where(ExternalResource::ATTRIBUTE_LINK, 'like', 'https://kitsu.io/%') + ->update([ + ExternalResource::ATTRIBUTE_LINK => DB::raw("REPLACE(link, 'https://kitsu.io/', 'https://kitsu.app/')") + ]); + } +} diff --git a/tests/Feature/Http/Api/List/Playlist/Track/TrackStoreTest.php b/tests/Feature/Http/Api/List/Playlist/Track/TrackStoreTest.php index 9f9144d33..ca88c20c0 100644 --- a/tests/Feature/Http/Api/List/Playlist/Track/TrackStoreTest.php +++ b/tests/Feature/Http/Api/List/Playlist/Track/TrackStoreTest.php @@ -13,7 +13,11 @@ use App\Features\AllowPlaylistManagement; use App\Models\Auth\User; use App\Models\List\Playlist; use App\Models\List\Playlist\PlaylistTrack; +use App\Models\Wiki\Anime; +use App\Models\Wiki\Anime\AnimeTheme; +use App\Models\Wiki\Anime\Theme\AnimeThemeEntry; use App\Models\Wiki\Video; +use App\Pivots\Wiki\AnimeThemeEntryVideo; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Event; @@ -39,10 +43,17 @@ class TrackStoreTest extends TestCase Feature::activate(AllowPlaylistManagement::class); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory()->createOne(); $track = PlaylistTrack::factory() ->for($playlist) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne(); $response = $this->post(route('api.playlist.track.store', ['playlist' => $playlist] + $track->toArray())); @@ -61,10 +72,17 @@ class TrackStoreTest extends TestCase Feature::activate(AllowPlaylistManagement::class); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory()->createOne(); $track = PlaylistTrack::factory() ->for($playlist) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne(); $user = User::factory()->createOne(); @@ -87,12 +105,19 @@ class TrackStoreTest extends TestCase Feature::activate(AllowPlaylistManagement::class); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory() ->for(User::factory()) ->createOne(); $track = PlaylistTrack::factory() ->for($playlist) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne(); $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); @@ -118,13 +143,19 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory() ->for($user) ->createOne(); $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne(); Sanctum::actingAs($user); @@ -135,7 +166,7 @@ class TrackStoreTest extends TestCase } /** - * The Track Store Endpoint shall require the video field. + * The Track Store Endpoint shall require the entry & video field. * * @return void */ @@ -156,6 +187,43 @@ class TrackStoreTest extends TestCase $response = $this->post(route('api.playlist.track.store', ['playlist' => $playlist])); $response->assertJsonValidationErrors([ + PlaylistTrack::ATTRIBUTE_ENTRY, + PlaylistTrack::ATTRIBUTE_VIDEO, + ]); + } + + /** + * The Playlist Track Store Endpoint shall require the entry and video to have an association. + * + * @return void + */ + public function testAnimeThemeEntryVideoExists(): void + { + $entry = AnimeThemeEntry::factory() + ->for(AnimeTheme::factory()->for(Anime::factory())) + ->create(); + + $video = Video::factory()->create(); + + $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + + $playlist = Playlist::factory() + ->for($user) + ->createOne(); + + $track = PlaylistTrack::factory() + ->for($playlist) + ->makeOne([ + PlaylistTrack::ATTRIBUTE_ENTRY => $entry->getKey(), + PlaylistTrack::ATTRIBUTE_VIDEO => $video->getKey(), + ]); + + Sanctum::actingAs($user); + + $response = $this->post(route('api.playlist.track.store', ['playlist' => $playlist] + $track->toArray())); + + $response->assertJsonValidationErrors([ + PlaylistTrack::ATTRIBUTE_ENTRY, PlaylistTrack::ATTRIBUTE_VIDEO, ]); } @@ -173,21 +241,41 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideoPrevious = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + + $entryVideoNext = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory() ->for($user) ->createOne(); $previous = PlaylistTrack::factory() ->for($playlist) + ->for($entryVideoPrevious->animethemeentry) + ->for($entryVideoPrevious->video) ->createOne(); $next = PlaylistTrack::factory() ->for($playlist) + ->for($entryVideoNext->animethemeentry) + ->for($entryVideoNext->video) ->createOne(); $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne([ PlaylistTrack::RELATION_PREVIOUS => $previous->getRouteKey(), PlaylistTrack::RELATION_NEXT => $next->getRouteKey(), @@ -216,18 +304,31 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideoNext = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory() ->for($user) ->createOne(); $next = PlaylistTrack::factory() ->for(Playlist::factory()) + ->for($entryVideoNext->animethemeentry) + ->for($entryVideoNext->video) ->createOne(); $track = PlaylistTrack::factory() ->for($playlist) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne([ - PlaylistTrack::ATTRIBUTE_VIDEO => Video::factory()->createOne()->getKey(), PlaylistTrack::RELATION_NEXT => $next->getRouteKey(), ]); @@ -253,18 +354,31 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideoPrevious = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory() ->for($user) ->createOne(); $previous = PlaylistTrack::factory() ->for(Playlist::factory()) + ->for($entryVideoPrevious->animethemeentry) + ->for($entryVideoPrevious->video) ->createOne(); $track = PlaylistTrack::factory() ->for($playlist) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne([ - PlaylistTrack::ATTRIBUTE_VIDEO => Video::factory()->createOne()->getKey(), PlaylistTrack::RELATION_PREVIOUS => $previous->getRouteKey(), ]); @@ -290,13 +404,19 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory() ->for($user) ->createOne(); $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne(); Sanctum::actingAs($user); @@ -327,6 +447,11 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $trackCount = $this->faker->numberBetween(2, 9); $playlist = Playlist::factory() @@ -338,7 +463,8 @@ class TrackStoreTest extends TestCase $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne([ PlaylistTrack::RELATION_PREVIOUS => $last->getRouteKey(), ]); @@ -377,6 +503,11 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $trackCount = $this->faker->numberBetween(2, 9); $playlist = Playlist::factory() @@ -389,7 +520,8 @@ class TrackStoreTest extends TestCase $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne([ PlaylistTrack::RELATION_PREVIOUS => $first->getRouteKey(), ]); @@ -428,6 +560,11 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $trackCount = $this->faker->numberBetween(2, 9); $playlist = Playlist::factory() @@ -440,7 +577,8 @@ class TrackStoreTest extends TestCase $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne([ PlaylistTrack::RELATION_NEXT => $last->getRouteKey(), ]); @@ -479,6 +617,11 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $trackCount = $this->faker->numberBetween(2, 9); $playlist = Playlist::factory() @@ -490,7 +633,8 @@ class TrackStoreTest extends TestCase $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne([ PlaylistTrack::RELATION_NEXT => $first->getRouteKey(), ]); @@ -533,13 +677,19 @@ class TrackStoreTest extends TestCase ) ->createOne(); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory() ->for($user) ->createOne(); $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne(); Sanctum::actingAs($user); @@ -565,6 +715,11 @@ class TrackStoreTest extends TestCase $user = User::factory()->withPermissions(CrudPermission::CREATE->format(PlaylistTrack::class))->createOne(); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory() ->tracks($trackLimit) ->for($user) @@ -572,7 +727,8 @@ class TrackStoreTest extends TestCase $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne(); Sanctum::actingAs($user); @@ -604,6 +760,11 @@ class TrackStoreTest extends TestCase ) ->createOne(); + $entryVideo = AnimeThemeEntryVideo::factory() + ->for(AnimeThemeEntry::factory()->for(AnimeTheme::factory()->for(Anime::factory()))) + ->for(Video::factory()) + ->createOne(); + $playlist = Playlist::factory() ->tracks($trackLimit) ->for($user) @@ -611,7 +772,8 @@ class TrackStoreTest extends TestCase $track = PlaylistTrack::factory() ->for($playlist) - ->for(Video::factory()) + ->for($entryVideo->animethemeentry) + ->for($entryVideo->video) ->makeOne(); Sanctum::actingAs($user);