frontapp 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|