diff --git a/framework/core/src/Extend/Permission.php b/framework/core/src/Extend/Permission.php index d6a82efb7..0a8e99529 100644 --- a/framework/core/src/Extend/Permission.php +++ b/framework/core/src/Extend/Permission.php @@ -2,18 +2,55 @@ use Illuminate\Foundation\Application; use Flarum\Core\Models\Permission as PermissionModel; +use Flarum\Extend\SerializeAttributes; class Permission implements ExtenderInterface { protected $permission; + protected $serialize = false; + + protected $grant = []; + public function __construct($permission) { $this->permission = $permission; } + public function serialize($serialize = true) + { + $this->serialize = $serialize; + + return $this; + } + + public function grant($callback) + { + $this->grant[] = $callback; + + return $this; + } + public function extend(Application $app) { PermissionModel::addPermission($this->permission); + + list($entity, $permission) = explode('.', $this->permission); + + if ($this->serialize) { + $extender = new SerializeAttributes( + 'Flarum\Api\Serializers\\'.ucfirst($entity).'Serializer', + function (&$attributes, $model, $serializer) use ($permission) { + $attributes['can'.ucfirst($permission)] = (bool) $model->can($serializer->actor->getUser(), $permission); + } + ); + + $extender->extend($app); + } + + foreach ($this->grant as $callback) { + $model = 'Flarum\Core\Models\\'.ucfirst($entity); + $model::grantPermission($permission, $callback); + } } } diff --git a/framework/core/src/Extend/SerializeAttributes.php b/framework/core/src/Extend/SerializeAttributes.php index 7e118f6f9..d359ef1c6 100644 --- a/framework/core/src/Extend/SerializeAttributes.php +++ b/framework/core/src/Extend/SerializeAttributes.php @@ -19,7 +19,7 @@ class SerializeAttributes implements ExtenderInterface { $app['events']->listen('Flarum\Api\Events\SerializeAttributes', function ($event) { if ($event->serializer instanceof $this->serializer) { - call_user_func($this->callback, $event->attributes, $event->model, $event->serializer); + call_user_func_array($this->callback, [&$event->attributes, $event->model, $event->serializer]); } }); }