forest_liana 1.3.28 → 1.3.29

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.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/forest_liana/intercom_controller.rb +8 -1
  3. data/app/controllers/forest_liana/stripe_controller.rb +33 -0
  4. data/app/models/forest_liana/model/collection.rb +1 -1
  5. data/app/serializers/forest_liana/collection_serializer.rb +3 -0
  6. data/app/serializers/forest_liana/intercom_attribute_serializer.rb +1 -1
  7. data/app/serializers/forest_liana/intercom_conversation_serializer.rb +1 -1
  8. data/app/serializers/forest_liana/serializer_factory.rb +44 -8
  9. data/app/serializers/forest_liana/stripe_bank_account_serializer.rb +43 -0
  10. data/app/serializers/forest_liana/stripe_card_serializer.rb +1 -1
  11. data/app/serializers/forest_liana/stripe_invoice_serializer.rb +1 -1
  12. data/app/serializers/forest_liana/stripe_payment_serializer.rb +1 -1
  13. data/app/serializers/forest_liana/stripe_subscription_serializer.rb +45 -0
  14. data/app/services/forest_liana/intercom_attributes_getter.rb +3 -11
  15. data/app/services/forest_liana/intercom_conversations_getter.rb +3 -10
  16. data/app/services/forest_liana/operator_value_parser.rb +1 -1
  17. data/app/services/forest_liana/schema_adapter.rb +61 -31
  18. data/app/services/forest_liana/stripe_bank_accounts_getter.rb +86 -0
  19. data/app/services/forest_liana/stripe_cards_getter.rb +26 -22
  20. data/app/services/forest_liana/stripe_invoices_getter.rb +28 -26
  21. data/app/services/forest_liana/stripe_payments_getter.rb +28 -25
  22. data/app/services/forest_liana/stripe_subscriptions_getter.rb +97 -0
  23. data/config/routes.rb +5 -2
  24. data/lib/forest_liana/bootstraper.rb +205 -30
  25. data/lib/forest_liana/version.rb +1 -1
  26. metadata +6 -2
@@ -3,12 +3,28 @@ module ForestLiana
3
3
 
4
4
  def initialize(app)
5
5
  @app = app
6
+
7
+ @integration_stripe_valid = false
8
+ @integration_intercom_valid = false
9
+
6
10
  @logger = Logger.new(STDOUT)
7
11
 
12
+ @@logger_colors = {
13
+ DEBUG: 34,
14
+ WARN: 33,
15
+ ERROR: 31,
16
+ INFO: 37
17
+ }
18
+
19
+ @logger.formatter = proc do |severity, datetime, progname, message|
20
+ displayed_message = "[#{datetime.to_s(:db)}] Forest 🌳🌳🌳 #{message}\n"
21
+ "\e[#{@@logger_colors[severity.to_sym]}m#{displayed_message}\033[0m"
22
+ end
23
+
8
24
  if ForestLiana.jwt_signing_key
9
- warn "DEPRECATION WARNING: the use of ForestLiana.jwt_signing_key \
10
- (config/initializers/forest_liana.rb) is deprecated. Use \
11
- ForestLiana.secret_key and ForestLiana.auth_key instead. \
25
+ @logger.warn "DEPRECATION WARNING: the use of \
26
+ ForestLiana.jwt_signing_key (config/initializers/forest_liana.rb) is \
27
+ deprecated. Use ForestLiana.secret_key and ForestLiana.auth_key instead. \
12
28
  More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
13
29
  ForestLiana.secret_key = ForestLiana.jwt_signing_key
14
30
  ForestLiana.auth_key = ForestLiana.jwt_signing_key
@@ -16,6 +32,7 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
16
32
  end
17
33
 
18
34
  def perform
35
+ check_integrations_setup
19
36
  create_serializers
20
37
 
21
38
  if ForestLiana.secret_key
@@ -27,6 +44,10 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
27
44
 
28
45
  private
29
46
 
47
+ def cast_to_array value
48
+ value.is_a?(String) ? [value] : value
49
+ end
50
+
30
51
  def create_serializers
31
52
  SchemaUtils.tables_names.map do |table_name|
32
53
  model = SchemaUtils.find_model_from_table_name(table_name)
@@ -47,6 +68,28 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
47
68
  end
48
69
  end
49
70
 
71
+ def check_integrations_setup
72
+ if stripe_integration?
73
+ if stripe_integration_valid? || stripe_integration_deprecated?
74
+ ForestLiana.integrations[:stripe][:mapping] =
75
+ cast_to_array(ForestLiana.integrations[:stripe][:mapping])
76
+ @integration_stripe_valid = true
77
+ else
78
+ @logger.error 'Cannot setup properly your Stripe integration.'
79
+ end
80
+ end
81
+
82
+ if intercom_integration?
83
+ if intercom_integration_valid? || intercom_integration_deprecated?
84
+ ForestLiana.integrations[:intercom][:mapping] =
85
+ cast_to_array(ForestLiana.integrations[:intercom][:mapping])
86
+ @integration_intercom_valid = true
87
+ else
88
+ @logger.error 'Cannot setup properly your Intercom integration.'
89
+ end
90
+ end
91
+ end
92
+
50
93
  def create_apimap
51
94
  SchemaUtils.tables_names.map do |table_name|
52
95
  model = SchemaUtils.find_model_from_table_name(table_name)
@@ -55,8 +98,17 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
55
98
  end
56
99
  end
57
100
 
58
- setup_stripe_integration if stripe_integration?
59
- setup_intercom_integration if intercom_integration?
101
+ if @integration_stripe_valid
102
+ ForestLiana.integrations[:stripe][:mapping].each do |collection|
103
+ setup_stripe_integration collection
104
+ end
105
+ end
106
+
107
+ if @integration_intercom_valid
108
+ ForestLiana.integrations[:intercom][:mapping].each do |collection_name|
109
+ setup_intercom_integration collection_name
110
+ end
111
+ end
60
112
  end
61
113
 
62
114
  def require_lib_forest_liana
@@ -73,26 +125,35 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
73
125
  meta: { liana: 'forest-rails', liana_version: liana_version }
74
126
  })
75
127
 
76
- uri = URI.parse("#{forest_url}/forest/apimaps")
77
- http = Net::HTTP.new(uri.host, uri.port)
78
- http.use_ssl = true if forest_url.start_with?('https')
79
- http.start do |client|
80
- request = Net::HTTP::Post.new(uri.path)
81
- request.body = json.to_json
82
- request['Content-Type'] = 'application/json'
83
- request['forest-secret-key'] = ForestLiana.secret_key
84
- response = client.request(request)
85
-
86
- if response.is_a?(Net::HTTPNotFound)
87
- @logger.warn "Forest cannot find your project secret key. " \
88
- "Please, run `rails g forest_liana:install`."
128
+ begin
129
+ uri = URI.parse("#{forest_url}/forest/apimaps")
130
+ http = Net::HTTP.new(uri.host, uri.port)
131
+ http.use_ssl = true if forest_url.start_with?('https')
132
+ http.start do |client|
133
+ request = Net::HTTP::Post.new(uri.path)
134
+ request.body = json.to_json
135
+ request['Content-Type'] = 'application/json'
136
+ request['forest-secret-key'] = ForestLiana.secret_key
137
+ response = client.request(request)
138
+
139
+ if response.is_a?(Net::HTTPNotFound)
140
+ @logger.warn "Cannot find your project secret key. " \
141
+ "Please, run `rails g forest_liana:install`."
142
+ end
89
143
  end
144
+ rescue Errno::ECONNREFUSED
145
+ @logger.warn "Cannot send the apimap to Forest. Are you online?"
90
146
  end
91
147
  end
92
148
 
93
- def setup_intercom_integration
149
+ def setup_intercom_integration(collection_name)
150
+ model_name = collection_name.constantize.try(:table_name)
151
+ collection_display_name = collection_name.capitalize
152
+
94
153
  ForestLiana.apimap << ForestLiana::Model::Collection.new({
95
- name: 'intercom_conversations',
154
+ name: "#{model_name}_intercom_conversations",
155
+ display_name: collection_display_name + ' Conversations',
156
+ icon: 'intercom',
96
157
  only_for_relationships: true,
97
158
  is_virtual: true,
98
159
  fields: [
@@ -105,7 +166,9 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
105
166
  })
106
167
 
107
168
  ForestLiana.apimap << ForestLiana::Model::Collection.new({
108
- name: 'intercom_attributes',
169
+ name: "#{model_name}_intercom_attributes",
170
+ display_name: collection_display_name + ' Attributes',
171
+ icon: 'intercom',
109
172
  only_for_relationships: true,
110
173
  is_virtual: true,
111
174
  fields: [
@@ -134,15 +197,41 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
134
197
  def intercom_integration?
135
198
  ForestLiana.integrations
136
199
  .try(:[], :intercom)
137
- .try(:[], :user_collection)
138
200
  .present?
139
201
  end
140
202
 
141
- def setup_stripe_integration
203
+ def intercom_integration_valid?
204
+ integration = ForestLiana.integrations.try(:[], :intercom)
205
+ integration.present? && integration.has_key?(:api_key) &&
206
+ integration.has_key?(:app_id) && integration.has_key?(:mapping)
207
+ end
208
+
209
+ def intercom_integration_deprecated?
210
+ integration = ForestLiana.integrations.try(:[], :intercom)
211
+
212
+ is_deprecated = integration.present? && integration.has_key?(:api_key) &&
213
+ integration.has_key?(:app_id) && integration.has_key?(:user_collection)
214
+
215
+ if is_deprecated
216
+ @logger.warn "Intercom integration attribute \"user_collection\" is " \
217
+ "now deprecated, please use \"mapping\" attribute."
218
+ end
219
+
220
+ is_deprecated
221
+ end
222
+
223
+ def setup_stripe_integration(collection_name_and_field)
224
+ collection_name = collection_name_and_field.split('.')[0]
225
+ model_name = collection_name.constantize.try(:table_name)
226
+ collection_display_name = model_name.capitalize
227
+
142
228
  ForestLiana.apimap << ForestLiana::Model::Collection.new({
143
- name: 'stripe_payments',
229
+ name: "#{model_name}_stripe_payments",
230
+ display_name: collection_display_name + ' Payments',
231
+ icon: 'stripe',
144
232
  is_virtual: true,
145
233
  is_read_only: true,
234
+ pagination_type: 'cursor',
146
235
  fields: [
147
236
  { field: :id, type: 'String', is_searchable: false },
148
237
  { field: :created, type: 'Date', is_searchable: false },
@@ -154,7 +243,7 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
154
243
  {
155
244
  field: :customer,
156
245
  type: 'String',
157
- reference: 'customers.id',
246
+ reference: "#{model_name}.id",
158
247
  is_searchable: false
159
248
  }
160
249
  ],
@@ -167,9 +256,12 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
167
256
  })
168
257
 
169
258
  ForestLiana.apimap << ForestLiana::Model::Collection.new({
170
- name: 'stripe_invoices',
259
+ name: "#{model_name}_stripe_invoices",
260
+ display_name: collection_display_name + ' Invoices',
261
+ icon: 'stripe',
171
262
  is_virtual: true,
172
263
  is_read_only: true,
264
+ pagination_type: 'cursor',
173
265
  fields: [
174
266
  { field: :id, type: 'String', is_searchable: false },
175
267
  { field: :amount_due, type: 'Number', is_searchable: false },
@@ -189,17 +281,20 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
189
281
  {
190
282
  field: :customer,
191
283
  type: 'String',
192
- reference: 'customers.id',
284
+ reference: "#{model_name}.id",
193
285
  is_searchable: false
194
286
  }
195
287
  ]
196
288
  })
197
289
 
198
290
  ForestLiana.apimap << ForestLiana::Model::Collection.new({
199
- name: 'stripe_cards',
291
+ name: "#{model_name}_stripe_cards",
292
+ display_name: collection_display_name + ' Cards',
293
+ icon: 'stripe',
200
294
  is_virtual: true,
201
295
  is_read_only: true,
202
296
  only_for_relationships: true,
297
+ pagination_type: 'cursor',
203
298
  fields: [
204
299
  { field: :id, type: 'String', is_searchable: false },
205
300
  { field: :last4, type: 'String', is_searchable: false },
@@ -219,7 +314,68 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
219
314
  {
220
315
  field: :customer,
221
316
  type: 'String',
222
- reference: 'customers.id',
317
+ reference: "#{model_name}.id",
318
+ is_searchable: false
319
+ }
320
+ ]
321
+ })
322
+
323
+ ForestLiana.apimap << ForestLiana::Model::Collection.new({
324
+ name: "#{model_name}_stripe_subscriptions",
325
+ display_name: collection_display_name + ' Subscriptions',
326
+ icon: 'stripe',
327
+ is_virtual: true,
328
+ is_read_only: true,
329
+ pagination_type: 'cursor',
330
+ fields: [
331
+ { field: :id, type: 'String', is_searchable: false },
332
+ { field: :cancel_at_period_end, type: 'Boolean', is_searchable: false },
333
+ { field: :canceled_at, type: 'Date', is_searchable: false },
334
+ { field: :created, type: 'Date', is_searchable: false },
335
+ { field: :current_period_end, type: 'Date', is_searchable: false },
336
+ { field: :current_period_start, type: 'Date', is_searchable: false },
337
+ { field: :ended_at, type: 'Date', is_searchable: false },
338
+ { field: :livemode, type: 'Boolean', is_searchable: false },
339
+ { field: :quantity, type: 'Number', is_searchable: false },
340
+ { field: :start, type: 'Date', is_searchable: false },
341
+ { field: :status, type: 'String', is_searchable: false },
342
+ { field: :tax_percent, type: 'Number', is_searchable: false },
343
+ { field: :trial_end, type: 'Date', is_searchable: false },
344
+ { field: :trial_start, type: 'Date', is_searchable: false },
345
+ {
346
+ field: :customer,
347
+ type: 'String',
348
+ reference: "#{model_name}.id",
349
+ is_searchable: false
350
+ }
351
+ ]
352
+ })
353
+
354
+ ForestLiana.apimap << ForestLiana::Model::Collection.new({
355
+ name: "#{model_name}_stripe_bank_accounts",
356
+ display_name: collection_display_name + ' Bank Accounts',
357
+ icon: 'stripe',
358
+ is_virtual: true,
359
+ is_read_only: true,
360
+ only_for_relationships: true,
361
+ pagination_type: 'cursor',
362
+ fields: [
363
+ { field: :id, type: 'String', is_searchable: false },
364
+ { field: :account, type: 'String', is_searchable: false },
365
+ { field: :account_holder_name, type: 'String', is_searchable: false },
366
+ { field: :account_holder_type, type: 'String', is_searchable: false },
367
+ { field: :bank_name, type: 'String', is_searchable: false },
368
+ { field: :country, type: 'String', is_searchable: false },
369
+ { field: :currency, type: 'String', is_searchable: false },
370
+ { field: :default_for_currency, type: 'Boolean', is_searchable: false },
371
+ { field: :fingerprint, type: 'String', is_searchable: false },
372
+ { field: :last4, type: 'String', is_searchable: false },
373
+ { field: :rooting_number, type: 'String', is_searchable: false },
374
+ { field: :status, type: 'String', is_searchable: false },
375
+ {
376
+ field: :customer,
377
+ type: 'String',
378
+ reference: "#{model_name}.id",
223
379
  is_searchable: false
224
380
  }
225
381
  ]
@@ -229,10 +385,29 @@ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
229
385
  def stripe_integration?
230
386
  ForestLiana.integrations
231
387
  .try(:[], :stripe)
232
- .try(:[], :api_key)
233
388
  .present?
234
389
  end
235
390
 
391
+ def stripe_integration_valid?
392
+ integration = ForestLiana.integrations.try(:[], :stripe)
393
+ integration.present? && integration.has_key?(:api_key) &&
394
+ integration.has_key?(:mapping)
395
+ end
396
+
397
+ def stripe_integration_deprecated?
398
+ integration = ForestLiana.integrations.try(:[], :stripe)
399
+ is_deprecated = integration.present? && integration.has_key?(:api_key) &&
400
+ integration.has_key?(:user_collection) &&
401
+ integration.has_key?(:user_field)
402
+
403
+ if is_deprecated
404
+ @logger.warn "Stripe integration attributes \"user_collection\" and " \
405
+ "\"user_field\" are now deprecated, please use \"mapping\" attribute."
406
+ end
407
+
408
+ is_deprecated
409
+ end
410
+
236
411
  def forest_url
237
412
  ENV['FOREST_URL'] || 'https://forestadmin-server.herokuapp.com';
238
413
  end
@@ -1,3 +1,3 @@
1
1
  module ForestLiana
2
- VERSION = "1.3.28"
2
+ VERSION = "1.3.29"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_liana
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.28
4
+ version: 1.3.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sandro Munda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-31 00:00:00.000000000 Z
11
+ date: 2016-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -156,9 +156,11 @@ files:
156
156
  - app/serializers/forest_liana/serializer_factory.rb
157
157
  - app/serializers/forest_liana/session_serializer.rb
158
158
  - app/serializers/forest_liana/stat_serializer.rb
159
+ - app/serializers/forest_liana/stripe_bank_account_serializer.rb
159
160
  - app/serializers/forest_liana/stripe_card_serializer.rb
160
161
  - app/serializers/forest_liana/stripe_invoice_serializer.rb
161
162
  - app/serializers/forest_liana/stripe_payment_serializer.rb
163
+ - app/serializers/forest_liana/stripe_subscription_serializer.rb
162
164
  - app/services/forest_liana/allowed_users_getter.rb
163
165
  - app/services/forest_liana/has_many_getter.rb
164
166
  - app/services/forest_liana/intercom_attributes_getter.rb
@@ -174,10 +176,12 @@ files:
174
176
  - app/services/forest_liana/schema_adapter.rb
175
177
  - app/services/forest_liana/schema_utils.rb
176
178
  - app/services/forest_liana/search_query_builder.rb
179
+ - app/services/forest_liana/stripe_bank_accounts_getter.rb
177
180
  - app/services/forest_liana/stripe_cards_getter.rb
178
181
  - app/services/forest_liana/stripe_invoices_getter.rb
179
182
  - app/services/forest_liana/stripe_payment_refunder.rb
180
183
  - app/services/forest_liana/stripe_payments_getter.rb
184
+ - app/services/forest_liana/stripe_subscriptions_getter.rb
181
185
  - app/services/forest_liana/value_stat_getter.rb
182
186
  - app/views/layouts/forest_liana/application.html.erb
183
187
  - config/initializers/arel-helpers.rb