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