-- session.lua function session_set(key, value) __response.session = __response.session or {} __response.session[key] = value if __ctx.session and __ctx.session.data then __ctx.session.data[key] = value end end function session_get(key) return __ctx.session and __ctx.session.data and __ctx.session.data[key] end function session_id() return __ctx.session and __ctx.session.id end function session_get_all() if __ctx.session and __ctx.session.data then local copy = {} for k, v in pairs(__ctx.session.data) do copy[k] = v end return copy end return {} end function session_delete(key) __response.session = __response.session or {} __response.session[key] = "__DELETE__" if __ctx.session and __ctx.session.data then __ctx.session.data[key] = nil end end function session_clear() __response.session = {__clear_all = true} if __ctx.session and __ctx.session.data then for k in pairs(__ctx.session.data) do __ctx.session.data[k] = nil end end end function session_flash(key, value) __response.flash = __response.flash or {} __response.flash[key] = value end function session_get_flash(key) -- Check current flash data first if __response.flash and __response.flash[key] ~= nil then return __response.flash[key] end -- Check session flash data if __ctx.session and __ctx.session.flash and __ctx.session.flash[key] ~= nil then return __ctx.session.flash[key] end return nil end function session_has_flash(key) -- Check current flash if __response.flash and __response.flash[key] ~= nil then return true end -- Check session flash if __ctx.session and __ctx.session.flash and __ctx.session.flash[key] ~= nil then return true end return false end function session_get_all_flash() local flash = {} -- Add session flash data first if __ctx.session and __ctx.session.flash then for k, v in pairs(__ctx.session.flash) do flash[k] = v end end -- Add current response flash (overwrites session flash if same key) if __response.flash then for k, v in pairs(__response.flash) do flash[k] = v end end return flash end function session_flash_now(key, value) -- Flash for current request only (not persisted) _G._current_flash = _G._current_flash or {} _G._current_flash[key] = value end function session_get_flash_now(key) return _G._current_flash and _G._current_flash[key] end -- ====================================================================== -- FLASH HELPER FUNCTIONS -- ====================================================================== function flash_success(message) session_flash("success", message) end function flash_error(message) session_flash("error", message) end function flash_warning(message) session_flash("warning", message) end function flash_info(message) session_flash("info", message) end function flash_message(type, message) session_flash(type, message) end -- Get flash messages by type function get_flash_success() return session_get_flash("success") end function get_flash_error() return session_get_flash("error") end function get_flash_warning() return session_get_flash("warning") end function get_flash_info() return session_get_flash("info") end -- Check if flash messages exist function has_flash_success() return session_has_flash("success") end function has_flash_error() return session_has_flash("error") end function has_flash_warning() return session_has_flash("warning") end function has_flash_info() return session_has_flash("info") end function redirect_with_flash(url, type, message, status) session_flash(type or "info", message) http_redirect(url, status) end function redirect_with_success(url, message, status) redirect_with_flash(url, "success", message, status) end function redirect_with_error(url, message, status) redirect_with_flash(url, "error", message, status) end