/**
  * Sync permissions với actions được 'định nghĩa' trong các resources model
  *
  * @return \Illuminate\Http\JsonResponse
  */
 public function sync()
 {
     // actions định nghĩa trong các model
     $resource_actions = app('access-control')->getResourceActions();
     $model_actions = [];
     foreach ($resource_actions as $resource => $actions) {
         $model_actions = array_merge($model_actions, array_map(function ($action) use($resource) {
             return "{$resource}.{$action}";
         }, array_keys($actions)));
     }
     // actions đã lưu trên DB (permissions table)
     $db_actions = array_map(function ($permission) {
         return "{$permission['resource']}.{$permission['action']}";
     }, Permission::all()->toArray());
     // có trong DB, nhưng không có trong model ===> remove
     $remove = array_diff($db_actions, $model_actions);
     foreach ($remove as $action) {
         list($resource, $action_name) = explode('.', $action);
         if ($permission = Permission::whereResource($resource)->whereAction($action_name)->first()) {
             // Permission model sẽ tự động xóa liên kết với roles
             $permission->delete();
         }
     }
     // có định nghĩa trong model, nhưng chưa lưu trong DB ===> insert
     $insert = array_diff($model_actions, $db_actions);
     if ($insert) {
         $permissions = array_map(function ($action) {
             list($resource, $action_name) = explode('.', $action);
             return ['resource' => $resource, 'action' => $action_name];
         }, $insert);
         Permission::insert($permissions);
     }
     return response()->json(['type' => 'success', 'content' => trans('access-control::permission.sync_success')]);
 }
 /**
  * Lấy tất cả permisions của các role của user
  * - Đối với từng role, permissions bao gồm của nó và của tất cả role ưcùng role_groupơ nhưng [level < hơn nó]
  *
  * @return \Illuminate\Database\Eloquent\Builder
  */
 public function permissions()
 {
     // Role IDs tất cả roles attach trực tiếp với User + 'Roles cấp dưới của các roles đó'
     $role_ids = [];
     foreach ($this->getRoles() as $role) {
         /** @var \Minhbang\AccessControl\Models\Role $role */
         $role_ids = array_merge($role_ids, $role->getInferiorIds(true));
     }
     $role_ids = $role_ids ?: [-1];
     return Permission::select('permissions.*')->join('permission_role', 'permission_role.permission_id', '=', 'permissions.id')->join('roles', 'roles.id', '=', 'permission_role.role_id')->whereIn('roles.id', $role_ids)->groupBy('permissions.id');
 }
 /**
  * @param \Minhbang\AccessControl\Models\Role $role
  * @param string $ids
  *
  * @return \Illuminate\Http\JsonResponse
  */
 public function attachPermission(Role $role, $ids)
 {
     if ($ids = explode(',', trim($ids))) {
         $all_ids = Permission::all()->pluck('id')->all();
         // Chỉ lấy ids là permissions ID
         $ids = array_filter($ids, function ($id) use($all_ids) {
             return in_array($id, $all_ids);
         });
         // Loại bỏ các permissions đã attach vào $role này rồi
         $ids = array_diff($ids, $role->permissions->pluck('id')->all());
         if ($ids) {
             $role->permissions()->attach($ids);
         }
     }
     return response()->json(['type' => 'success', 'content' => trans('access-control::role.attach_permission_success')]);
 }