tramway-api 1.8.6.5 → 1.8.6.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +42 -9
- data/app/controllers/tramway/api/application_controller.rb +1 -3
- data/app/controllers/tramway/api/v1/application_controller.rb +16 -6
- data/app/controllers/tramway/api/v1/records_controller.rb +7 -0
- data/app/serializers/tramway/api/v1/error_serializer.rb +14 -12
- data/lib/tramway/api.rb +2 -1
- data/lib/tramway/api/version.rb +1 -1
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eac6742207080fc85dd8b83884206f932e8b92dd9ac29a9ee748274bff7f823a
|
4
|
+
data.tar.gz: 3fc429d2b9e90a4cd4b1349aa03541057e60147f59a8312cd1bb39e390cd62b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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 ||
|
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 ||
|
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
|
114
|
+
def application_name
|
115
|
+
@application ||= Tramway::Core.application&.model_class&.first || Tramway::Core.application
|
112
116
|
begin
|
113
|
-
|
114
|
-
rescue
|
115
|
-
raise
|
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
|
27
|
-
|
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
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
data/lib/tramway/api/version.rb
CHANGED
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.
|
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:
|
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.
|
119
|
+
rubygems_version: 3.1.4
|
106
120
|
signing_key:
|
107
121
|
specification_version: 4
|
108
122
|
summary: Engine for api
|