$model */ public function __construct(protected string $model) { parent::__construct('Create'.Str::pascal(class_basename($model))); } public function authorize($root, array $args, $ctx, ?ResolveInfo $resolveInfo = null, ?Closure $getSelectFields = null): bool { $args = collect($args) ->filter(fn ($value) => $value instanceof Model) ->values() ->all(); return Gate::allows('create', [$this->model, ...$args]); } /** * Get the arguments for the create mutation. * * @return Argument[] */ public function arguments(): array { $arguments = []; $baseType = $this->baseRebingType(); if ($baseType instanceof BaseType) { $bindableFields = Arr::where($baseType->fieldClasses(), fn (Field $field) => $field instanceof BindableField && $field instanceof CreatableField); $notBindableFields = Arr::where($baseType->fieldClasses(), fn (Field $field) => ! $field instanceof BindableField); $arguments[] = $this->resolveBindArguments($bindableFields); $arguments[] = $this->resolveCreateMutationArguments($notBindableFields); } return Arr::flatten($arguments); } /** * @param array $args * @return array */ public function rulesForValidation(array $args = []): array { $baseType = $this->baseRebingType(); if ($baseType instanceof BaseType) { return collect($baseType->fieldClasses()) ->filter(fn (Field $field) => $field instanceof CreatableField) ->mapWithKeys(fn (Field&CreatableField $field) => [$field->getColumn() => $field->getCreationRules($args)]) ->toArray(); } return []; } /** * The type returned by the field. */ public function type(): Type { return Type::nonNull($this->baseType()); } }