tramway-api 1.8.2.3 → 1.8.6

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: 022a3e30c40c67f5ea395f36d02ad064888501855af9e9d3cd3c17084ec4ae90
4
- data.tar.gz: ce519fcc07c446ca740141be4f737109a3bada820e22b813e497cfc4de5b165c
3
+ metadata.gz: ed93d90eaaed7aa48a6b22b4961a91ee4ffccb7ca89e5572e605b4fbb438fde7
4
+ data.tar.gz: 5dfddda7b69e8d16ac6822f33d2980fdf689b10eb6fa207e5c111bc9cb87c69b
5
5
  SHA512:
6
- metadata.gz: 5b38ee6bf57cbd0d3490c8f92e7d514454a1bbacaef1d792a28128b300ad4280cb15526c259c6fa4f146a297840989ded8104f27dcaa37509a582449356e7d32
7
- data.tar.gz: 29869a70b7712a098743976745a9bc497b37ab27154673a4048ccfa608e95529a52d03cef159646a1a1d1db0429e20747d422ce9c1cc2aa045a3e792c380d9d4
6
+ metadata.gz: e10d5588bf40fd00da3f56deeac9999d64b487e52f053e70f747116b08cef9db8b5673f35a7fb177ac8833089111f0e8c44763981fb95cd1527ab507e80abe03
7
+ data.tar.gz: '0953fe2122cbda3f51a493978ca23f908d40e8689d48410a518fb41ff05184d579779dc03c2f416af5bd1be691fd2eedc5c783aef70043d4ec7df1917e8b5fc7'
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,21 @@ 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
+ if params[:key].present?
28
+ if ids_methods_of(model: model_class).include? params[:key]
29
+ @record = model_class.find_by! params[:key] => params[:id] if params[:id].present?
30
+ end
31
+ else
32
+ default_id_method = Tramway::Api.default_id_method_of(model: model_class) || :uuid
33
+ @record = model_class.find_by! default_id_method => params[:id] if params[:id].present?
34
+ end
28
35
  end
29
36
 
30
37
  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]
38
+ active_records = model_class.respond_to?(:active) ? model_class.active : model_class.all
39
+ collection = active_records.order(id: :desc).send params[:scope] || :all
40
+ collection = collection.page(params[:page]).per(params[:per]) if params[:page].present?
41
+ collection = collection.full_text_search params[:search] if params[:search].present?
33
42
  collection
34
43
  end
35
44
 
@@ -100,12 +109,10 @@ module Tramway
100
109
  protected
101
110
 
102
111
  def model_class
103
- if params[:model].to_s.in? available_models_for_current_user
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"
108
- end
112
+ begin
113
+ params[:model].constantize
114
+ rescue ActiveSupport::Concern::MultipleIncludedBlocks => e
115
+ raise "#{e}. Maybe #{params[:model]} model doesn't exists or there is naming conflicts with it"
109
116
  end
110
117
  end
111
118
 
@@ -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,21 @@ 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 other_id_methods_of(model:)
95
+ @@id_methods[model.to_s][:other]
96
+ end
97
+
98
+ def default_id_method_of(model:)
99
+ @@id_methods[model.to_s][:default]
100
+ end
86
101
  end
87
102
  end
88
103
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Tramway
4
4
  module Api
5
- VERSION = '1.8.2.3'
5
+ VERSION = '1.8.6'
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.3
4
+ version: 1.8.6
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-30 00:00:00.000000000 Z
11
+ date: 2020-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers