diff options
Diffstat (limited to 'priv/repo')
| -rw-r--r-- | priv/repo/migrations/20200109123126_add_counter_cache_table.exs | 55 | ||||
| -rw-r--r-- | priv/repo/migrations/20200307103755_fix_moderation_log_subjects.exs | 9 | 
2 files changed, 64 insertions, 0 deletions
| diff --git a/priv/repo/migrations/20200109123126_add_counter_cache_table.exs b/priv/repo/migrations/20200109123126_add_counter_cache_table.exs new file mode 100644 index 000000000..df9e21193 --- /dev/null +++ b/priv/repo/migrations/20200109123126_add_counter_cache_table.exs @@ -0,0 +1,55 @@ +defmodule Pleroma.Repo.Migrations.AddCounterCacheTable do +  use Ecto.Migration + +  def up do +    create_if_not_exists table(:counter_cache) do +      add(:name, :string, null: false) +      add(:count, :bigint, null: false, default: 0) +    end + +    create_if_not_exists(unique_index(:counter_cache, [:name])) + +    """ +    CREATE OR REPLACE FUNCTION update_status_visibility_counter_cache() +    RETURNS TRIGGER AS +    $$ +      DECLARE +      BEGIN +      IF TG_OP = 'INSERT' THEN +          IF NEW.data->>'type' = 'Create' THEN +            EXECUTE 'INSERT INTO counter_cache (name, count) VALUES (''status_visibility_' || activity_visibility(NEW.actor, NEW.recipients, NEW.data) || ''', 1) ON CONFLICT (name) DO UPDATE SET count = counter_cache.count + 1'; +          END IF; +          RETURN NEW; +      ELSIF TG_OP = 'UPDATE' THEN +          IF (NEW.data->>'type' = 'Create') and (OLD.data->>'type' = 'Create') and activity_visibility(NEW.actor, NEW.recipients, NEW.data) != activity_visibility(OLD.actor, OLD.recipients, OLD.data) THEN +             EXECUTE 'INSERT INTO counter_cache (name, count) VALUES (''status_visibility_' || activity_visibility(NEW.actor, NEW.recipients, NEW.data) || ''', 1) ON CONFLICT (name) DO UPDATE SET count = counter_cache.count + 1'; +             EXECUTE 'update counter_cache SET count = counter_cache.count - 1 where count > 0 and name = ''status_visibility_' || activity_visibility(OLD.actor, OLD.recipients, OLD.data) || ''';'; +          END IF; +          RETURN NEW; +      ELSIF TG_OP = 'DELETE' THEN +          IF OLD.data->>'type' = 'Create' THEN +            EXECUTE 'update counter_cache SET count = counter_cache.count - 1 where count > 0 and name = ''status_visibility_' || activity_visibility(OLD.actor, OLD.recipients, OLD.data) || ''';'; +          END IF; +          RETURN OLD; +      END IF; +      END; +    $$ +    LANGUAGE 'plpgsql'; +    """ +    |> execute() + +    """ +    CREATE TRIGGER status_visibility_counter_cache_trigger BEFORE INSERT OR UPDATE of recipients, data OR DELETE ON activities +    FOR EACH ROW +    EXECUTE PROCEDURE update_status_visibility_counter_cache(); +    """ +    |> execute() +  end + +  def down do +    execute("drop trigger if exists status_visibility_counter_cache_trigger on activities") +    execute("drop function if exists update_status_visibility_counter_cache()") +    drop_if_exists(unique_index(:counter_cache, [:name])) +    drop_if_exists(table(:counter_cache)) +  end +end diff --git a/priv/repo/migrations/20200307103755_fix_moderation_log_subjects.exs b/priv/repo/migrations/20200307103755_fix_moderation_log_subjects.exs new file mode 100644 index 000000000..d1c8539e1 --- /dev/null +++ b/priv/repo/migrations/20200307103755_fix_moderation_log_subjects.exs @@ -0,0 +1,9 @@ +defmodule Pleroma.Repo.Migrations.FixModerationLogSubjects do +  use Ecto.Migration + +  def change do +    execute( +      "update moderation_log set data = safe_jsonb_set(data, '{subject}', safe_jsonb_set('[]'::jsonb, '{0}', data->'subject')) where jsonb_typeof(data->'subject') != 'array' and data->>'action' = ANY('{revoke,grant,activate,deactivate,delete}');" +    ) +  end +end | 
