Michael Hoennig
2022-10-29 ddfabef9b76f1d20b28f57def8ab6027d1deebb2
commit | author | age
7f5b23 1 --liquibase formatted sql
MH 2
3 -- ============================================================================
bece97 4 --changeset hs-office-sepamandate-rbac-OBJECT:1 endDelimiter:--//
7f5b23 5 -- ----------------------------------------------------------------------------
bece97 6 call generateRelatedRbacObject('hs_office_sepamandate');
7f5b23 7 --//
MH 8
9
10 -- ============================================================================
bece97 11 --changeset hs-office-sepamandate-rbac-ROLE-DESCRIPTORS:1 endDelimiter:--//
7f5b23 12 -- ----------------------------------------------------------------------------
bece97 13 call generateRbacRoleDescriptors('hsOfficeSepaMandate', 'hs_office_sepamandate');
7f5b23 14 --//
MH 15
16
17 -- ============================================================================
bece97 18 --changeset hs-office-sepamandate-rbac-ROLES-CREATION:1 endDelimiter:--//
7f5b23 19 -- ----------------------------------------------------------------------------
MH 20
21 /*
22     Creates and updates the roles and their assignments for sepaMandate entities.
23  */
24
25 create or replace function hsOfficeSepaMandateRbacRolesTrigger()
26     returns trigger
27     language plpgsql
28     strict as $$
29 declare
30     newHsOfficeDebitor      hs_office_debitor;
31     newHsOfficeBankAccount  hs_office_bankAccount;
32 begin
33
34     select * from hs_office_debitor as p where p.uuid = NEW.debitorUuid into newHsOfficeDebitor;
35     select * from hs_office_bankAccount as c where c.uuid = NEW.bankAccountUuid into newHsOfficeBankAccount;
36
37     if TG_OP = 'INSERT' then
38
39         -- === ATTENTION: code generated from related Mermaid flowchart: ===
40
41         perform createRoleWithGrants(
42                 hsOfficeSepaMandateOwner(NEW),
43                 permissions => array['*'],
44                 incomingSuperRoles => array[globalAdmin()]
45             );
46
47         perform createRoleWithGrants(
48                 hsOfficeSepaMandateAdmin(NEW),
49                 permissions => array['edit'],
50                 incomingSuperRoles => array[hsOfficeSepaMandateOwner(NEW)],
51                 outgoingSubRoles => array[hsOfficeBankAccountTenant(newHsOfficeBankAccount)]
52             );
53
54         perform createRoleWithGrants(
55                 hsOfficeSepaMandateAgent(NEW),
56                 incomingSuperRoles => array[hsOfficeSepaMandateAdmin(NEW), hsOfficeDebitorAdmin(newHsOfficeDebitor), hsOfficeBankAccountAdmin(newHsOfficeBankAccount)],
57                 outgoingSubRoles => array[hsOfficeDebitorTenant(newHsOfficeDebitor)]
58             );
59
60         perform createRoleWithGrants(
61                 hsOfficeSepaMandateTenant(NEW),
62                 incomingSuperRoles => array[hsOfficeSepaMandateAgent(NEW)],
63                 outgoingSubRoles => array[hsOfficeDebitorGuest(newHsOfficeDebitor), hsOfficeBankAccountGuest(newHsOfficeBankAccount)]
64             );
65
66         perform createRoleWithGrants(
67                 hsOfficeSepaMandateGuest(NEW),
68                 permissions => array['view'],
69                 incomingSuperRoles => array[hsOfficeSepaMandateTenant(NEW)]
70             );
71
72         -- === END of code generated from Mermaid flowchart. ===
73
74     else
75         raise exception 'invalid usage of TRIGGER';
76     end if;
77
78     return NEW;
79 end; $$;
80
81 /*
82     An AFTER INSERT TRIGGER which creates the role structure for a new customer.
83  */
84 create trigger createRbacRolesForHsOfficeSepaMandate_Trigger
85     after insert
bece97 86     on hs_office_sepamandate
7f5b23 87     for each row
MH 88 execute procedure hsOfficeSepaMandateRbacRolesTrigger();
89 --//
90
91
92 -- ============================================================================
bece97 93 --changeset hs-office-sepamandate-rbac-IDENTITY-VIEW:1 endDelimiter:--//
7f5b23 94 -- ----------------------------------------------------------------------------
bece97 95 call generateRbacIdentityView('hs_office_sepamandate', idNameExpression => 'target.reference');
7f5b23 96 --//
MH 97
98
99 -- ============================================================================
bece97 100 --changeset hs-office-sepamandate-rbac-RESTRICTED-VIEW:1 endDelimiter:--//
7f5b23 101 -- ----------------------------------------------------------------------------
bece97 102 call generateRbacRestrictedView('hs_office_sepamandate',
7f5b23 103     orderby => 'target.reference',
MH 104     columnUpdates => $updates$
ddfabe 105         reference = new.reference,
64461f 106         agreement = new.agreement,
7f5b23 107         validity = new.validity
MH 108     $updates$);
109 --//
110
111
112 -- ============================================================================
bece97 113 --changeset hs-office-sepamandate-rbac-NEW-SepaMandate:1 endDelimiter:--//
7f5b23 114 -- ----------------------------------------------------------------------------
MH 115 /*
116     Creates a global permission for new-sepaMandate and assigns it to the hostsharing admins role.
117  */
118 do language plpgsql $$
119     declare
120         addCustomerPermissions uuid[];
121         globalObjectUuid       uuid;
122         globalAdminRoleUuid    uuid ;
123     begin
124         call defineContext('granting global new-sepaMandate permission to global admin role', null, null, null);
125
126         globalAdminRoleUuid := findRoleId(globalAdmin());
127         globalObjectUuid := (select uuid from global);
128         addCustomerPermissions := createPermissions(globalObjectUuid, array ['new-sepamandate']);
129         call grantPermissionsToRole(globalAdminRoleUuid, addCustomerPermissions);
130     end;
131 $$;
132
133 /**
134     Used by the trigger to prevent the add-customer to current user respectively assumed roles.
135  */
136 create or replace function addHsOfficeSepaMandateNotAllowedForCurrentSubjects()
137     returns trigger
138     language PLPGSQL
139 as $$
140 begin
141     raise exception '[403] new-sepaMandate not permitted for %',
142         array_to_string(currentSubjects(), ';', 'null');
143 end; $$;
144
145 /**
146     Checks if the user or assumed roles are allowed to create a new customer.
147  */
bece97 148 create trigger hs_office_sepamandate_insert_trigger
7f5b23 149     before insert
bece97 150     on hs_office_sepamandate
7f5b23 151     for each row
MH 152     -- TODO.spec: who is allowed to create new sepaMandates
153     when ( not hasAssumedRole() )
154 execute procedure addHsOfficeSepaMandateNotAllowedForCurrentSubjects();
155 --//
156