Fix issue checking user alias availability (#879)

Closes #878

Signed-off-by: Sergio Castaño Arteaga <tegioz@icloud.com>
This commit is contained in:
Sergio C. Arteaga 2020-11-20 08:55:11 +01:00 committed by GitHub
parent ae79ab9240
commit 7671dd2f0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 109 additions and 20 deletions

View File

@ -70,6 +70,7 @@
{{ template "subscriptions/get_user_package_subscriptions.sql" }}
{{ template "subscriptions/get_user_subscriptions.sql" }}
{{ template "users/check_user_alias_availability.sql" }}
{{ template "users/get_user_profile.sql" }}
{{ template "users/register_session.sql" }}
{{ template "users/register_user.sql" }}

View File

@ -0,0 +1,14 @@
-- check_user_alias_availability checks if the provided alias is available.
create or replace function check_user_alias_availability(p_alias text)
returns setof uuid as $$
select user_id
from "user" u
left join email_verification_code c using (user_id)
where u.alias = p_alias
and
case when c.created_at is not null then
current_timestamp - '1 day'::interval < c.created_at
else
true
end;
$$ language sql;

View File

@ -0,0 +1,79 @@
-- Start transaction and plan tests
begin;
select plan(4);
-- Declare some variables
\set user1ID '00000000-0000-0000-0000-000000000001'
\set user2ID '00000000-0000-0000-0000-000000000002'
\set code2ID '00000000-0000-0000-0000-000000000002'
\set user3ID '00000000-0000-0000-0000-000000000003'
\set code3ID '00000000-0000-0000-0000-000000000003'
-- Seed some data
insert into "user" (
user_id,
alias,
email
) values (
:'user1ID',
'user1',
'user1@email.com'
);
insert into "user" (
user_id,
alias,
email
) values (
:'user2ID',
'user2',
'user2@email.com'
);
insert into email_verification_code (
email_verification_code_id,
user_id,
created_at
) values (
:'code2ID',
:'user2ID',
current_timestamp - '30 minutes'::interval
);
insert into "user" (
user_id,
alias,
email
) values (
:'user3ID',
'user3',
'user3@email.com'
);
insert into email_verification_code (
email_verification_code_id,
user_id,
created_at
) values (
:'code3ID',
:'user3ID',
current_timestamp - '2 days'::interval
);
-- Run some tests
select isnt_empty(
$$ select check_user_alias_availability('user1') $$,
'Alias user1 should not be available (verified)'
);
select isnt_empty(
$$ select check_user_alias_availability('user2') $$,
'Alias user2 should not be available (not verified but code not expired yet)'
);
select is_empty(
$$ select check_user_alias_availability('user3') $$,
'Alias user3 should be available (not verified and code has expired)'
);
select is_empty(
$$ select check_user_alias_availability('user4') $$,
'Alias user4 should be available (it does not exist)'
);
-- Finish tests and rollback transaction
select * from finish();
rollback;

View File

@ -1,6 +1,6 @@
-- Start transaction and plan tests
begin;
select plan(130);
select plan(131);
-- Check default_text_search_config is correct
select results_eq(
@ -408,6 +408,7 @@ select has_function('get_user_opt_out_entries');
select has_function('get_user_package_subscriptions');
select has_function('get_user_subscriptions');
-- Users
select has_function('check_user_alias_availability');
select has_function('get_user_profile');
select has_function('register_session');
select has_function('register_user');

View File

@ -18,25 +18,19 @@ import (
const (
// Database queries
checkUserAliasAvailDBQ = `
select user_id
from "user" u
join email_verification_code c using (user_id)
where u.alias = $1
and current_timestamp - '1 day'::interval < c.created_at
`
checkUserCredsDBQ = `select user_id, password from "user" where email = $1 and password is not null and email_verified = true`
deleteSessionDBQ = `delete from session where session_id = $1`
getAPIKeyUserIDDBQ = `select user_id from api_key where key = $1`
getSessionDBQ = `select user_id, floor(extract(epoch from created_at)) from session where session_id = $1`
getUserIDDBQ = `select user_id from "user" where email = $1`
getUserPasswordDBQ = `select password from "user" where user_id = $1 and password is not null`
getUserProfileDBQ = `select get_user_profile($1::uuid)`
registerSessionDBQ = `select register_session($1::jsonb)`
registerUserDBQ = `select register_user($1::jsonb)`
updateUserPasswordDBQ = `select update_user_password($1::uuid, $2::text, $3::text)`
updateUserProfileDBQ = `select update_user_profile($1::uuid, $2::jsonb)`
verifyEmailDBQ = `select verify_email($1::uuid)`
checkUserAliasAvailDBQ = `select check_user_alias_availability($1::text)`
checkUserCredsDBQ = `select user_id, password from "user" where email = $1 and password is not null and email_verified = true`
deleteSessionDBQ = `delete from session where session_id = $1`
getAPIKeyUserIDDBQ = `select user_id from api_key where key = $1`
getSessionDBQ = `select user_id, floor(extract(epoch from created_at)) from session where session_id = $1`
getUserIDDBQ = `select user_id from "user" where email = $1`
getUserPasswordDBQ = `select password from "user" where user_id = $1 and password is not null`
getUserProfileDBQ = `select get_user_profile($1::uuid)`
registerSessionDBQ = `select register_session($1::jsonb)`
registerUserDBQ = `select register_user($1::jsonb)`
updateUserPasswordDBQ = `select update_user_password($1::uuid, $2::text, $3::text)`
updateUserProfileDBQ = `select update_user_profile($1::uuid, $2::jsonb)`
verifyEmailDBQ = `select verify_email($1::uuid)`
)
var (