6c94f1bb372adf9f6c58d559d802b0b9cfccfe68
[akkoma] / priv / repo / migrations / 20190109152453_add_visibility_function.exs
1 defmodule Pleroma.Repo.Migrations.AddVisibilityFunction do
2 use Ecto.Migration
3
4 def up do
5 definition = """
6 create or replace function activity_visibility(actor varchar, recipients varchar[], data jsonb) returns varchar as $$
7 DECLARE
8 fa varchar;
9 public varchar := 'https://www.w3.org/ns/activitystreams#Public';
10 BEGIN
11 SELECT COALESCE(users.follower_address, '') into fa from users where users.ap_id = actor;
12
13 IF data->'to' ? public THEN
14 RETURN 'public';
15 ELSIF data->'cc' ? public THEN
16 RETURN 'unlisted';
17 ELSIF ARRAY[fa] && recipients THEN
18 RETURN 'private';
19 ELSIF not(ARRAY[fa, public] && recipients) THEN
20 RETURN 'direct';
21 ELSE
22 RETURN 'unknown';
23 END IF;
24 END;
25 $$ LANGUAGE plpgsql IMMUTABLE;
26 """
27
28 execute(definition)
29
30 create(
31 index(:activities, ["activity_visibility(actor, recipients, data)"],
32 name: :activities_visibility_index
33 )
34 )
35 end
36
37 def down do
38 drop(
39 index(:activities, ["activity_visibility(actor, recipients, data)"],
40 name: :activities_visibility_index
41 )
42 )
43
44 execute("drop function activity_visibility(actor varchar, recipients varchar[], data jsonb)")
45 end
46 end