mirror of
https://github.com/coollabsio/coolify.git
synced 2026-11-06 13:10:37 -04:00
44 lines
1.5 KiB
PHP
44 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\Models\Scopes;
|
|
|
|
use App\Models\Environment;
|
|
use App\Models\Project;
|
|
use App\Services\Access\AccessResolver;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Scope;
|
|
|
|
/**
|
|
* Hides projects, environments, and resources that the authenticated member or API token has no grant for.
|
|
*
|
|
* It filters only when the actor has no team-wide grant, so owners, admins, team-wide members and tokens,
|
|
* queue workers, and console commands see the same rows as before.
|
|
*/
|
|
class VisibleThroughAccessGrants implements Scope
|
|
{
|
|
public function apply(Builder $builder, Model $model): void
|
|
{
|
|
$resolver = app(AccessResolver::class);
|
|
if ($resolver->isResolving()) {
|
|
return;
|
|
}
|
|
|
|
foreach ($resolver->currentLayers() as $layer) {
|
|
if ($layer->coversWholeTeam()) {
|
|
continue;
|
|
}
|
|
|
|
if ($model instanceof Project) {
|
|
$builder->whereIn($model->qualifyColumn('id'), $layer->visibleProjectIds());
|
|
} elseif ($model instanceof Environment) {
|
|
$builder->whereIn($model->qualifyColumn('id'), $layer->visibleEnvironmentIds());
|
|
} else {
|
|
$builder->where(fn (Builder $query) => $query
|
|
->whereIn($model->qualifyColumn('environment_id'), $layer->fullEnvironmentIds())
|
|
->orWhereIn($model->qualifyColumn('uuid'), $layer->resourceUuids()));
|
|
}
|
|
}
|
|
}
|
|
}
|