}
/**
- * Checks if a user has a book or chapter available to create a page
- * @param Ownable $ownable
- * @param $permission
+ * Checks if a user has the given permission for any items in the system.
+ * Can be passed an entity instance to filter on a specific type.
+ * @param string $permission
+ * @param string $entityClass
* @return bool
*/
- public function checkAvailableCreatePageAccess()
+ public function checkUserHasPermissionOnAnything(string $permission, string $entityClass = null)
{
- $userRoleIds = $this->currentUser()->roles()->pluck('id')->toArray();
+ $userRoleIds = $this->currentUser()->roles()->select('id')->pluck('id')->toArray();
$userId = $this->currentUser()->id;
-
- $canCreatePage = $this->db->table('joint_permissions')
- ->where('action', '=', 'page-create')
+ $permissionQuery = $this->db->table('joint_permissions')
+ ->where('action', '=', $permission)
->whereIn('role_id', $userRoleIds)
->where(function ($query) use ($userId) {
$query->where('has_permission', '=', 1)
- ->orWhere(function ($query2) use ($userId) {
- $query2->where('has_permission_own', '=', 1)
- ->where('created_by', '=', $userId);
- });
- })
- ->get()->count() > 0;
+ ->orWhere(function ($query2) use ($userId) {
+ $query2->where('has_permission_own', '=', 1)
+ ->where('created_by', '=', $userId);
+ });
+ });
+
+ if (!is_null($entityClass)) {
+ $entityInstance = app()->make($entityClass);
+ $permissionQuery = $permissionQuery->where('entity_type', '=', $entityInstance->getMorphClass());
+ }
- return $canCreatePage;
+ $hasPermission = $permissionQuery->count() > 0;
+ $this->clean();
+ return $hasPermission;
}
/**
* @param string $entityIdColumn
* @param string $entityTypeColumn
* @param string $action
- * @return mixed
+ * @return QueryBuilder
*/
public function filterRestrictedEntityRelations($query, $tableName, $entityIdColumn, $entityTypeColumn, $action = 'view')
{
}
/**
- * Filters pages that are a direct relation to another item.
+ * Add conditions to a query to filter the selection to related entities
+ * where permissions are granted.
+ * @param $entityType
* @param $query
* @param $tableName
* @param $entityIdColumn
* @return mixed
*/
- public function filterRelatedPages($query, $tableName, $entityIdColumn)
+ public function filterRelatedEntity($entityType, $query, $tableName, $entityIdColumn)
{
$this->currentAction = 'view';
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn];
- $pageMorphClass = $this->entityProvider->page->getMorphClass();
+ $pageMorphClass = $this->entityProvider->get($entityType)->getMorphClass();
+
$q = $query->where(function ($query) use ($tableDetails, $pageMorphClass) {
$query->where(function ($query) use (&$tableDetails, $pageMorphClass) {
$query->whereExists(function ($permissionQuery) use (&$tableDetails, $pageMorphClass) {
});
})->orWhere($tableDetails['entityIdColumn'], '=', 0);
});
+
$this->clean();
+
return $q;
}