lib/sailthru.rb in sailthru-client-1.15 vs lib/sailthru.rb in sailthru-client-2.0.0

- old
+ new

@@ -7,11 +7,11 @@ require 'digest/md5' require 'net/http/post/multipart' module Sailthru - Version = VERSION = '1.15' + Version = VERSION = '2.0.0' class SailthruClientException < Exception end module Helpers @@ -116,13 +116,31 @@ # email, String # replacements, Hash # options, Hash # replyto: override Reply-To header # test: send as test email (subject line will be marked, will not count towards stats) + # schedule_time, Date # returns: # Hash, response data from server + # + # Send a transactional email, or schedule one for the near future + # http://docs.sailthru.com/api/send def send(template_name, email, vars={}, options = {}, schedule_time = nil) + warn "[DEPRECATION] `send` is deprecated. Please use `send_email` instead." + send_email(template_name, email, vars={}, options = {}, schedule_time = nil) + end + + # params: + # template_name, String + # email, String + # vars, Hash + # options, Hash + # replyto: override Reply-To header + # test: send as test email (subject line will be marked, will not count towards stats) + # returns: + # Hash, response data from server + def send_email(template_name, email, vars={}, options = {}, schedule_time = nil) post = {} post[:template] = template_name post[:email] = email post[:vars] = vars if vars.length >= 1 post[:options] = options if options.length >= 1 @@ -248,16 +266,18 @@ end # params: # blast_id, Fixnum | String + # options, hash # returns: # Hash, response data from server # # Get information on a previously scheduled email blast - def get_blast(blast_id) - api_get(:blast, {:blast_id => blast_id.to_s}) + def get_blast(blast_id, options={}) + options[:blast_id] = blast_id.to_s + api_get(:blast, options) end # params: # blast_id, Fixnum | String # @@ -286,23 +306,40 @@ # params: # email, String # vars, Hash # lists, Hash mapping list name => 1 for subscribed, 0 for unsubscribed + # options, Hash mapping optional parameters # returns: # Hash, response data from server # # Set replacement vars and/or list subscriptions for an email address. - def set_email(email, vars = {}, lists = {}, templates = {}) - data = {:email => email} + def set_email(email, vars = {}, lists = {}, templates = {}, options = {}) + data = options + data[:email] = email data[:vars] = vars unless vars.empty? data[:lists] = lists unless lists.empty? data[:templates] = templates unless templates.empty? self.api_post(:email, data) end - + # params: + # new_email, String + # old_email, String + # options, Hash mapping optional parameters + # returns: + # Hash of response data. + # + # change a user's email address. + def change_email(new_email, old_email, options = {}) + data = options + data[:email] = new_email + data[:change_email] = old_email + self.api_post(:email, data) + end + + # params: # template_name, String # returns: # Hash of response data. # # Get a template. @@ -344,12 +381,11 @@ if request.post? [:action, :email, :send_id, :sig].each { |key| return false unless params.has_key?(key) } return false unless params[:action] == :verify - sig = params[:sig] - params.delete(:sig) + sig = params.delete(:sig) return false unless sig == get_signature_hash(params, @secret) _send = self.get_send(params[:send_id]) return false unless _send.has_key?(:email) @@ -360,10 +396,48 @@ return false end end # params: + # params, Hash + # request, String + # returns: + # TrueClass or FalseClass, Returns true if the incoming request is an authenticated optout post. + def receive_optout_post(params, request) + if request.post? + [:action, :email, :sig].each { |key| return false unless params.has_key?(key) } + + return false unless params[:action] == 'optout' + + sig = params.delete(:sig) + return false unless sig == get_signature_hash(params, @secret) + return true + else + return false + end + end + + # params: + # params, Hash + # request, String + # returns: + # TrueClass or FalseClass, Returns true if the incoming request is an authenticated hardbounce post. + def receive_hardbounce_post(params, request) + if request.post? + [:action, :email, :sig].each { |key| return false unless params.has_key?(key) } + + return false unless params[:action] == 'hardbounce' + + sig = params.delete(:sig) + return false unless sig == get_signature_hash(params, @secret) + return true + else + return false + end + end + + # params: # email, String # items, String # incomplete, Integer # message_id, String # options, Hash @@ -414,11 +488,10 @@ end if date != nil data[:date] = date end data[:stat] = 'list' - stats(data) end # params @@ -443,22 +516,47 @@ end data[:stat] = 'blast' stats(data) end + # params + # template, String + # start_date, String + # end_date, String + # options, Hash + # + # returns: + # hash, response from server + # Retrieve information about a particular blast or aggregated information from all of blasts over a specified date range + def stats_send(template = nil, start_date = nil, end_date = nil, options = {}) + data = options + if template != nil + data[:template] = template + end + if start_date != nil + data[:start_date] = start_date + end + if end_date != nil + data[:end_date] = end_date + end + data[:stat] = 'send' + stats(data) + end + # params # title, String # url, String # date, String # tags, Array or Comma separated string # vars, Hash + # options, Hash # # Push a new piece of content to Sailthru, triggering any applicable alerts. # http://docs.sailthru.com/api/content - def push_content(title, url, date = nil, tags = nil, vars = {}) - data = {} + def push_content(title, url, date = nil, tags = nil, vars = {}, options = {}) + data = options data[:title] = title data[:url] = url if date != nil data[:date] = date end @@ -507,38 +605,11 @@ api_delete(:list, {:list => list}) end # params # email, String - # hid_only, Boolean # - # gets horizon data - def get_horizon(email, hid_only = false) - data = {} - data[:email] = email - if hid_only == true - data[:hid_only] = 1 - end - api_get(:horizon, data) - end - - - # params - # email, String - # tags, String | Array - # - # sets horizon data - def set_horizon(email, tags) - data = {} - data[:email] = email - data[:tags] = (tags.class == Array) ? tags.join(',') : tags - api_post(:horizon, data) - end - - # params - # email, String - # # get user alert data def get_alert(email) api_get(:alert, {:email => email}) end @@ -656,23 +727,87 @@ 'fields' => fields } api_get(:user, data) end - # Creates new user - def create_new_user(options = {}) - options.delete('id') - api_post(:user, options) - end - - # Save existing user + # Create new user, or update existing user def save_user(id, options = {}) data = options data['id'] = id api_post(:user, data) end + # params + # Get an existing trigger + def get_triggers() + api_get(:trigger, {}) + end + + # params + # template, String + # trigger_id, String + # Get an existing trigger + def get_trigger_by_template(template, trigger_id = nil) + data = {} + data['template'] = template + if trigger_id != nil then data['trigger_id'] = trigger_id end + api_get(:trigger, data) + end + + # params + # event, String + # Get an existing trigger + def get_trigger_by_event(event) + data = {} + data['event'] = event + api_get(:trigger, data) + end + + # params + # template, String + # time, String + # time_unit, String + # event, String + # zephyr, String + # Create or update a trigger + def post_template_trigger(template, time, time_unit, event, zephyr) + data = {} + data['template'] = template + data['time'] = time + data['time_unit'] = time_unit + data['event'] = event + data['zephyr'] = zephyr + api_post(:trigger, data) + end + + # params + # template, String + # time, String + # time_unit, String + # zephyr, String + # Create or update a trigger + def post_event_trigger(event, time, time_unit, zephyr) + data = {} + data['time'] = time + data['time_unit'] = time_unit + data['event'] = event + data['zephyr'] = zephyr + api_post(:trigger, data) + end + + # params + # id, String + # event, String + # options, Hash (Can contain vars, Hash and/or key) + # Notify Sailthru of an Event + def post_event(id, event, options = {}) + data = options + data['id'] = id + data['event'] = event + api_post(:event, data) + end + # Perform API GET request def api_get(action, data) api_request(action, data, 'GET') end @@ -726,11 +861,33 @@ end end return _result end + # set up our post request + def set_up_post_request(uri, data, headers, binary_key = nil) + if (!binary_key.nil?) + binary_data = data[binary_key] + if binary_data.is_a?(StringIO) + data[binary_key] = UploadIO.new( + binary_data, "text/plain" + ) + else + data[binary_key] = UploadIO.new( + File.open(binary_data), "text/plain" + ) + end + + req = Net::HTTP::Post::Multipart.new(uri.path, data) + else + req = Net::HTTP::Post.new(uri.path, headers) + req.set_form_data(data) + end + req + end + # params: # uri, String # data, Hash # method, String "GET" or "POST" # returns: @@ -746,18 +903,13 @@ headers = {"User-Agent" => "Sailthru API Ruby Client #{VERSION}"} _uri = URI.parse(uri) if method == 'POST' - if (!binary_key.nil?) - binary_data = data[binary_key] - data[binary_key] = UploadIO.new(File.open(binary_data), "text/plain") - req = Net::HTTP::Post::Multipart.new(_uri.path, data) - else - req = Net::HTTP::Post.new(_uri.path, headers) - req.set_form_data(data) - end + req = self.set_up_post_request( + _uri, data, headers, binary_key + ) else request_uri = "#{_uri.path}?#{_uri.query}" if method == 'DELETE' req = Net::HTTP::Delete.new(request_uri, headers) @@ -777,10 +929,10 @@ response = http.start { http.request(req) } rescue Exception => e - raise SailthruClientException.new("Unable to open stream: #{_uri}\n#{e}"); + raise SailthruClientException.new(["Unable to open stream: #{_uri}", e.inspect, e.backtrace].join("\n")); end if response.body return response.body else