32 lines
1007 B
PL/PgSQL
32 lines
1007 B
PL/PgSQL
DROP FUNCTION IF EXISTS find_or_create_user_by_identity;
|
|
|
|
CREATE OR REPLACE FUNCTION find_or_create_user_by_identity(
|
|
identity_type_param VARCHAR(20),
|
|
identity_value_param VARCHAR(255)
|
|
)
|
|
RETURNS TABLE(user_id INTEGER, is_new BOOLEAN)
|
|
AS $$
|
|
DECLARE
|
|
existing_user_id INTEGER;
|
|
new_user_id INTEGER;
|
|
BEGIN
|
|
SELECT ui.user_id INTO existing_user_id
|
|
FROM user_identities ui
|
|
WHERE ui.identity_type = identity_type_param
|
|
AND ui.identity_value = identity_value_param;
|
|
|
|
IF existing_user_id IS NOT NULL THEN
|
|
RETURN QUERY SELECT existing_user_id::INTEGER, FALSE::BOOLEAN;
|
|
RETURN;
|
|
END IF;
|
|
|
|
INSERT INTO users (created_at)
|
|
VALUES (NOW())
|
|
RETURNING id INTO new_user_id;
|
|
|
|
INSERT INTO user_identities (user_id, identity_type, identity_value, created_at, verified)
|
|
VALUES (new_user_id, identity_type_param, identity_value_param, NOW(), TRUE);
|
|
|
|
RETURN QUERY SELECT new_user_id::INTEGER, TRUE::BOOLEAN;
|
|
END;
|
|
$$ LANGUAGE plpgsql; |