sendwithus-clj

0.1.0-SNAPSHOT


Clojure SDK for SendWithUs API

dependencies

org.clojure/clojure
1.5.1
org.clojure/data.json
0.1.2
clj-http
0.3.5



(this space intentionally left almost blank)
 
(ns sendwithus-clj.core
  (:require
   [clj-http.client :as http])
  (:use [clojure.data.json :only [json-str read-json]]
        [clojure.string :only [join]]))
(def client-version 0.1)
(def user-agent (format "clojure-%f" client-version))
(def api-base "/api/v1/")
(def host-base (str "https://api.sendwithus.com" api-base))
(def swu-api-header "X-SWU-API-KEY")
(def swu-client-header "X-SWU-API-CLIENT")
(def ^{:dynamic true} *swu-key* nil)
(def batch-path (str api-base "send"))
(def batch-method "POST")
(defrecord Request [path query body])
(defrecord Template [id locale version name subject html text])
(defrecord Recipient [address name])
(defrecord Sender [address reply_to name])
(defrecord Email [email_id recipient cc bcc sender email_data tags headers inline files esp_account locale version_name])
(defrecord RenderRequest [template_id template_data version_id version_name locale strict])
(defrecord DripCampaign [drip_campaign_id recipient cc bcc sender email_data tags esp_account locale])
(defmacro with-send-with-us [key & body]
  `(binding [*swu-key* ~key]
     ~@body))
(defn- make-uri [request]
  (str host-base (:path request)))
(defn- parameter-string [params]
  (join "&"
        (map (fn [[key val]] (str (name key) "=" (str val)))
             (sort-by #(name (key %)) java.lang.String/CASE_INSENSITIVE_ORDER params))))
(defn- make-headers []
  {"Accept" "text/plain"
   "Content-Type" "application/json;charset=UTF-8"
   swu-api-header *swu-key*
   swu-client-header user-agent})
(defn- do-get [request]
  (read-json (:body (http/get (make-uri request)
              {:body (:body request)
               :query-params (:query request)
               :headers (make-headers)}))))
(defn- do-post [request]
  (read-json
    (:body
      (http/post
        (make-uri request)
        {:body (json-str (:body request))
         :query-params (parameter-string (:query request))
         :headers (make-headers)}))))
(defn- do-put [request]
  (read-json
    (:body
      (http/put
        (make-uri request)
        {:body (json-str (:body request))
         :query-params (parameter-string (:query request))
         :headers (make-headers)}))))
(defn- do-delete [request]
  (read-json
    (:body
      (http/delete (make-uri request) {:query-params (parameter-string (:query request)) :headers (make-headers)}))))

Gets all - no args Gets one - [template-id] Gets one with a specific locale - [template-id locale] Gets one with a specific locale and version - [template-id locale version]

(defn get-templates
  ([] (do-get (Request. "templates" nil nil)))
  ([template-id] (do-get (Request. (str "templates/" template-id) nil nil)))
  ([template-id locale] (do-get (Request. (str "templates/" template-id "/locales/" locale) nil nil)))
  ([template-id locale version] (do-get (Request. (str "templates/" template-id "/locales/" locale "/versions/" version) nil nil))))
(defn update-template [template]
  "Updates an existing template - [Template.]"
  (let [template-id (:id template)
        locale (:locale template)
        version (:version template)]
    (do-put (Request. (str "templates/" template-id "/locales/" locale "/versions/" version) nil template))))
(defn create-template [template]
  "Creates a new template - [Template.]"
  (do-post (Request. "templates" nil template)))
(defn add-locale [template]
  "Adds locale to existing template - [Template.]"
  (let [template-id (:id template)]
    (do-post (Request. (str "templates/" template-id "/locales") nil template))))
(defn add-version [template]
  "Adds a version to template - [Template.] (without locale)
   Adds a version to a specific locale - [Template.] (with locale)"
  (let [template-id (:id template)
        locale (:locale template)]
  (if (empty? locale)
    (do-post (Request. (str "templates/" template-id "/versions") nil template))
    (do-post (Request. (str "templates/" template-id "/locales/" locale "/versions") nil template)))))

Gets all logs - no args Gets specific logs - [log-id show-events(optional)]

(defn get-logs
  ([] (do-get (Request. "logs" nil nil)))
  ([log-id events?]
    (if (false? events?)
      (do-get (Request. (str "logs/" log-id) nil nil))
      (do-get (Request. (str "logs/" log-id "/events") nil nil)))))
(defn resend-email [log-id]
  "Resends a specific email based on log id - [log-id]"
  (do-post (Request. "resend" nil {:log_id log-id})))
(defn send-email [email]
  "Sends an email - [Email.]"
  (do-post (Request. "send" nil email)))

Gets all snippets - no args Gets a specific snippet - [snippet-id]

(defn get-snippets
  ([] (do-get (Request. "snippets" nil nil)))
  ([snippet-id] (do-get (Request. (str "snippets/" snippet-id) nil nil))))
(defn create-snippet [name body]
  "Creates a new snippet - [name body]"
  (do-post (Request. "snippets" nil {:name name :body body})))
(defn update-snippet [snippet-id name body]
  "Updates an existing snippet - [snippet-id name body]"
  (do-put (Request. (str "snippets/" snippet-id) nil {:name name :body body})))
(defn delete-snippet [snippet-id]
  "Deletes an existing snippet - [snippet-id]"
  (do-delete (Request. (str "snippets/" snippet-id) nil nil)))
(defn render-email [render-options]
  "Renders an email based on options - [RenderRequest.]"
  (do-post (Request. "render" nil render-options)))
(defn get-providers []
  "Gets all email service providers - no args"
  (do-get (Request. "esp_accounts" nil nil)))
(defn set-default-provider [provider-id]
  "Set a email service provider as default - [provider-id]"
  (do-put (Request. "esp_accounts/set_default" nil {:esp_id provider-id})))
(defn get-customer [email]
  "Gets a specific customer by email - [email-address]"
  (do-get (Request. (str "customers/" email) nil nil)))

Inserts or updates a customer - [email-address] Inserts or updates a customer with data - [email-address customer-data] Inserts or updates a customer with data and locale - [email-address customer-data locale]

(defn upsert-customer
  ([email] (do-post (Request. "customers" nil {:email email})))
  ([email data] (do-post (Request. "customers" nil {:email email :data data})))
  ([email data locale] (do-post (Request. "customers" nil {:email email :data data :locale locale}))))
(defn delete-customer [email]
  "Deletes and existing customer"
  (do-delete (Request. (str "customers/" email) nil nil)))
(defn get-customer-logs [email]
  "Gets a specific customer's logs by email - [email-address]"
  (do-get (Request. (str "customers/" email "/logs") nil nil)))
(defn add-customer-to-group [email group-id]
  "Adds a specific email to a group - [email-address group-id]"
  (do-post (Request. (str "customers/" email "/groups/" group-id) nil nil)))
(defn remove-customer-from-group [email group-id]
  "Removes a specific customer from a group - [email-address group-id]"
  (do-delete (Request. (str "customers/" email "/groups/" group-id) nil nil)))

Removes a customer for all campaigns - [email-address] Removes a customer from a specific campaign - [email-address campaign-id]

(defn remove-customer-from-campaigns
  ([email] (do-post (Request. "drip_campaigns/deactivate" nil {:recipient_address email})))
  ([email drip-campaign-id] (do-post (Request. (str "drip_campaigns/" drip-campaign-id "/deactivate") nil {:recipient_address email}))))
(defn add-customer-to-campaign [drip-campaign]
  "Adds a customer to a campaign - [DripCampaign.]"
  (let [drip-campaign-id (:drip_campaign_id drip-campaign)]
    (do-post (Request. (str "drip_campaigns/" drip-campaign-id "/activate") nil drip-campaign))))

Gets all drip campaigns - no args Gets a specific drip campaign - [campaign-id]

(defn get-drip-campaigns
  ([] (do-get (Request. "drip_campaigns" nil nil)))
  ([drip-campaign-id] (do-get (Request. (str "drip_campaigns/" drip-campaign-id) nil nil))))
(defn get-segments []
  "Gets all segments - no args"
  (do-get (Request. "segments" nil nil)))
(defn send-to-segement [segment-id template-id email-data]
  "Sends a specific segment - [segment-id template-id email-data]"
  (do-post (Request. (str "segments/" segment-id "/send") nil {:email_id template-id :email_data email-data})))
(defn get-groups []
  "Gets all groups - no args"
  (do-get (Request. "groups" nil nil)))
(defn create-group [name description]
  "Creates a new group - [name description]"
  (do-post (Request. "groups" nil {:name name :description description})))
(defn update-group [group-id name description]
  "Updates an existing group - [group-id name description]"
  (do-put (Request. (str "groups/" group-id) nil {:name name :description description})))
(defn delete-group [group-id]
  "Deletes an existing group - [group-id]"
  (do-delete (Request. (str "groups/" group-id) nil nil)))
(defn batch-send [emails]
  "Sends multiple requests - [[Email.]]"
  (let [batch-requests (vec (map #(assoc {} :path batch-path :method batch-method :body %) emails))]
    (do-post (Request. "batch" nil batch-requests))))