(
defn
set-user-group-memberships!
[
user-or-id
new-user-group-memberships
]
(
let
[
user-id
(
u/the-id
user-or-id
)
old-user-group-memberships
(
user-group-memberships
user-id
)
old-group-id->membership-info
(
user-group-memberships->map
old-user-group-memberships
)
new-group-id->membership-info
(
user-group-memberships->map
(
complete-membership-info
new-user-group-memberships
old-group-id->membership-info
)
)
[
to-remove
to-add
]
(
data/diff
old-group-id->membership-info
new-group-id->membership-info
)
to-remove-group-ids
(
keys
to-remove
)
to-add-group-ids
(
keys
to-add
)
]
(
when
(
or
(
seq
to-remove-group-ids
)
(
seq
to-add-group-ids
)
)
(
when-not
api/*is-superuser?*
(
when-not
(
and
api/*is-group-manager?*
(
set/subset?
(
set
(
concat
to-remove-group-ids
to-add-group-ids
)
)
(
t2/select-fn-set
:group_id
:model/PermissionsGroupMembership
:user_id
api/*current-user-id*
:is_group_manager
true
)
)
)
(
throw
(
ex-info
(
tru
"Not allowed to edit group memberships"
)
{
:status-code
403
}
)
)
)
)
(
t2/with-transaction
[
_conn
]
(
when
(
seq
to-remove-group-ids
)
(
t2/delete!
:model/PermissionsGroupMembership
:user_id
user-id
,
:group_id
[
:in
to-remove-group-ids
]
)
)
(
when
(
seq
to-add-group-ids
)
(
doseq
[
group-id
to-add-group-ids
]
(
t2/insert!
:model/PermissionsGroupMembership
{
:user_id
user-id
:group_id
group-id
:is_group_manager
(
:is_group_manager
(
new-group-id->membership-info
group-id
)
)
}
)
)
)
)
)
)
)