First
[anni] / priv / repo / migrations / 20200520155351_add_recipients_contain_blocked_domains_function.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Repo.Migrations.AddRecipientsContainBlockedDomainsFunction do
6   use Ecto.Migration
7   @disable_ddl_transaction true
8
9   def up do
10     statement = """
11     CREATE OR REPLACE FUNCTION recipients_contain_blocked_domains(recipients varchar[], blocked_domains varchar[]) RETURNS boolean AS $$
12     DECLARE
13       recipient_domain varchar;
14       recipient varchar;
15     BEGIN
16       FOREACH recipient IN ARRAY recipients LOOP
17         recipient_domain = split_part(recipient, '/', 3)::varchar;
18
19         IF recipient_domain = ANY(blocked_domains) THEN
20           RETURN TRUE;
21         END IF;
22       END LOOP;
23
24       RETURN FALSE;
25     END;
26     $$ LANGUAGE plpgsql;
27     """
28
29     execute(statement)
30   end
31
32   def down do
33     execute(
34       "drop function if exists recipients_contain_blocked_domains(recipients varchar[], blocked_domains varchar[])"
35     )
36   end
37 end