$provider_data * @property string $profile * @property ?string $url * @property string $access_token * @property ?int $project_id */ class SourceControl extends AbstractModel { /** @use HasFactory<\Database\Factories\SourceControlFactory> */ use HasFactory; use SoftDeletes; protected $fillable = [ 'provider', 'provider_data', 'profile', 'url', 'access_token', 'project_id', ]; protected $casts = [ 'access_token' => 'encrypted', 'provider_data' => 'encrypted:array', 'project_id' => 'integer', ]; public function provider(): SourceControlProvider { $providerClass = config('core.source_control_providers_class')[$this->provider]; /** @var SourceControlProvider $provider */ $provider = new $providerClass($this); return $provider; } public function getRepo(string $repo): mixed { return $this->provider()->getRepo($repo); } /** * @return HasMany */ public function sites(): HasMany { return $this->hasMany(Site::class); } /** * @return BelongsTo */ public function project(): BelongsTo { return $this->belongsTo(Project::class); } /** * @return Builder */ public static function getByProjectId(int $projectId): Builder { /** @var Builder $query */ $query = static::query(); return $query ->where(function (Builder $query) use ($projectId): void { $query->where('project_id', $projectId)->orWhereNull('project_id'); }); } }