tramway-api 1.8.6.2 → 1.8.6.7

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: 6979a107b8db6db6b03df5744632f5c2c137e65006518dd06dcc6f6d63724971
4
- data.tar.gz: 46e8a150611e423e37b626cb6a35f16253e5190b38539825eefa260883f261fd
3
+ metadata.gz: 3206561c6202bb16eb547409a92afc1ffd3bd0577ab5924f0ba9142b2d2da5f7
4
+ data.tar.gz: fc82ca7b002060d3f2a1d49d723a26d0405f5765ffd34a0b7b6a287914d68018
5
5
  SHA512:
6
- metadata.gz: e94d128902e6bd42a59041dc1da3fdc49d968b5abdfad66a3421d515ada393f9de75819413da2ad07f86506a425cf55fa12d98492be42afcaf927937a75f2029
7
- data.tar.gz: 8d73a6a246a6ce4478dd110e480a7a6394cccc22908a97db136adb1dec2cad0faa7f7670bf840b896ad47e97a4a03f904e7547343f1b09da09e75e660017ceec
6
+ metadata.gz: 9311be67f963e06248ab95056f9e20a40d819b706e8ce9814dbe28b8c063439dac7ebc42bc7ef9f2f3495579db8fd641a9db6032ea9ef4ebbd7847d1c008987d
7
+ data.tar.gz: 6a0baa01d8e34556901407c738ceacf3facb379b6dbf5a27df2834347de75d79ca3bcf524f159d4a95fea9fc37e2eea8cf45a54f25f028e9bb1f443705f934b0
data/README.md CHANGED
@@ -41,7 +41,6 @@ coming soon...
41
41
  ```ruby
42
42
  gem 'active_model_serializers', '0.10.5'
43
43
  gem 'tramway-core'
44
- gem 'state_machine', github: 'seuros/state_machine'
45
44
  gem 'knock'
46
45
  gem 'audited'
47
46
  gem 'ransack'
@@ -105,10 +104,18 @@ To choose your own public ID method, just add this line to:
105
104
  *config/initializers/tramway.rb*
106
105
 
107
106
  ```ruby
108
- Tramway::Api.id_methods_of(User => :id)
107
+ Tramway::Api.id_methods_of(User => { default: :id })
109
108
  ```
110
109
  If you want to use `uuid` by default, please, add it to your models
111
110
 
111
+ ### Also, you can add array of secondary methods as IDs, but you'll need to add their names to a request
112
+
113
+ ```ruby
114
+ Tramway::Api.id_methods_of(User => { default: id, other: :email }
115
+ ```
116
+
117
+ in this case your request will look like this `/api/v1/records/someEmail@mail.com?model=User&key=email`
118
+
112
119
  #### Add generating uuid by default to every model, that is accessible by API
113
120
 
114
121
  *db/migrate/add_uuid_to_some_model.rb*
@@ -138,7 +145,7 @@ end
138
145
 
139
146
  #### Configurate available models. Tramway will create end points according to this config
140
147
 
141
- ```
148
+ ```ruby
142
149
  ::Tramway::Api.set_available_models({
143
150
  User => [
144
151
  {
@@ -286,7 +293,6 @@ RSpec.describe 'Post generate token', type: :feature do
286
293
 
287
294
  end
288
295
  end
289
-
290
296
  ```
291
297
 
292
298
  Run `rspec` to test
@@ -332,11 +338,6 @@ this model must have field `password_digest`, because we use `bcrypt` gem for au
332
338
 
333
339
  Sets ActiveRecord models which will be used in API
334
340
 
335
- Argument is a hash. Keys are underscored models names, values are hashes with actions of available methods for every model.
336
- * `open` key means that this action will be used without authentication
337
- * `closed` key means that this action will be used with authentication
338
-
339
-
340
341
  Enabled methods:
341
342
 
342
343
  * create
@@ -352,7 +353,7 @@ Every model you've added in initializer will be able by URL `api/v1/records?mode
352
353
  Just update your initializer:
353
354
 
354
355
  ```ruby
355
- ::Tramway::Api.set_available_models user: { open: %i[create], closed: %i[update index] } # we've added index method
356
+ ::Tramway::Api.set_available_models({ User => { %i[index] })
356
357
  ```
357
358
 
358
359
  Create serializer
@@ -383,6 +384,8 @@ end
383
384
 
384
385
  You have your records in JSON API spec.
385
386
 
387
+ You also able to use pagination, provided by `kaminari`
388
+
386
389
  ### Create
387
390
 
388
391
  *config/initializers/tramway.rb*
@@ -426,6 +429,46 @@ Params Structure
426
429
  }
427
430
  ```
428
431
 
432
+ Also, you can test it with this
433
+
434
+ *spec/factories/your_models.rb*
435
+
436
+ ```ruby
437
+ FactoryBot.define do
438
+ factory :your_model do
439
+ attribute1 { # some code which generate value for this attribute }
440
+ attribute2 { # some code which generate value for this attribute }
441
+ name { generate :name }
442
+ end
443
+ end
444
+ ```
445
+
446
+ *spec/api/your_model_spec.rb*
447
+
448
+ ```ruby
449
+ require 'rails_helper'
450
+
451
+ RSpec.describe 'Post generate token', type: :feature do
452
+ describe 'POST /api/v1/user_token' do
453
+ let(:user) { create :user, password: '123456789' }
454
+
455
+ it 'returns created status' do
456
+ post '/api/v1/user_token', params: { auth: { login: user.email, password: '123456789' } }
457
+
458
+ expect(response.status).to eq 201
459
+ end
460
+
461
+ it 'returns token' do
462
+ post '/api/v1/user_token', params: { auth: { login: user.email, password: '123456789' } }
463
+
464
+ expect(json_response[:auth_token].present?).to be_truthy
465
+ expect(json_response[:user]).to include_json({ email: user.email, uuid: user.uuid })
466
+ end
467
+
468
+ end
469
+ end
470
+ ```
471
+
429
472
  ### Update
430
473
 
431
474
  *config/initializers/tramway.rb*
@@ -58,9 +58,7 @@ module Tramway
58
58
 
59
59
  def current_user
60
60
  Tramway::Api.user_based_models.map do |user_based_model|
61
- unless user_based_model == User
62
- send("current_#{user_based_model.name.underscore}")
63
- end
61
+ send("current_#{user_based_model.name.underscore}") unless user_based_model == User
64
62
  end.compact.first
65
63
  end
66
64
  end
@@ -4,6 +4,8 @@ module Tramway
4
4
  module Api
5
5
  module V1
6
6
  class ApplicationController < ::Tramway::Api::ApplicationController
7
+ before_action :application
8
+
7
9
  def render_errors_for(model)
8
10
  render json: model, status: :unprocessable_entity, serializer: ::Tramway::Api::V1::ErrorSerializer
9
11
  end
@@ -25,7 +27,7 @@ module Tramway
25
27
 
26
28
  def record
27
29
  if params[:key].present?
28
- if other_id_methods_of(model: model_class).include? params[:key]
30
+ if Tramway::Api.other_id_methods_of(model: model_class).include? params[:key].to_sym
29
31
  @record = model_class.find_by! params[:key] => params[:id] if params[:id].present?
30
32
  end
31
33
  else
@@ -45,6 +47,7 @@ module Tramway
45
47
  def check_available_model_class
46
48
  unless model_class
47
49
  head(:unauthorized) && return unless current_user
50
+
48
51
  head(:unprocessable_entity) && return
49
52
  end
50
53
  end
@@ -109,11 +112,9 @@ module Tramway
109
112
  protected
110
113
 
111
114
  def model_class
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"
116
- end
115
+ params[:model].constantize
116
+ rescue ActiveSupport::Concern::MultipleIncludedBlocks => e
117
+ raise "#{e}. Maybe #{params[:model]} model doesn't exists or there is naming conflicts with it"
117
118
  end
118
119
 
119
120
  def decorator_class(model_name = nil)
@@ -5,6 +5,7 @@ module Tramway::Api::V1
5
5
  before_action :check_available_model_class
6
6
  before_action :check_available_model_action_for_record, only: %i[show update destroy]
7
7
  before_action :authenticate_user_if_needed
8
+ before_action :application
8
9
 
9
10
  def index
10
11
  collection = available_action_for_collection
@@ -54,5 +55,11 @@ module Tramway::Api::V1
54
55
  include: '*',
55
56
  status: :no_content
56
57
  end
58
+
59
+ def application
60
+ if ::Tramway::Core.application
61
+ @application = Tramway::Core.application&.model_class&.first || Tramway::Core.application
62
+ end
63
+ end
57
64
  end
58
65
  end
@@ -16,25 +16,29 @@ class Tramway::Api::V1::ErrorSerializer < ActiveModel::Serializer
16
16
  def error_messages(object, path = []) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
17
17
  error_messages = {}
18
18
 
19
- object.errors.messages.each do |name, messages|
20
- error_messages.merge!((path + [name]).join('/') => messages)
21
- end
22
-
23
- if object.model
24
- object.model.errors.messages.each do |name, messages|
19
+ if object.respond_to? :errors
20
+ object.errors.messages.each do |name, messages|
25
21
  error_messages.merge!((path + [name]).join('/') => messages)
26
22
  end
27
23
  end
28
24
 
29
- object.model&.attributes&.each do |attribute_key, attribute_value|
30
- if attribute_value.is_a?(Array)
31
- attribute_value.each_with_index do |array_attribute_value, array_attribute_key|
32
- error_messages.merge!(
33
- error_messages(
34
- array_attribute_value,
35
- path + [attribute_key] + [array_attribute_key]
25
+ if object.respond_to? :model
26
+ if object.model
27
+ object.model.errors.messages.each do |name, messages|
28
+ error_messages.merge!((path + [name]).join('/') => messages)
29
+ end
30
+ end
31
+
32
+ object.model&.attributes&.each do |attribute_key, attribute_value|
33
+ if attribute_value.is_a?(Array)
34
+ attribute_value.each_with_index do |array_attribute_value, array_attribute_key|
35
+ error_messages.merge!(
36
+ error_messages(
37
+ array_attribute_value,
38
+ path + [attribute_key] + [array_attribute_key]
39
+ )
36
40
  )
37
- )
41
+ end
38
42
  end
39
43
  end
40
44
  end
data/lib/tramway/api.rb CHANGED
@@ -96,7 +96,8 @@ module Tramway
96
96
  end
97
97
 
98
98
  def default_id_method_of(model:)
99
- @@id_methods[model.to_s][:default]
99
+ @@id_methods ||= {}
100
+ @@id_methods.dig(model.to_s, :default)
100
101
  end
101
102
  end
102
103
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Tramway
4
4
  module Api
5
- VERSION = '1.8.6.2'
5
+ VERSION = '1.8.6.7'
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.6.2
4
+ version: 1.8.6.7
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-07-26 00:00:00.000000000 Z
11
+ date: 2021-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.9.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: uuid
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Engine for api
56
70
  email:
57
71
  - kalashnikovisme@gmail.com
@@ -102,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
118
  requirements: []
105
- rubygems_version: 3.1.2
119
+ rubygems_version: 3.1.4
106
120
  signing_key:
107
121
  specification_version: 4
108
122
  summary: Engine for api