Files
KanbanGit/app/Actions/Projects/BuildProjectTicketOptionsPayload.php
T
Twyco ff796aa10a
linter / quality (pull_request) Successful in 1m28s
tests / ci (8.4) (pull_request) Successful in 1m47s
feat: overhaul project workspace navigation
2026-07-18 17:52:25 +02:00

57 lines
2.1 KiB
PHP

<?php
namespace App\Actions\Projects;
use App\Http\Resources\ProjectResource;
use App\Http\Resources\TicketPriorityResource;
use App\Http\Resources\TicketReferenceResource;
use App\Http\Resources\TicketStatusResource;
use App\Http\Resources\TicketTypeResource;
use App\Http\Resources\UserResource;
use App\Models\Project;
use App\Models\Ticket;
use App\Models\User;
class BuildProjectTicketOptionsPayload
{
/**
* @return array<string, mixed>
*/
public function handle(Project $project, string $source = 'backlog', mixed $status = null): array
{
$source = $source === 'board' ? 'board' : 'backlog';
$defaultTicketStatus = $source === 'board'
? $project->ticketStatuses()->whereNotNull('board_column_id')->first()
: $project->ticketStatuses()->whereNull('board_column_id')->first();
$defaultTicketStatus ??= $project->ticketStatuses()->first();
return [
'defaultTicketStatusId' => $defaultTicketStatus?->id,
'parentTicketOptions' => TicketReferenceResource::collection(
Ticket::query()
->where('project_id', $project->id)
->whereHas('ticketType', fn ($query) => $query->where('is_parent', true))
->orderByDesc('sequence_number')
->get(),
)->resolve(),
'project' => ProjectResource::make($project)->resolve(),
'source' => $source,
'status' => $status,
'ticketPriorities' => TicketPriorityResource::collection($project->ticketPriorities()->get())->resolve(),
'ticketStatusOptions' => TicketStatusResource::collection(
$project->ticketStatuses()
->with('boardColumn')
->get(),
)->resolve(),
'ticketTypes' => TicketTypeResource::collection($project->ticketTypes()->get())->resolve(),
'users' => UserResource::collection(
User::query()
->visibleToProject($project)
->orderBy('name')
->get(),
)->resolve(),
];
}
}