/** * @param array $ids list of contact (if positive) or group (if negative) ids. * @return array id => admin|custom; for users with no access at all there's no key=>value pair. */ public function getAccessStatus($ids) { if (!$ids) { return array(); } // Additional groups we need to get access info for. // $group_ids = list of (negative) group ids that users from $ids are members of. $user_groups_model = new waUserGroupsModel(); $user_group = $user_groups_model->getGroupIdsForUsers($ids); // ignores negative ids, so it's ok to pass group ids there $group_ids = array(); foreach ($user_group as $user_group_ids) { $group_ids = array_merge($group_ids, $user_group_ids); } $group_ids = array_map(wa_lambda('$a', 'return -$a;'), $group_ids); $sql = "SELECT -group_id AS id, MAX(CASE app_id WHEN 'webasyst' THEN 2 ELSE 1 END) AS status\n FROM `{$this->table}`\n WHERE -group_id IN (i:ids) AND name='backend'\n GROUP BY group_id"; $result = $this->query($sql, array('ids' => array_merge($ids, $group_ids)))->fetchAll('id', true); // update result considering group rights for users foreach ($ids as $id) { if (!isset($result[$id])) { $result[$id] = 0; } if (isset($user_group[$id]) && $result[$id] <= 1) { foreach ($user_group[$id] as $gid) { if (isset($result[-$gid]) && $result[-$gid] > $result[$id]) { $result[$id] = $result[-$gid]; } if ($result[$id] > 1) { break; } } } if ($result[$id]) { $result[$id] = $result[$id] > 1 ? 'admin' : 'custom'; } else { unset($result[$id]); } } // Remove from results all groups that we added temporary foreach ($group_ids as $gid) { if (isset($result[$gid])) { unset($result[$gid]); } } return $result; }