|
| 1 | +-- The previous user_has_project_permission function is called on _every_ project when doing global omnisearch, |
| 2 | +-- which is too slow. |
| 3 | + |
| 4 | +-- Create a view which serves as join table for finding projects we should consider in search, it's much faster |
| 5 | +-- than running a permission check for every private project. |
| 6 | +CREATE FUNCTION projects_searchable_by_user(arg_user_id UUID) |
| 7 | +-- Returns a subset of the projects table |
| 8 | +RETURNS SETOF projects AS $$ |
| 9 | + -- Get all public projects and projects owned by the user, |
| 10 | + -- as well as all public projects. |
| 11 | + SELECT p.* |
| 12 | + FROM projects p |
| 13 | + WHERE p.owner_user_id = arg_user_id |
| 14 | + OR NOT p.private |
| 15 | +UNION |
| 16 | + SELECT |
| 17 | + p.* |
| 18 | + FROM org_members om |
| 19 | + JOIN projects p |
| 20 | + ON om.organization_user_id = p.owner_user_id |
| 21 | + JOIN roles r ON om.role_id = r.id |
| 22 | + WHERE om.member_user_id = arg_user_id |
| 23 | + AND 'project:view' = ANY(r.permissions) |
| 24 | + -- All public projects are already included above |
| 25 | + AND p.private |
| 26 | + UNION |
| 27 | + -- Include projects the user is a direct maintainer of |
| 28 | + SELECT |
| 29 | + p.* |
| 30 | + FROM users u |
| 31 | + JOIN role_memberships rm ON u.subject_id = rm.subject_id |
| 32 | + JOIN roles r ON rm.role_id = r.id |
| 33 | + JOIN projects p ON rm.resource_id = p.resource_id |
| 34 | + WHERE u.id = arg_user_id |
| 35 | + AND 'project:view' = ANY(r.permissions) |
| 36 | + AND p.private; |
| 37 | +$$ LANGUAGE sql STABLE PARALLEL SAFE; |
| 38 | + |
| 39 | +-- A better index for this query. |
| 40 | +-- CREATE INDEX idx_projects_by_owner_and_privacy |
| 41 | +-- ON projects (private, owner_user_id); |
| 42 | + |
| 43 | +CREATE INDEX idx_public_projects_by_owner |
| 44 | + ON projects (owner_user_id) |
| 45 | + WHERE NOT private; |
| 46 | + |
| 47 | +CREATE INDEX idx_private_projects_by_owner |
| 48 | + ON projects (owner_user_id) |
| 49 | + WHERE private; |
0 commit comments