public function saveContext(string $cabin, int $contextId, array $post) : bool
{
$actions = $this->getActionNames($cabin);
$actionIds = \array_flip($actions);
$post['group_perms'] = $this->permBoolean($post['group_perms'] ?? [], $actions);
$post['user_perms'] = $this->permBoolean($post['user_perms'] ?? [], $actions);
$groupPerms = $this->getGroupRulesForContextSave($actions, $contextId);
$userPerms = $this->getUserRulesForContextSave($actions, $contextId);
// Sort then diff group permissions:
\ksort($groupPerms);
\ksort($post['group_perms']);
$groupInsert = \Airship\array_multi_diff($post['group_perms'], $groupPerms);
$groupDelete = \Airship\array_multi_diff($groupPerms, $post['group_perms']);
// Sort then diff user permissions:
\ksort($userPerms);
\ksort($post['user_perms']);
$userInsert = \Airship\array_multi_diff($post['user_perms'], $userPerms);
$userDelete = \Airship\array_multi_diff($userPerms, $post['user_perms']);
$this->db->beginTransaction();
// Update the locator
$this->db->update('airship_perm_contexts', ['locator' => $post['context']], ['cabin' => $cabin, 'contextid' => $contextId]);
// Insert then delete rules based on the changes made:
// Insert new group rules:
foreach ($groupInsert as $group => $inserts) {
foreach ($inserts as $lbl => $val) {
if ($val) {
$this->db->insert('airship_perm_rules', ['context' => $contextId, 'groupid' => $group, 'action' => $actionIds[$lbl]]);
}
}
}
// Delete old group rules:
foreach ($groupDelete as $group => $deletes) {
foreach ($deletes as $lbl => $val) {
if ($val) {
$this->db->delete('airship_perm_rules', ['context' => $contextId, 'groupid' => $group, 'action' => $actionIds[$lbl]]);
}
}
}
// Insert new user rules:
foreach ($userInsert as $user => $inserts) {
foreach ($inserts as $lbl => $val) {
if ($val) {
$this->db->insert('airship_perm_rules', ['context' => $contextId, 'userid' => $user, 'action' => $actionIds[$lbl]]);
}
}
}
// Delete old user rules:
foreach ($userDelete as $user => $deletes) {
foreach ($deletes as $lbl => $val) {
if ($val) {
$this->db->delete('airship_perm_rules', ['context' => $contextId, 'userid' => $user, 'action' => $actionIds[$lbl]]);
}
}
}
return $this->db->commit();
}