Update packages tsdoc when transferring repository (#1652)

Closes #1648

Signed-off-by: Sergio Castaño Arteaga <tegioz@icloud.com>
This commit is contained in:
Sergio C. Arteaga 2021-10-25 15:20:10 +02:00 committed by GitHub
parent ea3b23570b
commit f5e3d2b3de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 120 additions and 2 deletions

View File

@ -64,5 +64,32 @@ begin
user_id = null user_id = null
where name = p_repository_name; where name = p_repository_name;
end if; end if;
-- Regenerate repository's packages text search document using new
-- publisher information
with new_tsdoc as (
select
p.package_id,
generate_package_tsdoc(
p.name,
s.display_name,
s.description,
s.keywords,
array[r.name, r.display_name],
array[u.alias, o.name, o.display_name, s.provider]
) as tsdoc
from package p
join snapshot s using (package_id)
join repository r using (repository_id)
left join "user" u using (user_id)
left join organization o using (organization_id)
where s.version = p.latest_version
and r.name = p_repository_name
)
update package
set tsdoc = new_tsdoc.tsdoc
from new_tsdoc
where package.package_id = new_tsdoc.package_id;
end end
$$ language plpgsql; $$ language plpgsql;

View File

@ -0,0 +1,24 @@
with new_tsdoc as (
select
p.package_id,
(
setweight(to_tsvector(p.name), 'A') ||
setweight(to_tsvector(coalesce(s.display_name, '')), 'A') ||
setweight(to_tsvector(coalesce(s.description, '')), 'B') ||
setweight(to_tsvector(array_to_string(coalesce(s.keywords, '{}'), ' ')), 'C') ||
setweight(to_tsvector(array_to_string(coalesce(array[r.name, r.display_name], '{}'), ' ')), 'B') ||
setweight(to_tsvector(array_to_string(coalesce(array[u.alias, o.name, o.display_name, s.provider], '{}'), ' ')), 'B')
) as tsdoc
from package p
join snapshot s using (package_id)
join repository r using (repository_id)
left join "user" u using (user_id)
left join organization o using (organization_id)
where s.version = p.latest_version
)
update package
set tsdoc = new_tsdoc.tsdoc
from new_tsdoc
where package.package_id = new_tsdoc.package_id;
---- create above / drop below ----

View File

@ -1,6 +1,6 @@
-- Start transaction and plan tests -- Start transaction and plan tests
begin; begin;
select plan(13); select plan(16);
-- Declare some variables -- Declare some variables
\set user1ID '00000000-0000-0000-0000-000000000001' \set user1ID '00000000-0000-0000-0000-000000000001'
@ -10,6 +10,8 @@ select plan(13);
\set org3ID '00000000-0000-0000-0000-000000000003' \set org3ID '00000000-0000-0000-0000-000000000003'
\set repo1ID '00000000-0000-0000-0000-000000000001' \set repo1ID '00000000-0000-0000-0000-000000000001'
\set repo2ID '00000000-0000-0000-0000-000000000002' \set repo2ID '00000000-0000-0000-0000-000000000002'
\set package1ID '00000000-0000-0000-0000-000000000001'
\set package2ID '00000000-0000-0000-0000-000000000002'
-- Seed some data -- Seed some data
insert into "user" (user_id, alias, email) insert into "user" (user_id, alias, email)
@ -28,6 +30,54 @@ insert into repository (repository_id, name, display_name, url, repository_kind_
values (:'repo1ID', 'repo1', 'Repo 1', 'https://repo1.com', 0, :'user1ID'); values (:'repo1ID', 'repo1', 'Repo 1', 'https://repo1.com', 0, :'user1ID');
insert into repository (repository_id, name, display_name, url, repository_kind_id, organization_id) insert into repository (repository_id, name, display_name, url, repository_kind_id, organization_id)
values (:'repo2ID', 'repo2', 'Repo 2', 'https://repo2.com', 0, :'org1ID'); values (:'repo2ID', 'repo2', 'Repo 2', 'https://repo2.com', 0, :'org1ID');
insert into package (
package_id,
name,
latest_version,
repository_id
) values (
:'package1ID',
'package1',
'1.0.0',
:'repo1ID'
);
insert into snapshot (
package_id,
version,
app_version,
display_name,
description
) values (
:'package1ID',
'1.0.0',
'12.0.0',
'Package 1',
'description'
);
insert into package (
package_id,
name,
latest_version,
repository_id
) values (
:'package2ID',
'package2',
'1.0.0',
:'repo2ID'
);
insert into snapshot (
package_id,
version,
app_version,
display_name,
description
) values (
:'package2ID',
'1.0.0',
'12.0.0',
'Package 2',
'description'
);
-- Transfers NOT part of an ownership claim request -- Transfers NOT part of an ownership claim request
@ -97,12 +147,30 @@ select results_eq(
); );
select is(count(*), 0::bigint, 'No repository ownership claim events should have been registered') select is(count(*), 0::bigint, 'No repository ownership claim events should have been registered')
from event where repository_id=:'repo2ID' and event_kind_id = 3; from event where repository_id=:'repo2ID' and event_kind_id = 3;
select is(
tsdoc,
'2:3A 2:7B description:4B package:2A package2:1A repo:6B repo2:5B user1:8B'::tsvector,
'Package 2 tsdoc should have been updated (user1 is now the publisher)'
)
from package where package_id=:'package2ID';
select is(
tsdoc,
null,
'Package 1 tsdoc should not have been updated'
)
from package where package_id=:'package1ID';
select transfer_repository( select transfer_repository(
'repo2', 'repo2',
'00000000-0000-0000-0000-000000000001', '00000000-0000-0000-0000-000000000001',
'org1', 'org1',
false false
); );
select is(
tsdoc,
'1:10B 2:3A,7B description:4B org1:8B organization:9B package:2A package2:1A repo:6B repo2:5B'::tsvector,
'Package 2 tsdoc should have been updated again (org1 is now the publisher)'
)
from package where package_id=:'package2ID';
-- Transfer org owned repository to other org -- Transfer org owned repository to other org
select transfer_repository( select transfer_repository(
@ -155,7 +223,6 @@ select transfer_repository(
null, null,
true true
); );
select * from event;
select results_eq( select results_eq(
$$ $$
select user_id, organization_id select user_id, organization_id