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