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 +4 -4
- data/README.md +53 -10
- data/app/controllers/tramway/api/application_controller.rb +1 -3
- data/app/controllers/tramway/api/v1/application_controller.rb +7 -6
- data/app/controllers/tramway/api/v1/records_controller.rb +7 -0
- data/app/serializers/tramway/api/v1/error_serializer.rb +18 -14
- 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: 3206561c6202bb16eb547409a92afc1ffd3bd0577ab5924f0ba9142b2d2da5f7
|
4
|
+
data.tar.gz: fc82ca7b002060d3f2a1d49d723a26d0405f5765ffd34a0b7b6a287914d68018
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
-
|
113
|
-
|
114
|
-
|
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
|
20
|
-
|
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
|
30
|
-
if
|
31
|
-
|
32
|
-
error_messages.merge!(
|
33
|
-
|
34
|
-
|
35
|
-
|
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
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.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:
|
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.
|
119
|
+
rubygems_version: 3.1.4
|
106
120
|
signing_key:
|
107
121
|
specification_version: 4
|
108
122
|
summary: Engine for api
|