diff --git a/.gitignore b/.gitignore index dbedfe1..41ac185 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,5 @@ tmp startup.rb Guardfile .DS_Store -lib/startup.rb \ No newline at end of file +lib/startup.rb +.rvmrc \ No newline at end of file diff --git a/lib/mailgun.rb b/lib/mailgun.rb index 20592ff..f068f4e 100644 --- a/lib/mailgun.rb +++ b/lib/mailgun.rb @@ -5,6 +5,7 @@ require "mailgun/mailgun_error" require "mailgun/base" require "mailgun/domain" +require "mailgun/campaign" require "mailgun/route" require "mailgun/mailbox" require "mailgun/bounce" @@ -14,10 +15,12 @@ require "mailgun/list" require "mailgun/list/member" require "mailgun/message" +require "mailgun/event" #require "startup" def Mailgun(options={}) options[:api_key] = Mailgun.api_key if Mailgun.api_key + options[:domain] = Mailgun.domain if Mailgun.domain Mailgun::Base.new(options) end diff --git a/lib/mailgun/base.rb b/lib/mailgun/base.rb index b4632db..63a1110 100644 --- a/lib/mailgun/base.rb +++ b/lib/mailgun/base.rb @@ -13,7 +13,7 @@ def initialize(options) Mailgun.api_version = options.fetch(:api_version) { "v2" } Mailgun.test_mode = options.fetch(:test_mode) { false } Mailgun.api_key = options.fetch(:api_key) { raise ArgumentError.new(":api_key is a required argument to initialize Mailgun") if Mailgun.api_key.nil?} - Mailgun.domain = options.fetch(:domain) { nil } + @domain = options.fetch(:domain) end # Returns the base url used in all Mailgun API calls @@ -22,35 +22,43 @@ def base_url end # Returns an instance of Mailgun::Mailbox configured for the current API user - def mailboxes(domain = Mailgun.domain) + def mailboxes(domain = @domain) Mailgun::Mailbox.new(self, domain) end - def messages(domain = Mailgun.domain) + def messages(domain = @domain) @messages ||= Mailgun::Message.new(self, domain) end - + + def events(domain = @domain) + @events ||= Mailgun::Event.new(self, domain) + end + def routes @routes ||= Mailgun::Route.new(self) end - - def bounces(domain = Mailgun.domain) + + def bounces(domain = @domain) Mailgun::Bounce.new(self, domain) end - + def domains Mailgun::Domain.new(self) end - def unsubscribes(domain = Mailgun.domain) + def campaigns(domain = @domain) + Mailgun::Campaign.new(self, domain) + end + + def unsubscribes(domain = @domain) Mailgun::Unsubscribe.new(self, domain) end - def complaints(domain = Mailgun.domain) + def complaints(domain = @domain) Mailgun::Complaint.new(self, domain) end - def log(domain=Mailgun.domain) + def log(domain=@domain) Mailgun::Log.new(self, domain) end diff --git a/lib/mailgun/campaign.rb b/lib/mailgun/campaign.rb new file mode 100644 index 0000000..82002d8 --- /dev/null +++ b/lib/mailgun/campaign.rb @@ -0,0 +1,40 @@ +module Mailgun + + # Interface to manage campaigns + class Campaign + + def initialize(mailgun, domain) + @mailgun = mailgun + @domain = domain + end + + # List all campaigns on the account + def list(options={}) + Mailgun.submit(:get, campaign_url, options)["items"] || [] + end + + # Find campaign by name + def find(campaign) + Mailgun.submit :get, campaign_url(campaign) + end + + # Add campaign to account + def create(campaign, opts = {}) + opts = {name: campaign}.merge(opts) + Mailgun.submit :post, campaign_url, opts + end + + # Remves a campaign from account + def delete(campaign) + Mailgun.submit :delete, campaign_url(campaign) + end + + private + + # Helper method to generate the proper url for Mailgun campaign API calls + def campaign_url(campaign = nil) + "#{@mailgun.base_url}/#{@domain}/campaigns#{'/' + campaign if campaign}" + end + + end +end diff --git a/lib/mailgun/event.rb b/lib/mailgun/event.rb new file mode 100644 index 0000000..ff3f8ba --- /dev/null +++ b/lib/mailgun/event.rb @@ -0,0 +1,41 @@ +require 'uri' + +module Mailgun + class Event + attr_accessor :items, :page + + def initialize(mailgun, domain) + @mailgun = mailgun + @domain = domain + end + + # list events + def list(options={}) + @stored_options = options.dup + @response = Mailgun.submit(:get, events_url(options[:address]), options) + @items = @response["items"] || [] + @page = @response["paging"] || {} + self + end + + def next + return unless next? + @mailgun.events.list(@stored_options.merge(address: address(@page["next"]))) + end + + def next? + @stored_options[:address] != address(@page["next"]) + end + + private + + def address(uri) + URI.parse(uri).path.split("/").last if uri + end + + # Helper method to generate the proper url for Mailgun event API calls + def events_url(address=nil) + "#{@mailgun.base_url}/#{@domain}/events#{'/' + address if address}" + end + end +end \ No newline at end of file diff --git a/lib/mailgun/list.rb b/lib/mailgun/list.rb index f60564a..7544a99 100644 --- a/lib/mailgun/list.rb +++ b/lib/mailgun/list.rb @@ -37,6 +37,10 @@ def delete(address) Mailgun.submit :delete, list_url(address) end + def create_members(address, members, options={}) + params = {:members => members.to_json} + Mailgun.submit :post, list_url(address) + '/members.json', params.merge(options) + end private diff --git a/lib/mailgun/message.rb b/lib/mailgun/message.rb index 8de6d8b..d058d67 100644 --- a/lib/mailgun/message.rb +++ b/lib/mailgun/message.rb @@ -15,14 +15,25 @@ def send_email(parameters={}) # :in_test_mode BOOL. override the @use_test_mode setting # :tags to add tags to the email # :track BOOL - Mailgun.submit(:post, messages_url, parameters) + Mailgun.submit(:post, publish_messages_url, parameters) + end + + def find(address, parameters={}) + response = Mailgun.submit(:get, messages_url(address), parameters) end - #private + # Removes a stored message from account + def delete(message_id) + Mailgun.submit :delete, messages_url(message_id) + end # Helper method to generate the proper url for Mailgun message API calls - def messages_url + def publish_messages_url(address=nil) "#{@mailgun.base_url}/#{@domain}/messages" end + + def messages_url(address=nil) + "#{@mailgun.base_url}/domains/#{@domain}/messages#{'/' + address if address}" + end end end diff --git a/spec/event_spec.rb b/spec/event_spec.rb new file mode 100644 index 0000000..374f815 --- /dev/null +++ b/spec/event_spec.rb @@ -0,0 +1,24 @@ +require 'spec_helper' + +describe Mailgun::Event do + + before :each do + @mailgun = Mailgun({:api_key => "api-key"}) # used to get the default values + + @sample = { + :email => "test@sample.mailgun.org", + :list_email => "dev@samples.mailgun.org", + :name => "test", + :domain => "sample.mailgun.org" + } + end + + describe "list events" do + it "should make a GET request with the right params" do + Mailgun.should_receive(:submit) + .with(:get, "#{@mailgun.events.send(:events_url)}", {:"event"=>'stored'}).and_return("dummy response") + + @mailgun.events.list(:"event"=>'stored') + end + end +end \ No newline at end of file diff --git a/spec/list/message_spec.rb b/spec/list/message_spec.rb index e58641a..bc1a8d3 100644 --- a/spec/list/message_spec.rb +++ b/spec/list/message_spec.rb @@ -30,11 +30,35 @@ :from => "lumberg.bill@initech.mailgun.domain" } Mailgun.should_receive(:submit) \ - .with(:post, @mailgun.messages.messages_url, parameters) \ + .with(:post, @mailgun.messages.publish_messages_url, parameters) \ .and_return(sample_response) @mailgun.messages.send_email(parameters) end end + describe "find message" do + it "should make a GET request to find a message" do + sample_response = "{\"Received\": \"by foo bar\", \"From\": \"foobar@example.com\", \"To\":\"Foo Bar\", \"subject\":\"Hi\", \"stripped-html\": \"Hi\"}" + message_id = "WyJhMGU2YTFiZjIzIiwgImFV" + Mailgun.should_receive(:submit) + .with(:get, "#{@mailgun.messages.send(:messages_url, message_id)}", {}) + .and_return(sample_response) + + @mailgun.messages.find(message_id) + end + end + + describe "delete message" do + it "should make a DELETE request with correct params" do + sample_response = "{\"message\": \"Message has been deleted\"}" + message_id = "WyJhMGU2YTFiZjIzIiwgImFV" + + Mailgun.should_receive(:submit). + with(:delete, @mailgun.messages.send(:messages_url, message_id)). + and_return(sample_response) + + @mailgun.messages.delete(message_id) + end + end end \ No newline at end of file