create or replace function public.register_user(_email text, _password_hash text)
  returns setof public.user
  language plpgsql
as $function$
declare
  _user_uuid uuid;
begin
  insert into "user" (
    user_email,
    user_password_hash
  ) values (
    _email,
    _password_hash
  ) returning user_uuid into _user_uuid;

  return query select * from "user" where user_uuid = _user_uuid;
end; $function$;

create or replace function public.validate_session(_session_uuid uuid)
  returns setof public.v_session
  language plpgsql
as $function$
begin
  return query select * from v_session
    where session_uuid = _session_uuid
      and session_time_last_active + session_timeout_length < now();
end; $function$;

create or replace function public.login_user_session(_user_uuid uuid, _timeout_length interval, _ip_addr varchar(50), _user_agent varchar(500), _referer varchar(500), _link uuid)
  returns setof public.v_session
  language plpgsql
as $function$
declare
  _session_uuid uuid;
begin
  insert into "session" (
    session_user_uuid,
    session_timeout_length,
    session_ip_address,
    session_user_agent,
    session_referer,
    session_originating_link
  ) values (
    _user_uuid,
    _timeout_length,
    _ip_addr,
    _user_agent,
    _referer,
    _link
  ) returning session_uuid into _session_uuid;

  return query select * from public.validate_session(_session_uuid);
end; $function$;
