tramway-api 1.8.6.5 → 1.8.6.10

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: a073d2cac39ca7ee025468a271a4a85ba900c81693d62556ac76f1c7962882e2
4
- data.tar.gz: 34fadb2c4df760f32bc76d14a2c25fa2c1e9819c3c6a738a82e0ba05d7535b1a
3
+ metadata.gz: eac6742207080fc85dd8b83884206f932e8b92dd9ac29a9ee748274bff7f823a
4
+ data.tar.gz: 3fc429d2b9e90a4cd4b1349aa03541057e60147f59a8312cd1bb39e390cd62b3
5
5
  SHA512:
6
- metadata.gz: 8a5f6ce365af846d668d355b7858e1ae31f3c8c4dd9afabaa8f9348cfb786c0fd470300bf904e1c381e14cd9499e286154cabd62401fee14e8c896062b6443ea
7
- data.tar.gz: c8ab7d0c75fb7d51ea2c9b2d9173120114387eaed83541f3e0ca9d41c12c874c311e492163769410a06c980648633ed1dbfa55b5a1a412be209b62ab980d6fbb
6
+ metadata.gz: 8fc3526803e3cc00c3eebcc1728042e9dde54fa6f1c9b8e9df8a21960544afaac4b0a2f9b899b85380977fafa0c28670eac9a9c21fc15c162207c77d5dccd1b3
7
+ data.tar.gz: cba7da12631b2f8010348dc1f460ff1bfaccdcb4586badb78163b21ea55be708337ce596133c65a59c35c70f8d45c4cf4948beb3f015e06f75ade4b81bc68ca4
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'
@@ -146,7 +145,7 @@ end
146
145
 
147
146
  #### Configurate available models. Tramway will create end points according to this config
148
147
 
149
- ```
148
+ ```ruby
150
149
  ::Tramway::Api.set_available_models({
151
150
  User => [
152
151
  {
@@ -294,7 +293,6 @@ RSpec.describe 'Post generate token', type: :feature do
294
293
 
295
294
  end
296
295
  end
297
-
298
296
  ```
299
297
 
300
298
  Run `rspec` to test
@@ -340,11 +338,6 @@ this model must have field `password_digest`, because we use `bcrypt` gem for au
340
338
 
341
339
  Sets ActiveRecord models which will be used in API
342
340
 
343
- Argument is a hash. Keys are underscored models names, values are hashes with actions of available methods for every model.
344
- * `open` key means that this action will be used without authentication
345
- * `closed` key means that this action will be used with authentication
346
-
347
-
348
341
  Enabled methods:
349
342
 
350
343
  * create
@@ -360,7 +353,7 @@ Every model you've added in initializer will be able by URL `api/v1/records?mode
360
353
  Just update your initializer:
361
354
 
362
355
  ```ruby
363
- ::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] })
364
357
  ```
365
358
 
366
359
  Create serializer
@@ -436,6 +429,46 @@ Params Structure
436
429
  }
437
430
  ```
438
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
+
439
472
  ### Update
440
473
 
441
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
@@ -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
@@ -69,7 +72,7 @@ module Tramway
69
72
  action_is_available = checking_roles.map do |role|
70
73
  Tramway::Api.action_is_available(
71
74
  action: action_name.to_sym,
72
- project: (@application_engine || @application.name),
75
+ project: (@application_engine || application_name),
73
76
  role: role,
74
77
  model_name: params[:model],
75
78
  current_user: current_user
@@ -90,7 +93,7 @@ module Tramway
90
93
  def authenticate_user_if_needed
91
94
  action_is_open = Tramway::Api.action_is_available(
92
95
  action: action_name.to_sym,
93
- project: (@application_engine || @application.name),
96
+ project: (@application_engine || application_name),
94
97
  model_name: params[:model]
95
98
  )
96
99
  head(:unauthorized) && return if !current_user && !action_is_open
@@ -108,14 +111,21 @@ module Tramway
108
111
 
109
112
  protected
110
113
 
111
- def model_class
114
+ def application_name
115
+ @application ||= Tramway::Core.application&.model_class&.first || Tramway::Core.application
112
116
  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"
117
+ @application.name
118
+ rescue
119
+ raise("Tramway::Api @application not initialized, Tramway::Core.application: #{::Tramway::Core.application}, model_class: #{Tramway::Core.application&.model_class }")
116
120
  end
117
121
  end
118
122
 
123
+ def model_class
124
+ params[:model].constantize
125
+ rescue ActiveSupport::Concern::MultipleIncludedBlocks => e
126
+ raise "#{e}. Maybe #{params[:model]} model doesn't exists or there is naming conflicts with it"
127
+ end
128
+
119
129
  def decorator_class(model_name = nil)
120
130
  "#{model_name || model_class}Decorator".constantize
121
131
  end
@@ -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
@@ -22,21 +22,23 @@ class Tramway::Api::V1::ErrorSerializer < ActiveModel::Serializer
22
22
  end
23
23
  end
24
24
 
25
- if object.model
26
- object.model.errors.messages.each do |name, messages|
27
- error_messages.merge!((path + [name]).join('/') => messages)
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
28
30
  end
29
- end
30
31
 
31
- object.model&.attributes&.each do |attribute_key, attribute_value|
32
- if attribute_value.is_a?(Array)
33
- attribute_value.each_with_index do |array_attribute_value, array_attribute_key|
34
- error_messages.merge!(
35
- error_messages(
36
- array_attribute_value,
37
- path + [attribute_key] + [array_attribute_key]
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
+ )
38
40
  )
39
- )
41
+ end
40
42
  end
41
43
  end
42
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.5'
5
+ VERSION = '1.8.6.10'
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.5
4
+ version: 1.8.6.10
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-08-10 00:00:00.000000000 Z
11
+ date: 2021-03-06 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