required(), new FirstArgument(), new PageArgument(), ]; } /** * The base return type of the query. */ public function baseType(): SearchType { return new SearchType(); } /** * @return array */ public function resolve($root, array $args, $context, ResolveInfo $resolveInfo): array { $result = []; $fields = $resolveInfo->getFieldSelection(); if (Arr::get($fields, 'anime')) { $result['anime'] = $this->search(Anime::class, $args, $resolveInfo, new AnimeType, 'anime'); } if (Arr::get($fields, 'artists')) { $result['artists'] = $this->search(Artist::class, $args, $resolveInfo, new ArtistType, 'artists'); } if (Arr::get($fields, 'animethemes')) { $result['animethemes'] = $this->search(AnimeTheme::class, $args, $resolveInfo, new AnimeThemeType, 'animethemes'); } if (Arr::get($fields, 'playlists')) { $result['playlists'] = $this->search(Playlist::class, $args, $resolveInfo, new PlaylistType, 'playlists'); } if (Arr::get($fields, 'series')) { $result['series'] = $this->search(Series::class, $args, $resolveInfo, new SeriesType, 'series'); } if (Arr::get($fields, 'songs')) { $result['songs'] = $this->search(Song::class, $args, $resolveInfo, new SongType, 'songs'); } if (Arr::get($fields, 'studios')) { $result['studios'] = $this->search(Studio::class, $args, $resolveInfo, new StudioType, 'studios'); } if (Arr::get($fields, 'videos')) { $result['videos'] = $this->search(Video::class, $args, $resolveInfo, new VideoType, 'videos'); } return $result; } /** * @param class-string $modelClass */ protected function search(string $modelClass, array $args, ResolveInfo $resolveInfo, EloquentType $type, string $fieldName): Collection { $term = Arr::get($args, 'search'); $page = Arr::get($args, 'page', 1); $first = Number::clamp(Arr::get($args, 'first'), 1, 15); $searchBuilder = Search::search($modelClass, new Criteria($term)) ->passToEloquentBuilder(fn (Builder $builder) => $this->constrainEagerLoads($builder, $resolveInfo, $type, $fieldName)) ->withPagination($first, $page); return collect($searchBuilder->execute()->items()); } }