Class: HighLevel::Storage::Redis

Inherits:
Base
  • Object
show all
Defined in:
lib/high_level/storage/redis.rb

Overview

Redis-backed session storage. Good for multi-process worker setups where Memory is per-process. Keys are prefixed with ‘gohighlevel:` and namespaced by the application_id derived from `client_id`. Each session is JSON-encoded and given a TTL equal to its `expires_in` (falling back to one day) so expired sessions are cleaned up by Redis itself.

Constant Summary collapse

DEFAULT_TTL_SECONDS =

Session TTL, in seconds, when an OAuth response has no expires_in.

24 * 60 * 60
KEY_PREFIX =

Key prefix for every session entry.

"gohighlevel"

Constants inherited from Base

Base::DEFAULT_EXPIRY_MS

Instance Method Summary collapse

Constructor Details

#initialize(redis: nil, ttl: DEFAULT_TTL_SECONDS, **redis_options) ⇒ Redis

Returns a new instance of Redis.

Parameters:

  • redis (::Redis, nil) (defaults to: nil)

    an existing client, or nil to build one

  • ttl (Integer) (defaults to: DEFAULT_TTL_SECONDS)

    fallback TTL in seconds

  • redis_options (Hash)

    options forwarded to ::Redis.new



24
25
26
27
28
29
# File 'lib/high_level/storage/redis.rb', line 24

def initialize(redis: nil, ttl: DEFAULT_TTL_SECONDS, **redis_options)
  super()
  @redis = redis || ::Redis.new(**redis_options)
  @default_ttl = ttl
  @client_id = nil
end

Instance Method Details

#delete_session(resource_id) ⇒ void

This method returns an undefined value.

Remove a stored session.

Parameters:

  • resource_id (String)

    a company or location id



71
72
73
74
# File 'lib/high_level/storage/redis.rb', line 71

def delete_session(resource_id)
  @redis.del(key_for(resource_id))
  nil
end

#disconnectvoid

This method returns an undefined value.

Release any resources held by the backend.



37
38
39
# File 'lib/high_level/storage/redis.rb', line 37

def disconnect
  @redis.close
end

#get_access_token(resource_id) ⇒ String?

Fetch just the access token from a stored session.

Parameters:

  • resource_id (String)

    a company or location id

Returns:

  • (String, nil)


65
66
67
68
# File 'lib/high_level/storage/redis.rb', line 65

def get_access_token(resource_id)
  session = get_session(resource_id)
  session && session[:access_token]
end

#get_session(resource_id) ⇒ Hash?

Fetch a stored session.

Parameters:

  • resource_id (String)

    a company or location id

Returns:

  • (Hash, nil)

    the session data, or nil when absent



57
58
59
60
61
62
# File 'lib/high_level/storage/redis.rb', line 57

def get_session(resource_id)
  raw = @redis.get(key_for(resource_id))
  return nil if raw.nil?

  JSON.parse(raw, symbolize_names: true)
end

#initvoid

This method returns an undefined value.

Initialize the backend (open connections, ensure schema, …).



32
33
34
# File 'lib/high_level/storage/redis.rb', line 32

def init
  # No-op — connection is lazy on the Redis client.
end

#set_client_id(client_id) ⇒ void

This method returns an undefined value.

Set the OAuth client id; its first hyphen-separated segment becomes the application namespace for stored sessions.

Parameters:

  • client_id (String)

Raises:

  • (ArgumentError)


42
43
44
45
46
# File 'lib/high_level/storage/redis.rb', line 42

def set_client_id(client_id)
  raise ArgumentError, "client_id is required" if client_id.nil? || client_id.to_s.empty?

  @client_id = client_id.to_s
end

#set_session(resource_id, session_data) ⇒ void

This method returns an undefined value.

Store (or replace) a session, stamping :expire_at.

Parameters:

  • resource_id (String)

    a company or location id

  • session_data (Hash)

    the session payload



49
50
51
52
53
54
# File 'lib/high_level/storage/redis.rb', line 49

def set_session(resource_id, session_data)
  data = symbolize_keys(session_data)
  document = data.merge(expire_at: calculate_expire_at(data[:expires_in]))
  @redis.set(key_for(resource_id), JSON.generate(document), ex: ttl_for(data))
  nil
end