parent::delete()); } protected $fillable = [ 'team_id', 'private_key_id', 'name', 'organization', 'api_url', 'html_url', 'custom_user', 'custom_port', 'app_id', 'installation_id', 'client_id', 'client_secret', 'webhook_secret', 'is_system_wide', 'is_public', 'contents', 'metadata', 'pull_requests', 'administration', ]; protected $appends = ['type']; protected $casts = [ 'is_public' => 'boolean', 'is_system_wide' => 'boolean', 'type' => 'string', ]; protected $hidden = [ 'client_secret', 'webhook_secret', ]; protected static function booted(): void { static::deleting(function (GithubApp $github_app) { $applications_count = Application::where('source_id', $github_app->id)->count(); if ($applications_count > 0) { throw new \Exception('You cannot delete this GitHub App because it is in use by '.$applications_count.' application(s). Delete them first.'); } $privateKey = $github_app->privateKey; if ($privateKey) { // Check if key is used by anything EXCEPT this GitHub app $isUsedElsewhere = $privateKey->servers()->exists() || $privateKey->applications()->exists() || $privateKey->githubApps()->where('id', '!=', $github_app->id)->exists() || $privateKey->gitlabApps()->exists(); if (! $isUsedElsewhere) { $privateKey->delete(); } else { } } }); } public static function ownedByCurrentTeam() { return GithubApp::where(function ($query) { $query->where('team_id', currentTeam()->id) ->orWhere('is_system_wide', true); }); } public function team() { return $this->belongsTo(Team::class); } public function applications() { return $this->morphMany(Application::class, 'source'); } public function privateKey() { return $this->belongsTo(PrivateKey::class); } public function type(): Attribute { return Attribute::make( get: function () { if ($this->getMorphClass() === GithubApp::class) { return 'github'; } }, ); } /** * A private GitHub App is connected once it has been registered and installed. * Public sources do not require installation credentials. */ public function isConnected(): bool { if ($this->is_public) { return true; } return filled($this->app_id) && filled($this->installation_id); } }