frontapp 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/frontapp.rb +5 -0
- data/lib/frontapp/client.rb +116 -0
- data/lib/frontapp/client/channels.rb +68 -0
- data/lib/frontapp/client/comments.rb +51 -0
- data/lib/frontapp/client/contact_groups.rb +55 -0
- data/lib/frontapp/client/contacts.rb +153 -0
- data/lib/frontapp/client/conversations.rb +74 -0
- data/lib/frontapp/client/events.rb +20 -0
- data/lib/frontapp/client/inboxes.rb +66 -0
- data/lib/frontapp/client/messages.rb +157 -0
- data/lib/frontapp/client/rules.rb +20 -0
- data/lib/frontapp/client/tags.rb +46 -0
- data/lib/frontapp/client/teammates.rb +66 -0
- data/lib/frontapp/utils/hash.rb +15 -0
- metadata +113 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f3e435b63630c56d64d442d07157db616154e354
|
4
|
+
data.tar.gz: 42a573b784d7888ab23cb8262315403b7215d1b8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5050cb6fb326a571606ab64594e4863b93112392cffb0d20c0843d7ec105756dc058ca865a93d4ce4abc995996bd75c6614022f4f3ae5663b94831675ef0da9b
|
7
|
+
data.tar.gz: d76fe968f65a4d7ea0e72771d3cf72c3f94adc4327e685369358f60e23b2617df8cbdcfca80fa86147dea30a2ce6f9decf1ff49ed97113921681127d0b887ead
|
data/lib/frontapp.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'http'
|
3
|
+
require 'json'
|
4
|
+
require_relative 'client/channels.rb'
|
5
|
+
require_relative 'client/comments.rb'
|
6
|
+
require_relative 'client/contact_groups.rb'
|
7
|
+
require_relative 'client/contacts.rb'
|
8
|
+
require_relative 'client/conversations.rb'
|
9
|
+
require_relative 'client/events.rb'
|
10
|
+
require_relative 'client/inboxes.rb'
|
11
|
+
require_relative 'client/messages.rb'
|
12
|
+
require_relative 'client/rules.rb'
|
13
|
+
require_relative 'client/tags.rb'
|
14
|
+
require_relative 'client/teammates.rb'
|
15
|
+
|
16
|
+
module Frontapp
|
17
|
+
class Client
|
18
|
+
|
19
|
+
include Frontapp::Client::Channels
|
20
|
+
include Frontapp::Client::Comments
|
21
|
+
include Frontapp::Client::ContactGroups
|
22
|
+
include Frontapp::Client::Contacts
|
23
|
+
include Frontapp::Client::Conversations
|
24
|
+
include Frontapp::Client::Events
|
25
|
+
include Frontapp::Client::Inboxes
|
26
|
+
include Frontapp::Client::Messages
|
27
|
+
include Frontapp::Client::Rules
|
28
|
+
include Frontapp::Client::Tags
|
29
|
+
include Frontapp::Client::Teammates
|
30
|
+
|
31
|
+
def initialize(options={})
|
32
|
+
auth_token = options[:auth_token]
|
33
|
+
@headers = HTTP.headers({
|
34
|
+
Accept: "application/json",
|
35
|
+
Authorization: "Bearer #{auth_token}"
|
36
|
+
})
|
37
|
+
end
|
38
|
+
|
39
|
+
def list(path, params = {})
|
40
|
+
items = []
|
41
|
+
last_page = false
|
42
|
+
query = format_query(params)
|
43
|
+
url = "#{base_url}#{path}?#{query}"
|
44
|
+
until last_page
|
45
|
+
res = @headers.get(url)
|
46
|
+
response = JSON.parse(res.to_s)
|
47
|
+
items.concat(response["_results"]) if response["_results"]
|
48
|
+
pagination = response["_pagination"]
|
49
|
+
if pagination.nil? || pagination["next"].nil?
|
50
|
+
last_page = true
|
51
|
+
else
|
52
|
+
url = pagination["next"]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
items
|
56
|
+
end
|
57
|
+
|
58
|
+
def get(path)
|
59
|
+
res = @headers.get("#{base_url}#{path}")
|
60
|
+
JSON.parse(res.to_s)
|
61
|
+
end
|
62
|
+
|
63
|
+
def create(path, body)
|
64
|
+
res = @headers.post("#{base_url}#{path}", json: body)
|
65
|
+
response = JSON.parse(res.to_s)
|
66
|
+
if !res.status.success?
|
67
|
+
raise "Response: #{res.inspect}\n Body: #{res.body}\nRequest: #{body.to_json.inspect}"
|
68
|
+
end
|
69
|
+
response
|
70
|
+
end
|
71
|
+
|
72
|
+
def create_without_response(path, body)
|
73
|
+
res = @headers.post("#{base_url}#{path}", json: body)
|
74
|
+
if !res.status.success?
|
75
|
+
raise "Response: #{res.inspect}\n Body: #{res.body}\nRequest: #{body.to_json.inspect}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def update(path, body)
|
80
|
+
res = @headers.patch("#{base_url}#{path}", json: body)
|
81
|
+
if !res.status.success?
|
82
|
+
raise "Response: #{res.inspect}\n Body: #{res.body}\nRequest: #{body.to_json.inspect}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def delete(path, body = {})
|
87
|
+
res = @headers.delete("#{base_url}#{path}", json: body)
|
88
|
+
if !res.status.success?
|
89
|
+
raise "Response: #{res.inspect}\n Body: #{res.body}\nRequest: #{body.to_json.inspect}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
def format_query(params)
|
95
|
+
res = []
|
96
|
+
q = params.delete(:q)
|
97
|
+
if q && q.is_a?(Hash)
|
98
|
+
res << q.map do |k, v|
|
99
|
+
case v
|
100
|
+
when Symbol, String
|
101
|
+
"q[#{k}][]=#{URI.encode(v)}"
|
102
|
+
when Array then
|
103
|
+
v.map { |c| "q[#{k}][]=#{URI.encode(c)}" }.join("&")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
res << params.map {|k,v| "#{k}=#{URI.encode(v)}"}
|
108
|
+
res.join("&")
|
109
|
+
end
|
110
|
+
|
111
|
+
def base_url
|
112
|
+
"https://api2.frontapp.com/"
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Channels
|
4
|
+
|
5
|
+
def channels(params = {})
|
6
|
+
list("channels", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Parameters
|
10
|
+
# Name Type Description
|
11
|
+
# -------------------------------
|
12
|
+
# channel_id string Id of the requested channel
|
13
|
+
# -------------------------------
|
14
|
+
def get_channel(channel_id)
|
15
|
+
get("channels/#{channel_id}")
|
16
|
+
end
|
17
|
+
|
18
|
+
# Only custom channels can be updated through the api!
|
19
|
+
#
|
20
|
+
# Parameters
|
21
|
+
# Name Type Description
|
22
|
+
# -------------------------------
|
23
|
+
# channel_id string Id of the requested channel
|
24
|
+
# -------------------------------
|
25
|
+
#
|
26
|
+
# Allowed attributes:
|
27
|
+
# Name Type Description
|
28
|
+
# ---------------------------------------------------
|
29
|
+
# settings object
|
30
|
+
# settings.webhook_url string (optional) custom type only. URL to which will be sent the replies of a custom message.
|
31
|
+
# ---------------------------------------------------
|
32
|
+
def update_channel!(channel_id, params = {})
|
33
|
+
cleaned = params.permit({ settings: [:webhook_url] })
|
34
|
+
update("channels/#{channel_id}", cleaned)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Only custom channels can be created through the api!
|
38
|
+
#
|
39
|
+
# Parameters
|
40
|
+
# Name Type Description
|
41
|
+
# -----------------------------
|
42
|
+
# inbox_id string Id of the inbox into which the channel messages will go
|
43
|
+
# -----------------------------
|
44
|
+
#
|
45
|
+
# Allowed attributes:
|
46
|
+
# Name Type Description
|
47
|
+
# ----------------------------------------------------
|
48
|
+
# type enum Type of the channel.
|
49
|
+
# settings object
|
50
|
+
# settings.webhook_url string (optional) custom type only. URL to which will be sent the replies of a custom message.
|
51
|
+
# ----------------------------------------------------
|
52
|
+
def create_channel!(inbox_id, params = {})
|
53
|
+
cleaned = params.permit(:type, { settings: [:webhook_url] })
|
54
|
+
create("inboxes/#{inbox_id}/channels", cleaned)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Parameters
|
58
|
+
# Name Type Description
|
59
|
+
# -------------------------------
|
60
|
+
# channel_id string Id of the requested channel
|
61
|
+
# -------------------------------
|
62
|
+
def get_channel_inbox(channel_id)
|
63
|
+
get("channels/#{channel_id}/inbox")
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Comments
|
4
|
+
|
5
|
+
# Parameters
|
6
|
+
# Name Type Description
|
7
|
+
# ------------------------------------
|
8
|
+
# conversation_id string Id of the requested conversation
|
9
|
+
# ------------------------------------
|
10
|
+
#
|
11
|
+
# Allowed attributes:
|
12
|
+
# Name Type Description
|
13
|
+
# ------------------------------
|
14
|
+
# author_id string Id of the teammate creating the comment
|
15
|
+
# body string Content of the comment
|
16
|
+
# ------------------------------
|
17
|
+
def create_comment!(conversation_id, params = {})
|
18
|
+
cleaned = params.permit(:author_id,:body)
|
19
|
+
create("conversations/#{conversation_id}/comments", cleaned)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Parameters
|
23
|
+
# Name Type Description
|
24
|
+
# ------------------------------------
|
25
|
+
# conversation_id string Id of the requested conversation
|
26
|
+
# ------------------------------------
|
27
|
+
def get_conversation_comments(conversation_id)
|
28
|
+
list("conversations/#{conversation_id}/comments")
|
29
|
+
end
|
30
|
+
|
31
|
+
# Parameters
|
32
|
+
# Name Type Description
|
33
|
+
# -------------------------------
|
34
|
+
# comment_id string Id of the requested comment
|
35
|
+
# -------------------------------
|
36
|
+
def get_comment(comment_id)
|
37
|
+
get("comments/#{comment_id}")
|
38
|
+
end
|
39
|
+
|
40
|
+
# Parameters
|
41
|
+
# Name Type Description
|
42
|
+
# -------------------------------
|
43
|
+
# comment_id string Id of the requested comment
|
44
|
+
# -------------------------------
|
45
|
+
def get_comment_mentions(comment_id)
|
46
|
+
get("comments/#{comment_id}/mentions")
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module ContactGroups
|
4
|
+
|
5
|
+
def contact_groups(params = {})
|
6
|
+
list("contact_groups", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Allowed attributes:
|
10
|
+
# Name Type Description
|
11
|
+
# -------------------------------------------
|
12
|
+
# name string Name of the group
|
13
|
+
# -------------------------------------------
|
14
|
+
def create_contact_group!(params = {})
|
15
|
+
cleaned = params.permit(:name)
|
16
|
+
create("contact_groups", cleaned)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Parameters
|
20
|
+
# Name Type Description
|
21
|
+
# -------------------------------
|
22
|
+
# group_id string Id of the requested group
|
23
|
+
# -------------------------------
|
24
|
+
def delete_contact_group!(group_id)
|
25
|
+
delete("contact_groups/#{group_id}")
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Parameters
|
30
|
+
# Name Type Description
|
31
|
+
# -------------------------------
|
32
|
+
# group_id string Id of the requested group
|
33
|
+
# -------------------------------
|
34
|
+
def get_contact_group_contacts(group_id)
|
35
|
+
get("contact_groups/#{group_id}/contacts")
|
36
|
+
end
|
37
|
+
|
38
|
+
# Parameters
|
39
|
+
# Name Type Description
|
40
|
+
# -------------------------------
|
41
|
+
# group_id string Id of the requested group
|
42
|
+
# -------------------------------
|
43
|
+
#
|
44
|
+
# Allowed attributes:
|
45
|
+
# Name Type Description
|
46
|
+
# --------------------------------------------
|
47
|
+
# contact_ids array List of ids or aliases of the contacts to add in the requested group
|
48
|
+
# --------------------------------------------
|
49
|
+
def add_contacts_to_contact_group!(group_id, params = {})
|
50
|
+
cleaned = params.permit(:contact_ids)
|
51
|
+
create_without_response("contact_groups/#{group_id}/contacts", cleaned)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Contacts
|
4
|
+
|
5
|
+
def contacts(params = {})
|
6
|
+
list("contacts", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Parameters
|
10
|
+
# Name Type Description
|
11
|
+
# -------------------------------
|
12
|
+
# contact_id string Id or alias of the requested contact
|
13
|
+
# -------------------------------
|
14
|
+
def get_contact(contact_id)
|
15
|
+
get("contacts/#{contact_id}")
|
16
|
+
end
|
17
|
+
|
18
|
+
# Parameters
|
19
|
+
# Name Type Description
|
20
|
+
# -------------------------------
|
21
|
+
# contact_id string Id or alias of the requested contact
|
22
|
+
# -------------------------------
|
23
|
+
#
|
24
|
+
# Allowed attributes:
|
25
|
+
# Name Type Description
|
26
|
+
# --------------------------------------------
|
27
|
+
# name string (optional) Contact name
|
28
|
+
# description string (optional) Contact description
|
29
|
+
# avatar_url string (optional) URL of the contact’s avatar
|
30
|
+
# is_spammer boolean (optional) Whether or not the contact is marked as a spammer
|
31
|
+
# links array (optional) List of all the links of the contact
|
32
|
+
# group_names array (optional) List of all the group names the contact belongs to. It will automatically create missing groups.
|
33
|
+
# --------------------------------------------
|
34
|
+
def update_contact!(contact_id, params = {})
|
35
|
+
cleaned = params.permit(:name,
|
36
|
+
:description,
|
37
|
+
:avatar_url,
|
38
|
+
:is_spammer,
|
39
|
+
:links,
|
40
|
+
:group_names)
|
41
|
+
update("contacts/#{contact_id}", cleaned)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Allowed attributes:
|
45
|
+
# Name Type Description
|
46
|
+
# --------------------------------------------
|
47
|
+
# name string (optional) Contact name
|
48
|
+
# description string (optional) Contact description
|
49
|
+
# avatar_url string (optional) URL of the contact’s avatar
|
50
|
+
# is_spammer boolean (optional) Whether or not the contact is marked as a spammer
|
51
|
+
# links array (optional) List of all the links of the contact
|
52
|
+
# group_names array (optional) List of all the group names the contact belongs to. It will automatically create missing groups.
|
53
|
+
# handles array List
|
54
|
+
# --------------------------------------------
|
55
|
+
def create_contact!(params = {})
|
56
|
+
cleaned = params.permit(:name,
|
57
|
+
:description,
|
58
|
+
:avatar_url,
|
59
|
+
:is_spammer,
|
60
|
+
:links,
|
61
|
+
:group_names,
|
62
|
+
:handles)
|
63
|
+
create("contacts", cleaned)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Name Type Description
|
67
|
+
# -------------------------------
|
68
|
+
# contact_id string Id or alias of the requested contact
|
69
|
+
# -------------------------------
|
70
|
+
def delete_contact!(contact_id)
|
71
|
+
delete("contacts/#{contact_id}")
|
72
|
+
end
|
73
|
+
|
74
|
+
# Parameters
|
75
|
+
# Name Type Description
|
76
|
+
# -------------------------------
|
77
|
+
# contact_id string Id or alias of the requested contact
|
78
|
+
# -------------------------------
|
79
|
+
#
|
80
|
+
# Allowed params:
|
81
|
+
# Name Type Description
|
82
|
+
# ----------------------------------------------
|
83
|
+
# q object (optional) Search query.
|
84
|
+
# q.statuses array (optional) List of the statuses of the conversations you want to list
|
85
|
+
# ----------------------------------------------
|
86
|
+
def get_contact_conversations(contact_id, params = {})
|
87
|
+
cleaned = params.permit({ q: [:statuses] })
|
88
|
+
list("contacts/#{contact_id}/conversations", cleaned)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Parameters
|
92
|
+
# Name Type Description
|
93
|
+
# -------------------------------
|
94
|
+
# contact_id string Id or alias of the requested contact
|
95
|
+
# -------------------------------
|
96
|
+
#
|
97
|
+
# Allowed attributes:
|
98
|
+
# Name Type Description
|
99
|
+
# ---------------------------
|
100
|
+
# handle string Handle used to reach the contact. Can be an email address, a twitter, handle, a phone number, …
|
101
|
+
# source enum Can be 'twitter’, 'email’ or 'phone’.
|
102
|
+
# ---------------------------
|
103
|
+
def add_contact_handle!(contact_id, params = {})
|
104
|
+
cleaned = params.permit(:handle, :source)
|
105
|
+
create_without_response("contacts/#{contact_id}/handles", cleaned)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Parameters
|
109
|
+
# Name Type Description
|
110
|
+
# -------------------------------
|
111
|
+
# contact_id string Id or alias of the requested contact
|
112
|
+
# -------------------------------
|
113
|
+
#
|
114
|
+
# Allowed attributes:
|
115
|
+
# Name Type Description
|
116
|
+
# ---------------------------
|
117
|
+
# handle string Handle used to reach the contact. Can be an email address, a twitter, handle, a phone number, …
|
118
|
+
# source enum Can be 'twitter’, 'email’ or 'phone’.
|
119
|
+
# ---------------------------
|
120
|
+
def delete_contact_handle!(contact_id, params = {})
|
121
|
+
cleaned = params.permit(:handle, :source)
|
122
|
+
delete("contacts/#{contact_id}/handles", cleaned)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Parameters
|
126
|
+
# Name Type Description
|
127
|
+
# -------------------------------
|
128
|
+
# contact_id string Id or alias of the requested contact
|
129
|
+
# -------------------------------
|
130
|
+
def get_contact_notes(contact_id)
|
131
|
+
list("contacts/#{contact_id}/notes")
|
132
|
+
end
|
133
|
+
|
134
|
+
# Parameters
|
135
|
+
# Name Type Description
|
136
|
+
# -------------------------------
|
137
|
+
# contact_id string Id or alias of the requested contact
|
138
|
+
# -------------------------------
|
139
|
+
#
|
140
|
+
# Allowed attributes:
|
141
|
+
# Name Type Description
|
142
|
+
# ------------------------------
|
143
|
+
# author_id string Id of the teammate creating the note
|
144
|
+
# body string Content of the note
|
145
|
+
# ------------------------------
|
146
|
+
def add_contact_note!(contact_id, params = {})
|
147
|
+
cleaned = params.permit(:author_id, :body)
|
148
|
+
create("contacts/#{contact_id}/notes", cleaned)
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Conversations
|
4
|
+
|
5
|
+
def conversations(params = {})
|
6
|
+
list("conversations", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Parameters
|
10
|
+
# Name Type Description
|
11
|
+
# ------------------------------------
|
12
|
+
# conversation_id string Id of the requested conversation
|
13
|
+
# ------------------------------------
|
14
|
+
def get_conversation(conversation_id)
|
15
|
+
get("conversations/#{conversation_id}")
|
16
|
+
end
|
17
|
+
|
18
|
+
# Parameters
|
19
|
+
# Name Type Description
|
20
|
+
# ------------------------------------
|
21
|
+
# conversation_id string Id of the requested conversation
|
22
|
+
# ------------------------------------
|
23
|
+
#
|
24
|
+
# Allowed attributes:
|
25
|
+
# Name Type Description
|
26
|
+
# ---------------------------------------------
|
27
|
+
# assignee_id string (optional) ID of the teammate to assign the conversation to. Set it to null to unassign.
|
28
|
+
# status enum (optional) New status of the conversation
|
29
|
+
# tags array (optional) List of all the tag names replacing the old conversation tags
|
30
|
+
# ---------------------------------------------
|
31
|
+
# The assignee id is their Frontapp handle, e.g. @username
|
32
|
+
def update_conversation!(conversation_id, params = {})
|
33
|
+
cleaned = params.permit(:assignee_id, :status, :tags)
|
34
|
+
update("conversations/#{conversation_id}", cleaned)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Parameters
|
38
|
+
# Name Type Description
|
39
|
+
# --------------------------------
|
40
|
+
# conversation_id string Id or email of the requested conversation
|
41
|
+
# --------------------------------
|
42
|
+
def get_conversation_inboxes(conversation_id)
|
43
|
+
get("conversations/#{conversation_id}/inboxes")
|
44
|
+
end
|
45
|
+
|
46
|
+
# Parameters
|
47
|
+
# Name Type Description
|
48
|
+
# --------------------------------
|
49
|
+
# conversation_id string Id or email of the requested conversation
|
50
|
+
# --------------------------------
|
51
|
+
def get_conversation_followers(conversation_id)
|
52
|
+
get("conversations/#{conversation_id}/followers")
|
53
|
+
end
|
54
|
+
|
55
|
+
# Parameters
|
56
|
+
# Name Type Description
|
57
|
+
# --------------------------------
|
58
|
+
# conversation_id string Id or email of the requested conversation
|
59
|
+
# --------------------------------
|
60
|
+
def get_conversation_events(conversation_id)
|
61
|
+
list("conversations/#{conversation_id}/events")
|
62
|
+
end
|
63
|
+
|
64
|
+
# Parameters
|
65
|
+
# Name Type Description
|
66
|
+
# --------------------------------
|
67
|
+
# conversation_id string Id or email of the requested conversation
|
68
|
+
# --------------------------------
|
69
|
+
def get_conversation_messages(conversation_id)
|
70
|
+
list("conversations/#{conversation_id}/messages")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Events
|
4
|
+
|
5
|
+
def events(params = {})
|
6
|
+
list("events", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Parameters
|
10
|
+
# Name Type Description
|
11
|
+
# -----------------------------
|
12
|
+
# event_id string Id of the requested event
|
13
|
+
# -----------------------------
|
14
|
+
def get_event(event_id)
|
15
|
+
get("events/#{event_id}")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Inboxes
|
4
|
+
|
5
|
+
def inboxes(params = {})
|
6
|
+
list("inboxes", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Parameters
|
10
|
+
# Name Type Description
|
11
|
+
# -----------------------------
|
12
|
+
# inbox_id string Id of the requested inbox
|
13
|
+
# -----------------------------
|
14
|
+
def get_inbox(inbox_id)
|
15
|
+
get("inboxes/#{inbox_id}")
|
16
|
+
end
|
17
|
+
|
18
|
+
# Allowed attributes:
|
19
|
+
# Name Type Description
|
20
|
+
# -------------------------------------------
|
21
|
+
# name string Name of the inbox
|
22
|
+
# teammate_ids array (optional) List of all the teammate ids who will have access to this inbox. If omitted, it will automatically select all the administrators in your company.
|
23
|
+
# -------------------------------------------
|
24
|
+
def create_inbox!(params = {})
|
25
|
+
cleaned = params.permit(:name, :teammate_ids)
|
26
|
+
create("inboxes", cleaned)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Parameters
|
30
|
+
# Name Type Description
|
31
|
+
# -----------------------------
|
32
|
+
# inbox_id string Id of the requested inbox
|
33
|
+
# -----------------------------
|
34
|
+
def get_inbox_channels(inbox_id)
|
35
|
+
get("inboxes/#{inbox_id}/channels")
|
36
|
+
end
|
37
|
+
|
38
|
+
# Parameters
|
39
|
+
# Name Type Description
|
40
|
+
# -----------------------------
|
41
|
+
# inbox_id string Id of the requested inbox
|
42
|
+
# -----------------------------
|
43
|
+
#
|
44
|
+
# Allowed attributes:
|
45
|
+
# Name Type Description
|
46
|
+
# ----------------------------------------------
|
47
|
+
# q object (optional) Search query.
|
48
|
+
# q.statuses array (optional) List of the statuses of the conversations you want to list
|
49
|
+
# ----------------------------------------------
|
50
|
+
def get_inbox_conversations(inbox_id, params = {})
|
51
|
+
cleaned = params.permit({ q: [:statuses] })
|
52
|
+
list("inboxes/#{inbox_id}/conversations", cleaned)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Parameters
|
56
|
+
# Name Type Description
|
57
|
+
# -----------------------------
|
58
|
+
# inbox_id string Id of the requested inbox
|
59
|
+
# -----------------------------
|
60
|
+
def get_inbox_teammates(inbox_id)
|
61
|
+
get("inboxes/#{inbox_id}/teammates")
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Messages
|
4
|
+
|
5
|
+
# Parameters
|
6
|
+
# Name Type Description
|
7
|
+
# -------------------------------
|
8
|
+
# message_id string Id of the requested message
|
9
|
+
# -------------------------------
|
10
|
+
def get_message(message_id)
|
11
|
+
get("messages/#{message_id}")
|
12
|
+
end
|
13
|
+
|
14
|
+
# Parameters
|
15
|
+
# Name Type Description
|
16
|
+
# -------------------------------
|
17
|
+
# channel_id string Id or address of the channel from which to send the message
|
18
|
+
# -------------------------------
|
19
|
+
#
|
20
|
+
# Allowed attributes:
|
21
|
+
# Name Type Description
|
22
|
+
# ------------------------------------------------
|
23
|
+
# author_id string (optional) Id of the teammate on behalf of whom the answer is sent
|
24
|
+
# subject string (optional) Subject of the message for email message
|
25
|
+
# body string Body of the message
|
26
|
+
# text string (optional) Text version of the body for messages with non-text body
|
27
|
+
# options object (optional) Sending options
|
28
|
+
# options.tags array (optional) List of tag names to add to the conversation (unknown tags will automatically be created)
|
29
|
+
# options.archive boolean (optional) Archive the conversation right when sending the reply (Default: true)
|
30
|
+
# to array List of the recipient handles who will receive this message
|
31
|
+
# cc array (optional) List of the recipient handles who will receive a copy of this message
|
32
|
+
# bcc array (optional) List of the recipient handles who will receive a blind copy of this message
|
33
|
+
# ------------------------------------------------
|
34
|
+
def send_message(channel_id, params)
|
35
|
+
cleaned = params.permit(:author_id,
|
36
|
+
:subject,
|
37
|
+
:body,
|
38
|
+
:text,
|
39
|
+
{ options: [:tags, :archive] },
|
40
|
+
:to,
|
41
|
+
:cc,
|
42
|
+
:bcc)
|
43
|
+
create("channels/#{channel_id}/messages", cleaned)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Parameters
|
47
|
+
# Name Type Description
|
48
|
+
# ------------------------------------
|
49
|
+
# conversation_id string Id of the conversation
|
50
|
+
# ------------------------------------
|
51
|
+
#
|
52
|
+
# Allowed attributes:
|
53
|
+
# Name Type Description
|
54
|
+
# ------------------------------------------------
|
55
|
+
# author_id string (optional) ID of the teammate on behalf of whom the answer is sent
|
56
|
+
# subject string (optional) Subject of the message for email message
|
57
|
+
# body string Body of the message
|
58
|
+
# text string (optional) Text version of the body for messages with non-text body
|
59
|
+
# options object (optional) Sending options
|
60
|
+
# options.tags array (optional) List of tag names to add to the conversation (unknown tags will automatically be created)
|
61
|
+
# options.archive boolean (optional) Archive the conversation right when sending the reply (Default: true)
|
62
|
+
# channel_id string (optional) Channel through which to send the message. Defaults to the original conversation channel. For imported messages or messages received on multiple channels, you MUST specify a channel ID.
|
63
|
+
# to array (optional) List of the recipient handles who will receive this message. By default it will use the recipients of the last received message.
|
64
|
+
# cc array (optional) List of the recipient handles who will receive a copy of this message. By default it will use the cc'ed recipients of the last received message.
|
65
|
+
# bcc array (optional) List of the recipient handles who will receive a blind copy of this message
|
66
|
+
# ------------------------------------------------
|
67
|
+
def send_reply(conversation_id, params)
|
68
|
+
cleaned = params.permit(:author_id,
|
69
|
+
:subject,
|
70
|
+
:body,
|
71
|
+
:text,
|
72
|
+
{ options: [:tags, :archive] },
|
73
|
+
:channel_id,
|
74
|
+
:to,
|
75
|
+
:cc,
|
76
|
+
:bcc)
|
77
|
+
create_without_response("conversations/#{conversation_id}/messages", cleaned)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Parameters
|
81
|
+
# Name Type Description
|
82
|
+
# ------------------------------------
|
83
|
+
# channel_id string Id of the requested custom channel
|
84
|
+
# ------------------------------------
|
85
|
+
#
|
86
|
+
# Allowed attributes:
|
87
|
+
# Name Type Description
|
88
|
+
# ----------------------------------------------------
|
89
|
+
# sender object Data of the sender
|
90
|
+
# sender.contact_id string (optional) ID of the contact in Front corresponding to the sender
|
91
|
+
# sender.name string (optional) Name of the sender
|
92
|
+
# sender.handle string Handle of the sender. It can be any string used to uniquely identify the sender
|
93
|
+
# subject string (optional) Subject of the message
|
94
|
+
# body string Body of the message
|
95
|
+
# body_format enum (optional) Format of the message body. (Default: 'markdown')
|
96
|
+
# metadata object (optional)
|
97
|
+
# metadata.thread_ref string (optional) Custom reference which will be used to thread messages. If you ommit this field, we’ll thread by sender instead
|
98
|
+
# metadata.headers object (optional) Custom object where any internal information can be stored
|
99
|
+
# ----------------------------------------------------
|
100
|
+
def receive_custom_message(channel_id, params)
|
101
|
+
cleaned = params.permit({ sender: [:contact_id, :name, :handle] },
|
102
|
+
:subject,
|
103
|
+
:body,
|
104
|
+
:body_format,
|
105
|
+
{ metadata: [:thread_ref, :headers] })
|
106
|
+
create("channels/#{channel_id}/incoming_messages", cleaned)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Parameters
|
110
|
+
# Name Type Description
|
111
|
+
# -----------------------------
|
112
|
+
# inbox_id string Id of the inbox into which the message should be append.
|
113
|
+
# -----------------------------
|
114
|
+
#
|
115
|
+
# Allowed attributes:
|
116
|
+
# Name Type Description
|
117
|
+
# -----------------------------------------------------------
|
118
|
+
# sender object
|
119
|
+
# sender.handle string Handle used to reach the contact. Can be an email address, a twitter, handle, a phone number, …
|
120
|
+
# sender.name string (optional) Name of the contact.
|
121
|
+
# sender.author_id string (optional) Id of the teammate who is the author of the message. Ignored if the message is inbound.
|
122
|
+
# to array List of recipient handles who received the message.
|
123
|
+
# cc array (optional) List of recipient handles who received a copy of the message.
|
124
|
+
# bcc array (optional) List of the recipeient handles who received a blind copy of the message.
|
125
|
+
# subject string (optional) Subject of the message.
|
126
|
+
# body string Body of the message.
|
127
|
+
# body_format enum (optional) Format of the message body. Ignored if the message type is not email. (Default: 'markdown')
|
128
|
+
# external_id string External identifier of the message. Front won’t import two messages with the same external ID.
|
129
|
+
# created_at number Date at which the message as been sent or received.
|
130
|
+
# type enum (optional) Type of the message to import. (Default: 'email')
|
131
|
+
# assignee_id string (optional) Id of the teammate who will be assigned to the conversation.
|
132
|
+
# tags array (optional) List of tag names to add to the conversation (unknown tags will automatically be created).
|
133
|
+
# metadata object
|
134
|
+
# metadata.thread_ref string (optional) Custom reference which will be used to thread messages. If you ommit this field, we’ll thread by sender instead.
|
135
|
+
# metadata.is_inbound boolean Whether or not the message is received (inbound) or sent (outbound) by you.
|
136
|
+
# metadata.is_archived boolean (optional) Whether or not the message should be directly archived once imported. (Default: true)
|
137
|
+
# metadata.should_skip_rules boolean (optional) Whether or not the rules should apply to this message. (Default: true)
|
138
|
+
# -----------------------------------------------------------
|
139
|
+
def import_message(inbox_id, params)
|
140
|
+
cleaned = params.permit({ sender: [:handle, :name, :author_id] },
|
141
|
+
:to,
|
142
|
+
:cc,
|
143
|
+
:bcc,
|
144
|
+
:subject,
|
145
|
+
:body,
|
146
|
+
:body_format,
|
147
|
+
:external_id,
|
148
|
+
:created_at,
|
149
|
+
:type,
|
150
|
+
:assignee_id,
|
151
|
+
:tags,
|
152
|
+
{ metadata: [:thread_ref, :is_inbound, :is_archived, :should_skip_rules] })
|
153
|
+
create("inboxes/#{inbox_id}/imported_messages", cleaned)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Rules
|
4
|
+
|
5
|
+
def rules(params = {})
|
6
|
+
list("rules", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Parameters
|
10
|
+
# Name Type Description
|
11
|
+
# ----------------------------
|
12
|
+
# rule_id string Id of the requested rule
|
13
|
+
# ----------------------------
|
14
|
+
def get_rule(rule_id)
|
15
|
+
get("rules/#{rule_id}")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Tags
|
4
|
+
|
5
|
+
def tags(params = {})
|
6
|
+
list("tags", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Parameters
|
10
|
+
# Name Type Description
|
11
|
+
# ---------------------------
|
12
|
+
# tag_id string Id of the requested tag
|
13
|
+
# ---------------------------
|
14
|
+
def get_tag(tag_id)
|
15
|
+
get("tags/#{tag_id}")
|
16
|
+
end
|
17
|
+
|
18
|
+
# Allowed attributes:
|
19
|
+
# Name Type Description
|
20
|
+
# -------------------------
|
21
|
+
# name string Name of the tag to create
|
22
|
+
# -------------------------
|
23
|
+
def create_tag!(params = {})
|
24
|
+
cleaned = params.permit(:name)
|
25
|
+
create("tags", cleaned)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Parameters
|
29
|
+
# Name Type Description
|
30
|
+
# ---------------------------
|
31
|
+
# tag_id string Id of the requested tag
|
32
|
+
# ---------------------------
|
33
|
+
#
|
34
|
+
# Allowed params:
|
35
|
+
# Name Type Description
|
36
|
+
# ----------------------------------------------
|
37
|
+
# q object (optional) Search query.
|
38
|
+
# q.statuses array (optional) List of the statuses of the conversations you want to list
|
39
|
+
# ----------------------------------------------
|
40
|
+
def get_tag_conversations(tag_id, params = {})
|
41
|
+
cleaned = params.permit({ q: [:statuses] })
|
42
|
+
list("tags/#{tag_id}/conversations", cleaned)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Frontapp
|
2
|
+
class Client
|
3
|
+
module Teammates
|
4
|
+
|
5
|
+
def teammates(params = {})
|
6
|
+
list("teammates", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Parameters
|
10
|
+
# Name Type Description
|
11
|
+
# --------------------------------
|
12
|
+
# teammate_id string Id or email of the requested teammate
|
13
|
+
# --------------------------------
|
14
|
+
def get_teammate(teammate_id)
|
15
|
+
get("teammates/#{teammate_id}")
|
16
|
+
end
|
17
|
+
|
18
|
+
# Parameters
|
19
|
+
# Name Type Description
|
20
|
+
# --------------------------------
|
21
|
+
# teammate_id string Id or email of the requested teammate
|
22
|
+
# --------------------------------
|
23
|
+
#
|
24
|
+
# Allowed attributes:
|
25
|
+
# Name Type Description
|
26
|
+
# ----------------------------------------------
|
27
|
+
# username string (optional) New username. It must be unique and can only contains lowercase letters, numbers and underscores.
|
28
|
+
# first_name string (optional) New first name
|
29
|
+
# last_name string (optional) New last name
|
30
|
+
# is_admin boolean (optional) New admin status
|
31
|
+
# is_available boolean (optional) New availability status
|
32
|
+
# ----------------------------------------------
|
33
|
+
def update_teammate!(teammate_id, params = {})
|
34
|
+
cleaned = params.permit(:username, :first_name, :last_name, :is_admin, :is_available)
|
35
|
+
update("teammates/#{teammate_id}", cleaned)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Parameters
|
39
|
+
# Name Type Description
|
40
|
+
# --------------------------------
|
41
|
+
# teammate_id string Id or email of the requested teammate
|
42
|
+
# --------------------------------
|
43
|
+
#
|
44
|
+
# Allowed params:
|
45
|
+
# Name Type Description
|
46
|
+
# ----------------------------------------------
|
47
|
+
# q object (optional) Search query.
|
48
|
+
# q.statuses array (optional) List of the statuses of the conversations you want to list
|
49
|
+
# ----------------------------------------------
|
50
|
+
def get_teammate_conversations(teammate_id, params = {})
|
51
|
+
cleaned = params.permit({ q: [:statuses] })
|
52
|
+
list("teammates/#{teammate_id}/conversations", cleaned)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Parameters
|
56
|
+
# Name Type Description
|
57
|
+
# --------------------------------
|
58
|
+
# teammate_id string Id or email of the requested teammate
|
59
|
+
# --------------------------------
|
60
|
+
def get_teammate_inboxes(teammate_id)
|
61
|
+
get("teammates/#{teammate_id}/inboxes")
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Hash
|
2
|
+
def permit(*filters)
|
3
|
+
res = {}
|
4
|
+
filters.flatten.each do |filter|
|
5
|
+
case filter
|
6
|
+
when Symbol, String
|
7
|
+
res[filter] = self[filter] if self.keys.include?(filter)
|
8
|
+
when Hash then
|
9
|
+
key = filter.keys.first
|
10
|
+
res[key] = self[key].permit(filter[key]) if self.keys.include?(key)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
res
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: frontapp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Niels van der Zanden
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-01-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: http
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.2.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.2.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: webmock
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '12.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '12.0'
|
69
|
+
description: Ruby client for Frontapp API
|
70
|
+
email: niels@phusion.nl
|
71
|
+
executables: []
|
72
|
+
extensions: []
|
73
|
+
extra_rdoc_files: []
|
74
|
+
files:
|
75
|
+
- lib/frontapp.rb
|
76
|
+
- lib/frontapp/client.rb
|
77
|
+
- lib/frontapp/client/channels.rb
|
78
|
+
- lib/frontapp/client/comments.rb
|
79
|
+
- lib/frontapp/client/contact_groups.rb
|
80
|
+
- lib/frontapp/client/contacts.rb
|
81
|
+
- lib/frontapp/client/conversations.rb
|
82
|
+
- lib/frontapp/client/events.rb
|
83
|
+
- lib/frontapp/client/inboxes.rb
|
84
|
+
- lib/frontapp/client/messages.rb
|
85
|
+
- lib/frontapp/client/rules.rb
|
86
|
+
- lib/frontapp/client/tags.rb
|
87
|
+
- lib/frontapp/client/teammates.rb
|
88
|
+
- lib/frontapp/utils/hash.rb
|
89
|
+
homepage: https://github.com/phusion/frontapp
|
90
|
+
licenses:
|
91
|
+
- MIT
|
92
|
+
metadata: {}
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
requirements: []
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 2.6.11
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: Ruby client for Frontapp API
|
113
|
+
test_files: []
|