forest_liana 1.3.28 → 1.3.29

Sign up to get free protection for your applications and to get access to all the features.
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