hs.hsadmin.ng/src/main/resources/db/changelog/057-rbac-role-builder.sql

76 lines
2.4 KiB
MySQL
Raw Normal View History

--liquibase formatted sql
-- ============================================================================
-- PERMISSIONS
--changeset rbac-role-builder-to-uuids:1 endDelimiter:--//
-- ----------------------------------------------------------------------------
create or replace function toPermissionUuids(forObjectUuid uuid, permitOps RbacOp[])
returns uuid[]
2022-07-29 08:46:04 +02:00
language plpgsql
strict as $$
begin
return createPermissions(forObjectUuid, permitOps);
2022-07-29 08:46:04 +02:00
end; $$;
2022-07-29 08:46:04 +02:00
-- =================================================================
-- CREATE ROLE
--changeset rbac-role-builder-create-role:1 endDelimiter:--//
-- -----------------------------------------------------------------
create or replace function createRoleWithGrants(
roleDescriptor RbacRoleDescriptor,
permissions RbacOp[] = array[]::RbacOp[],
incomingSuperRoles RbacRoleDescriptor[] = array[]::RbacRoleDescriptor[],
outgoingSubRoles RbacRoleDescriptor[] = array[]::RbacRoleDescriptor[],
userUuids uuid[] = array[]::uuid[],
grantedByRole RbacRoleDescriptor = null
)
2022-07-29 08:46:04 +02:00
returns uuid
called on null input
language plpgsql as $$
declare
roleUuid uuid;
subRoleDesc RbacRoleDescriptor;
superRoleDesc RbacRoleDescriptor;
2022-07-29 08:46:04 +02:00
subRoleUuid uuid;
superRoleUuid uuid;
2022-07-29 08:46:04 +02:00
userUuid uuid;
grantedByRoleUuid uuid;
2022-07-29 08:46:04 +02:00
begin
roleUuid := createRole(roleDescriptor);
if cardinality(permissions) > 0 then
call grantPermissionsToRole(roleUuid, toPermissionUuids(roleDescriptor.objectuuid, permissions));
2022-07-29 08:46:04 +02:00
end if;
foreach superRoleDesc in array array_remove(incomingSuperRoles, null)
loop
superRoleUuid := getRoleId(superRoleDesc);
call grantRoleToRole(roleUuid, superRoleUuid, superRoleDesc.assumed);
end loop;
2022-07-29 08:46:04 +02:00
foreach subRoleDesc in array array_remove(outgoingSubRoles, null)
loop
subRoleUuid := getRoleId(subRoleDesc);
call grantRoleToRole(subRoleUuid, roleUuid, subRoleDesc.assumed);
end loop;
if cardinality(userUuids) > 0 then
if grantedByRole is null then
grantedByRoleUuid := roleUuid;
else
grantedByRoleUuid := getRoleId(grantedByRole);
end if;
foreach userUuid in array userUuids
2022-07-29 08:46:04 +02:00
loop
call grantRoleToUserUnchecked(grantedByRoleUuid, roleUuid, userUuid);
2022-07-29 08:46:04 +02:00
end loop;
end if;
return roleUuid;
end; $$;
--//