CREATE OR REPLACE FUNCTION policy.save_menu_policy(_user_id integer, _office_id integer, _menu_ids integer[])
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
DELETE FROM policy.menu_access
WHERE NOT policy.menu_access.menu_id = ANY(_menu_ids)
AND user_id = _user_id
AND office_id = _office_id;
WITH menus
AS
(
SELECT explode_array(_menu_ids) AS _menu_id
)
INSERT INTO policy.menu_access(user_id, office_id, menu_id)
SELECT _user_id, _office_id, _menu_id
FROM menus
WHERE _menu_id NOT IN
(
SELECT menu_id
FROM policy.menu_access
WHERE policy.menu_access.user_id = _user_id
AND policy.menu_access.office_id = _office_id
);
RETURN;
END
$function$