2024.11.0-alpha.0に更新しました
This account is not set to public on notestock.
This account is not set to public on notestock.
システム上ブロックできちゃうのに、やられるたびに「管理者をブロックしてはいけない」と言うのも微妙なので、システム上できないようにした。
アプリコードじゃなくて、DBの方にトリガを書いてこんな感じで
create or replace function check_blockee_is_not_admin()
returns trigger as
$func$
begin
if -- ブロック実行者がローカルサーバーの人であって
(select host from "user" u where u.id = new."blockerId") is null
and
-- ブロック対象者がこのサーバーの管理者であるなら
new."blockeeId" in (
select u.id
from
"user" u
where
u."isRoot"
or exists (select 1 from
role_assignment ra join role r on (r.id = ra."roleId" and r."isAdministrator")
where ra."userId" = u.id
)
)
then
raise exception 'cannot block admin.';
end if;
return new;
end
$func$ language plpgsql;
create trigger check_blockee
before insert on blocking
for each row execute procedure check_blockee_is_not_admin();
トリガを使うともっと強気に、管理者をブロックしたとたんにアカウント凍結みたいなことも書けちゃうんだけど、ほしいのはそういうSNSじゃないし
DBにGUIツールでつないでみて初めてわかったことなんだけど、user
ってテーブル名はこのままで参照できないのね、ポスグレ。
必ず"user"
って二重引用符で囲わないといけない。予約後だからそりゃそうかって感じなんだけど、psqlコマンドだけで叩こうとしてたときはなんでこのテーブルうまくアクセスできないんだってなってた