Как рефакторировать оболочку с помощью singleton для настройки сеанса?

module Asterisk
 class Client
 include HTTParty
 base_uri 'https://asterisk.dev/'
 def initialize(session_key = nil)
 @session_key = session_key
 end
 def get_session_key(login, password)
 self.class.put('/api/auth', query: { login: login, password: password })
 end
 def get_contacts
 self.class.get("/api/#{@session_key}/contacts")
 end
 def get_contact(id)
 self.class.get("/api/#{@session_key}/contact/#{id}")
 end
 def create_contact
 self.class.put("/api/#{@session_key}/create")
 end
 def logout
 self.class.delete("/api/#{@session_key}/logout")
 end
 end
end

Сейчас он работает, как показано ниже

session_key = Asterisk::Client.new.get_session_key('login', 'pass')
client = Asterisk::Client.new(session_key)
client.get_contacts

Я хотел бы получить и установить ключ сеанса, используя singleton. Как это сделать?

1 ответ

module Asterisk
 class Client
 include HTTParty
 include Singleton
 base_uri 'https://asterisk.dev/'
 attr_reader :last_session_update
 private
 def session_key
 if !@session_key || session_refresh_needed?
 @session_key = set_session_key
 @last_session_update = Time.now
 else
 @session_key
 end
 end
 def set_session_key
 self.class.put('/api/auth', query: { login: login, password: password })
 end
 def password
 #the way you get pass
 end
 def login
 #the way you get login (ENV...)
 end
 def session_refresh_needed?
 return true unless last_session_update
 ( Time.now - last_session_update) > 30.minute
 end
 end
end

Он включает вашу проблему с обновлением 30 минут.

Теперь вызовите Asterisk::Client.instance

licensed under cc by-sa 3.0 with attribution.