xssbook2/db/rest/user/api_user_insert.sql

121 lines
2.2 KiB
PL/PgSQL

CREATE FUNCTION _api.user_insert()
RETURNS TRIGGER
LANGUAGE plpgsql VOLATILE
AS $BODY$
DECLARE
_length INTEGER;
BEGIN
PERFORM _api.validate_text(
_text => NEW.username,
_column => 'username',
_min => 1,
_max => 24
);
PERFORM TRUE FROM admin.user
WHERE username = NEW.username;
IF FOUND THEN
PERFORM _api.raise_unique('username');
END IF;
PERFORM _api.validate_text(
_text => NEW.password,
_column => 'password',
_max => 256
);
PERFORM _api.validate_text(
_text => NEW.first_name,
_nullable => TRUE,
_column => 'first_name',
_max => 256
);
NEW.first_name = COALESCE(NEW.first_name, ''::text);
PERFORM _api.validate_text(
_text => NEW.last_name,
_nullable => TRUE,
_column => 'last_name',
_max => 256
);
NEW.last_name = COALESCE(NEW.last_name, ''::text);
PERFORM _api.validate_text(
_text => NEW.middle_name,
_nullable => TRUE,
_column => 'middle_name',
_max => 256
);
NEW.middle_name = COALESCE(NEW.middle_name, ''::text);
PERFORM _api.validate_text(
_text => NEW.email,
_column => 'email',
_max => 256
);
PERFORM _api.validate_text(
_text => NEW.gender,
_column => 'gender',
_max => 256
);
IF NEW.birth_date IS NULL THEN
PERFORM _api.raise_null('birth_date');
END IF;
PERFORM _api.validate_text(
_text => NEW.profile_bio,
_nullable => TRUE,
_column => 'profile_bio',
_max => 2048
);
NEW.profile_bio = COALESCE(NEW.profile_bio, ''::text);
INSERT INTO admin.user (
username,
password,
first_name,
last_name,
middle_name,
email,
gender,
birth_date,
profile_avatar,
profile_banner,
profile_bio
) VALUES (
NEW.username,
NEW.password,
NEW.first_name,
NEW.last_name,
NEW.middle_name,
NEW.email,
NEW.gender,
NEW.birth_date,
NEW.profile_avatar,
NEW.profile_banner,
NEW.profile_bio
);
NEW.password := NULL;
RETURN NEW;
END
$BODY$;
GRANT EXECUTE ON FUNCTION _api.user_insert()
TO rest_anon, rest_user;
GRANT INSERT ON TABLE api.user
TO rest_anon, rest_user;
GRANT INSERT ON TABLE admin.user
TO rest_anon, rest_user;
GRANT UPDATE ON TABLE sys.user_id_seq
TO rest_anon, rest_user;
CREATE TRIGGER api_user_insert_trgr
INSTEAD OF INSERT
ON api.user
FOR EACH ROW
EXECUTE PROCEDURE _api.user_insert();