Refactor Inertia responses to use resources
This commit is contained in:
@@ -5,6 +5,8 @@ namespace App\Http\Controllers\Admin;
|
||||
use App\Actions\Permissions\PermissionService;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Admin\SyncUserGlobalPermissionsRequest;
|
||||
use App\Http\Resources\PermissionOptionResource;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Support\Arr;
|
||||
@@ -21,11 +23,15 @@ class UserManagementController extends Controller
|
||||
{
|
||||
return Inertia::render('admin/users/Index', [
|
||||
'directPermissions' => $this->permissionService->assignmentMap(User::class),
|
||||
'permissionOptions' => $this->permissionService->permissionOptions(User::class, null),
|
||||
'permissionOptions' => PermissionOptionResource::collection(
|
||||
$this->permissionService->permissionOptions(User::class, null),
|
||||
)->resolve(),
|
||||
'status' => session('status'),
|
||||
'users' => User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
'users' => UserResource::collection(
|
||||
User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,11 +3,12 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Actions\Permissions\PermissionService;
|
||||
use App\Actions\Projects\BuildProjectBoardPageProps;
|
||||
use App\Actions\Tickets\CreateTicketWorklogEntry;
|
||||
use App\Enums\Permission;
|
||||
use App\Enums\TicketWorklogEntryType;
|
||||
use App\Http\Requests\MoveProjectTicketRequest;
|
||||
use App\Http\Resources\BoardColumnResource;
|
||||
use App\Http\Resources\ProjectResource;
|
||||
use App\Models\Project;
|
||||
use App\Models\Ticket;
|
||||
use App\Models\TicketStatus;
|
||||
@@ -20,7 +21,6 @@ use Inertia\Response;
|
||||
class ProjectBoardController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly BuildProjectBoardPageProps $buildProjectBoardPageProps,
|
||||
private readonly CreateTicketWorklogEntry $createTicketWorklogEntry,
|
||||
private readonly PermissionService $permissionService,
|
||||
) {}
|
||||
@@ -34,12 +34,28 @@ class ProjectBoardController extends Controller
|
||||
403,
|
||||
);
|
||||
|
||||
return Inertia::render('projects/Board', $this->buildProjectBoardPageProps->handle(
|
||||
$project,
|
||||
$this->permissionService->allows($user, Permission::ProjectWrite, $project),
|
||||
$this->permissionService->allows($user, Permission::ProjectWrite, $project),
|
||||
session('status'),
|
||||
));
|
||||
$canManageTickets = $this->permissionService->allows($user, Permission::ProjectWrite, $project);
|
||||
|
||||
return Inertia::render('projects/Board', [
|
||||
'boardColumns' => BoardColumnResource::collection(
|
||||
$project->boardColumns()
|
||||
->with([
|
||||
'ticketStatuses',
|
||||
'tickets' => fn ($query) => $query
|
||||
->with([
|
||||
'ticketPriority',
|
||||
'ticketStatus.allowedTargetStatuses.boardColumn',
|
||||
'ticketStatus.boardColumn',
|
||||
'ticketType',
|
||||
]),
|
||||
])
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'canCreateTickets' => $canManageTickets,
|
||||
'canEditTickets' => $canManageTickets,
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
'status' => session('status'),
|
||||
]);
|
||||
}
|
||||
|
||||
public function move(
|
||||
|
||||
@@ -9,6 +9,9 @@ use App\Http\Requests\StoreTicketStatusRequest;
|
||||
use App\Http\Requests\UpdateBoardColumnRequest;
|
||||
use App\Http\Requests\UpdateTicketStatusRequest;
|
||||
use App\Http\Requests\UpdateTicketStatusTransitionsRequest;
|
||||
use App\Http\Resources\BoardColumnResource;
|
||||
use App\Http\Resources\ProjectResource;
|
||||
use App\Http\Resources\TicketStatusResource;
|
||||
use App\Models\BoardColumn;
|
||||
use App\Models\Project;
|
||||
use App\Models\TicketStatus;
|
||||
@@ -35,17 +38,23 @@ class ProjectBoardSettingsController extends Controller
|
||||
);
|
||||
|
||||
return Inertia::render('projects/settings/Board', [
|
||||
'backlogTicketStatuses' => $project->ticketStatuses()
|
||||
->whereNull('board_column_id')
|
||||
->get(),
|
||||
'boardColumns' => $project->boardColumns()
|
||||
->with('ticketStatuses')
|
||||
->get(),
|
||||
'project' => $project,
|
||||
'backlogTicketStatuses' => TicketStatusResource::collection(
|
||||
$project->ticketStatuses()
|
||||
->whereNull('board_column_id')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'boardColumns' => BoardColumnResource::collection(
|
||||
$project->boardColumns()
|
||||
->with('ticketStatuses')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
'status' => session('status'),
|
||||
'ticketStatuses' => $project->ticketStatuses()
|
||||
->with(['allowedTargetStatuses.boardColumn', 'boardColumn'])
|
||||
->get(),
|
||||
'ticketStatuses' => TicketStatusResource::collection(
|
||||
$project->ticketStatuses()
|
||||
->with(['allowedTargetStatuses.boardColumn', 'boardColumn'])
|
||||
->get(),
|
||||
)->resolve(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,14 +3,22 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Actions\Permissions\PermissionService;
|
||||
use App\Actions\Projects\BuildProjectBacklogPageProps;
|
||||
use App\Actions\ProjectTicketMetadata\InitializeProjectTicketMetadata;
|
||||
use App\Enums\Permission;
|
||||
use App\Http\Requests\DeleteProjectRequest;
|
||||
use App\Http\Requests\StoreProjectRequest;
|
||||
use App\Http\Requests\SyncProjectPermissionsRequest;
|
||||
use App\Http\Resources\PermissionOptionResource;
|
||||
use App\Http\Resources\ProjectResource;
|
||||
use App\Http\Resources\TeamResource;
|
||||
use App\Http\Resources\TicketPriorityResource;
|
||||
use App\Http\Resources\TicketResource;
|
||||
use App\Http\Resources\TicketStatusResource;
|
||||
use App\Http\Resources\TicketTypeResource;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Models\Project;
|
||||
use App\Models\Team;
|
||||
use App\Models\Ticket;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
@@ -21,7 +29,6 @@ use Inertia\Response;
|
||||
class ProjectController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly BuildProjectBacklogPageProps $buildProjectBacklogPageProps,
|
||||
private readonly InitializeProjectTicketMetadata $initializeProjectTicketMetadata,
|
||||
private readonly PermissionService $permissionService,
|
||||
) {}
|
||||
@@ -38,7 +45,7 @@ class ProjectController extends Controller
|
||||
|
||||
if ($viewableProjectIds === []) {
|
||||
return Inertia::render('projects/Index', [
|
||||
'projects' => [],
|
||||
'projects' => ProjectResource::collection(collect())->resolve(),
|
||||
'status' => session('status'),
|
||||
]);
|
||||
}
|
||||
@@ -47,8 +54,7 @@ class ProjectController extends Controller
|
||||
}
|
||||
|
||||
return Inertia::render('projects/Index', [
|
||||
'projects' => $projectQuery
|
||||
->get(),
|
||||
'projects' => ProjectResource::collection($projectQuery->get())->resolve(),
|
||||
'status' => session('status'),
|
||||
]);
|
||||
}
|
||||
@@ -83,7 +89,7 @@ class ProjectController extends Controller
|
||||
|
||||
return Inertia::render('projects/Show', [
|
||||
'canManageAccess' => $this->permissionService->allows($user, Permission::ProjectAdmin, $project),
|
||||
'project' => $project,
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -96,18 +102,50 @@ class ProjectController extends Controller
|
||||
403,
|
||||
);
|
||||
|
||||
return Inertia::render('projects/Backlog', $this->buildProjectBacklogPageProps->handle(
|
||||
$project,
|
||||
$this->permissionService->allows($user, Permission::ProjectWrite, $project),
|
||||
$this->permissionService->allows($user, Permission::ProjectWrite, $project),
|
||||
session('status'),
|
||||
));
|
||||
$canManageTickets = $this->permissionService->allows($user, Permission::ProjectWrite, $project);
|
||||
|
||||
return Inertia::render('projects/Backlog', [
|
||||
'backlogTicketStatuses' => TicketStatusResource::collection(
|
||||
$project->ticketStatuses()
|
||||
->whereNull('board_column_id')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'canCreateTickets' => $canManageTickets,
|
||||
'canEditTickets' => $canManageTickets,
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
'status' => session('status'),
|
||||
'ticketStatusOptions' => TicketStatusResource::collection(
|
||||
$project->ticketStatuses()
|
||||
->with('boardColumn')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'ticketPriorities' => TicketPriorityResource::collection($project->ticketPriorities()->get())->resolve(),
|
||||
'ticketTypes' => TicketTypeResource::collection($project->ticketTypes()->get())->resolve(),
|
||||
'tickets' => TicketResource::collection(
|
||||
Ticket::query()
|
||||
->with([
|
||||
'ticketPriority',
|
||||
'ticketStatus.allowedTargetStatuses.boardColumn',
|
||||
'ticketStatus.boardColumn',
|
||||
'ticketType',
|
||||
])
|
||||
->where('project_id', $project->id)
|
||||
->whereHas('ticketStatus', fn ($query) => $query->whereNull('board_column_id'))
|
||||
->orderByDesc('sequence_number')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'users' => UserResource::collection(
|
||||
User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function general(Request $request, Project $project): Response
|
||||
{
|
||||
return Inertia::render('projects/settings/General', [
|
||||
'project' => $project,
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
'status' => session('status'),
|
||||
]);
|
||||
}
|
||||
@@ -122,25 +160,23 @@ class ProjectController extends Controller
|
||||
|
||||
return Inertia::render('projects/Access', [
|
||||
'directPermissions' => $this->permissionService->assignmentMap(User::class, $project),
|
||||
'permissionOptions' => $this->permissionService->permissionOptions(User::class, Project::class),
|
||||
'project' => $project,
|
||||
'permissionOptions' => PermissionOptionResource::collection(
|
||||
$this->permissionService->permissionOptions(User::class, Project::class),
|
||||
)->resolve(),
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
'status' => session('status'),
|
||||
'teamPermissions' => $this->permissionService->assignmentMap(Team::class, $project),
|
||||
'teams' => Team::query()
|
||||
->with('users')
|
||||
->orderBy('name')
|
||||
->get()
|
||||
->map(fn (Team $team): array => [
|
||||
'id' => $team->id,
|
||||
'name' => $team->name,
|
||||
'created_at' => $team->created_at?->toISOString(),
|
||||
'updated_at' => $team->updated_at?->toISOString(),
|
||||
'user_ids' => $team->users->modelKeys(),
|
||||
'users' => $team->users->values(),
|
||||
]),
|
||||
'users' => User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
'teams' => TeamResource::collection(
|
||||
Team::query()
|
||||
->with('users')
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'users' => UserResource::collection(
|
||||
User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,9 @@ use App\Actions\Permissions\PermissionService;
|
||||
use App\Enums\Permission;
|
||||
use App\Http\Requests\StoreRepositoryConnectionRequest;
|
||||
use App\Http\Requests\UpdateRepositoryConnectionRequest;
|
||||
use App\Http\Resources\AvailableGitRepositorySourceResource;
|
||||
use App\Http\Resources\ProjectResource;
|
||||
use App\Http\Resources\RepositoryConnectionResource;
|
||||
use App\Models\Project;
|
||||
use App\Models\RepositoryConnection;
|
||||
use App\Models\User;
|
||||
@@ -36,27 +39,21 @@ class ProjectRepositorySettingsController extends Controller
|
||||
403,
|
||||
);
|
||||
|
||||
$repositoryConnections = $project->repositoryConnections()
|
||||
->get()
|
||||
->each(function (RepositoryConnection $repositoryConnection) use ($user): void {
|
||||
$repositoryConnection->setAttribute(
|
||||
'has_personal_access',
|
||||
$this->hasPersonalAccess($user, $repositoryConnection),
|
||||
);
|
||||
});
|
||||
|
||||
return Inertia::render('projects/settings/Repositories', [
|
||||
'availableRepositorySources' => $this->availableRepositorySources($user),
|
||||
'project' => $project,
|
||||
'repositoryConnections' => $project->repositoryConnections()
|
||||
->get()
|
||||
->map(fn (RepositoryConnection $repositoryConnection): array => [
|
||||
'base_url' => $repositoryConnection->base_url,
|
||||
'created_at' => $repositoryConnection->created_at?->toISOString(),
|
||||
'has_personal_access' => $this->hasPersonalAccess($user, $repositoryConnection),
|
||||
'id' => $repositoryConnection->id,
|
||||
'owner_name' => $repositoryConnection->owner_name,
|
||||
'project_id' => $repositoryConnection->project_id,
|
||||
'provider' => $repositoryConnection->provider->value,
|
||||
'provider_label' => $repositoryConnection->provider->label(),
|
||||
'provider_repository_id' => $repositoryConnection->provider_repository_id,
|
||||
'repository_full_name' => $repositoryConnection->repository_full_name,
|
||||
'repository_name' => $repositoryConnection->repository_name,
|
||||
'repository_url' => $repositoryConnection->repository_url,
|
||||
'updated_at' => $repositoryConnection->updated_at?->toISOString(),
|
||||
])
|
||||
->values(),
|
||||
'availableRepositorySources' => AvailableGitRepositorySourceResource::collection(
|
||||
$this->availableRepositorySources($user),
|
||||
)->resolve(),
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
'repositoryConnections' => RepositoryConnectionResource::collection($repositoryConnections)->resolve(),
|
||||
'status' => session('status'),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -6,12 +6,24 @@ use App\Actions\Git\BuildSuggestedTicketBranchName;
|
||||
use App\Actions\Git\ResolveTicketBranchMatches;
|
||||
use App\Actions\Git\ResolveTicketPullRequestMatches;
|
||||
use App\Actions\Permissions\PermissionService;
|
||||
use App\Actions\Tickets\BuildProjectTicketUpdateAttributes;
|
||||
use App\Actions\Tickets\CreateProjectTicket;
|
||||
use App\Actions\Tickets\UpdateProjectTicket;
|
||||
use App\Enums\Permission;
|
||||
use App\Http\Requests\StoreProjectTicketRequest;
|
||||
use App\Http\Requests\UpdateProjectTicketRequest;
|
||||
use App\Http\Resources\ProjectResource;
|
||||
use App\Http\Resources\TicketFieldDefinitionResource;
|
||||
use App\Http\Resources\TicketLinkResource;
|
||||
use App\Http\Resources\TicketLinkTypeResource;
|
||||
use App\Http\Resources\TicketPriorityResource;
|
||||
use App\Http\Resources\TicketReferenceResource;
|
||||
use App\Http\Resources\TicketRepositoryBranchResource;
|
||||
use App\Http\Resources\TicketRepositoryPullRequestResource;
|
||||
use App\Http\Resources\TicketResource;
|
||||
use App\Http\Resources\TicketStatusResource;
|
||||
use App\Http\Resources\TicketTreeNodeResource;
|
||||
use App\Http\Resources\TicketTypeResource;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Models\Project;
|
||||
use App\Models\Ticket;
|
||||
use App\Models\TicketLink;
|
||||
@@ -25,7 +37,6 @@ use Inertia\Response;
|
||||
class ProjectTicketController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly BuildProjectTicketUpdateAttributes $buildProjectTicketUpdateAttributes,
|
||||
private readonly BuildSuggestedTicketBranchName $buildSuggestedTicketBranchName,
|
||||
private readonly CreateProjectTicket $createProjectTicket,
|
||||
private readonly PermissionService $permissionService,
|
||||
@@ -54,17 +65,21 @@ class ProjectTicketController extends Controller
|
||||
|
||||
return Inertia::render('projects/TicketCreate', [
|
||||
'defaultTicketStatusId' => $defaultTicketStatus?->id,
|
||||
'project' => $project,
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
'source' => $source,
|
||||
'status' => session('status'),
|
||||
'ticketPriorities' => $project->ticketPriorities()->get(),
|
||||
'ticketStatusOptions' => $project->ticketStatuses()
|
||||
->with('boardColumn')
|
||||
->get(),
|
||||
'ticketTypes' => $project->ticketTypes()->get(),
|
||||
'users' => User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
'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()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -118,50 +133,65 @@ class ProjectTicketController extends Controller
|
||||
return Inertia::render('projects/Ticket', [
|
||||
'canEditTicket' => $canEditTicket,
|
||||
'canManageProject' => $canManageProject,
|
||||
'childTicketTree' => $this->buildChildTicketTree($ticket),
|
||||
'linkedTickets' => $this->linkedTickets($ticket),
|
||||
'parentTicketOptions' => Ticket::query()
|
||||
->where('project_id', $project->id)
|
||||
->whereKeyNot($ticket->id)
|
||||
->whereHas('ticketType', fn ($query) => $query->where('is_parent', true))
|
||||
->orderByDesc('sequence_number')
|
||||
->get()
|
||||
->map(fn (Ticket $parentTicket): array => [
|
||||
'id' => $parentTicket->id,
|
||||
'ticket_key' => $parentTicket->ticket_key,
|
||||
'title' => $parentTicket->title,
|
||||
]),
|
||||
'project' => $project,
|
||||
'repositoryBranches' => $this->resolveTicketBranchMatches->handle(
|
||||
$user,
|
||||
$project,
|
||||
$ticket,
|
||||
),
|
||||
'repositoryPullRequests' => $this->resolveTicketPullRequestMatches->handle(
|
||||
$user,
|
||||
$project,
|
||||
$ticket,
|
||||
),
|
||||
'childTicketTree' => TicketTreeNodeResource::collection(
|
||||
$ticket->childTickets()
|
||||
->with('ticketType')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'linkedTickets' => TicketLinkResource::collection(
|
||||
TicketLink::query()
|
||||
->with(['sourceTicket', 'targetTicket', 'ticketLinkType'])
|
||||
->where(function ($query) use ($ticket): void {
|
||||
$query
|
||||
->where('source_ticket_id', $ticket->id)
|
||||
->orWhere('target_ticket_id', $ticket->id);
|
||||
})
|
||||
->orderBy('id')
|
||||
->get()
|
||||
->each(fn (TicketLink $ticketLink) => $ticketLink->setAttribute('current_ticket_id', $ticket->id)),
|
||||
)->resolve(),
|
||||
'parentTicketOptions' => TicketReferenceResource::collection(
|
||||
Ticket::query()
|
||||
->where('project_id', $project->id)
|
||||
->whereKeyNot($ticket->id)
|
||||
->whereHas('ticketType', fn ($query) => $query->where('is_parent', true))
|
||||
->orderByDesc('sequence_number')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
'repositoryBranches' => TicketRepositoryBranchResource::collection(
|
||||
$this->resolveTicketBranchMatches->handle(
|
||||
$user,
|
||||
$project,
|
||||
$ticket,
|
||||
),
|
||||
)->resolve(),
|
||||
'repositoryPullRequests' => TicketRepositoryPullRequestResource::collection(
|
||||
$this->resolveTicketPullRequestMatches->handle(
|
||||
$user,
|
||||
$project,
|
||||
$ticket,
|
||||
),
|
||||
)->resolve(),
|
||||
'status' => session('status'),
|
||||
'suggestedBranchName' => $this->buildSuggestedTicketBranchName->handle($ticket),
|
||||
'ticket' => $displayTicket,
|
||||
'ticketFieldDefinitions' => $project->ticketFieldDefinitions()->get(),
|
||||
'ticketLinkOptions' => Ticket::query()
|
||||
->where('project_id', $project->id)
|
||||
->whereKeyNot($ticket->id)
|
||||
->orderByDesc('sequence_number')
|
||||
->get()
|
||||
->map(fn (Ticket $linkedTicket): array => [
|
||||
'id' => $linkedTicket->id,
|
||||
'ticket_key' => $linkedTicket->ticket_key,
|
||||
'title' => $linkedTicket->title,
|
||||
]),
|
||||
'ticketLinkTypes' => $project->ticketLinkTypes()->get(),
|
||||
'ticketPriorities' => $project->ticketPriorities()->get(),
|
||||
'ticketTypes' => $project->ticketTypes()->get(),
|
||||
'users' => User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
'ticket' => TicketResource::make($displayTicket)->resolve(),
|
||||
'ticketFieldDefinitions' => TicketFieldDefinitionResource::collection($project->ticketFieldDefinitions()->get())->resolve(),
|
||||
'ticketLinkOptions' => TicketReferenceResource::collection(
|
||||
Ticket::query()
|
||||
->where('project_id', $project->id)
|
||||
->whereKeyNot($ticket->id)
|
||||
->orderByDesc('sequence_number')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
'ticketLinkTypes' => TicketLinkTypeResource::collection($project->ticketLinkTypes()->get())->resolve(),
|
||||
'ticketPriorities' => TicketPriorityResource::collection($project->ticketPriorities()->get())->resolve(),
|
||||
'ticketTypes' => TicketTypeResource::collection($project->ticketTypes()->get())->resolve(),
|
||||
'users' => UserResource::collection(
|
||||
User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -178,14 +208,11 @@ class ProjectTicketController extends Controller
|
||||
);
|
||||
|
||||
$validated = $request->validated();
|
||||
$fieldValues = Arr::get($validated, 'field_values', []);
|
||||
$ticketAttributes = $this->buildProjectTicketUpdateAttributes->handle($ticket, $validated);
|
||||
|
||||
$wasUpdated = $this->updateProjectTicket->handle(
|
||||
$ticket,
|
||||
$user,
|
||||
$ticketAttributes,
|
||||
$fieldValues,
|
||||
$validated,
|
||||
);
|
||||
|
||||
$statusMessage = $wasUpdated
|
||||
@@ -195,74 +222,4 @@ class ProjectTicketController extends Controller
|
||||
return to_route('projects.tickets.show', [$project, $ticket])
|
||||
->with('status', $statusMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<int, array{
|
||||
* children: array<int, mixed>,
|
||||
* id: int,
|
||||
* ticket_key: string,
|
||||
* ticket_type_name: string|null,
|
||||
* title: string
|
||||
* }>
|
||||
*/
|
||||
private function buildChildTicketTree(Ticket $ticket): array
|
||||
{
|
||||
return $ticket->childTickets()
|
||||
->with('ticketType')
|
||||
->get()
|
||||
->map(fn (Ticket $childTicket): array => [
|
||||
'children' => $this->buildChildTicketTree($childTicket),
|
||||
'id' => $childTicket->id,
|
||||
'ticket_key' => $childTicket->ticket_key,
|
||||
'ticket_type_name' => $childTicket->ticketType?->name,
|
||||
'title' => $childTicket->title,
|
||||
])
|
||||
->all();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<int, array{
|
||||
* created_at: string|null,
|
||||
* id: int,
|
||||
* linked_ticket: array{id: int, ticket_key: string, title: string},
|
||||
* source_ticket_id: int,
|
||||
* target_ticket_id: int,
|
||||
* ticket_link_type: mixed,
|
||||
* ticket_link_type_id: int,
|
||||
* updated_at: string|null
|
||||
* }>
|
||||
*/
|
||||
private function linkedTickets(Ticket $ticket): array
|
||||
{
|
||||
return TicketLink::query()
|
||||
->with(['sourceTicket', 'targetTicket', 'ticketLinkType'])
|
||||
->where(function ($query) use ($ticket): void {
|
||||
$query
|
||||
->where('source_ticket_id', $ticket->id)
|
||||
->orWhere('target_ticket_id', $ticket->id);
|
||||
})
|
||||
->orderBy('id')
|
||||
->get()
|
||||
->map(function (TicketLink $ticketLink) use ($ticket): array {
|
||||
$linkedTicket = $ticketLink->source_ticket_id === $ticket->id
|
||||
? $ticketLink->targetTicket
|
||||
: $ticketLink->sourceTicket;
|
||||
|
||||
return [
|
||||
'created_at' => $ticketLink->created_at?->toISOString(),
|
||||
'id' => $ticketLink->id,
|
||||
'linked_ticket' => [
|
||||
'id' => $linkedTicket->id,
|
||||
'ticket_key' => $linkedTicket->ticket_key,
|
||||
'title' => $linkedTicket->title,
|
||||
],
|
||||
'source_ticket_id' => $ticketLink->source_ticket_id,
|
||||
'target_ticket_id' => $ticketLink->target_ticket_id,
|
||||
'ticket_link_type' => $ticketLink->ticketLinkType,
|
||||
'ticket_link_type_id' => $ticketLink->ticket_link_type_id,
|
||||
'updated_at' => $ticketLink->updated_at?->toISOString(),
|
||||
];
|
||||
})
|
||||
->all();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,12 @@ use App\Http\Requests\UpdateProjectNamedSettingRequest;
|
||||
use App\Http\Requests\UpdateProjectTicketMetadataSettings;
|
||||
use App\Http\Requests\UpdateProjectTicketTypeRequest;
|
||||
use App\Http\Requests\UpdateTicketFieldDefinitionRequest;
|
||||
use App\Http\Resources\FieldTypeOptionResource;
|
||||
use App\Http\Resources\ProjectResource;
|
||||
use App\Http\Resources\TicketFieldDefinitionResource;
|
||||
use App\Http\Resources\TicketLinkTypeResource;
|
||||
use App\Http\Resources\TicketPriorityResource;
|
||||
use App\Http\Resources\TicketTypeResource;
|
||||
use App\Models\Project;
|
||||
use App\Models\Ticket;
|
||||
use App\Models\TicketFieldDefinition;
|
||||
@@ -41,19 +47,14 @@ class ProjectTicketMetadataSettingsController extends Controller
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
return Inertia::render('projects/settings/Metadata', [
|
||||
'fieldTypeOptions' => collect(TicketFieldDefinition::FIELD_TYPES)
|
||||
->map(fn (string $fieldType): array => [
|
||||
'label' => ucfirst($fieldType),
|
||||
'value' => $fieldType,
|
||||
])
|
||||
->all(),
|
||||
'project' => $project,
|
||||
'fieldTypeOptions' => FieldTypeOptionResource::collection(collect(TicketFieldDefinition::FIELD_TYPES))->resolve(),
|
||||
'project' => ProjectResource::make($project)->resolve(),
|
||||
'error' => session('error'),
|
||||
'status' => session('status'),
|
||||
'ticketFieldDefinitions' => $project->ticketFieldDefinitions()->get(),
|
||||
'ticketLinkTypes' => $project->ticketLinkTypes()->get(),
|
||||
'ticketPriorities' => $project->ticketPriorities()->get(),
|
||||
'ticketTypes' => $project->ticketTypes()->withCount('tickets')->get(),
|
||||
'ticketFieldDefinitions' => TicketFieldDefinitionResource::collection($project->ticketFieldDefinitions()->get())->resolve(),
|
||||
'ticketLinkTypes' => TicketLinkTypeResource::collection($project->ticketLinkTypes()->get())->resolve(),
|
||||
'ticketPriorities' => TicketPriorityResource::collection($project->ticketPriorities()->get())->resolve(),
|
||||
'ticketTypes' => TicketTypeResource::collection($project->ticketTypes()->withCount('tickets')->get())->resolve(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ use App\Actions\Git\GitProviderManager;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Settings\StoreUserGitConnectionRequest;
|
||||
use App\Http\Requests\Settings\UpdateUserGitConnectionRequest;
|
||||
use App\Http\Resources\UserGitConnectionResource;
|
||||
use App\Models\UserGitConnection;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
@@ -25,20 +26,7 @@ class GitConnectionController extends Controller
|
||||
{
|
||||
|
||||
return Inertia::render('settings/GitConnections', [
|
||||
'gitConnections' => $request->user()->gitConnections
|
||||
->map(fn (UserGitConnection $gitConnection): array => [
|
||||
'account_login' => $gitConnection->account_login,
|
||||
'account_name' => $gitConnection->account_name,
|
||||
'base_url' => $gitConnection->base_url,
|
||||
'created_at' => $gitConnection->created_at?->toISOString(),
|
||||
'id' => $gitConnection->id,
|
||||
'provider' => $gitConnection->provider->value,
|
||||
'provider_label' => $gitConnection->provider->label(),
|
||||
'provider_user_id' => $gitConnection->provider_user_id,
|
||||
'updated_at' => $gitConnection->updated_at?->toISOString(),
|
||||
'user_id' => $gitConnection->user_id,
|
||||
])
|
||||
->values(),
|
||||
'gitConnections' => UserGitConnectionResource::collection($request->user()->gitConnections)->resolve(),
|
||||
'status' => $request->session()->get('status'),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,9 @@ use App\Enums\Permission;
|
||||
use App\Http\Requests\StoreTeamRequest;
|
||||
use App\Http\Requests\SyncTeamUserPermissionsRequest;
|
||||
use App\Http\Requests\UpdateTeamMembersRequest;
|
||||
use App\Http\Resources\PermissionOptionResource;
|
||||
use App\Http\Resources\TeamResource;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Models\Team;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
@@ -37,25 +40,21 @@ class TeamController extends Controller
|
||||
|
||||
return Inertia::render('teams/Index', [
|
||||
'canCreateTeams' => $canCreateTeams,
|
||||
'permissionOptions' => $this->permissionService->permissionOptions(User::class, Team::class),
|
||||
'permissionOptions' => PermissionOptionResource::collection(
|
||||
$this->permissionService->permissionOptions(User::class, Team::class),
|
||||
)->resolve(),
|
||||
'status' => session('status'),
|
||||
'teamPermissions' => $teams
|
||||
->mapWithKeys(fn (Team $team): array => [
|
||||
$team->id => $this->permissionService->assignmentMap(User::class, $team),
|
||||
])
|
||||
->all(),
|
||||
'teams' => $teams
|
||||
->map(fn (Team $team): array => [
|
||||
'id' => $team->id,
|
||||
'name' => $team->name,
|
||||
'created_at' => $team->created_at?->toISOString(),
|
||||
'updated_at' => $team->updated_at?->toISOString(),
|
||||
'user_ids' => $team->users->modelKeys(),
|
||||
'users' => $team->users->values(),
|
||||
]),
|
||||
'users' => User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
'teams' => TeamResource::collection($teams)->resolve(),
|
||||
'users' => UserResource::collection(
|
||||
User::query()
|
||||
->orderBy('name')
|
||||
->get(),
|
||||
)->resolve(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user