class HipTail::Authority

Attributes

group_id[R]

Returns group_id for authority. @return [String]

oauth_id[R]

@return [String] Returns OAuth ID.

room_id[R]

Returns room_id for room authority. Nil for global authority. @return [String] @return [nil]

Public Class Methods

new(params) click to toggle source

A new instance of HipTail::Authority. @param [Hash] params @option params [String] :oauth_id @option params [String] :oauth_secret @option params [String] :authorization_url @option params [String] :token_url @option params [String] :room_id @option params [String] :group_id @option params [String] :api_base @return [HipTail::Authority]

# File lib/hiptail/authority.rb, line 42
def initialize(params)
  @oauth_id          = params[:oauth_id]
  @oauth_secret      = params[:oauth_secret]
  @authorization_url = params[:authorization_url]
  @token_url         = params[:token_url]

  @room_id           = params[:room_id]
  @group_id          = params[:group_id]

  @room_id  = @room_id.to_i  if ! @room_id.nil?
  @group_id = @group_id.to_i if ! @group_id.nil?

  api_base_uri = params[:api_base].to_s
  unless api_base_uri.end_with?('/')
    api_base_uri += '/';
  end
  @api_base = URI.parse(api_base_uri)
end

Public Instance Methods

add_member(params) click to toggle source

Issues add member API. @param [Hash] params Parameters for add member API with :room_id. @option params [String] :room_id Room ID. Optional but mandatory for global authority. @option params [String] :user_id One of :user_id, :user_mention, :user_email is required. @option params [String] :user_mention @option params [String] :user_email @return [Hash] Resulting response of API.

# File lib/hiptail/authority.rb, line 144
def add_member(params)
  room_id = self.room_id || params.delete(:room_id)
  raise ArgumentError.new("room_id required") unless room_id

  user_name = user_name_from_params(params)
  raise ArgumentError.new("user_id or user_mention or user_email required") unless user_name

  call_api(:method => :put, :uri => @api_base.merge("room/#{room_id}/member/#{user_name}"), :body_params => params)
end
as_hash() click to toggle source

@return [Hash] Hash representation. Convenient for persistency.

# File lib/hiptail/authority.rb, line 62
def as_hash
  {
    :oauth_id          => @oauth_id,
    :oauth_secret      => @oauth_secret,
    :authorization_url => @authorization_url,
    :token_url         => @token_url,
    :room_id           => @room_id,
    :group_id          => @group_id,
    :api_base          => @api_base,
  }
end
for_global?() click to toggle source

@return [Boolean] Represents whether the authority is for global or not.

# File lib/hiptail/authority.rb, line 21
def for_global?
  ! @room_id
end
Also aliased as: global?
for_room?() click to toggle source

@return [Boolean] Represents whether the authority is for a room or not.

# File lib/hiptail/authority.rb, line 27
def for_room?
  ! for_global?
end
Also aliased as: room?
get_all_members(params = {}) click to toggle source

Issues get all members API. @param [Hash] params Parameters for get all members API. @return [HipTail::Users]

# File lib/hiptail/authority.rb, line 118
def get_all_members(params = {})
  room_id = self.room_id || params.delete(:room_id)
  raise ArgumentError.new("room_id required") unless room_id
  res = call_api(:method => :get, :uri => @api_base.merge("room/#{room_id}/member"), :query_params => params)
  return unless res.successful?
  Users.new(res.data)
end
get_all_participants(params = {}) click to toggle source

Issues get all participants API. @param [Hash] params Parameters for get all participants API. @return [HipTail::Users]

# File lib/hiptail/authority.rb, line 129
def get_all_participants(params = {})
  room_id = self.room_id || params.delete(:room_id)
  raise ArgumentError.new("room_id required") unless room_id
  res = call_api(:method => :get, :uri => @api_base.merge("room/#{room_id}/participant"), :query_params => params)
  return unless res.successful?
  Users.new(res.data)
end
get_all_rooms(params = {}) click to toggle source

Issues get all rooms API. @param [Hash] params Parameters for get all rooms API. @return [HipTail::Rooms]

# File lib/hiptail/authority.rb, line 97
def get_all_rooms(params = {})
  res = call_api(:method => :get, :uri => @api_base.merge("room"), :query_params => params)
  return unless res.successful?
  Rooms.new(res.data)
end
get_all_users(params = {}) click to toggle source

Issues get all users API. @param [Hash] params Parameters for get all users API. @return [HipTail::Users]

# File lib/hiptail/authority.rb, line 186
def get_all_users(params = {})
  res = call_api(:method => :get, :uri => @api_base.merge("user"), :query_params => params)
  return unless res.successful?
  Users.new(res.data)
end
get_room(params) click to toggle source

Issues get room API. @param [Hash] params Parameters for get all room API. @option params [String] :room_id Room ID. Optional but mandatory for global authority. @return [HipTail::Room::Detail]

# File lib/hiptail/authority.rb, line 107
def get_room(params)
  room_id = self.room_id || params.delete(:room_id)
  raise ArgumentError.new("room_id required") unless room_id
  res = call_api(:method => :get, :uri => @api_base.merge("room/#{room_id}"), :query_params => params)
  return unless res.successful?
  Room::Detail.new(res.data)
end
global?()
Alias for: for_global?
remove_member(params) click to toggle source

Issues remove member API. @param [Hash] params Parameters for remove member API with :room_id. @option params [String] :room_id Room ID. Optional but mandatory for global authority. @option params [String] :user_id One of :user_id, :user_mention, :user_email is required. @option params [String] :user_mention @option params [String] :user_email @return [Hash] Resulting response of API.

# File lib/hiptail/authority.rb, line 161
def remove_member(params)
  room_id = self.room_id || params.delete(:room_id)
  raise ArgumentError.new("room_id required") unless room_id

  user_name = user_name_from_params(params)
  raise ArgumentError.new("user_id or user_mention or user_email required") unless user_name

  call_api(:method => :delete, :uri => @api_base.merge("room/#{room_id}/member/#{user_name}"), :body_params => params)
end
reply_message(params) click to toggle source

Issues reply message API. @param [Hash] params Parameters for reply message API with :room_id. @option params [String] :room_id Room ID. Optional but mandatory for global authority. @return [Hash] Resulting response of API.

# File lib/hiptail/authority.rb, line 88
def reply_message(params)
  room_id = self.room_id || params.delete(:room_id)
  raise ArgumentError.new("room_id required") unless room_id
  call_api(:method => :post, :uri => @api_base.merge("room/#{room_id}/reply"), :body_params => params)
end
room?()
Alias for: for_room?
send_notification(params) click to toggle source

Issues send notification API. @param [Hash] params Parameters for notification API with :room_id. @option params [String] :room_id Room ID. Optional but mandatory for global authority. @return [Hash] Resulting response of API.

# File lib/hiptail/authority.rb, line 78
def send_notification(params)
  room_id = self.room_id || params.delete(:room_id)
  raise ArgumentError.new("room_id required") unless room_id
  call_api(:method => :post, :uri => @api_base.merge("room/#{room_id}/notification"), :body_params => params)
end
view_user(params) click to toggle source

Issues view user API. @param [Hash] params Parameters for view user API with :user_id. @option params [String] :user_id User ID or email or mention name (beginning with an '@'). @return [HipTail::User]

# File lib/hiptail/authority.rb, line 175
def view_user(params)
  user_id = params.delete(:user_id)
  raise ArgumentError.new("user_id required") unless user_id
  res = call_api(:method => :get, :uri => @api_base.merge("user/#{user_id}"), :query_params => params)
  return unless res.successful?
  User::Person.new(res.data)
end

Private Instance Methods

call_api(args) click to toggle source
# File lib/hiptail/authority.rb, line 205
def call_api(args)
  uri = URI.parse(args[:uri].to_s)
  queries = URI.decode_www_form(uri.query || '').map { |pair| [ pair[0].to_sym, pair[1] ] }
  # XXX Array or Hash, which is better?
  query = Hash[*queries.flatten(1)].merge(args[:query_params] || {})
  query[:auth_token] = token
  uri.query = query.size > 0 ? URI.encode_www_form(query) : nil

  headers = {
    'Content-Type' => 'application/json; charset=UTF-8',
  }

  if args[:body_params]
    body = JSON.generate(args[:body_params] || {}, :ascii_only => true)
    headers['Content-Length'] = body.bytesize.to_s
  else
    body = nil
  end

  case args[:method].to_s.downcase
  when 'get'
    req = Net::HTTP::Get.new(uri.request_uri, headers)
  when 'post'
    req = Net::HTTP::Post.new(uri.request_uri, headers)
  when 'put'
    req = Net::HTTP::Put.new(uri.request_uri, headers)
  when 'delete'
    req = Net::HTTP::Delete.new(uri.request_uri, headers)
  else
    raise
  end

  req.body = body if body

  res = http.start do |http|
    http.request(req)
  end

  def res.successful?
    self.is_a?(Net::HTTPSuccess)
  end

  if res.content_type =~ %r{\A application/json}x
    body_data = JSON.parse(res.body)
  else
    body_data = {}
  end

  res_class = class << res; self; end
  res_class.class_eval do
    define_method(:data) do
      body_data
    end
  end

  res
end
http() click to toggle source
# File lib/hiptail/authority.rb, line 284
def http
  unless @http
    @http = Net::HTTP.new(@api_base.host, @api_base.port)
    @http.use_ssl = true if @api_base.scheme == 'https'
    @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    if ENV["DEBUG_HTTP"]
      @http.set_debug_output($stderr)
    end
  end

  @http.clone
end
oauth2_client() click to toggle source
# File lib/hiptail/authority.rb, line 271
def oauth2_client
  unless @client
    @client = OAuth2::Client.new(
      @oauth_id, @oauth_secret,
      :authorize_url => @authorization_url,
      :token_url     => @token_url,
      :auth_scheme   => :basic_auth,
    )
  end

  @client
end
token() click to toggle source
# File lib/hiptail/authority.rb, line 263
def token
  if !@token || @token.expired?
    @token = oauth2_client.client_credentials.get_token( :scope => "send_notification send_message admin_room view_group" )
  end

  @token.token
end
user_name_from_params(params) click to toggle source
# File lib/hiptail/authority.rb, line 194
def user_name_from_params(params)
  user_id      = params.delete(:user_id)
  user_mention = params.delete(:user_mention)
  user_email   = params.delete(:user_email)

  return user_id if user_id
  return "@" + user_mention if user_mention
  return user_email if user_email
  return
end