Merge branch '8784-dir-listings'
[arvados.git] / services / api / lib / create_permission_view.sql
1 -- Copyright (C) The Arvados Authors. All rights reserved.
2 --
3 -- SPDX-License-Identifier: AGPL-3.0
4
5 CREATE TEMPORARY VIEW permission_view AS
6 WITH RECURSIVE
7 perm_value (name, val) AS (
8      VALUES
9      ('can_read',   1::smallint),
10      ('can_login',  1),
11      ('can_write',  2),
12      ('can_manage', 3)
13      ),
14 perm_edges (tail_uuid, head_uuid, val, follow) AS (
15        SELECT links.tail_uuid,
16               links.head_uuid,
17               pv.val,
18               (pv.val = 3 OR groups.uuid IS NOT NULL) AS follow
19               FROM links
20               LEFT JOIN perm_value pv ON pv.name = links.name
21               LEFT JOIN groups ON pv.val<3 AND groups.uuid = links.head_uuid
22               WHERE links.link_class = 'permission'
23        UNION ALL
24        SELECT owner_uuid, uuid, 3, true FROM groups
25        ),
26 perm (val, follow, user_uuid, target_uuid) AS (
27      SELECT 3::smallint             AS val,
28             true                    AS follow,
29             users.uuid::varchar(32) AS user_uuid,
30             users.uuid::varchar(32) AS target_uuid
31             FROM users
32      UNION
33      SELECT LEAST(perm.val, edges.val)::smallint AS val,
34             edges.follow                         AS follow,
35             perm.user_uuid::varchar(32)          AS user_uuid,
36             edges.head_uuid::varchar(32)         AS target_uuid
37             FROM perm
38             INNER JOIN perm_edges edges
39             ON perm.follow AND edges.tail_uuid = perm.target_uuid
40 )
41 SELECT user_uuid,
42        target_uuid,
43        val AS perm_level,
44        CASE follow WHEN true THEN target_uuid ELSE NULL END AS target_owner_uuid
45        FROM perm;