tramway-api 1.8.2.2 → 1.8.5

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: cf2d5329ba186ae429c9be23d63ff3afcbff06f8d02d54b4671639c3bdf82265
4
- data.tar.gz: a72979a2d919cc22b2e60fe6bed54e2a44eee5f3e37fe6e19d55be93f47cc669
3
+ metadata.gz: 5a4acbd7817b429de6d718ee675810614a832cad7a9138c0f594cf603a5acc8c
4
+ data.tar.gz: fff87179a2ad5f22c4183b32af51fe38f0119426ffb4746316d6a72a30e42f19
5
5
  SHA512:
6
- metadata.gz: 6f3f0e9de37be1606e31fb77de127f1f3321b6ecfb0fb3c0c406b22e1566fe7433c17218799886f0ac630fbdf51bb242c05cc3a8cfd2ba12be018b3c95184b26
7
- data.tar.gz: b11dbcf1a53909ccc125976c9ae348783f41c6ba795b4d687314e40676cdcb23d97d7b2b77c58f8bbffe17dd2e20340d566ce20e9cd2f3c0542b8e2df17f549a
6
+ metadata.gz: 4f5e4e5362f56106305c71b38b21202b19f7b204434fd8f3df2a7722d7634606caf759513ae13fa975559eed995b4189df9c8c06289a97c502a7e8ef06f7744f
7
+ data.tar.gz: 51cb8206094060d4815eb4abb23b211ec0632f364f7718f8be3e2c3a346c1f3a0c7bba0b6da566b60584dfc9e09cd59b11a20d5ca4e5556010c96e4506b9a2dc
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,7 @@ module Tramway
15
15
  def snake_case(params)
16
16
  hash = {}
17
17
  params.each do |attribute, value|
18
- key = UUID.validate attribute ? attribute : attribute.to_s.gsub('-', '_')
18
+ key = ::UUID.validate(attribute) ? attribute : attribute.to_s.gsub('-', '_')
19
19
  hash.merge! key => value
20
20
  end
21
21
  hash
@@ -24,12 +24,15 @@ module Tramway
24
24
  private
25
25
 
26
26
  def record
27
- @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?
28
29
  end
29
30
 
30
31
  def records
31
- collection = model_class.active.order(id: :desc).send params[:scope] || :all
32
- collection = collection.full_text_search params[:search] if params[:search]
32
+ active_records = model_class.respond_to?(:active) ? model_class.active : model_class.all
33
+ collection = active_records.order(id: :desc).send params[:scope] || :all
34
+ collection = collection.page(params[:page]).per(params[:per]) if params[:page].present?
35
+ collection = collection.full_text_search params[:search] if params[:search].present?
33
36
  collection
34
37
  end
35
38
 
@@ -96,15 +99,14 @@ module Tramway
96
99
  def checking_roles
97
100
  [:open, current_user&.role].compact
98
101
  end
102
+
99
103
  protected
100
104
 
101
105
  def model_class
102
- if params[:model].to_s.in? available_models_for_current_user
103
- begin
104
- params[:model].constantize
105
- rescue ActiveSupport::Concern::MultipleIncludedBlocks => e
106
- raise "#{e}. Maybe #{params[:model]} model doesn't exists or there is naming conflicts with it"
107
- end
106
+ begin
107
+ params[:model].constantize
108
+ rescue ActiveSupport::Concern::MultipleIncludedBlocks => e
109
+ raise "#{e}. Maybe #{params[:model]} model doesn't exists or there is naming conflicts with it"
108
110
  end
109
111
  end
110
112
 
@@ -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
@@ -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.2'
5
+ VERSION = '1.8.5'
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.2
4
+ version: 1.8.5
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-28 00:00:00.000000000 Z
11
+ date: 2020-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers