response = Gate::inspect('viewAny', Anime::class))->allowed(); } /** * The arguments of the type. * * @return Argument[] */ public function arguments(): array { return [ new Argument(self::ATTRIBUTE_SITE, GraphQL::type(class_basename(ResourceSite::class))) ->required(), new Argument(self::ATTRIBUTE_ID, Type::listOf(Type::nonNull(Type::int()))), new Argument(self::ATTRIBUTE_LINK, Type::string()), ]; } /** * The base return type of the query. */ public function baseType(): AnimeType { return new AnimeType(); } public function resolve($root, array $args, $context, ResolveInfo $resolveInfo): Collection { Validator::make($args, [ self::ATTRIBUTE_SITE => ['required', new Enum(ResourceSite::class)], self::ATTRIBUTE_ID => ['required_without:link', 'max:100'], self::ATTRIBUTE_LINK => ['required_without:id'], ])->validate(); $builder = Anime::query(); $site = Arr::get($args, self::ATTRIBUTE_SITE); $externalId = Arr::get($args, self::ATTRIBUTE_ID); $link = Arr::get($args, self::ATTRIBUTE_LINK); $builder->whereRelation(Anime::RELATION_RESOURCES, function (Builder $query) use ($site, $externalId, $link): void { $query->where(ExternalResource::ATTRIBUTE_SITE, $site); if (is_array($externalId)) { $query->whereIn(ExternalResource::ATTRIBUTE_EXTERNAL_ID, $externalId); } if (is_string($link)) { $query->where(ExternalResource::ATTRIBUTE_LINK, $link); } }); $this->constrainEagerLoads($builder, $resolveInfo, new AnimeType()); return $builder->get(); } }