From e26403613dc1074661ef1c2f16bfceb18dc25c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Casta=C3=B1o=20Arteaga?= Date: Mon, 15 Jan 2024 13:40:36 +0100 Subject: [PATCH] Allow disabling all repositories notifications (#3612) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sergio CastaƱo Arteaga --- .../subscriptions/get_repository_subscriptors.sql | 7 ++++++- .../schema/054_repositories_notifications_disabled.sql | 9 +++++++++ .../subscriptions/get_repository_subscriptors.sql | 4 ++++ database/tests/schema/schema.sql | 6 ++++-- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 database/migrations/schema/054_repositories_notifications_disabled.sql diff --git a/database/migrations/functions/subscriptions/get_repository_subscriptors.sql b/database/migrations/functions/subscriptions/get_repository_subscriptors.sql index 738405dd6..822b8bfe2 100644 --- a/database/migrations/functions/subscriptions/get_repository_subscriptors.sql +++ b/database/migrations/functions/subscriptions/get_repository_subscriptors.sql @@ -2,7 +2,8 @@ -- provided for the given event kind. At the moment, the user owning a given -- repository or all the users who belong to the organization which owns the -- repository are considered to be subscribed to the repository, unless they --- have opted out of notifications for that repository and event. +-- have opted out of notifications for that repository and event or they've +-- fully disabled the repositories notifications. create or replace function get_repository_subscriptors(p_repository_id uuid, p_event_kind_id int) returns setof json as $$ select coalesce(json_agg(json_build_object( @@ -27,5 +28,9 @@ returns setof json as $$ from opt_out where repository_id = p_repository_id and event_kind_id = p_event_kind_id + union + select user_id + from "user" + where repositories_notifications_disabled = true ); $$ language sql; diff --git a/database/migrations/schema/054_repositories_notifications_disabled.sql b/database/migrations/schema/054_repositories_notifications_disabled.sql new file mode 100644 index 000000000..33a674c5d --- /dev/null +++ b/database/migrations/schema/054_repositories_notifications_disabled.sql @@ -0,0 +1,9 @@ +alter table "user" add column repositories_notifications_disabled boolean; +create index if not exists user_repositories_notifications_disabled_idx + on "user" (user_id) + where repositories_notifications_disabled = true; + +---- create above / drop below ---- + +drop index if exists user_repositories_notifications_disabled_idx; +alter table "user" drop column repositories_notifications_disabled; diff --git a/database/tests/functions/subscriptions/get_repository_subscriptors.sql b/database/tests/functions/subscriptions/get_repository_subscriptors.sql index 36d33ff90..7dfc5f4df 100644 --- a/database/tests/functions/subscriptions/get_repository_subscriptors.sql +++ b/database/tests/functions/subscriptions/get_repository_subscriptors.sql @@ -8,6 +8,7 @@ select plan(2); \set user3ID '00000000-0000-0000-0000-000000000003' \set user4ID '00000000-0000-0000-0000-000000000004' \set user5ID '00000000-0000-0000-0000-000000000005' +\set user6ID '00000000-0000-0000-0000-000000000006' \set org1ID '00000000-0000-0000-0000-000000000001' \set repo1ID '00000000-0000-0000-0000-000000000001' \set repo2ID '00000000-0000-0000-0000-000000000002' @@ -23,12 +24,15 @@ insert into "user" (user_id, alias, email) values (:'user4ID', 'user4', 'user4@email.com'); insert into "user" (user_id, alias, email) values (:'user5ID', 'user5', 'user5@email.com'); +insert into "user" (user_id, alias, email, repositories_notifications_disabled) +values (:'user6ID', 'user6', 'user6@email.com', true); insert into organization (organization_id, name, display_name, description, home_url) values (:'org1ID', 'org1', 'Organization 1', 'Description 1', 'https://org1.com'); insert into user__organization (user_id, organization_id, confirmed) values(:'user2ID', :'org1ID', true); insert into user__organization (user_id, organization_id, confirmed) values(:'user3ID', :'org1ID', true); insert into user__organization (user_id, organization_id, confirmed) values(:'user4ID', :'org1ID', false); insert into user__organization (user_id, organization_id, confirmed) values(:'user5ID', :'org1ID', true); +insert into user__organization (user_id, organization_id, confirmed) values(:'user6ID', :'org1ID', true); insert into repository (repository_id, name, display_name, url, repository_kind_id, user_id) values (:'repo1ID', 'repo1', 'Repo 1', 'https://repo1.com', 0, :'user1ID'); insert into repository (repository_id, name, display_name, url, repository_kind_id, organization_id) diff --git a/database/tests/schema/schema.sql b/database/tests/schema/schema.sql index c59fa09a8..6a5633f40 100644 --- a/database/tests/schema/schema.sql +++ b/database/tests/schema/schema.sql @@ -257,7 +257,8 @@ select columns_are('user', array[ 'created_at', 'tfa_enabled', 'tfa_recovery_codes', - 'tfa_url' + 'tfa_url', + 'repositories_notifications_disabled' ]); select columns_are('user_starred_package', array[ 'user_id', @@ -390,7 +391,8 @@ select indexes_are('subscription', array[ select indexes_are('user', array[ 'user_pkey', 'user_alias_key', - 'user_email_key' + 'user_email_key', + 'user_repositories_notifications_disabled_idx' ]); select indexes_are('user__organization', array[ 'user__organization_pkey'