DEleted function in request and changed the way the controller uses it,
linter / quality (pull_request) Successful in 1m13s
tests / ci (8.4) (pull_request) Failing after 1m15s

This commit is contained in:
Eric Peters
2026-04-03 16:50:00 +02:00
parent 2c1a0cbff3
commit 1c355c20b4
27 changed files with 285 additions and 263 deletions
@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\UpdateUserAdminStatusRequest;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Arr;
use Inertia\Inertia;
use Inertia\Response;
@@ -24,6 +25,7 @@ class UserManagementController extends Controller
public function update(UpdateUserAdminStatusRequest $request, User $user): RedirectResponse
{
$user->forceFill([
'is_admin' => $request->boolean('is_admin'),
])->save();
@@ -21,15 +21,18 @@ class ProjectBacklogController extends Controller
public function index(Request $request, Project $project): Response
{
$user = $request->user();
abort_unless(
$this->projectPermissionService->userCanViewProject($request->user(), $project),
$this->projectPermissionService->userCanViewProject($user, $project),
403,
);
return Inertia::render('projects/Backlog', [
'boardColumns' => $project->boardColumns()->get(),
'canEditTickets' => $this->projectPermissionService->userHasPermission($request->user(), $project, 'edit'),
'canCreateTickets' => $this->projectPermissionService->userHasPermission($request->user(), $project, 'create'),
'canEditTickets' => $this->projectPermissionService->userHasPermission($user, $project, 'edit'),
'canCreateTickets' => $this->projectPermissionService->userHasPermission($user, $project, 'create'),
'project' => $project,
'status' => session('status'),
'ticketPriorities' => $project->ticketPriorities()->get(),
@@ -45,12 +48,15 @@ class ProjectBacklogController extends Controller
public function store(StoreProjectTicketRequest $request, Project $project): RedirectResponse
{
$user = $request->user();
$validated = $request->validated();
abort_unless(
$this->projectPermissionService->userHasPermission($request->user(), $project, 'create'),
$this->projectPermissionService->userHasPermission($user, $project, 'create'),
403,
);
$ticket = $this->createProjectTicket->handle($project, $request->validated(), $request->user());
$ticket = $this->createProjectTicket->handle($project, $validated, $user);
return to_route('projects.backlog.index', $project)
->with('status', "{$ticket->ticket_key} was added to the backlog.");
@@ -22,8 +22,10 @@ class ProjectBoardController extends Controller
public function index(Request $request, Project $project): Response
{
$user = $request->user();
abort_unless(
$this->projectPermissionService->userCanViewProject($request->user(), $project),
$this->projectPermissionService->userCanViewProject($user, $project),
403,
);
@@ -34,7 +36,7 @@ class ProjectBoardController extends Controller
->with(['ticketPriority', 'ticketType']),
])
->get(),
'canEditTickets' => $this->projectPermissionService->userHasPermission($request->user(), $project, 'edit'),
'canEditTickets' => $this->projectPermissionService->userHasPermission($user, $project, 'edit'),
'project' => $project,
'status' => session('status'),
]);
@@ -45,8 +47,10 @@ class ProjectBoardController extends Controller
Project $project,
Ticket $ticket,
): RedirectResponse {
$user = $request->user();
abort_unless(
$this->projectPermissionService->userHasPermission($request->user(), $project, 'edit'),
$this->projectPermissionService->userHasPermission($user, $project, 'edit'),
403,
);
@@ -74,7 +78,7 @@ class ProjectBoardController extends Controller
$this->createTicketWorklogEntry->handle(
$ticket->fresh(),
$request->user(),
$user,
'status_changed',
"Moved from {$originLabel} to {$destinationLabel}.",
[
+29 -8
View File
@@ -11,6 +11,7 @@ use App\Models\Team;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Inertia\Inertia;
use Inertia\Response;
@@ -23,11 +24,13 @@ class ProjectController extends Controller
public function index(Request $request): Response
{
$user = $request->user();
$projectQuery = Project::query()
->orderByDesc('id');
if (! $request->user()->is_admin) {
$viewableProjectIds = $this->projectPermissionService->viewableProjectIds($request->user());
if (! $user->is_admin) {
$viewableProjectIds = $this->projectPermissionService->viewableProjectIds($user);
if ($viewableProjectIds === []) {
return Inertia::render('projects/Index', [
@@ -60,21 +63,23 @@ class ProjectController extends Controller
public function show(Request $request, Project $project): Response
{
$user = $request->user();
abort_unless(
$this->projectPermissionService->userCanViewProject($request->user(), $project),
$this->projectPermissionService->userCanViewProject($user, $project),
403,
);
return Inertia::render('projects/Show', [
'canManageAccess' => $this->projectPermissionService->userCanManageProjectAccess($request->user(), $project),
'canManageAccess' => $this->projectPermissionService->userCanManageProjectAccess($user, $project),
'project' => $project,
]);
}
public function access(Request $request, Project $project): Response
{
$user = $request->user();
abort_unless(
$this->projectPermissionService->userCanManageProjectAccess($request->user(), $project),
$this->projectPermissionService->userCanManageProjectAccess($user, $project),
403,
);
@@ -107,12 +112,21 @@ class ProjectController extends Controller
Project $project,
User $user,
): RedirectResponse {
$user = $request->user();
abort_unless(
$this->projectPermissionService->userCanManageProjectAccess($request->user(), $project),
$this->projectPermissionService->userCanManageProjectAccess($user, $project),
403,
);
$this->projectPermissionService->syncUserPermissions($project, $user, $request->permissions());
$validated = $request->validated();
$permissions = collect(Arr::get($validated, 'permissions'))
->map(fn (mixed $permission): string => (string) $permission)
->unique()
->values()
->all();
$this->projectPermissionService->syncUserPermissions($project, $user, $permissions);
return to_route('projects.access', $project)
->with('status', "{$user->name} permissions were updated.");
@@ -128,7 +142,14 @@ class ProjectController extends Controller
403,
);
$this->projectPermissionService->syncTeamPermissions($project, $team, $request->permissions());
$validated = $request->validated();
$permissions = collect(Arr::get($validated, 'permissions'))
->map(fn (mixed $permission): string => (string) $permission)
->unique()
->values()
->all();
$this->projectPermissionService->syncTeamPermissions($project, $team, $permissions);
return to_route('projects.access', $project)
->with('status', "{$team->name} permissions were updated.");
@@ -13,6 +13,7 @@ use App\Models\User;
use App\Models\UserGitConnection;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
@@ -28,20 +29,21 @@ class ProjectRepositorySettingsController extends Controller
public function show(Request $request, Project $project): Response
{
$user = $request->user();
abort_unless(
$this->projectPermissionService->userCanManageProjectAccess($request->user(), $project),
$this->projectPermissionService->userCanManageProjectAccess($user, $project),
403,
);
return Inertia::render('projects/settings/Repositories', [
'availableRepositorySources' => $this->availableRepositorySources($request->user()),
'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($request->user(), $repositoryConnection),
'has_personal_access' => $this->hasPersonalAccess($user, $repositoryConnection),
'id' => $repositoryConnection->id,
'owner_name' => $repositoryConnection->owner_name,
'project_id' => $repositoryConnection->project_id,
@@ -62,15 +64,20 @@ class ProjectRepositorySettingsController extends Controller
StoreRepositoryConnectionRequest $request,
Project $project,
): RedirectResponse {
$user = $request->user();
abort_unless(
$this->projectPermissionService->userCanManageProjectAccess($request->user(), $project),
$this->projectPermissionService->userCanManageProjectAccess($user, $project),
403,
);
$validated = $request->validated();
$userGitConnectionId = Arr::get($validated, 'user_git_connection_id');
$providerRepositoryId = Arr::get($validated, 'provider_repository_id');
$repositoryAttributes = $this->repositoryAttributesForSelection(
$request->user(),
$request->userGitConnectionId(),
$request->providerRepositoryId(),
$user,
$userGitConnectionId,
$providerRepositoryId,
);
$this->ensureRepositoryConnectionIsUnique($project, $repositoryAttributes);
@@ -86,15 +93,22 @@ class ProjectRepositorySettingsController extends Controller
Project $project,
RepositoryConnection $repositoryConnection,
): RedirectResponse {
$user = $request->user();
abort_unless(
$this->projectPermissionService->userCanManageProjectAccess($request->user(), $project),
$this->projectPermissionService->userCanManageProjectAccess($user, $project),
403,
);
$validated = $request->validated();
$userGitConnectionId = Arr::get($validated, 'user_git_connection_id');
$providerRepositoryId = Arr::get($validated, 'provider_repository_id');
$repositoryAttributes = $this->repositoryAttributesForSelection(
$request->user(),
$request->userGitConnectionId(),
$request->providerRepositoryId(),
$user,
$userGitConnectionId,
$providerRepositoryId,
);
$this->ensureRepositoryConnectionIsUnique(
@@ -14,6 +14,7 @@ use App\Models\Ticket;
use App\Models\UserGitConnection;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Arr;
use Illuminate\Validation\ValidationException;
use Throwable;
@@ -30,17 +31,23 @@ class ProjectTicketBranchController extends Controller
Project $project,
Ticket $ticket,
): JsonResponse {
$user = $request->user();
abort_unless(
$this->projectPermissionService->userHasPermission($request->user(), $project, 'edit'),
$this->projectPermissionService->userHasPermission($user, $project, 'edit'),
403,
);
$validated = $request->validated();
$repositoryConnectionId = Arr::get($validated, 'repository_connection_id');
$branchName = trim((string) Arr::get($validated, 'branch_name'));
$repositoryConnection = $this->projectRepositoryConnection(
$project,
$request->repositoryConnectionId(),
$repositoryConnectionId,
);
$userGitConnection = $this->matchingUserGitConnection(
$request->user()->id,
$user->id,
$repositoryConnection,
);
@@ -51,7 +58,7 @@ class ProjectTicketBranchController extends Controller
]);
}
$syntaxMessage = $this->validateGitBranchName->message($request->branchName());
$syntaxMessage = $this->validateGitBranchName->message($branchName);
if ($syntaxMessage !== null) {
return response()->json([
@@ -72,7 +79,7 @@ class ProjectTicketBranchController extends Controller
),
)
->contains(
fn (GitBranch $branch): bool => $branch->name === $request->branchName(),
fn (GitBranch $branch): bool => $branch->name === $branchName,
);
} catch (Throwable) {
return response()->json([
@@ -99,17 +106,26 @@ class ProjectTicketBranchController extends Controller
Project $project,
Ticket $ticket,
): RedirectResponse {
$user = $request->user();
abort_unless(
$this->projectPermissionService->userHasPermission($request->user(), $project, 'edit'),
$this->projectPermissionService->userHasPermission($user, $project, 'edit'),
403,
);
$validated = $request->validated();
$repositoryConnectionId = Arr::get($validated, 'repository_connection_id');
$branchName = trim((string) Arr::get($validated, 'branch_name'));
$repositoryConnection = $this->projectRepositoryConnection(
$project,
$request->repositoryConnectionId(),
$repositoryConnectionId,
);
$userGitConnection = $this->matchingUserGitConnection(
$request->user()->id,
$user->id,
$repositoryConnection,
);
@@ -119,7 +135,7 @@ class ProjectTicketBranchController extends Controller
]);
}
$syntaxMessage = $this->validateGitBranchName->message($request->branchName());
$syntaxMessage = $this->validateGitBranchName->message($branchName);
if ($syntaxMessage !== null) {
throw ValidationException::withMessages([
@@ -139,7 +155,7 @@ class ProjectTicketBranchController extends Controller
),
)
->contains(
fn (GitBranch $branch): bool => $branch->name === $request->branchName(),
fn (GitBranch $branch): bool => $branch->name === $branchName,
);
} catch (Throwable) {
throw ValidationException::withMessages([
@@ -166,7 +182,7 @@ class ProjectTicketBranchController extends Controller
$userGitConnection->api_token,
$repositoryConnection->owner_name,
$repositoryConnection->repository_name,
$request->branchName(),
$branchName,
$repository->defaultBranch,
);
} catch (Throwable) {
@@ -178,7 +194,7 @@ class ProjectTicketBranchController extends Controller
return to_route('projects.tickets.show', [$project, $ticket])
->with(
'status',
"{$request->branchName()} was created in {$repositoryConnection->repository_full_name}.",
"{$branchName} was created in {$repositoryConnection->repository_full_name}.",
);
}
@@ -14,6 +14,7 @@ use App\Models\TicketLink;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Inertia\Inertia;
use Inertia\Response;
@@ -29,15 +30,17 @@ class ProjectTicketController extends Controller
public function show(Request $request, Project $project, Ticket $ticket): Response
{
$user = $request->user();
abort_unless(
$this->projectPermissionService->userCanViewProject($request->user(), $project),
$this->projectPermissionService->userCanViewProject($user, $project),
403,
);
$excludedParentIds = [$ticket->id, ...$this->descendantIds($ticket)];
return Inertia::render('projects/Ticket', [
'canEditTicket' => $this->projectPermissionService->userHasPermission($request->user(), $project, 'edit'),
'canEditTicket' => $this->projectPermissionService->userHasPermission($user, $project, 'edit'),
'childTicketTree' => $this->buildChildTicketTree($ticket),
'linkedTickets' => $this->linkedTickets($ticket),
'parentTicketOptions' => Ticket::query()
@@ -53,12 +56,12 @@ class ProjectTicketController extends Controller
]),
'project' => $project,
'repositoryBranches' => $this->resolveTicketBranchMatches->handle(
$request->user(),
$user,
$project,
$ticket,
),
'repositoryPullRequests' => $this->resolveTicketPullRequestMatches->handle(
$request->user(),
$user,
$project,
$ticket,
),
@@ -97,16 +100,22 @@ class ProjectTicketController extends Controller
Project $project,
Ticket $ticket,
): RedirectResponse {
$user = $request->user();
abort_unless(
$this->projectPermissionService->userHasPermission($request->user(), $project, 'edit'),
$this->projectPermissionService->userHasPermission($user, $project, 'edit'),
403,
);
$validated = $request->validated();
$fieldValues = Arr::get($validated, 'field_values');
$ticketAttributes = $request->ticketAttributes();
$wasUpdated = $this->updateProjectTicket->handle(
$ticket,
$request->user(),
$request->ticketAttributes(),
$request->fieldValues(),
$user,
$ticketAttributes,
$fieldValues,
);
$statusMessage = $wasUpdated
@@ -10,6 +10,7 @@ use App\Models\Ticket;
use App\Models\TicketLink;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class ProjectTicketLinkController extends Controller
@@ -24,25 +25,31 @@ class ProjectTicketLinkController extends Controller
Project $project,
Ticket $ticket,
): RedirectResponse {
$user = $request->user();
abort_unless(
$this->projectPermissionService->userHasPermission($request->user(), $project, 'edit'),
$this->projectPermissionService->userHasPermission($user, $project, 'edit'),
403,
);
$validated = $request->validated();
$linkedTicketId = Arr::get($validated, 'linked_ticket_id');
$ticketLinkTypeId = Arr::get($validated, 'ticket_link_type_id');
$linkedTicket = Ticket::query()
->where('project_id', $project->id)
->findOrFail($request->linkedTicketId());
->findOrFail($linkedTicketId);
[$sourceTicketId, $targetTicketId] = $this->normalizeTicketPair($ticket->id, $linkedTicket->id);
$ticketLink = DB::transaction(function () use ($linkedTicket, $request, $sourceTicketId, $targetTicketId, $ticket): TicketLink {
$ticketLink = DB::transaction(function () use ($linkedTicket, $user, $ticketLinkTypeId, $sourceTicketId, $targetTicketId, $ticket): TicketLink {
$ticketLink = TicketLink::query()->updateOrCreate(
[
'source_ticket_id' => $sourceTicketId,
'target_ticket_id' => $targetTicketId,
],
[
'ticket_link_type_id' => $request->ticketLinkTypeId(),
'ticket_link_type_id' => $ticketLinkTypeId,
],
);
@@ -50,7 +57,7 @@ class ProjectTicketLinkController extends Controller
$this->createTicketWorklogEntry->handle(
$ticket,
$request->user(),
$user,
'link_updated',
"Linked {$linkedTicket->ticket_key} as {$ticketLink->ticketLinkType->label}.",
[
@@ -61,7 +68,7 @@ class ProjectTicketLinkController extends Controller
$this->createTicketWorklogEntry->handle(
$linkedTicket,
$request->user(),
$user,
'link_updated',
"Linked {$ticket->ticket_key} as {$ticketLink->ticketLinkType->label}.",
[
@@ -83,8 +90,10 @@ class ProjectTicketLinkController extends Controller
Ticket $ticket,
TicketLink $ticketLink,
): RedirectResponse {
$user = $request->user();
abort_unless(
$this->projectPermissionService->userHasPermission($request->user(), $project, 'edit'),
$this->projectPermissionService->userHasPermission($user, $project, 'edit'),
403,
);
@@ -101,12 +110,12 @@ class ProjectTicketLinkController extends Controller
$label = $ticketLink->ticketLinkType->label;
DB::transaction(function () use ($label, $linkedTicket, $request, $ticket, $ticketLink): void {
DB::transaction(function () use ($label, $linkedTicket, $user, $ticket, $ticketLink): void {
$ticketLink->delete();
$this->createTicketWorklogEntry->handle(
$ticket,
$request->user(),
$user,
'link_removed',
"Removed {$label} link to {$linkedTicket->ticket_key}.",
[
@@ -117,7 +126,7 @@ class ProjectTicketLinkController extends Controller
$this->createTicketWorklogEntry->handle(
$linkedTicket,
$request->user(),
$user,
'link_removed',
"Removed {$label} link to {$ticket->ticket_key}.",
[
@@ -16,6 +16,7 @@ use App\Models\TicketType;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
@@ -54,10 +55,15 @@ class ProjectTicketMetadataSettingsController extends Controller
$this->abortUnlessCanManage($request, $project);
$this->initializeProjectTicketMetadata->handle($project);
$ticketType = DB::transaction(function () use ($project, $request): TicketType {
$validated = $request->validated();
$name = Arr::get($validated, 'name');
$position = Arr::get($validated, 'position');
$ticketType = DB::transaction(function () use ($project, $name, $position): TicketType {
$ticketType = $project->ticketTypes()->create([
'is_builtin' => false,
'name' => $request->validated('name'),
'name' => $name,
'position' => $project->ticketTypes()->count() + 1,
'system_key' => null,
]);
@@ -65,7 +71,7 @@ class ProjectTicketMetadataSettingsController extends Controller
$this->reorderModels(
$project->ticketTypes()->whereKeyNot($ticketType->id)->get()->values(),
$ticketType,
$request->position() ?? $project->ticketTypes()->count(),
$position ?? $project->ticketTypes()->count(),
);
return $ticketType;
@@ -83,15 +89,19 @@ class ProjectTicketMetadataSettingsController extends Controller
$this->abortUnlessCanManage($request, $project);
$this->initializeProjectTicketMetadata->handle($project);
DB::transaction(function () use ($project, $request, $ticketType): void {
$validated = $request->validated();
$name = Arr::get($validated, 'name');
$position = Arr::get($validated, 'position');
DB::transaction(function () use ($project, $name, $position, $ticketType): void {
$ticketType->update([
'name' => $request->validated('name'),
'name' => $name,
]);
$this->reorderModels(
$project->ticketTypes()->whereKeyNot($ticketType->id)->get()->values(),
$ticketType,
$request->position(),
$position,
);
});
@@ -121,16 +131,20 @@ class ProjectTicketMetadataSettingsController extends Controller
{
$this->abortUnlessCanManage($request, $project);
$ticketPriority = DB::transaction(function () use ($project, $request): TicketPriority {
$validated = $request->validated();
$name = Arr::get($validated, 'name');
$position = Arr::get($validated, 'position');
$ticketPriority = DB::transaction(function () use ($project, $name, $position): TicketPriority {
$ticketPriority = $project->ticketPriorities()->create([
'name' => $request->validated('name'),
'name' => $name,
'position' => $project->ticketPriorities()->count() + 1,
]);
$this->reorderModels(
$project->ticketPriorities()->whereKeyNot($ticketPriority->id)->get()->values(),
$ticketPriority,
$request->position() ?? $project->ticketPriorities()->count(),
$position ?? $project->ticketPriorities()->count(),
);
return $ticketPriority;
@@ -147,15 +161,19 @@ class ProjectTicketMetadataSettingsController extends Controller
): RedirectResponse {
$this->abortUnlessCanManage($request, $project);
DB::transaction(function () use ($project, $request, $ticketPriority): void {
$validated = $request->validated();
$name = Arr::get($validated, 'name');
$position = Arr::get($validated, 'position');
DB::transaction(function () use ($project, $name, $position, $ticketPriority): void {
$ticketPriority->update([
'name' => $request->validated('name'),
'name' => $name,
]);
$this->reorderModels(
$project->ticketPriorities()->whereKeyNot($ticketPriority->id)->get()->values(),
$ticketPriority,
$request->position(),
$position,
);
});
@@ -188,17 +206,22 @@ class ProjectTicketMetadataSettingsController extends Controller
): RedirectResponse {
$this->abortUnlessCanManage($request, $project);
$ticketFieldDefinition = DB::transaction(function () use ($project, $request): TicketFieldDefinition {
$validated = $request->validated();
$label = Arr::get($validated, 'label');
$fieldType = Arr::get($validated, 'field_type');
$position = Arr::get($validated, 'position');
$ticketFieldDefinition = DB::transaction(function () use ($project, $fieldType, $label): TicketFieldDefinition {
$ticketFieldDefinition = $project->ticketFieldDefinitions()->create([
'field_type' => $request->validated('field_type'),
'label' => $request->validated('label'),
'field_type' => $fieldType,
'label' => $label,
'position' => $project->ticketFieldDefinitions()->count() + 1,
]);
$this->reorderModels(
$project->ticketFieldDefinitions()->whereKeyNot($ticketFieldDefinition->id)->get()->values(),
$ticketFieldDefinition,
$request->position() ?? $project->ticketFieldDefinitions()->count(),
$position ?? $project->ticketFieldDefinitions()->count(),
);
return $ticketFieldDefinition;
@@ -215,16 +238,21 @@ class ProjectTicketMetadataSettingsController extends Controller
): RedirectResponse {
$this->abortUnlessCanManage($request, $project);
DB::transaction(function () use ($project, $request, $ticketFieldDefinition): void {
$validated = $request->validated();
$label = Arr::get($validated, 'label');
$fieldType = Arr::get($validated, 'field_type');
$position = Arr::get($validated, 'position');
DB::transaction(function () use ($project, $fieldType, $label, $ticketFieldDefinition, $position): void {
$ticketFieldDefinition->update([
'field_type' => $request->validated('field_type'),
'label' => $request->validated('label'),
'field_type' => $fieldType,
'label' => $label,
]);
$this->reorderModels(
$project->ticketFieldDefinitions()->whereKeyNot($ticketFieldDefinition->id)->get()->values(),
$ticketFieldDefinition,
$request->position(),
$position,
);
});
@@ -253,18 +281,22 @@ class ProjectTicketMetadataSettingsController extends Controller
public function storeLinkType(StoreProjectNamedSettingRequest $request, Project $project): RedirectResponse
{
$validated = $request->validated();
$name = Arr::get($validated, 'name');
$position = Arr::get($validated, 'position');
$this->abortUnlessCanManage($request, $project);
$ticketLinkType = DB::transaction(function () use ($project, $request): TicketLinkType {
$ticketLinkType = DB::transaction(function () use ($project, $position, $name): TicketLinkType {
$ticketLinkType = $project->ticketLinkTypes()->create([
'label' => $request->validated('name'),
'label' => $name,
'position' => $project->ticketLinkTypes()->count() + 1,
]);
$this->reorderModels(
$project->ticketLinkTypes()->whereKeyNot($ticketLinkType->id)->get()->values(),
$ticketLinkType,
$request->position() ?? $project->ticketLinkTypes()->count(),
$position ?? $project->ticketLinkTypes()->count(),
);
return $ticketLinkType;
@@ -279,17 +311,22 @@ class ProjectTicketMetadataSettingsController extends Controller
Project $project,
TicketLinkType $ticketLinkType,
): RedirectResponse {
$validated = $request->validated();
$name = Arr::get($validated, 'name');
$position = Arr::get($validated, 'position');
$this->abortUnlessCanManage($request, $project);
DB::transaction(function () use ($project, $request, $ticketLinkType): void {
DB::transaction(function () use ($project, $name, $position, $ticketLinkType): void {
$ticketLinkType->update([
'label' => $request->validated('name'),
'label' => $name,
]);
$this->reorderModels(
$project->ticketLinkTypes()->whereKeyNot($ticketLinkType->id)->get()->values(),
$ticketLinkType,
$request->position(),
$position,
);
});
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Settings;
use App\Actions\Git\GitProviderKey;
use App\Actions\Git\GitProviderManager;
use App\Http\Controllers\Controller;
use App\Http\Requests\Settings\StoreUserGitConnectionRequest;
@@ -9,6 +10,7 @@ use App\Http\Requests\Settings\UpdateUserGitConnectionRequest;
use App\Models\UserGitConnection;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Inertia\Inertia;
use Inertia\Response;
use Throwable;
@@ -21,8 +23,11 @@ class GitConnectionController extends Controller
public function edit(Request $request): Response
{
$user = $request->user();
$session = $request->session();
return Inertia::render('settings/GitConnections', [
'gitConnections' => $request->user()->gitConnections
'gitConnections' => $user->gitConnections
->map(fn (UserGitConnection $gitConnection): array => [
'account_login' => $gitConnection->account_login,
'account_name' => $gitConnection->account_name,
@@ -36,17 +41,25 @@ class GitConnectionController extends Controller
'user_id' => $gitConnection->user_id,
])
->values(),
'status' => $request->session()->get('status'),
'status' => $session->get('status'),
]);
}
public function store(StoreUserGitConnectionRequest $request): RedirectResponse
{
$validated = $request->validated();
$apiToken = Arr::get($validated, 'api_token');
$baseUrl = Arr::get($validated, 'base_url');
$provider = GitProviderKey::from((string) Arr::get($validated, 'provider'));
$user = $request->user();
try {
$gitProvider = $this->gitProviderManager->client($request->provider());
$gitProvider = $this->gitProviderManager->client($provider);
$authenticatedUser = $gitProvider->getAuthenticatedUser(
$request->baseUrl(),
$request->apiToken(),
$baseUrl,
$apiToken,
);
} catch (Throwable) {
return back()
@@ -58,11 +71,11 @@ class GitConnectionController extends Controller
UserGitConnection::query()->create([
'account_login' => $authenticatedUser->login,
'account_name' => $authenticatedUser->name,
'api_token' => $request->apiToken(),
'base_url' => $request->baseUrl(),
'provider' => $request->provider(),
'api_token' => $apiToken,
'base_url' => $baseUrl,
'provider' => $provider,
'provider_user_id' => $authenticatedUser->providerUserId,
'user_id' => $request->user()->id,
'user_id' => $user->id,
]);
return to_route('git-connections.edit')
@@ -75,11 +88,18 @@ class GitConnectionController extends Controller
): RedirectResponse {
$this->abortUnlessOwner($request, $gitConnection);
$validated = $request->validated();
$apiToken = Arr::get($validated, 'api_token');
$baseUrl = Arr::get($validated, 'base_url');
$provider = GitProviderKey::from((string) Arr::get($validated, 'provider'));
try {
$gitProvider = $this->gitProviderManager->client($request->provider());
$gitProvider = $this->gitProviderManager->client($provider);
$authenticatedUser = $gitProvider->getAuthenticatedUser(
$request->baseUrl(),
$request->apiToken(),
$baseUrl,
$apiToken,
);
} catch (Throwable) {
return back()
@@ -91,9 +111,9 @@ class GitConnectionController extends Controller
$gitConnection->update([
'account_login' => $authenticatedUser->login,
'account_name' => $authenticatedUser->name,
'api_token' => $request->apiToken(),
'base_url' => $request->baseUrl(),
'provider' => $request->provider(),
'api_token' => $apiToken,
'base_url' => $baseUrl,
'provider' => $provider,
'provider_user_id' => $authenticatedUser->providerUserId,
]);
@@ -115,6 +135,7 @@ class GitConnectionController extends Controller
private function abortUnlessOwner(Request $request, UserGitConnection $gitConnection): void
{
abort_unless($gitConnection->user_id === $request->user()->id, 403);
$user = $request->user();
abort_unless($gitConnection->user_id === $user->id, 403);
}
}
@@ -19,9 +19,12 @@ class ProfileController extends Controller
*/
public function edit(Request $request): Response
{
$session = $request->session();
$user = $request->user();
return Inertia::render('settings/Profile', [
'mustVerifyEmail' => $request->user() instanceof MustVerifyEmail,
'status' => $request->session()->get('status'),
'mustVerifyEmail' => $user instanceof MustVerifyEmail,
'status' => $session->get('status'),
]);
}
@@ -30,13 +33,15 @@ class ProfileController extends Controller
*/
public function update(ProfileUpdateRequest $request): RedirectResponse
{
$request->user()->fill($request->validated());
if ($request->user()->isDirty('email')) {
$request->user()->email_verified_at = null;
$user = $request->user();
$user->fill($request->validated());
if ($user->isDirty('email')) {
$user->email_verified_at = null;
}
$request->user()->save();
$user->save();
return to_route('profile.edit');
}
@@ -47,13 +52,14 @@ class ProfileController extends Controller
public function destroy(ProfileDeleteRequest $request): RedirectResponse
{
$user = $request->user();
$session = $request->session();
Auth::logout();
$user->delete();
$request->session()->invalidate();
$request->session()->regenerateToken();
$session->invalidate();
$session->regenerateToken();
return redirect('/');
}
@@ -30,6 +30,7 @@ class SecurityController extends Controller implements HasMiddleware
*/
public function edit(TwoFactorAuthenticationRequest $request): Response
{
$user = $request->user();
$props = [
'canManageTwoFactor' => Features::canManageTwoFactorAuthentication(),
];
@@ -37,7 +38,7 @@ class SecurityController extends Controller implements HasMiddleware
if (Features::canManageTwoFactorAuthentication()) {
$request->ensureStateIsValid();
$props['twoFactorEnabled'] = $request->user()->hasEnabledTwoFactorAuthentication();
$props['twoFactorEnabled'] = $user->hasEnabledTwoFactorAuthentication();
$props['requiresConfirmation'] = Features::optionEnabled(Features::twoFactorAuthentication(), 'confirm');
}
@@ -49,7 +50,9 @@ class SecurityController extends Controller implements HasMiddleware
*/
public function update(PasswordUpdateRequest $request): RedirectResponse
{
$request->user()->update([
$user = $request->user();
$user->update([
'password' => $request->password,
]);
+10 -1
View File
@@ -8,6 +8,7 @@ use App\Http\Requests\UpdateTeamMembersRequest;
use App\Models\Team;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Arr;
use Inertia\Inertia;
use Inertia\Response;
@@ -49,7 +50,15 @@ class TeamController extends Controller
public function updateMembers(UpdateTeamMembersRequest $request, Team $team): RedirectResponse
{
$this->projectPermissionService->syncTeamMembers($team, $request->userIds());
$validated = $request->validated();
$userIds = collect(Arr::get($validated, 'user_ids', []))
->map(fn (mixed $userId): int => (int) $userId)
->unique()
->values()
->all();
$this->projectPermissionService->syncTeamMembers($team, $userIds);
return to_route('admin.teams.index')
->with('status', "{$team->name} members were updated.");
@@ -17,6 +17,13 @@ class StoreUserGitConnectionRequest extends FormRequest
{
return $this->user() !== null;
}
protected function prepareForValidation(): void
{
$this->merge([
'base_url' => $this->normalizedBaseUrl(),
'provider' => Str::lower(trim((string) $this->input('provider'))),
]);
}
/**
* Get the validation rules that apply to the request.
@@ -42,30 +49,6 @@ class StoreUserGitConnectionRequest extends FormRequest
))],
];
}
protected function prepareForValidation(): void
{
$this->merge([
'base_url' => $this->normalizedBaseUrl(),
'provider' => Str::lower(trim((string) $this->input('provider'))),
]);
}
public function apiToken(): string
{
return (string) $this->validated('api_token');
}
public function baseUrl(): string
{
return (string) $this->validated('base_url');
}
public function provider(): GitProviderKey
{
return GitProviderKey::from((string) $this->validated('provider'));
}
private function normalizedBaseUrl(): string
{
$baseUrl = Str::of((string) $this->input('base_url'))
@@ -19,6 +19,13 @@ class UpdateUserGitConnectionRequest extends FormRequest
return $this->user() !== null;
}
protected function prepareForValidation(): void
{
$this->merge([
'base_url' => $this->normalizedBaseUrl(),
'provider' => Str::lower(trim((string) $this->input('provider'))),
]);
}
/**
* Get the validation rules that apply to the request.
*
@@ -47,30 +54,6 @@ class UpdateUserGitConnectionRequest extends FormRequest
))],
];
}
protected function prepareForValidation(): void
{
$this->merge([
'base_url' => $this->normalizedBaseUrl(),
'provider' => Str::lower(trim((string) $this->input('provider'))),
]);
}
public function apiToken(): string
{
return (string) $this->validated('api_token');
}
public function baseUrl(): string
{
return (string) $this->validated('base_url');
}
public function provider(): GitProviderKey
{
return GitProviderKey::from((string) $this->validated('provider'));
}
private function normalizedBaseUrl(): string
{
$baseUrl = Str::of((string) $this->input('base_url'))
@@ -28,14 +28,5 @@ class StoreProjectNamedSettingRequest extends FormRequest
];
}
public function position(): ?int
{
$position = $this->validated('position');
if ($position === null) {
return null;
}
return (int) $position;
}
}
@@ -27,14 +27,6 @@ class StoreProjectTicketBranchRequest extends FormRequest
'repository_connection_id' => ['required', 'integer', 'exists:repository_connections,id'],
];
}
public function branchName(): string
{
return trim((string) $this->validated('branch_name'));
}
public function repositoryConnectionId(): int
{
return (int) $this->validated('repository_connection_id');
}
}
@@ -28,13 +28,5 @@ class StoreRepositoryConnectionRequest extends FormRequest
];
}
public function providerRepositoryId(): string
{
return (string) $this->validated('provider_repository_id');
}
public function userGitConnectionId(): int
{
return (int) $this->validated('user_git_connection_id');
}
}
@@ -31,14 +31,4 @@ class StoreTicketFieldDefinitionRequest extends FormRequest
];
}
public function position(): ?int
{
$position = $this->validated('position');
if ($position === null) {
return null;
}
return (int) $position;
}
}
@@ -61,14 +61,4 @@ class StoreTicketLinkRequest extends FormRequest
},
];
}
public function linkedTicketId(): int
{
return (int) $this->validated('linked_ticket_id');
}
public function ticketLinkTypeId(): int
{
return (int) $this->validated('ticket_link_type_id');
}
}
@@ -33,15 +33,4 @@ class SyncProjectPermissionsRequest extends FormRequest
];
}
/**
* @return array<int, string>
*/
public function permissions(): array
{
return collect($this->validated('permissions', []))
->map(fn (mixed $permission): string => (string) $permission)
->unique()
->values()
->all();
}
}
@@ -28,8 +28,5 @@ class UpdateProjectNamedSettingRequest extends FormRequest
];
}
public function position(): int
{
return (int) $this->validated('position');
}
}
@@ -181,18 +181,6 @@ class UpdateProjectTicketRequest extends FormRequest
* value_user_id?: int|string|null
* }>
*/
public function fieldValues(): array
{
/** @var array<int, array{
* ticket_field_definition_id: int,
* value_number?: float|int|string|null,
* value_user_id?: int|string|null
* }> $fieldValues
*/
$fieldValues = $this->validated('field_values', []);
return $fieldValues;
}
private function createsCycle(Ticket $ticket, Ticket $candidateParent): bool
{
@@ -28,13 +28,5 @@ class UpdateRepositoryConnectionRequest extends FormRequest
];
}
public function providerRepositoryId(): string
{
return (string) $this->validated('provider_repository_id');
}
public function userGitConnectionId(): int
{
return (int) $this->validated('user_git_connection_id');
}
}
@@ -32,12 +32,4 @@ class UpdateTeamMembersRequest extends FormRequest
/**
* @return array<int, int>
*/
public function userIds(): array
{
return collect($this->validated('user_ids', []))
->map(fn (mixed $userId): int => (int) $userId)
->unique()
->values()
->all();
}
}
@@ -31,8 +31,4 @@ class UpdateTicketFieldDefinitionRequest extends FormRequest
];
}
public function position(): int
{
return (int) $this->validated('position');
}
}
@@ -27,14 +27,4 @@ class ValidateProjectTicketBranchRequest extends FormRequest
'repository_connection_id' => ['required', 'integer', 'exists:repository_connections,id'],
];
}
public function branchName(): string
{
return trim((string) $this->validated('branch_name'));
}
public function repositoryConnectionId(): int
{
return (int) $this->validated('repository_connection_id');
}
}