feat(github-source): Enhance GitHub App configuration with manual and private key support
- Add support for manual GitHub App configuration - Introduce private key selection for GitHub Apps - Enable editing of previously disabled GitHub App fields - Add error handling for permission checks - Implement a manual GitHub App creation method
This commit is contained in:
@@ -37,6 +37,8 @@ class Change extends Component
|
|||||||
|
|
||||||
public $applications;
|
public $applications;
|
||||||
|
|
||||||
|
public $privateKeys;
|
||||||
|
|
||||||
protected $rules = [
|
protected $rules = [
|
||||||
'github_app.name' => 'required|string',
|
'github_app.name' => 'required|string',
|
||||||
'github_app.organization' => 'nullable|string',
|
'github_app.organization' => 'nullable|string',
|
||||||
@@ -54,6 +56,7 @@ class Change extends Component
|
|||||||
'github_app.metadata' => 'nullable|string',
|
'github_app.metadata' => 'nullable|string',
|
||||||
'github_app.pull_requests' => 'nullable|string',
|
'github_app.pull_requests' => 'nullable|string',
|
||||||
'github_app.administration' => 'nullable|string',
|
'github_app.administration' => 'nullable|string',
|
||||||
|
'github_app.private_key_id' => 'required|int',
|
||||||
];
|
];
|
||||||
|
|
||||||
public function boot()
|
public function boot()
|
||||||
@@ -65,9 +68,13 @@ class Change extends Component
|
|||||||
|
|
||||||
public function checkPermissions()
|
public function checkPermissions()
|
||||||
{
|
{
|
||||||
|
try {
|
||||||
GithubAppPermissionJob::dispatchSync($this->github_app);
|
GithubAppPermissionJob::dispatchSync($this->github_app);
|
||||||
$this->github_app->refresh()->makeVisible('client_secret')->makeVisible('webhook_secret');
|
$this->github_app->refresh()->makeVisible('client_secret')->makeVisible('webhook_secret');
|
||||||
$this->dispatch('success', 'Github App permissions updated.');
|
$this->dispatch('success', 'Github App permissions updated.');
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return handleError($e, $this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// public function check()
|
// public function check()
|
||||||
@@ -109,6 +116,7 @@ class Change extends Component
|
|||||||
$github_app_uuid = request()->github_app_uuid;
|
$github_app_uuid = request()->github_app_uuid;
|
||||||
$this->github_app = GithubApp::ownedByCurrentTeam()->whereUuid($github_app_uuid)->firstOrFail();
|
$this->github_app = GithubApp::ownedByCurrentTeam()->whereUuid($github_app_uuid)->firstOrFail();
|
||||||
$this->github_app->makeVisible(['client_secret', 'webhook_secret']);
|
$this->github_app->makeVisible(['client_secret', 'webhook_secret']);
|
||||||
|
$this->privateKeys = PrivateKey::ownedByCurrentTeam()->get();
|
||||||
|
|
||||||
$this->applications = $this->github_app->applications;
|
$this->applications = $this->github_app->applications;
|
||||||
$settings = instanceSettings();
|
$settings = instanceSettings();
|
||||||
@@ -243,6 +251,7 @@ class Change extends Component
|
|||||||
'github_app.client_secret' => 'required|string',
|
'github_app.client_secret' => 'required|string',
|
||||||
'github_app.webhook_secret' => 'required|string',
|
'github_app.webhook_secret' => 'required|string',
|
||||||
'github_app.is_system_wide' => 'required|bool',
|
'github_app.is_system_wide' => 'required|bool',
|
||||||
|
'github_app.private_key_id' => 'required|int',
|
||||||
]);
|
]);
|
||||||
$this->github_app->save();
|
$this->github_app->save();
|
||||||
$this->dispatch('success', 'Github App updated.');
|
$this->dispatch('success', 'Github App updated.');
|
||||||
@@ -251,6 +260,15 @@ class Change extends Component
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function createGithubAppManually()
|
||||||
|
{
|
||||||
|
$this->github_app->makeVisible('client_secret')->makeVisible('webhook_secret');
|
||||||
|
$this->github_app->app_id = '1234567890';
|
||||||
|
$this->github_app->installation_id = '1234567890';
|
||||||
|
$this->github_app->save();
|
||||||
|
$this->dispatch('success', 'Github App updated.');
|
||||||
|
}
|
||||||
|
|
||||||
public function instantSave()
|
public function instantSave()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
confirmationText="{{ data_get($github_app, 'name') }}" :confirmWithPassword="false"
|
confirmationText="{{ data_get($github_app, 'name') }}" :confirmWithPassword="false"
|
||||||
step2ButtonText="Permanently Delete" />
|
step2ButtonText="Permanently Delete" />
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="subtitle">Your Private GitHub App for private repositories.</div>
|
<div class="subtitle">Your Private GitHub App for private repositories.</div>
|
||||||
@@ -46,7 +47,7 @@
|
|||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<div class="flex items-end gap-2 w-full">
|
<div class="flex items-end gap-2 w-full">
|
||||||
<x-forms.input id="github_app.name" label="App Name" disabled />
|
<x-forms.input id="github_app.name" label="App Name" />
|
||||||
<x-forms.button wire:click.prevent="updateGithubAppName" class="bg-coollabs">
|
<x-forms.button wire:click.prevent="updateGithubAppName" class="bg-coollabs">
|
||||||
Sync Name
|
Sync Name
|
||||||
</x-forms.button>
|
</x-forms.button>
|
||||||
@@ -57,7 +58,7 @@
|
|||||||
</x-forms.button>
|
</x-forms.button>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<x-forms.input id="github_app.organization" label="Organization" disabled
|
<x-forms.input id="github_app.organization" label="Organization"
|
||||||
placeholder="If empty, personal user will be used" />
|
placeholder="If empty, personal user will be used" />
|
||||||
</div>
|
</div>
|
||||||
@if (!isCloud())
|
@if (!isCloud())
|
||||||
@@ -68,27 +69,32 @@
|
|||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<x-forms.input id="github_app.html_url" label="HTML Url" disabled />
|
<x-forms.input id="github_app.html_url" label="HTML Url" />
|
||||||
<x-forms.input id="github_app.api_url" label="API Url" disabled />
|
<x-forms.input id="github_app.api_url" label="API Url" />
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
@if ($github_app->html_url === 'https://github.com')
|
|
||||||
<x-forms.input id="github_app.custom_user" label="User" disabled />
|
|
||||||
<x-forms.input type="number" id="github_app.custom_port" label="Port" disabled />
|
|
||||||
@else
|
|
||||||
<x-forms.input id="github_app.custom_user" label="User" required />
|
<x-forms.input id="github_app.custom_user" label="User" required />
|
||||||
<x-forms.input type="number" id="github_app.custom_port" label="Port" required />
|
<x-forms.input type="number" id="github_app.custom_port" label="Port" required />
|
||||||
@endif
|
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<x-forms.input type="number" id="github_app.app_id" label="App Id" disabled />
|
<x-forms.input type="number" id="github_app.app_id" label="App Id" required />
|
||||||
<x-forms.input type="number" id="github_app.installation_id" label="Installation Id"
|
<x-forms.input type="number" id="github_app.installation_id" label="Installation Id"
|
||||||
disabled />
|
required />
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<x-forms.input id="github_app.client_id" label="Client Id" type="password" disabled />
|
<x-forms.input id="github_app.client_id" label="Client Id" type="password" required />
|
||||||
<x-forms.input id="github_app.client_secret" label="Client Secret" type="password" />
|
<x-forms.input id="github_app.client_secret" label="Client Secret" type="password" required />
|
||||||
<x-forms.input id="github_app.webhook_secret" label="Webhook Secret" type="password" />
|
<x-forms.input id="github_app.webhook_secret" label="Webhook Secret" type="password" required />
|
||||||
|
</div>
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<x-forms.select id="github_app.private_key_id" label="Private Key" required>
|
||||||
|
@if (blank($github_app->private_key_id))
|
||||||
|
<option value="0" selected>Select a private key</option>
|
||||||
|
@endif
|
||||||
|
@foreach ($privateKeys as $privateKey)
|
||||||
|
<option value="{{ $privateKey->id }}">{{ $privateKey->name }}</option>
|
||||||
|
@endforeach
|
||||||
|
</x-forms.select>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-end gap-2 ">
|
<div class="flex items-end gap-2 ">
|
||||||
<h2 class="pt-4">Permissions</h2>
|
<h2 class="pt-4">Permissions</h2>
|
||||||
@@ -182,6 +188,15 @@
|
|||||||
shortConfirmationLabel="GitHub App Name" :confirmWithPassword="false" step2ButtonText="Permanently Delete" />
|
shortConfirmationLabel="GitHub App Name" :confirmWithPassword="false" step2ButtonText="Permanently Delete" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
|
<h3>Manual Installation</h3>
|
||||||
|
<div class="flex gap-2 items-center">
|
||||||
|
If you want to fill the form manually, you can continue below. Only for advanced users.
|
||||||
|
<x-forms.button wire:click.prevent="createGithubAppManually">
|
||||||
|
Continue
|
||||||
|
</x-forms.button>
|
||||||
|
</div>
|
||||||
|
<h3>Automated Installation</h3>
|
||||||
<div class=" pb-5 rounded alert-error">
|
<div class=" pb-5 rounded alert-error">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 stroke-current shrink-0" fill="none"
|
<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 stroke-current shrink-0" fill="none"
|
||||||
viewBox="0 0 24 24">
|
viewBox="0 0 24 24">
|
||||||
|
Reference in New Issue
Block a user