001_base.sql
1-- schema/001_base.sql
2-- +goose Up
3-- +goose StatementBegin
4CREATE TABLE IF NOT EXISTS permissions (
5 resource_type TEXT NOT NULL,
6 resource_id INTEGER,
7 user_id INTEGER,
8 attribute_id INTEGER,
9 permissions INTEGER NOT NULL
10);
11
12CREATE TABLE IF NOT EXISTS attributes (key TEXT NOT NULL, value BLOB NOT NULL);
13
14CREATE TABLE IF NOT EXISTS attribute_user (
15 attribute_id INTEGER NOT NULL,
16 user_id INTEGER NOT NULL
17);
18
19CREATE VIEW IF NOT EXISTS abac (resource_type, resource_id, user_id, permissions) AS
20SELECT
21 permissions.resource_type,
22 permissions.resource_id,
23 COALESCE(permissions.user_id, attribute_user.user_id) AS user_id,
24 permissions.permissions
25FROM
26 permissions
27 LEFT JOIN attribute_user USING (attribute_id);
28
29CREATE UNIQUE INDEX IF NOT EXISTS permission_idx_user ON permissions (resource_type, resource_id, user_id)
30WHERE
31 attribute_id IS NULL;
32
33CREATE UNIQUE INDEX IF NOT EXISTS permission_idx_att ON permissions (resource_type, resource_id, attribute_id)
34WHERE
35 user_id IS NULL;
36
37CREATE UNIQUE INDEX IF NOT EXISTS permission_idx_def_res ON permissions (resource_type, resource_id)
38WHERE
39 user_id IS NULL
40 AND attribute_id IS NULL;
41
42CREATE UNIQUE INDEX IF NOT EXISTS permission_idx_def_type ON permissions (resource_type)
43WHERE
44 resource_id IS NULL
45 AND user_id IS NULL
46 AND attribute_id IS NULL;
47
48CREATE UNIQUE INDEX IF NOT EXISTS attribute_user_idx ON attribute_user (attribute_id, user_id);
49
50CREATE UNIQUE INDEX IF NOT EXISTS attribute_idx ON attributes (key, value);
51-- +goose StatementEnd
52
53-- +goose Down
54-- +goose StatementBegin
55DROP TABLE permissions;
56DROP TABLE attributes;
57DROP TABLE attribute_user;
58DROP INDEX permission_idx_user;
59DROP INDEX permission_idx_att;
60DROP INDEX permission_idx_def_res;
61DROP INDEX permission_idx_def_type;
62DROP INDEX attribute_user_idx;
63DROP INDEX attribute_idx;
64-- +goose StatementEnd
65