require 'gibbon' require "banana_bits/concerns/hashable" module BananaBits class Client include ::BananaBits::Concerns::Hashable attr_reader :email, :list_id, :api_key def initialize(email, options={}) @email = email options = symbolize_keys(options) @api_key = BananaBits.configuration.api_key || options[:api_key] @list_id = BananaBits.configuration.list_id || options[:list_id] check_for_missing_arguments! end def subscribe(body={}) body.merge! email_address: email, status: 'subscribed' body = remove_blank_values!(body) gibbon_client.lists(list_id).members(hashed_email).upsert(body: body) end def unsubscribe gibbon_client.lists(list_id).members(hashed_email).update( body: { status: "unsubscribed" } ) end def delete gibbon_client.lists(list_id).members(hashed_email).delete end private def gibbon_client Gibbon::Request.new(api_key: api_key, symbolize_keys: true) end def hashed_email Digest::MD5.hexdigest email.downcase end # TODO: Add functionality for adding and or pulling down groups def group_options(group_name) group = get_group(group_name) group_id = group ? group[:id] : nil get_group_options(group_id) end def get_group(group_name) groups = gibbon_client.lists(list_id).interest_categories.retrieve.body groups[:categories].select{ |g| g[:title].downcase == group_name.to_s.downcase }.first end def get_group_options(group_id=nil) if group_id options = gibbon_client.lists(list_id).interest_categories(group_id).interests.retrieve.body[:interests] options.inject({}) { |result, interest| result.merge "#{interest[:name]}" => interest[:id]} else {} end end def check_for_missing_arguments! missing = %i(email api_key list_id).select{ |meth| self.public_send(meth).nil? } if missing.any? msg = "Missing required options: #{missing.join(', ')}." raise BananaBits::Error.new(msg) end end end end