d2d.emegrendeles.hu/app/Services/FeatureFlagRegistrar.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;
});
});
}
}