*/ public function serialize(ResourceConnection $connection): array { $applications = $this->applicationsById($connection); $resourceOneUuid = $applications->get($connection->resource_one_id)?->uuid; $resourceTwoUuid = $applications->get($connection->resource_two_id)?->uuid; $applicationsById = $applications; return [ 'id' => $connection->uuid, 'applicationIds' => array_values(array_filter([ $resourceOneUuid, $resourceTwoUuid, ])), 'fromApplicationId' => $resourceOneUuid, 'toApplicationId' => $resourceTwoUuid, 'portsByDirection' => $connection->rules ->groupBy(function ($rule) use ($applicationsById): string { $sourceUuid = $applicationsById->get($rule->source_resource_id)?->uuid; $targetUuid = $applicationsById->get($rule->target_resource_id)?->uuid; return "{$sourceUuid}->{$targetUuid}"; }) ->filter(fn (Collection $rules, string $direction): bool => ! str_starts_with($direction, '->') && ! str_ends_with($direction, '->')) ->map(fn (Collection $rules) => $rules ->sortBy('port') ->pluck('port') ->map(fn ($port) => (string) $port) ->values() ->all()) ->all(), ]; } /** * @return Collection */ public function applicationsByUuid(ResourceConnection $connection): Collection { return $this->applicationsById($connection)->keyBy('uuid'); } /** * @return Collection */ public function applicationsById(ResourceConnection $connection): Collection { return V5Application::query() ->whereIn('id', [ (int) $connection->resource_one_id, (int) $connection->resource_two_id, ]) ->get() ->keyBy('id'); } }