whenLoaded('taskable'); $taskable = $entity && ! $entity instanceof MissingValue ? [ 'type' => EntityResolver::typeOf($entity), 'id' => $entity->getKey(), 'label' => $this->entityLabel($entity), ] : null; $gate = Gate::forUser($request->user()); return [ 'id' => $this->id, 'subject' => $this->subject, 'description' => $this->description, 'taskable_type' => $taskable['type'] ?? null, 'taskable_id' => $taskable['id'] ?? $this->taskable_id, 'taskable' => $taskable, 'assigned_to' => $this->assigned_to, 'assignee' => $this->whenLoaded('assignee', fn () => $this->assignee?->only(['id', 'name', 'avatar', 'avatar_url'])), 'assigned_by' => $this->assigned_by, 'assigner' => $this->whenLoaded('assigner', fn () => $this->assigner?->only(['id', 'name'])), 'created_by' => $this->created_by, 'creator' => $this->whenLoaded('creator', fn () => $this->creator?->only(['id', 'name'])), 'priority' => $this->priority->value, 'status' => $this->status->value, 'due_at' => $this->due_at?->toISOString(), 'started_at' => $this->started_at?->toISOString(), 'completed_at' => $this->completed_at?->toISOString(), 'reminder_at' => $this->reminder_at?->toISOString(), 'parent_task_id' => $this->parent_task_id, 'parent' => $this->whenLoaded('parent', fn () => $this->parent?->only(['id', 'subject'])), 'estimated_minutes' => $this->estimated_minutes, 'visibility' => $this->visibility->value, 'version' => $this->version, 'is_overdue' => $this->is_overdue, 'capabilities' => [ 'update' => $gate->allows('update', $this->resource), 'assign' => $gate->allows('assign', [$this->resource, $this->assigned_to]), 'transition' => $gate->allows('transition', $this->resource), 'delete' => $gate->allows('delete', $this->resource), ], 'created_at' => $this->created_at?->toISOString(), 'updated_at' => $this->updated_at?->toISOString(), ]; } private function entityLabel(object $entity): string { return (string) ($entity->name ?? $entity->title ?? $entity->company ?? trim(($entity->first_name ?? '').' '.($entity->last_name ?? '')) ?: class_basename($entity).' #'.$entity->getKey()); } }