刘光辉
4 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jnpf.dmsMapper.DmsUserFolderPermissionTreeMapper">
    <resultMap id="TreeRow" type="jnpf.dmsEntity.permission.model.DmsUserFolderPermissionTreeRow">
        <id column="id" property="id" typeHandler="jnpf.dmsDatabase.DmsUuidTypeHandler"/>
        <result column="parent_id" property="parentId" typeHandler="jnpf.dmsDatabase.DmsUuidTypeHandler"/>
        <result column="name" property="name"/>
        <result column="sort_code" property="sortCode"/>
        <result column="has_children" property="hasChildren"/>
        <result column="user_id" property="userId"/>
        <result column="action_code" property="actionCode"/>
    </resultMap>
 
    <!-- Shared by the administrator tree and current-user business queries. -->
    <sql id="MatchedFolderPermissions">
        matched_folder_permissions(user_id, folder_id, resource_scope, action_code) AS (
            SELECT DISTINCT ip.user_id, granted.id, p.resource_scope, p.action_code
            FROM public.dms_file_permissions p
            JOIN input_principals ip
              ON ip.principal_id = p.principal_id
             AND (
                    (p.principal_type = 'USER' AND ip.principal_kind = 'USER')
                 OR (p.principal_type = 'ORG' AND p.include_child_orgs = FALSE
                     AND ip.principal_kind = 'ORG_DIRECT')
                 OR (p.principal_type = 'ORG' AND p.include_child_orgs = TRUE
                     AND ip.principal_kind = 'ORG_ANCESTOR')
                 OR (p.principal_type = 'POSITION' AND ip.principal_kind = 'POSITION')
                 OR (p.principal_type = 'ROLE' AND ip.principal_kind = 'ROLE')
                 OR (p.principal_type = 'GROUP' AND ip.principal_kind = 'GROUP')
             )
            JOIN public.dms_folders granted
              ON granted.tenant_id = p.tenant_id
             AND granted.id = p.resource_id
             AND granted.f_delete_mark IS NULL
            WHERE p.tenant_id = #{q.tenantId}
              AND p.resource_type = 'FOLDER'
              AND p.resource_scope IN ('SELF', 'SUBTREE')
              AND p.action_code IN ('READ', 'PRINT')
              AND p.revoked_at IS NULL
              AND p.valid_from &lt;= CURRENT_TIMESTAMP
              AND (p.valid_to IS NULL OR CURRENT_TIMESTAMP &lt; p.valid_to)
              AND (p.max_use_count IS NULL OR p.used_count &lt; p.max_use_count)
        )
    </sql>
 
    <resultMap id="FolderId" type="jnpf.dmsEntity.permission.model.DmsUserFolderPermissionTreeRow">
        <id column="id" property="id" typeHandler="jnpf.dmsDatabase.DmsUuidTypeHandler"/>
    </resultMap>
 
    <!-- Separate personal scope: application grants do not authorize an entire folder. -->
    <select id="selectWorkflowPrintVersions" resultMap="FolderId">
        SELECT DISTINCT p.resource_id AS id
        FROM public.dms_file_permissions p
        WHERE p.tenant_id = #{tenantId}
          AND p.principal_type = 'USER' AND p.principal_id = #{userId}
          AND p.resource_type = 'FILE_VERSION' AND p.resource_scope = 'SELF'
          AND p.action_code = 'PRINT' AND p.source_type = 'WORKFLOW'
          AND p.revoked_at IS NULL
          AND p.valid_from &lt;= CURRENT_TIMESTAMP
          AND (p.valid_to IS NULL OR CURRENT_TIMESTAMP &lt; p.valid_to)
          AND (p.max_use_count IS NULL OR p.used_count &lt; p.max_use_count)
        ORDER BY id
    </select>
 
    <select id="selectPrintFolders" resultMap="FolderId">
        WITH RECURSIVE input_principals(user_id, principal_kind, principal_id) AS (
            SELECT item -&gt;&gt; 'userId', item -&gt;&gt; 'principalKind', item -&gt;&gt; 'principalId'
            FROM jsonb_array_elements(CAST(#{q.principalsJson} AS jsonb)) item
        ),
        <include refid="MatchedFolderPermissions"/>,
        effective_folders(id, inheritable) AS (
            SELECT folder_id, resource_scope = 'SUBTREE'
            FROM matched_folder_permissions WHERE action_code = 'PRINT'
            UNION
            SELECT child.id, TRUE
            FROM effective_folders parent
            JOIN public.dms_folders child ON child.tenant_id = #{q.tenantId}
                AND child.parent_id = parent.id AND child.f_delete_mark IS NULL
            WHERE parent.inheritable
        )
        SELECT DISTINCT id FROM effective_folders ORDER BY id
    </select>
 
    <select id="selectTree" resultMap="TreeRow">
        WITH RECURSIVE input_principals(user_id, principal_kind, principal_id) AS (
            SELECT item -&gt;&gt; 'userId', item -&gt;&gt; 'principalKind', item -&gt;&gt; 'principalId'
            FROM jsonb_array_elements(CAST(#{q.principalsJson} AS jsonb)) item
        ),
        parent_ancestors(id, parent_id) AS (
            <choose>
                <when test="q.parentId != null">
                    SELECT folder.id, folder.parent_id
                    FROM public.dms_folders folder
                    WHERE folder.tenant_id = #{q.tenantId}
                      AND folder.id = #{q.parentId}
                      AND folder.f_delete_mark IS NULL
                </when>
                <otherwise>
                    SELECT NULL::UUID, NULL::UUID WHERE FALSE
                </otherwise>
            </choose>
            UNION
            SELECT parent.id, parent.parent_id
            FROM parent_ancestors child
            JOIN public.dms_folders parent
              ON parent.tenant_id = #{q.tenantId}
             AND parent.id = child.parent_id
             AND parent.f_delete_mark IS NULL
        ),
        <include refid="MatchedFolderPermissions"/>,
        navigation_ancestors(id, parent_id) AS (
            SELECT DISTINCT folder.id, folder.parent_id
            FROM matched_folder_permissions permission
            JOIN public.dms_folders folder
              ON folder.tenant_id = #{q.tenantId}
             AND folder.id = permission.folder_id
             AND folder.f_delete_mark IS NULL
            UNION
            SELECT parent.id, parent.parent_id
            FROM navigation_ancestors child
            JOIN public.dms_folders parent
              ON parent.tenant_id = #{q.tenantId}
             AND parent.id = child.parent_id
             AND parent.f_delete_mark IS NULL
        ),
        page_folders AS (
            SELECT folder.id, folder.parent_id, folder.name, folder.sort_code
            FROM public.dms_folders folder
            WHERE folder.tenant_id = #{q.tenantId}
              AND folder.f_delete_mark IS NULL
            <choose>
                <when test="q.parentId == null">AND folder.parent_id IS NULL</when>
                <otherwise>AND folder.parent_id = #{q.parentId}</otherwise>
            </choose>
              AND (
                    folder.id IN (SELECT visible.id FROM navigation_ancestors visible)
                    OR EXISTS (
                        SELECT 1
                        FROM matched_folder_permissions inherited
                        WHERE inherited.resource_scope = 'SUBTREE'
                          AND inherited.folder_id IN (SELECT ancestor.id FROM parent_ancestors ancestor)
                    )
              )
            <if test="q.cursorSortCode != null">
                AND (folder.sort_code &gt; #{q.cursorSortCode}
                     OR (folder.sort_code = #{q.cursorSortCode} AND folder.id &gt; #{q.cursorId}))
            </if>
            ORDER BY folder.sort_code, folder.id
            LIMIT #{q.limit}
        ),
        effective_page_permissions(user_id, folder_id, action_code) AS (
            SELECT DISTINCT permission.user_id, folder.id, permission.action_code
            FROM page_folders folder
            JOIN matched_folder_permissions permission
              ON permission.folder_id = folder.id
              OR (
                    permission.resource_scope = 'SUBTREE'
                    AND permission.folder_id IN (
                        SELECT ancestor.id FROM parent_ancestors ancestor
                    )
              )
        )
        SELECT folder.id,
               folder.parent_id,
               folder.name,
               folder.sort_code,
               EXISTS (
                   SELECT 1
                   FROM public.dms_folders child
                   WHERE child.tenant_id = #{q.tenantId}
                     AND child.parent_id = folder.id
                     AND child.f_delete_mark IS NULL
                     AND (
                            child.id IN (SELECT visible.id FROM navigation_ancestors visible)
                            OR EXISTS (
                                SELECT 1
                                FROM matched_folder_permissions inherited
                                WHERE inherited.resource_scope = 'SUBTREE'
                                  AND (
                                        inherited.folder_id = folder.id
                                        OR inherited.folder_id IN (
                                            SELECT ancestor.id FROM parent_ancestors ancestor
                                        )
                                  )
                            )
                     )
               ) AS has_children,
               permission.user_id,
               permission.action_code
        FROM page_folders folder
        LEFT JOIN effective_page_permissions permission ON permission.folder_id = folder.id
        ORDER BY folder.sort_code, folder.id, permission.user_id, permission.action_code
    </select>
</mapper>