54 lines
1.8 KiB
PHP
54 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\FeatureFlag;
|
|
use App\Models\FeatureFlagOverride;
|
|
use App\Models\User;
|
|
use Laravel\Pennant\Feature;
|
|
|
|
class FeatureFlagRegistrar
|
|
{
|
|
/**
|
|
* Regisztrálja az összes adatbázisban tárolt feature flaget a Pennant-ban.
|
|
*
|
|
* Az egyéni felhasználói felülbírálásokat szándékosan NEM a Pennant saját
|
|
* tárolóján (Feature::for($user)->activate()) keresztül kezeljük, mert a
|
|
* Pennant purge() minden scope-ra töröl egy adott flag névre - egy admin
|
|
* mentés (pl. enabled kikapcsolása) így törölné az explicit felülbírálásokat
|
|
* is. Ezért az override-okat saját táblában tároljuk, a resolver pedig ezt
|
|
* nézi meg elsőként; a Pennant tárolója így csak a szabály-alapú
|
|
* alapértelmezett feloldást cache-eli, amit bármikor biztonságos purge-elni.
|
|
*/
|
|
public function registerAll(): void
|
|
{
|
|
FeatureFlag::all()->each(function (FeatureFlag $flag) {
|
|
Feature::define($flag->name, function (?User $user) use ($flag) {
|
|
if ($user) {
|
|
$override = FeatureFlagOverride::where('feature_flag_id', $flag->id)
|
|
->where('user_id', $user->id)
|
|
->first();
|
|
|
|
if ($override) {
|
|
return $override->active;
|
|
}
|
|
}
|
|
|
|
if (! $flag->enabled) {
|
|
return false;
|
|
}
|
|
|
|
if ($flag->stages && ! in_array(config('app.stage'), $flag->stages, true)) {
|
|
return false;
|
|
}
|
|
|
|
if ($flag->roles && (! $user || ! $user->hasRole($flag->roles))) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
});
|
|
});
|
|
}
|
|
}
|