*/ public function toArray(Request $request): array { $locale = $request->query(config('locales.query_parameter')) ?? app()->getLocale(); $resolved = TranslatablePayload::resolve($this->resource, $this->translatable, $locale); return [ 'id' => $this->id, 'locale' => $locale, ...$resolved, 'status' => $this->status->value, 'is_featured' => (bool) $this->is_featured, 'needs_help' => (bool) $this->needs_help, 'demo_url' => $this->demo_url, // The stored path, which is what a client PATCHes back; what was // derived from it travels alongside, as on a page. 'cover_image' => $this->cover_image, 'cover_image_media' => ImagePayload::make( $this->cover_image, $this->resource->relationLoaded('coverMedia') ? $this->resource->getRelation('coverMedia') : null, $resolved['cover_image_alt'] ?? null, ), 'started_at' => $this->started_at?->toDateString(), 'ended_at' => $this->ended_at?->toDateString(), 'published_at' => $this->published_at?->toIso8601String(), 'unpublish_at' => $this->unpublish_at?->toIso8601String(), 'position' => $this->position, 'client_id' => $this->client_id, 'lead_member_id' => $this->lead_member_id, 'technology_ids' => $this->whenLoaded('technologies', fn () => $this->technologies->pluck('id')->values()), 'service_ids' => $this->whenLoaded('services', fn () => $this->services->pluck('id')->values()), 'members' => $this->whenLoaded('members', fn () => $this->members->map(fn ($member) => [ 'id' => $member->id, 'name' => $member->name, 'role' => $member->pivot->role, ])->values()), 'created_at' => $this->created_at?->toIso8601String(), 'updated_at' => $this->updated_at?->toIso8601String(), 'deleted_at' => $this->deleted_at?->toIso8601String(), 'translations' => $this->when( in_array('translations', explode(',', (string) $request->query('with')), true), fn () => TranslatablePayload::all($this->resource, $this->translatable), ), ]; } }