16007: Remove 'trashed' from permission computation
authorPeter Amstutz <peter.amstutz@curii.com>
Mon, 4 May 2020 20:34:24 +0000 (16:34 -0400)
committerPeter Amstutz <peter.amstutz@curii.com>
Mon, 4 May 2020 20:34:24 +0000 (16:34 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curii.com>

services/api/app/models/user.rb
services/api/db/migrate/20200501150153_permission_table.rb

index dd447ca51a895fa2297d6860002a52ff7f360037..a5fc12d0af28379e4204d0ff8fc2a0ba13da2bb0 100644 (file)
@@ -155,12 +155,12 @@ class User < ArvadosModel
   def self.all_group_permissions
     all_perms = {}
     ActiveRecord::Base.connection.
-      exec_query("SELECT user_uuid, target_owner_uuid, perm_level, trashed
+      exec_query("SELECT user_uuid, target_owner_uuid, perm_level
                   FROM #{PERMISSION_VIEW}
                   WHERE target_owner_uuid IS NOT NULL",
                   # "name" arg is a query label that appears in logs:
                   "all_group_permissions",
-                  ).rows.each do |user_uuid, group_uuid, max_p_val, trashed|
+                  ).rows.each do |user_uuid, group_uuid, max_p_val|
       all_perms[user_uuid] ||= {}
       all_perms[user_uuid][group_uuid] = PERMS_FOR_VAL[max_p_val.to_i]
     end
@@ -173,7 +173,7 @@ class User < ArvadosModel
   def group_permissions
     group_perms = {self.uuid => {:read => true, :write => true, :manage => true}}
     ActiveRecord::Base.connection.
-      exec_query("SELECT target_owner_uuid, perm_level, trashed
+      exec_query("SELECT target_owner_uuid, perm_level
                   FROM #{PERMISSION_VIEW}
                   WHERE user_uuid = $1
                   AND target_owner_uuid IS NOT NULL",
@@ -181,7 +181,7 @@ class User < ArvadosModel
                   "group_permissions for #{uuid}",
                   # "binds" arg is an array of [col_id, value] for '$1' vars:
                   [[nil, uuid]],
-                ).rows.each do |group_uuid, max_p_val, trashed|
+                ).rows.each do |group_uuid, max_p_val|
       group_perms[group_uuid] = PERMS_FOR_VAL[max_p_val.to_i]
     end
     group_perms
index 87c8a4cb867e68882a9fdb5034c51e6635727178..e1d0ab1b32d9902df8f869e48ff791cfe983d394 100644 (file)
@@ -5,7 +5,6 @@ class PermissionTable < ActiveRecord::Migration[5.0]
       t.string :target_uuid
       t.integer :perm_level
       t.string :target_owner_uuid
-      t.integer :trashed
     end
 
     ActiveRecord::Base.connection.execute %{
@@ -13,20 +12,17 @@ create or replace function compute_permission_table ()
 returns table(user_uuid character varying (27),
               target_uuid character varying (27),
               perm_level smallint,
-              target_owner_uuid character varying(27),
-              trashed smallint)
+              target_owner_uuid character varying(27))
 VOLATILE
 language SQL
 as $$
  WITH RECURSIVE perm_value(name, val) AS (
          VALUES ('can_read'::text,(1)::smallint), ('can_login'::text,1), ('can_write'::text,2), ('can_manage'::text,3)
-        ), perm_edges(tail_uuid, head_uuid, val, follow, trashed) AS (
+        ), perm_edges(tail_uuid, head_uuid, val, follow) AS (
          SELECT links.tail_uuid,
             links.head_uuid,
             pv.val,
-            ((pv.val = 3) OR (groups.uuid IS NOT NULL)) AS follow,
-            (0)::smallint AS trashed,
-            (0)::smallint AS followtrash
+            ((pv.val = 3) OR (groups.uuid IS NOT NULL)) AS follow
            FROM ((public.links
              LEFT JOIN perm_value pv ON ((pv.name = (links.name)::text)))
              LEFT JOIN public.groups ON (((pv.val < 3) AND ((groups.uuid)::text = (links.head_uuid)::text))))
@@ -35,26 +31,19 @@ as $$
          SELECT groups.owner_uuid,
             groups.uuid,
             3,
-            true AS bool,
-                CASE
-                    WHEN ((groups.trash_at IS NOT NULL) AND (groups.trash_at < clock_timestamp())) THEN 1
-                    ELSE 0
-                END AS "case",
-            1
+            true AS bool
            FROM public.groups
-        ), perm(val, follow, user_uuid, target_uuid, trashed) AS (
+        ), perm(val, follow, user_uuid, target_uuid) AS (
          SELECT (3)::smallint AS val,
             true AS follow,
             (users.uuid)::character varying(32) AS user_uuid,
-            (users.uuid)::character varying(32) AS target_uuid,
-            (0)::smallint AS trashed
+            (users.uuid)::character varying(32) AS target_uuid
            FROM public.users
         UNION
          SELECT (LEAST((perm_1.val)::integer, edges.val))::smallint AS val,
             edges.follow,
             perm_1.user_uuid,
-            (edges.head_uuid)::character varying(32) AS target_uuid,
-            ((GREATEST((perm_1.trashed)::integer, edges.trashed) * edges.followtrash))::smallint AS trashed
+            (edges.head_uuid)::character varying(32) AS target_uuid
            FROM (perm perm_1
              JOIN perm_edges edges ON ((perm_1.follow AND ((edges.tail_uuid)::text = (perm_1.target_uuid)::text))))
         )
@@ -64,8 +53,7 @@ as $$
     CASE perm.follow
        WHEN true THEN perm.target_uuid
        ELSE NULL::character varying
-    END AS target_owner_uuid,
-    max(perm.trashed) AS trashed
+    END AS target_owner_uuid
    FROM perm
   GROUP BY perm.user_uuid, perm.target_uuid,
         CASE perm.follow