*/ public function attributes(): array { return [ 'name' => $this->type->getName().self::SUFFIX, 'values' => $this->getValues(), 'resolvers' => $this->getValuesWithResolver(), ]; } /** * @return Collection */ private function getSortableFields(): Collection { return collect($this->type->fieldClasses()) ->filter(fn (Field $field): bool => $field instanceof SortableField); } private function getRelations(BaseType $type): Collection { return collect($type->relations()) ->filter(fn (Relation $relation): bool => $relation instanceof BelongsToRelation && $relation->getBaseType() instanceof BaseType) ->mapWithKeys( fn (Relation $relation): array => [ $relation->getName() => collect($relation->getBaseType()->fieldClasses()) ->filter(fn (Field $field): bool => $field instanceof SortableField), ], ); } /** * Get the values of the enum. * * @return array */ private function getValues(): array { return $this->getSortableFields() ->map(fn (Field $field): array => [new Sort($field->getName()), new Sort($field->getName(), SortDirection::DESC)]) ->flatten() ->merge( $this->getRelations($this->type) ->flatMap(fn (Collection $fields, $relation) => $fields->map(fn (Field $field): array => [ new Sort($relation.'_'.$field->getName()), new Sort($relation.'_'.$field->getName(), SortDirection::DESC), ])) ->flatten() ) ->push(new RandomSort()) ->mapWithKeys(fn (Sort $sort): array => [$sort->__toString() => $sort->__toString()]) ->toArray(); } /** * Get the resolvers for every value. * * @return array */ private function getValuesWithResolver(): array { return $this->getSortableFields() ->mapWithKeys(fn (Field&SortableField $field): array => [ Str::of($field->getName())->snake()->upper()->__toString() => [ self::RESOLVER_COLUMN => $field->getColumn(), self::RESOLVER_SORT_TYPE => $field->sortType(), self::RESOLVER_RELATION => method_exists($field, 'relation') ? $field->{'relation'}() : null, ], ]) ->merge( $this->getRelations($this->type) ->flatMap(fn (Collection $collection, $relation) => $collection->flatMap(fn (Field $field): array => [ Str::upper($relation).'_'.Str::of($field->getName())->snake()->upper()->__toString() => [ self::RESOLVER_COLUMN => $field->getColumn(), self::RESOLVER_SORT_TYPE => SortType::RELATION, self::RESOLVER_RELATION => $relation, ], ])) ) /** @phpstan-ignore-next-line */ ->push([RandomSort::CASE => []]) ->toArray(); } }