fix duplicate follow

This commit is contained in:
2019-07-29 14:01:42 +02:00
parent 988bf4d34a
commit 84276ad496
4 changed files with 22 additions and 13 deletions

View File

@@ -1,19 +1,21 @@
create or replace function follow(reference regclass, target_id uuid, citizen_id uuid) returns void
create or replace function follow(reference regclass, _target_id uuid, _citizen_id uuid) returns void
language plpgsql as
$$
declare
_citizen_id alias for citizen_id;
_target_id alias for target_id;
begin
if reference = 'article'::regclass then
insert into follow_article (citizen_id, target_id)
values (_citizen_id, _target_id);
values (_citizen_id, _target_id)
on conflict (citizen_id, target_id) do nothing;
elseif reference = 'constitution'::regclass then
insert into follow_constitution (citizen_id, target_id)
values (_citizen_id, _target_id);
values (_citizen_id, _target_id)
on conflict (citizen_id, target_id) do nothing;
elseif reference = 'citizen'::regclass then
insert into follow_citizen (citizen_id, target_id)
values (_citizen_id, _target_id);
values (_citizen_id, _target_id)
on conflict (citizen_id, target_id) do nothing;
else
raise exception '% no implemented', reference::text;
end if;
end;
$$;

View File

@@ -193,7 +193,8 @@ create table extra
create table follow
(
foreign key (citizen_id) references citizen (id),
primary key (id)
primary key (id),
unique (citizen_id, target_id)
) inherits (extra);
create table follow_article
@@ -201,7 +202,8 @@ create table follow_article
target_reference regclass default 'article'::regclass not null,
foreign key (citizen_id) references citizen (id),
foreign key (target_id) references article (id),
primary key (id)
primary key (id),
unique (citizen_id, target_id)
) inherits (follow);
create table follow_constitution
@@ -209,7 +211,8 @@ create table follow_constitution
target_reference regclass default 'constitution'::regclass not null,
foreign key (citizen_id) references citizen (id),
foreign key (target_id) references constitution (id),
primary key (id)
primary key (id),
unique (citizen_id, target_id)
) inherits (follow);
create table follow_citizen
@@ -217,7 +220,8 @@ create table follow_citizen
target_reference regclass default 'citizen'::regclass not null,
foreign key (citizen_id) references citizen (id),
foreign key (target_id) references citizen (id),
primary key (id)
primary key (id),
unique (citizen_id, target_id)
) inherits (follow);

View File

@@ -57,7 +57,7 @@ begin
assert (select count(*) = 1 from "comment"), 'edit comment must not insert new comment';
assert (select count(*) = 1 from "comment" where content = 'edited'), 'edit comment must not insert new comment';
-- delete article and context
-- delete comment and context
delete from "comment";
delete from article;
delete from citizen;

View File

@@ -38,13 +38,16 @@ begin
_citizen_id2 := created_citizen2->>'id';
perform follow('citizen'::regclass, _citizen_id, _citizen_id2);
assert (select count(*) > 0 from follow), 'follow must be inserted';
perform follow('citizen'::regclass, _citizen_id, _citizen_id2);
assert (select count(*) > 0 from follow), 'follow must be inserted';
perform unfollow('citizen'::regclass, _citizen_id, _citizen_id2);
assert (select count(*) = 0 from follow), 'follow must be deleted after unfollow';
-- delete article and context
-- delete follow and context
delete from citizen;
delete from "user";