<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,48 +1,101 @@
 class EmailLabsClient
-  ENDPOINT      = 'http://www.elabs7.com/API/mailing_list.html'
-  SITE_ID       = '1234567890'
-  MAILING_LISTS = { 
-    'site_updates' =&gt; { :id =&gt; '12345', :trigger =&gt; '6789' },
-    'newsletter'   =&gt; { :id =&gt; '24560' }
+  ENDPOINT    = 'http://www.elabs7.com/API/mailing_list.html'
+  SITE_ID     = '1234567890'
+  MLID        = '12345'
+  PASSWORD    = 'xxxxxxx'
+  EMAIL_TYPES = {
+    :newsletter   =&gt; { :demographic =&gt; '12345', :trigger =&gt; '1234' },
+    :notification =&gt; { :demographic =&gt; '23456', :trigger =&gt; '2345' },
+    :invitation   =&gt; { :demographic =&gt; ['34567', '45678'], :trigger =&gt; '3456' }
   }
-  
+
   def self.method_missing(symbol, *args)
     case symbol.to_s
     when /subscribe_user_to_(\w+)/
-      subscribe_user MAILING_LISTS[$1][:id], *args
+      subscribe_user EMAIL_TYPES[$1.singularize.to_sym][:demographic], *args
+    when /unsubscribe_user_from_(\w+)/
+      unsubscribe_user EMAIL_TYPES[$1.singularize.to_sym][:demographic], *args
+    when /(\w+)_has_subscriber\?/
+      has_subscriber? EMAIL_TYPES[$1.singularize.to_sym][:demographic], *args
     when /send_(\w+)/
-      send_email MAILING_LISTS[$1][:id], MAILING_LISTS[$1][:trigger], *args
+      send_email EMAIL_TYPES[$1.to_sym][:trigger], *args
+    else
+      super
+    end
+  end
+
+  def self.user_exists?(email_address)
+    send_request('record', 'query-data') do |body|
+      body.DATA email_address, :type =&gt; 'email'
     end
   end
-  
+
   protected
-  
-  def self.subscribe_user(mailing_list, email_address, options = {})
-    send_request('record', 'add') do |body|
-      body.MLID mailing_list
+
+  def self.subscribe_user(demographic_ids, email_address, options = {})
+    demographic_ids = [demographic_ids] if demographic_ids.is_a?(String)
+    action = user_exists?(email_address) ? 'update' : 'add'
+
+    send_request('record', action) do |body|
       body.DATA email_address, :type =&gt; 'email'
+      demographic_ids.each do |demographic_id|
+        body.DATA 'on', :type =&gt; 'demographic', :id =&gt; demographic_id
+      end
       body.DATA options[:first_name], :type =&gt; 'demographic', :id =&gt; '1' unless options[:first_name].blank?
       body.DATA options[:last_name],  :type =&gt; 'demographic', :id =&gt; '2' unless options[:last_name].blank?
     end
   end
-  
-  def self.send_email(mailing_list, trigger_id, email_address, message)
+
+  def self.unsubscribe_user(demographic_ids, email_address, options = {})
+    demographic_ids = [demographic_ids] if demographic_ids.is_a?(String)
+    send_request('record', 'update') do |body|
+      body.DATA email_address, :type =&gt; 'email'
+      demographic_ids.each do |demographic_id|
+        body.DATA nil, :type =&gt; 'demographic', :id =&gt; demographic_id
+      end
+    end
+  end
+
+  def self.has_subscriber?(demographic_ids, email_address, options = {})
+    demographic_ids = [demographic_ids] if demographic_ids.is_a?(String)
+    response = send_request('record', 'query-data', true) do |body|
+      body.DATA email_address, :type =&gt; 'email'
+    end
+    demographic_ids.all? do |d|
+      response.include? &quot;&lt;DATA type=\&quot;demographic\&quot; id=\&quot;#{d}\&quot;&gt;on&lt;/DATA&gt;&quot;
+    end
+  end
+
+  def self.send_email(trigger_id, email_address, message, options = {})
     send_request('triggers', 'fire-trigger') do |body|
-      body.MLID mailing_list
       body.DATA trigger_id,    :type =&gt; 'extra', :id =&gt; 'trigger_id'
       body.DATA email_address, :type =&gt; 'extra', :id =&gt; 'recipients'
       body.DATA message,       :type =&gt; 'extra', :id =&gt; 'message'
-    end    
+      options.to_a.sort_by {|o| o.first.to_s }.each do |key, value|
+        body.DATA value, :type =&gt; 'extra', :id =&gt; key.to_s unless value.blank?
+      end
+    end
   end
-  
-  def self.send_request(request_type, activity)
+
+  def self.send_request(type, activity, return_body = false)
     xml = Builder::XmlMarkup.new :target =&gt; (input = '')
-    xml.instruct!
     xml.DATASET do
       xml.SITE_ID SITE_ID
+      xml.MLID MLID
+      xml.DATA PASSWORD, :type =&gt; 'extra', :id =&gt; 'password'
       yield xml
     end
-    Net::HTTP.post_form(URI.parse(ENDPOINT), :type =&gt; request_type, :activity =&gt; activity, :input =&gt; input)
+
+    conn = Net::HTTP.new(&quot;www.elabs7.com&quot;, 443)
+    conn.use_ssl = true
+    conn.verify_mode = OpenSSL::SSL::VERIFY_NONE
+
+    response = conn.start do |http|
+      req = Net::HTTP::Post.new(&quot;/API/mailing_list.html&quot;)
+      req.set_form_data(&quot;activity&quot; =&gt; activity, &quot;type&quot; =&gt; type, &quot;input&quot; =&gt; input)
+      http.request(req).body
+    end
+    return_body ? response : response.include?(&quot;&lt;TYPE&gt;success&lt;/TYPE&gt;&quot;)
   end
 
 end
\ No newline at end of file</diff>
      <filename>email_labs_client.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,51 +11,67 @@ require 'active_support'
 require File.dirname(__FILE__) + '/email_labs_client'
 
 class EmailLabsClientTest &lt; Test::Unit::TestCase
-  
   context &quot;The EmailLabsClient class&quot; do
-  
-    should &quot;should add a new user&quot; do
-      Net::HTTP.expects(:post_form).with(URI.parse(EmailLabsClient::ENDPOINT),
-        :type =&gt; 'record', :activity =&gt; 'add',
-        :input =&gt; &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;&quot; +
-                  &quot;&lt;DATASET&gt;&quot; +
-                    &quot;&lt;SITE_ID&gt;#{EmailLabsClient::SITE_ID}&lt;/SITE_ID&gt;&quot; +
-                    &quot;&lt;MLID&gt;#{EmailLabsClient::MAILING_LISTS['site_updates'][:id]}&lt;/MLID&gt;&quot; +
-                    &quot;&lt;DATA type=\&quot;email\&quot;&gt;user@example.com&lt;/DATA&gt;&quot; +
-                  &quot;&lt;/DATASET&gt;&quot;)
-      EmailLabsClient.subscribe_user_to_site_updates('user@example.com')
+    setup do
+      @messages = EmailLabsClient::EMAIL_TYPES[:site_message]
     end
     
-    should &quot;should accept an optional name&quot; do
-      Net::HTTP.expects(:post_form).with(URI.parse(EmailLabsClient::ENDPOINT),
-        :type =&gt; 'record', :activity =&gt; 'add',
-        :input =&gt; &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;&quot; +
-                  &quot;&lt;DATASET&gt;&quot; +
-                    &quot;&lt;SITE_ID&gt;#{EmailLabsClient::SITE_ID}&lt;/SITE_ID&gt;&quot; +
-                    &quot;&lt;MLID&gt;#{EmailLabsClient::MAILING_LISTS['site_updates'][:id]}&lt;/MLID&gt;&quot; +
-                    &quot;&lt;DATA type=\&quot;email\&quot;&gt;user@example.com&lt;/DATA&gt;&quot; +
-                    &quot;&lt;DATA type=\&quot;demographic\&quot; id=\&quot;1\&quot;&gt;Sample&lt;/DATA&gt;&quot; + 
-                    &quot;&lt;DATA type=\&quot;demographic\&quot; id=\&quot;2\&quot;&gt;User&lt;/DATA&gt;&quot; +
-                  &quot;&lt;/DATASET&gt;&quot;)
-      EmailLabsClient.subscribe_user_to_site_updates('user@example.com',
-        :first_name =&gt; 'Sample', :last_name =&gt; 'User')
-    end
+    context &quot;managing list membership&quot; do
+      should &quot;tell if a user is already on mailing list&quot; do
+        EmailLabsClient.expects(:send_request).with('record',
+          'query-data').returns(true)
+        assert EmailLabsClient.user_exists?('user@example.com')
+      end
+
+      should &quot;tell if a user is subscribed to an email type&quot; do
+        EmailLabsClient.expects(:send_request).with('record',
+          'query-data', true).returns(&quot;&lt;DATA type=\&quot;demographic\&quot; &quot; +
+          &quot;id=\&quot;#{@messages[:demographic]}\&quot;&gt;on&lt;/DATA&gt;&quot;)
+        assert EmailLabsClient.site_messages_has_subscriber?('user@example.com')
+      end
+
+      should &quot;add a new user&quot; do
+        EmailLabsClient.expects(:user_exists?).with('user@example.com').returns false
+        EmailLabsClient.expects(:send_request).with('record',
+          'add').returns(true)
+        assert EmailLabsClient.subscribe_user_to_site_messages('user@example.com')
+      end
+
+      should &quot;accept an optional name&quot; do
+        EmailLabsClient.expects(:user_exists?).with('user@example.com').returns false
+        EmailLabsClient.expects(:send_request).with('record',
+          'add').returns(true)
+        assert EmailLabsClient.subscribe_user_to_site_messages('user@example.com',
+          :first_name =&gt; 'Sample', :last_name =&gt; 'User')
+      end
     
-    should &quot;should send email&quot; do
-      Net::HTTP.expects(:post_form).with(URI.parse(EmailLabsClient::ENDPOINT),
-        :type =&gt; 'triggers', :activity =&gt; 'fire-trigger',
-        :input =&gt; &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;&quot; +
-                  &quot;&lt;DATASET&gt;&quot; +
-                    &quot;&lt;SITE_ID&gt;#{EmailLabsClient::SITE_ID}&lt;/SITE_ID&gt;&quot; +
-                    &quot;&lt;MLID&gt;#{EmailLabsClient::MAILING_LISTS['site_updates'][:id]}&lt;/MLID&gt;&quot; +
-                    &quot;&lt;DATA type=\&quot;extra\&quot; id=\&quot;trigger_id\&quot;&gt;&quot; + 
-                      &quot;#{EmailLabsClient::MAILING_LISTS['site_updates'][:trigger]}&lt;/DATA&gt;&quot; +
-                    &quot;&lt;DATA type=\&quot;extra\&quot; id=\&quot;recipients\&quot;&gt;user@example.com&lt;/DATA&gt;&quot; +
-                    &quot;&lt;DATA type=\&quot;extra\&quot; id=\&quot;message\&quot;&gt;Why hello there!&lt;/DATA&gt;&quot; +
-                  &quot;&lt;/DATASET&gt;&quot;)
-      EmailLabsClient.send_site_updates('user@example.com', 'Why hello there!')
+      should &quot;update a user if already exists&quot; do
+        EmailLabsClient.expects(:user_exists?).with('user@example.com').returns true
+        EmailLabsClient.expects(:send_request).with('record',
+          'update').returns(true)
+        assert EmailLabsClient.subscribe_user_to_site_messages('user@example.com')
+      end
+
+      should &quot;remove a user&quot; do
+        EmailLabsClient.expects(:send_request).with('record',
+          'update').returns(true)
+        assert EmailLabsClient.unsubscribe_user_from_site_messages('user@example.com')
+      end
     end
     
+    context &quot;sending email&quot; do
+      should &quot;send email&quot; do
+        EmailLabsClient.expects(:send_request).with('triggers',
+          'fire-trigger').returns(true)
+        assert EmailLabsClient.send_site_message('user@example.com', 'Why hello there!')
+      end
+
+      should &quot;accept sender name and email address&quot; do
+        EmailLabsClient.expects(:send_request).with('triggers',
+          'fire-trigger').returns(true)
+        assert EmailLabsClient.send_site_message('user@example.com', 'Why hello there!',
+          :first_name =&gt; &quot;John&quot;, :last_name =&gt; &quot;Smith&quot;)
+      end
+    end
   end
-  
 end
\ No newline at end of file</diff>
      <filename>email_labs_client_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>7dfef5be7910c621027ae1ef0ee55e8907ffdf03</id>
    </parent>
  </parents>
  <author>
    <name>David Eisinger</name>
    <email>david.eisinger@viget.com</email>
  </author>
  <url>http://github.com/vigetlabs/email_labs_client/commit/a0ea35b55b487f55a43d755c7df76fac3ef215cf</url>
  <id>a0ea35b55b487f55a43d755c7df76fac3ef215cf</id>
  <committed-date>2008-10-21T07:15:35-07:00</committed-date>
  <authored-date>2008-10-21T07:15:35-07:00</authored-date>
  <message>Updated to work w/ latest EmailLabs authentication</message>
  <tree>c8cfc2f475507304345241ef7b456f57258a4f71</tree>
  <committer>
    <name>David Eisinger</name>
    <email>david.eisinger@viget.com</email>
  </committer>
</commit>
