talktome 1.1.2 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3921c37bcb667aedfa4119ab30f430b16cc05dfc9c1bd8d2607775f81fde5ad6
4
- data.tar.gz: c374bc0d83fd26cf0f079fec2abf214ce5ffb387dd04a07ab2dbb04e4f610683
3
+ metadata.gz: 4ae24a6e1def52e8f6b89ba6dd6ade0f5dc7d41182d591a573215c1a75d49603
4
+ data.tar.gz: ad8ca169cd9619c21e0af5af7f862b65730105f95276881449ab1877626dcefb
5
5
  SHA512:
6
- metadata.gz: 1fa9f53a14b13bc8cc5b76a74ea2e61bf0eb25185f41e3c2f787748f77ea79f05f5ccb94988c5fbcbea7e1fc1a24d490456f34bde6edd26b113618c6396f6782
7
- data.tar.gz: 33cb01d9ab2908673b8a20b196bc9d9070dc1ec76cdc7dfc506677004640f0e562dac5771db16b582672fbd426de0337a2c06941889ce80b31257a226dafc9d6
6
+ metadata.gz: fee101432b406429b2c8761311e9616181766cd7904db0678adba35b32ebd26c3d709cd90cc1173545ac27d6ff310ca7edf284de3fc31215d831ea4d47ed7d6b
7
+ data.tar.gz: 6827ee15c92c7d6487aaac7b7c850c2e327a2bbc95a84f213f16593fb7017219779f6163ea702cf50e8d1010c3fffa8a69181890581e8427c7c5472a19477110
data/lib/talktome/app.rb CHANGED
@@ -13,36 +13,39 @@ module Talktome
13
13
 
14
14
  set :raise_errors, true
15
15
  set :show_exceptions, false
16
+ set :talktome, Talktome::Client::Local.new(ROOT_FOLDER/'templates')
16
17
 
17
18
  VALIDATION_SCHEMA = ::Finitio.system(<<~FIO)
18
19
  @import finitio/data
19
20
  Email = String(s | s =~ /^[^@]+@[^@]+$/ )
20
21
  {
21
- to :? Email
22
- reply_to :? Email
23
- ... : .Object
22
+ to :? Email
23
+ reply_to :? Email
24
+ in_reply_to :? String
25
+ ... : .Object
24
26
  }
25
27
  FIO
26
28
 
27
- TALKTOME = Talktome::Client::Local.new(ROOT_FOLDER/'templates')
28
-
29
- post %r{/([a-z-]+)/} do |action|
29
+ post %r{/([a-z-]+([\/][a-z-]+)*)/} do |action, _|
30
30
  begin
31
31
  as_array = info.map{|k,v| {'key' => k.capitalize, 'value' => v}}
32
32
  subject = Talktome.env('TALKTOME_EMAIL_SUBJECT', 'Someone wants to reach you!')
33
33
  footer = Talktome.env('TALKTOME_EMAIL_FOOTER', "Truly yours,\n
34
34
  Sent by [Enspirit.be](https://enspirit.be/), contact us if you need help with any IT task.")
35
35
  user = load_user_from_info!
36
- TALKTOME.talktome(action, user, info.merge(allvars: as_array, subject: subject, footer: footer), [:email]){|email|
36
+ settings.talktome.talktome(action, user, info.merge(allvars: as_array, subject: subject, footer: footer), [:email]){|email|
37
37
  email.reply_to = info[:reply_to] if info.has_key?(:reply_to)
38
+ email.in_reply_to = info[:in_reply_to] if info.has_key?(:in_reply_to)
38
39
  }
39
40
  [ 200, { "Content-Type" => "text/plain"}, ["Ok"] ]
40
41
  rescue JSON::ParserError
41
42
  fail!("Invalid data")
42
43
  rescue Finitio::Error => ex
43
44
  fail!(ex.message)
44
- rescue ::Talktome::InvalidEmailError => ex
45
+ rescue ::Talktome::InvalidEmailError
45
46
  fail!("Invalid email address")
47
+ rescue ::Talktome::TemplateNotFoundError
48
+ fail!("No such template", 404)
46
49
  end
47
50
  end
48
51
 
@@ -55,7 +58,8 @@ module Talktome
55
58
  end
56
59
 
57
60
  def load_user_from_info!
58
- if to = info[:to]
61
+ protected_fields = [:to, :in_reply_to]
62
+ if (info.keys & protected_fields).any?
59
63
  secret = Talktome.env('TALKTOME_BEARER_SECRET')
60
64
  fail!("Missing secret", 400) unless secret
61
65
  fail!("Invalid secret", 401) unless "Bearer #{secret}" == env["HTTP_AUTHORIZATION"]
@@ -17,7 +17,7 @@ module Talktome
17
17
 
18
18
  def load_message!(identifier, strategies)
19
19
  folder = self.folder/identifier
20
- raise InvalidMessageError, "No such message `#{identifier}`" unless folder.exists?
20
+ raise TemplateNotFoundError, "No such message `#{identifier}`" unless folder.exists?
21
21
  raise InvalidMessageError, "Message `#{identifier}` should be a folder" unless folder.directory?
22
22
  strategies.each do |s|
23
23
  if (file = folder.glob("#{s}.*").first) && file.file?
@@ -2,4 +2,5 @@ module Talktome
2
2
  class Error < StandardError; end
3
3
  class InvalidMessageError < Error; end
4
4
  class InvalidEmailError < Error; end
5
+ class TemplateNotFoundError < Error; end
5
6
  end
@@ -16,6 +16,7 @@ module Talktome
16
16
  [
17
17
  :to,
18
18
  :reply_to,
19
+ :in_reply_to,
19
20
  :subject
20
21
  ].each do |which|
21
22
  if arg = message.metadata[which.to_s]
@@ -1,7 +1,7 @@
1
1
  module Talktome
2
2
  module Version
3
3
  MAJOR = 1
4
- MINOR = 1
4
+ MINOR = 3
5
5
  TINY = 2
6
6
  end
7
7
  VERSION = "#{Version::MAJOR}.#{Version::MINOR}.#{Version::TINY}"
data/spec/app/test_app.rb CHANGED
@@ -9,6 +9,7 @@ module Talktome
9
9
  }
10
10
 
11
11
  before(:each) do
12
+ Talktome::App.set :talktome, Talktome::Client::Local.new(Path.dir.parent/'fixtures')
12
13
  ENV['TALKTOME_EMAIL_DEFAULT_TO'] = "to@talktome.com"
13
14
  ENV['TALKTOME_EMAIL_DEFAULT_FROM'] = "from@talktome.com"
14
15
  Mail::TestMailer.deliveries.clear
@@ -162,5 +163,77 @@ module Talktome
162
163
  end
163
164
  end
164
165
 
166
+ context 'POST /support/, regarding the In-Reply-To' do
167
+ class ::Talktome::Message::Template
168
+ def raise_on_context_miss?
169
+ false
170
+ end
171
+ end
172
+
173
+ it 'forbids the usage of :in_reply_to unless a secret is provided' do
174
+ post "/support/", {
175
+ in_reply_to: '<F6E2D0B4-CC35-4A91-BA4C-C7C712B10C13@company.com>',
176
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
177
+ expect(last_response.status).to eql(400)
178
+ expect(Mail::TestMailer.deliveries.length).to eql(0)
179
+ end
180
+
181
+ it 'does not allow setting the :in_reply_to without a valid AUTH token' do
182
+ Talktome.set_env('TALKTOME_BEARER_SECRET', "Invalid secret") do
183
+ post "/support/", {
184
+ in_reply_to: '<F6E2D0B4-CC35-4A91-BA4C-C7C712B10C13@company.com>',
185
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
186
+ expect(last_response.status).to eql(401)
187
+ expect(Mail::TestMailer.deliveries.length).to eql(0)
188
+ end
189
+ end
190
+
191
+ it "lets override it by passing a inReplyTo field" do
192
+ Talktome.set_env('TALKTOME_BEARER_SECRET', "Some secret") do
193
+ header 'Authorization', 'Bearer Some secret'
194
+ post "/support/", {
195
+ to: 'client@company.com',
196
+ in_reply_to: '<F6E2D0B4-CC35-4A91-BA4C-C7C712B10C13@company.com>',
197
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
198
+ expect(last_response).to be_ok
199
+ expect(Mail::TestMailer.deliveries.length).to eql(1)
200
+ expect(Mail::TestMailer.deliveries.first.in_reply_to).to eql('F6E2D0B4-CC35-4A91-BA4C-C7C712B10C13@company.com')
201
+ end
202
+ end
203
+ end
204
+
205
+ context 'POST /multi-lingual/en/' do
206
+
207
+ it 'works' do
208
+ post "/multi-lingual/en/", {
209
+ reply_to: 'hello@visitor.com',
210
+ message: 'Hello from visitor',
211
+ key: 'value',
212
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
213
+ expect(last_response.status).to eql(200)
214
+ expect(last_response).to be_ok
215
+ expect(Mail::TestMailer.deliveries.length).to eql(1)
216
+ expect(Mail::TestMailer.deliveries.first.to).to eql(["to@talktome.com"])
217
+ expect(Mail::TestMailer.deliveries.first.from).to eql(["from@talktome.com"])
218
+ expect(Mail::TestMailer.deliveries.first.subject).to eql("Someone wants to reach you!")
219
+ expect(Mail::TestMailer.deliveries.first.html_part.body).to include("<li>Key: value</li>")
220
+ expect(Mail::TestMailer.deliveries.first.html_part.body).to include("Truly yours")
221
+ end
222
+ end
223
+
224
+ context 'POST /xxx when the template does not exist' do
225
+
226
+ it 'return a 404 error when the template doesn\'t exist' do
227
+ post "/multi-lingual/fr/", {
228
+ reply_to: 'hello@visitor.com',
229
+ message: 'Hello from visitor',
230
+ key: 'value',
231
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
232
+
233
+ expect(last_response.status).to eql(404)
234
+ expect(last_response.body).to match(/No such template/)
235
+ end
236
+ end
237
+
165
238
  end
166
239
  end
@@ -74,6 +74,7 @@ module Talktome
74
74
  client.talktome("welcome", user, tpldata, [:email])
75
75
  expect(strategy.last.message.to_html).to eql("<html><title>Hello Test user</title><body><h1>Hello Test user</h1>\n\n<p>Welcome to this email example!</p>\n\n<h3>Test user</h3>\n</body></html>\n")
76
76
  end
77
+
77
78
  end
78
79
 
79
80
  end
@@ -0,0 +1,13 @@
1
+ ---
2
+ subject: |-
3
+ {{subject}}
4
+ ---
5
+ Hello,
6
+
7
+ This person is trying to reach you:
8
+
9
+ {{#allvars}}
10
+ * {{key}}: {{value}}
11
+ {{/allvars}}
12
+
13
+ {{footer}}
@@ -0,0 +1,13 @@
1
+ ---
2
+ subject: |-
3
+ {{subject}}
4
+ ---
5
+ Hello,
6
+
7
+ This person is trying to reach you:
8
+
9
+ {{#allvars}}
10
+ * {{key}}: {{value}}
11
+ {{/allvars}}
12
+
13
+ {{footer}}
@@ -0,0 +1,6 @@
1
+ ---
2
+ subject: Regarding your support request
3
+ ---
4
+ Our support team will get back to you ASAP regarding your request.
5
+
6
+ Best regards
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: talktome
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernard Lambeau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-05 00:00:00.000000000 Z
11
+ date: 2021-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -191,7 +191,10 @@ files:
191
191
  - lib/talktome/version.rb
192
192
  - spec/app/test_app.rb
193
193
  - spec/client/test_local.rb
194
+ - spec/fixtures/contact-us/email.md
194
195
  - spec/fixtures/layouts/email.html
196
+ - spec/fixtures/multi-lingual/en/email.md
197
+ - spec/fixtures/support/email.md
195
198
  - spec/fixtures/welcome/email.md
196
199
  - spec/fixtures/welcome/footer.mustache
197
200
  - spec/message/test_initialize.rb
@@ -220,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
220
223
  - !ruby/object:Gem::Version
221
224
  version: '0'
222
225
  requirements: []
223
- rubygems_version: 3.2.15
226
+ rubygems_version: 3.2.32
224
227
  signing_key:
225
228
  specification_version: 4
226
229
  summary: Talktome helps you talk to users by email, messaging, sms, etc.