authen
.public
Tables
(current)
Columns
Constraints
Relationships
Orphan Tables
Anomalies
Routines
fn_logout
Description
User logout
Parameters
Name
Type
Mode
log_id
bigint
IN
res_code
integer
OUT
res_msg
text
OUT
Definition
declare _prop_id int; _user_id int; _row_count int; -- === Add by T.Supol 2025-07-24 v_prop_code text; v_user_name public.citext; v_result boolean; v_session_duration interval; v_session_timeout interval = fn_get_config(_prop_id, 'SESSION_TIMEOUT', '@SYSTEM')||' seconds'; -- ============================= _sqlstate TEXT; _detail TEXT; _hint TEXT; _context TEXT; _msg_text TEXT; begin res_code := 0; res_msg := 'Success'; select w.prop_id, w.user_id, u.user_name, p.code, case when (w.logout_time is not null) then 1 when age(current_timestamp, coalesce(w.last_seen, w.login_time)) >= v_session_timeout then 2 else 0 end from work_log w left join users u on u.id = w.user_id left join property p on p.id = w.prop_id where w.id = $1 into _prop_id, _user_id, v_user_name, v_prop_code, res_code; if (res_code = 0) then update user_property A set work_log_id = null where a.user_id = _user_id and a.prop_id = _prop_id AND a.work_log_id = $1; v_result := sp_clear_my_lock_record(v_prop_code, v_user_name); PERFORM sys.log_info('Logout', format('User: %s, Prop: %s, Success', v_user_name, upper(v_prop_code))); else res_msg := case res_code when 1 then 'User already logged' when 2 then 'Session timed out' end; PERFORM sys.log_warn('Logout', format(E'User: %s, Prop: %s, %s', v_user_name, upper(v_prop_code), res_msg)); end if; EXCEPTION WHEN OTHERS THEN GET STACKED DIAGNOSTICS _msg_text = MESSAGE_TEXT, _sqlstate = RETURNED_SQLSTATE, _detail = PG_EXCEPTION_DETAIL, _hint = PG_EXCEPTION_HINT, _context = PG_EXCEPTION_CONTEXT; res_code := 4; res_msg := _msg_text; PERFORM sys.log_error('fn_logout', _msg_text, _detail, _sqlstate, _hint, _context, jsonb_build_object( 'log_id', log_id, 'user_id', _user_id, 'prop_id', _prop_id ), v_user_name ); END