tramway-api 1.8.2 → 1.8.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 56cacd097b745beaad7a04f1b31a63f645ffcb0ca3f2705be6c636765e04968a
4
- data.tar.gz: 30b2598b412f3b87d48895254e1eef6ffd8b1c20299ea07b9bee766397aff8a5
3
+ metadata.gz: 6ea920d1d95b5d0879e4761b50d32a53ae9cd09425fd7ce6f3c35cc6173821cf
4
+ data.tar.gz: 248fc9efe23a6b44db5ce5065fc4e15500c3c387f5c39380b83e677cb750434c
5
5
  SHA512:
6
- metadata.gz: 42275c0a399c5f988e6cbf683a03b1eacbf3aae1da85a212ef06f48e936ed9e0a856ba89132d80e4c4f11e49a620f4cb8a7f2ee2402857ac24a4e5d2772f46c5
7
- data.tar.gz: ae1465d070ee21a997310922cd43898617a617d5d74a727e4a37abd6717aca961ca833c547038703738227f2c9559e295dcd3c7bdcf191893b1957f95c962964
6
+ metadata.gz: 949028808784d424710d0a72e602eefe85144ef46ffd1cba3a1671ad787fb91c527ae2b52002a5c60ada7c4225c9b853c3ee0f944ccda9ac7d224d086d029402
7
+ data.tar.gz: 5ca4783d217ee96ab1aef6be3368dd1a8c0a71233a5b129b30147b34d77f74b868933986bddcb0a12229fc4f9d6454332c7a7a1351f4c883b2be8269223c0023
data/README.md CHANGED
@@ -44,6 +44,7 @@ coming soon...
44
44
  gem 'state_machine', github: 'seuros/state_machine'
45
45
  gem 'knock'
46
46
  gem 'audited'
47
+ gem 'ransack'
47
48
  ```
48
49
 
49
50
  ## Usage
@@ -64,23 +65,51 @@ gem 'knock'
64
65
 
65
66
  Run `bundle install`
66
67
 
68
+ ### Initialize @application object
69
+
70
+ [How-to](https://github.com/Purple-Magic/tramway-core/blob/develop/README.md#every-tramway-application-need-initialized-application-object-or-if-you-create-tramway-plugin-it-should-be-application_engine-object)
71
+
72
+ *config/routes.rb*
73
+
74
+ ```ruby
75
+ Rails.application.routes.draw do
76
+ # ...
77
+ mount Tramway::Api::Engine, at: '/api'
78
+ # ...
79
+ end
80
+ ```
81
+
67
82
  Then generate User (you use another name, it's just an example) model
68
83
 
69
84
  ```
70
- rails g model user email:text password_digest:text username:text state:text uid:text
85
+ rails g model user email:text password_digest:text username:text state:text uuid:uuid
71
86
  ```
72
87
 
73
88
  Enable extension in your database:
74
89
 
75
90
  *db/migrate/enable_extension.rb*
76
- ```
77
- def change
78
- enable_extension 'uuid-ossp'
91
+ ```ruby
92
+ class EnableExtensionUUIDOSSP < ActiveRecord::Migration
93
+ def change
94
+ enable_extension 'uuid-ossp'
95
+ end
79
96
  end
80
97
  ```
81
98
 
99
+ ### You can choose a method, which will be using as public ID method
100
+
101
+ By default, it's a `uuid` method
102
+
103
+ To choose your own public ID method, just add this line to:
82
104
 
83
- Add generating uuid by default to every model, that is accessible by API
105
+ *config/initializers/tramway.rb*
106
+
107
+ ```ruby
108
+ Tramway::Api.id_methods_of(User => :id)
109
+ ```
110
+ If you want to use `uuid` by default, please, add it to your models
111
+
112
+ #### Add generating uuid by default to every model, that is accessible by API
84
113
 
85
114
  *db/migrate/add_uuid_to_some_model.rb*
86
115
 
@@ -100,11 +129,26 @@ class User < Tramway::Core::ApplicationRecord
100
129
  end
101
130
  ```
102
131
 
103
- Create file `config/initializers/tramway.rb`
132
+ #### Create file `config/initializers/tramway.rb`
133
+ #### If you need JWT authentication add this line to the `config/initializers/tramway.rb`
104
134
 
105
135
  ```ruby
106
136
  ::Tramway::Api.auth_config = { user_model: User, auth_attributes: %i[email username] }
107
- ::Tramway::Api.set_available_models user: { open: %i[create], closed: %i[update] }
137
+ ```
138
+
139
+ #### Configurate available models. Tramway will create end points according to this config
140
+
141
+ ```
142
+ ::Tramway::Api.set_available_models({
143
+ User => [
144
+ {
145
+ show: lambda do |record, current_user|
146
+ record.id == current_user.id # shows only current_user profile
147
+ end
148
+ }
149
+ ],
150
+ project: :your_project_name
151
+ })
108
152
  ```
109
153
 
110
154
  Run `rails g tramway:core:install`
@@ -316,7 +360,7 @@ Create serializer
316
360
  *app/serializers/user_serializer.rb*
317
361
 
318
362
  ```ruby
319
- class UserSerializer < Tramway::Core::ApplicationSerializer
363
+ class UserSerializer < Tramway::Api::V1::ApplicationSerializer
320
364
  attributes :username, :email
321
365
  end
322
366
  ```
@@ -341,21 +385,125 @@ You have your records in JSON API spec.
341
385
 
342
386
  ### Create
343
387
 
344
- Production ready
388
+ *config/initializers/tramway.rb*
345
389
 
346
- Docs coming soon
390
+ ```ruby
391
+ ::Tramway::Api.set_available_models({ YourModel => [ :create ] }, project: :your_project_name })
392
+ ```
393
+
394
+ *app/forms/your_model_form.rb*
395
+
396
+ ```ruby
397
+ class YourModelForm < Tramway::Core::ApplicationForm
398
+ properties :attribute1, :attribute2, :name
399
+
400
+ association :another_association_model
401
+
402
+ def name=(value)
403
+ model.first_name = value.split(' ')[0]
404
+ model.first_name = value.split(' ')[1]
405
+ end
406
+ end
407
+ ```
408
+
409
+ Now you can your request. It has such structure
410
+
411
+ **POST** `/api/v1/records?model=YourModel`
412
+
413
+ ```
414
+ Params Structure
415
+ {
416
+ data: {
417
+ attributes: {
418
+ attribute1: 'some value',
419
+ attribute2: 'some value',
420
+ name: 'some full name',
421
+ another_association_model: {
422
+ # here a list of attributes, which you described in AnotherAssociationModelForm
423
+ }
424
+ }
425
+ }
426
+ }
427
+ ```
347
428
 
348
429
  ### Update
349
430
 
350
- Production ready
431
+ *config/initializers/tramway.rb*
351
432
 
352
- Docs coming soon
433
+ ```ruby
434
+ ::Tramway::Api.set_available_models({ YourModel => [ :update ] }, project: :your_project_name })
435
+ ```
436
+
437
+ *app/forms/your_model_form.rb*
438
+
439
+ ```ruby
440
+ class YourModelForm < Tramway::Core::ApplicationForm
441
+ properties :attribute1, :attribute2, :name
442
+
443
+ association :another_association_model
444
+
445
+ def name=(value)
446
+ model.first_name = value.split(' ')[0]
447
+ model.first_name = value.split(' ')[1]
448
+ end
449
+ end
450
+ ```
451
+
452
+ Now you can your request. It has such structure
453
+
454
+ **PATCH** `/api/v1/records/#{object_id}?model=YourModel`
455
+
456
+ ```
457
+ Params Structure
458
+ {
459
+ data: {
460
+ attributes: {
461
+ attribute1: 'some value',
462
+ attribute2: 'some value',
463
+ name: 'some full name',
464
+ another_association_model: {
465
+ # here a list of attributes, which you described in AnotherAssociationModelForm
466
+ }
467
+ }
468
+ }
469
+ }
470
+ ```
353
471
 
354
472
  ### Show
355
473
 
356
- Production ready
474
+ #### Description
357
475
 
358
- Docs coming soon
476
+ It returns just one record, if it is not deleted.
477
+
478
+ #### Using
479
+
480
+ ##### Allow method show in tramway initializer for `YourModel`
481
+
482
+ *config/initializers/tramway.rb*
483
+
484
+ ```ruby
485
+ ::Tramway::Api.set_available_models({ YourModel => [ :show ] }, project: :your_project_name })
486
+ ```
487
+
488
+ ##### Create serializer
489
+
490
+ *app/serializers/user_serializer.rb*
491
+
492
+ ```ruby
493
+ class UserSerializer < Tramway::Core::ApplicationSerializer
494
+ attributes :username, :email
495
+ end
496
+ ```
497
+
498
+ ##### Run your server on the localhost `rails s`
499
+ ##### Made this query to test new API method (for example: you can create file `bin/test_tramway.rb` with this lines):
500
+
501
+ ```ruby
502
+ require 'net/http'
503
+
504
+ YourModel.create! attribute_1: 'some value', attribute_2: 'some_value'
505
+ Net::HTTP.get('localhost:3000', "/api/v1/records/#{YourModel.last.id}?model=YourModel")
506
+ ```
359
507
 
360
508
  ### Destroy
361
509
 
@@ -58,7 +58,9 @@ module Tramway
58
58
 
59
59
  def current_user
60
60
  Tramway::Api.user_based_models.map do |user_based_model|
61
- send("current_#{user_based_model.name.underscore}")
61
+ unless user_based_model == User
62
+ send("current_#{user_based_model.name.underscore}")
63
+ end
62
64
  end.compact.first
63
65
  end
64
66
  end
@@ -15,7 +15,8 @@ module Tramway
15
15
  def snake_case(params)
16
16
  hash = {}
17
17
  params.each do |attribute, value|
18
- hash.merge! attribute.to_s.gsub('-', '_') => value
18
+ key = ::UUID.validate(attribute) ? attribute : attribute.to_s.gsub('-', '_')
19
+ hash.merge! key => value
19
20
  end
20
21
  hash
21
22
  end
@@ -23,7 +24,8 @@ module Tramway
23
24
  private
24
25
 
25
26
  def record
26
- @record = model_class.find_by! uuid: params[:id] if params[:id].present?
27
+ id_method = Tramway::Api.id_method_of(model: model_class) || :uuid
28
+ @record = model_class.find_by! id_method => params[:id] if params[:id].present?
27
29
  end
28
30
 
29
31
  def records
@@ -95,15 +97,14 @@ module Tramway
95
97
  def checking_roles
96
98
  [:open, current_user&.role].compact
97
99
  end
100
+
98
101
  protected
99
102
 
100
103
  def model_class
101
- if params[:model].to_s.in? available_models_for_current_user
102
- begin
103
- params[:model].constantize
104
- rescue ActiveSupport::Concern::MultipleIncludedBlocks => e
105
- raise "#{e}. Maybe #{params[:model]} model doesn't exists or there is naming conflicts with it"
106
- end
104
+ begin
105
+ params[:model].constantize
106
+ rescue ActiveSupport::Concern::MultipleIncludedBlocks => e
107
+ raise "#{e}. Maybe #{params[:model]} model doesn't exists or there is naming conflicts with it"
107
108
  end
108
109
  end
109
110
 
@@ -6,7 +6,8 @@ class Tramway::Api::V1::ApplicationSerializer < ActiveModel::Serializer
6
6
  attribute :id
7
7
 
8
8
  def id
9
- object.uuid
9
+ id_method = Tramway::Api.id_method_of(model: object.class) || :uuid
10
+ object.send(id_method)
10
11
  end
11
12
 
12
13
  def created_at
@@ -27,12 +27,8 @@ class Tramway::Api::V1::ErrorSerializer < ActiveModel::Serializer
27
27
  end
28
28
 
29
29
  object.model&.attributes&.each do |attribute_key, attribute_value|
30
- if attribute_value.is_a?(Reform::Form)
31
- error_messages.merge!(error_messages(attribute_value, path + [attribute_key]))
32
- elsif attribute_value.is_a?(Array)
30
+ if attribute_value.is_a?(Array)
33
31
  attribute_value.each_with_index do |array_attribute_value, array_attribute_key|
34
- next unless array_attribute_value.is_a?(Reform::Form)
35
-
36
32
  error_messages.merge!(
37
33
  error_messages(
38
34
  array_attribute_value,
@@ -83,6 +83,17 @@ module Tramway
83
83
  new_hash.merge! pair[0].to_s => pair[1]
84
84
  end
85
85
  end
86
+
87
+ def id_methods_of(options = {})
88
+ @@id_methods ||= {}
89
+ @@id_methods.merge!(options.reduce({}) do |hash, pair|
90
+ hash.merge! pair[0].to_s => pair[1]
91
+ end)
92
+ end
93
+
94
+ def id_method_of(model:)
95
+ @@id_methods[model.to_s]
96
+ end
86
97
  end
87
98
  end
88
99
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Tramway
4
4
  module Api
5
- VERSION = '1.8.2'
5
+ VERSION = '1.8.3.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tramway-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.2
4
+ version: 1.8.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Kalashnikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-17 00:00:00.000000000 Z
11
+ date: 2020-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers