# ExZendesk
Simple [HTTPoison](https://github.com/edgurgel/httpoison) based helper library to interact with the [Zendesk API](https://developer.zendesk.com/rest_api/docs/core/introduction)
## Installation
If [available in Hex](https://hex.pm/docs/publish), the package can be installed as:
1. Add `ex_zendesk` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[{:ex_zendesk, "~> 0.1.0"}]
end
```
2. Ensure `ex_zendesk` is started before your application:
```elixir
def application do
[applications: [:ex_zendesk]]
end
```
## Configuration
First you must configure the subdomain, username, and password. The library will check environment variables first and fall back to application configuration.
This library currently supports Basic authentication or API token authentication.
- subdomain, taken from ZENDESK_SUBDOMAIN environment variable or `Application.get_env(:ex_zendesk, :subdomain)`. This is your zendesk base url, such as https://obscura.zendesk.com
- user, taken from ZENDESK_USER environment variable or `Application.get_env(:ex_zendesk, :user)`. If using basic authentication, this is your zendesk login (ex. user@gmail.com). If using api token authentication this is your zendesk login followed by /token (ex. user@gmail.com/token)
- password, taken from ZENDESK_PASSWORD environment variable or `Application.get_env(:ex_zendesk, :password)`. If using basic authentication this is your zendesk password. If using api token authentication put your api token here.
## Usage
This library is a thin wrapper on top of [HTTPoison](https://github.com/edgurgel/httpoison)
```elixir
ExZendesk.start
ExZendesk.get "/api/v2/tickets.json?per_page=1"
# => {:ok,
# %HTTPoison.Response{body: %{count: 114,
# next_page: "https://storestartup.zendesk.com/api/v2/tickets.json?page=2&per_page=1",
# previous_page: nil,
# tickets: [%{allow_channelback: false, assignee_id: 1802891567,
# brand_id: 572847, collaborator_ids: [],
# created_at: "2016-03-01T07:03:12Z", custom_fields: [],
# description: "Hello,\r\nThis is a test ticket",
# due_at: nil, external_id: nil, fields: [], followup_ids: [],
# forum_topic_id: nil, group_id: 26814467, has_incidents: false, id: 38,
# organization_id: nil, priority: nil, problem_id: nil,
# raw_subject: "Test ticket", recipient: nil,
# requester_id: 5022882178, satisfaction_rating: nil,
# sharing_agreement_ids: [], status: "closed",
# subject: "Test Ticket",
# submitter_id: 5022882178, tags: [], type: nil,
# updated_at: "2016-05-07T17:01:56Z",
# url: "https://storestartup.zendesk.com/api/v2/tickets/38.json",
# via: %{channel: "web", source: %{from: %{}, rel: nil, to: %{}}}}]},
# headers: [{"Server", "nginx"}, {"Date", "Fri, 12 Aug 2016 16:33:01 GMT"},
# {"Content-Type", "application/json; charset=UTF-8"},
# {"Content-Length", "1291"}, {"Connection", "keep-alive"},
# {"X-Zendesk-API-Version", "v2"},
# {"X-Zendesk-Application-Version", "v3.94.2"},
# {"X-Zendesk-API-Warn",
# "Removed restricted keys [\"_json\"] from parameters according to whitelist"},
# {"X-Frame-Options", "SAMEORIGIN"}, {"X-Rate-Limit", "700"},
# {"X-Rate-Limit-Remaining", "699"},
# {"Strict-Transport-Security", "max-age=31536000;"},
# {"X-UA-Compatible", "IE=Edge,chrome=1"},
# {"ETag", "\"8cd9c3920ce86f5b21141e6bcef72358\""},
# {"Cache-Control", "must-revalidate, private, max-age=0"},
# {"X-Zendesk-Origin-Server", "app41.pod6.iad1.zdsys.com"},
# {"X-Request-Id", "5aa337af-21ba-4ef0-ce53-b8ca3a6bb1dc"},
# {"X-Runtime", "0.188008"}, {"X-Rack-Cache", "miss"},
# {"X-Zendesk-Request-Id", "1fcdee3a31262d9d3064"},
# {"X-Content-Type-Options", "nosniff"}], status_code: 200}}
sample_ticket = %{ticket: %{subject: "testing", comment: %{body: "this is a test"}, requester: %{name: "John Doe", email: "jdoe@gmail.com"}}}
ExZendesk.post "/api/v2/tickets.json", sample_ticket
# => {:ok,
# %HTTPoison.Response{body: %{audit: %{author_id: 1802891567,
# created_at: "2016-08-12T16:40:14Z",
# events: [%{attachments: [], audit_id: 145382499768, author_id: 9343852848,
# body: "this is a test",
# html_body: "<div class=\"zd-comment\"><p dir=\"auto\">this is a test</p></div>",
# id: 145382499848, public: true, type: "Comment"},
# %{field_name: "subject", id: 145382500008, type: "Create",
# value: "testing"},
# %{field_name: "status", id: 145382500068, type: "Create", value: "open"},
# %{field_name: "priority", id: 145382500148, type: "Create", value: nil},
# %{field_name: "type", id: 145382500188, type: "Create", value: nil},
# %{field_name: "assignee_id", id: 145382500248, type: "Create",
# value: "1802891567"},
# %{field_name: "group_id", id: 145382500288, type: "Create",
# value: "26814467"},
# %{field_name: "requester_id", id: 145382500368, type: "Create",
# value: "9343852848"},
# %{body: "Your request ({{ticket.id}}) has been received and is being reviewed by our support staff.\n\nTo add additional # # comments, reply to this email.\n\n{{ticket.comments_formatted}}",
# id: 145382500448, recipients: [9343852848],
# subject: "[Request received] {{ticket.title}}", type: "Notification",
# via: %{channel: "rule",
# source: %{from: %{id: 64041887,
# title: "Notify requester of received request"}, rel: "trigger",
# to: %{}}}},
# %{body: "A ticket (\#{{ticket.id}}) by {{ticket.requester.name}} has been received. It is unassigned.\n\n{{ticket.comments_formatted}}",
# id: 145382500608, recipients: [1802891567],
# subject: "[{{ticket.account}}] {{ticket.title}}", type: "Notification",
# via: %{channel: "rule",
# source: %{from: %{id: 64041947,
# title: "Notify all agents of received request"}, rel: "trigger",
# to: %{}}}}], id: 145382499768,
# metadata: %{custom: %{},
# system: %{client: "Elixir/ExZendesk", ip_address: "173.65.209.214",
# latitude: 27.88669999999999, location: "Tampa, FL, United States",
# longitude: -82.5117}}, ticket_id: 173,
# via: %{channel: "api", source: %{from: %{}, rel: nil, to: %{}}}},
# ticket: %{allow_channelback: false, assignee_id: 1802891567,
# brand_id: 572847, collaborator_ids: [],
# created_at: "2016-08-12T16:40:14Z", custom_fields: [],
# description: "this is a test", due_at: nil, external_id: nil, fields: [],
# forum_topic_id: nil, group_id: 26814467, has_incidents: false, id: 173,
# organization_id: nil, priority: nil, problem_id: nil,
# raw_subject: "testing", recipient: nil, requester_id: 9343852848,
# satisfaction_rating: nil, sharing_agreement_ids: [], status: "open",
# subject: "testing", submitter_id: 9343852848, tags: [], type: nil,
# updated_at: "2016-08-12T16:40:14Z",
# url: "https://storestartup.zendesk.com/api/v2/tickets/173.json",
# via: %{channel: "api", source: %{from: %{}, rel: nil, to: %{}}}}},
# headers: [{"Server", "nginx"}, {"Date", "Fri, 12 Aug 2016 16:40:14 GMT"},
# {"Content-Type", "application/json; charset=UTF-8"},
# {"Content-Length", "2665"}, {"Connection", "keep-alive"},
# {"X-Zendesk-API-Version", "v2"},
# {"X-Zendesk-Application-Version", "v3.94.2"},
# {"X-Frame-Options", "SAMEORIGIN"},
# {"Location", "https://partially.zendesk.com/api/v2/tickets/173.json"},
# {"X-Rate-Limit", "700"}, {"X-Rate-Limit-Remaining", "699"},
# {"Strict-Transport-Security", "max-age=31536000;"},
# {"X-UA-Compatible", "IE=Edge,chrome=1"},
# {"ETag", "\"71ffe41cfa9ce1e92dfd15a1de13822d\""},
# {"Cache-Control", "max-age=0, private, must-revalidate"},
# {"X-Zendesk-Origin-Server", "app44.pod6.iad1.zdsys.com"},
# {"X-Request-Id", "deeaf0fd-e352-4102-c1e6-b8ca3a6bbce0"},
# {"X-Runtime", "0.679025"}, {"X-Rack-Cache", "invalidate, pass"},
# {"X-Zendesk-Request-Id", "4e1deda0879800940aeb"},
# {"X-Content-Type-Options", "nosniff"}], status_code: 201}}
```