57 lines
2.1 KiB
PHP
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(),
|
|
];
|
|
}
|
|
}
|