]> Untitled Git - lemmy.git/blob - migrations/2020-07-18-234519_add_unique_community_user_actor_ids/up.sql
add enable_federated_downvotes site option
[lemmy.git] / migrations / 2020-07-18-234519_add_unique_community_user_actor_ids / up.sql
1 -- Following this issue : https://github.com/LemmyNet/lemmy/issues/957
2 -- Creating a unique changeme actor_id
3 CREATE OR REPLACE FUNCTION generate_unique_changeme ()
4     RETURNS text
5     LANGUAGE sql
6     AS $$
7     SELECT
8         'changeme_' || string_agg(substr('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789', ceil(random() * 62)::integer, 1), '')
9     FROM
10         generate_series(1, 20)
11 $$;
12
13 -- Need to delete the possible community and user dupes for ones that don't start with the fake one
14 -- A few test inserts, to make sure this removes later dupes
15 -- insert into community (name, title, category_id, creator_id) values ('testcom', 'another testcom', 1, 2);
16 DELETE FROM community a USING (
17     SELECT
18         min(id) AS id,
19         actor_id
20     FROM
21         community
22     GROUP BY
23         actor_id
24     HAVING
25         count(*) > 1) b
26 WHERE
27     a.actor_id = b.actor_id
28     AND a.id <> b.id;
29
30 DELETE FROM user_ a USING (
31     SELECT
32         min(id) AS id,
33         actor_id
34     FROM
35         user_
36     GROUP BY
37         actor_id
38     HAVING
39         count(*) > 1) b
40 WHERE
41     a.actor_id = b.actor_id
42     AND a.id <> b.id;
43
44 -- Replacing the current default on the columns, to the unique one
45 UPDATE
46     community
47 SET
48     actor_id = generate_unique_changeme ()
49 WHERE
50     actor_id = 'http://fake.com';
51
52 UPDATE
53     user_
54 SET
55     actor_id = generate_unique_changeme ()
56 WHERE
57     actor_id = 'http://fake.com';
58
59 -- Add the unique indexes
60 ALTER TABLE community
61     ALTER COLUMN actor_id SET NOT NULL;
62
63 ALTER TABLE community
64     ALTER COLUMN actor_id SET DEFAULT generate_unique_changeme ();
65
66 ALTER TABLE user_
67     ALTER COLUMN actor_id SET NOT NULL;
68
69 ALTER TABLE user_
70     ALTER COLUMN actor_id SET DEFAULT generate_unique_changeme ();
71
72 -- Add lowercase uniqueness too
73 DROP INDEX idx_user_name_lower_actor_id;
74
75 CREATE UNIQUE INDEX idx_user_lower_actor_id ON user_ (lower(actor_id));
76
77 CREATE UNIQUE INDEX idx_community_lower_actor_id ON community (lower(actor_id));
78