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 +4 -4
- data/README.md +162 -14
- data/app/controllers/tramway/api/application_controller.rb +3 -1
- data/app/controllers/tramway/api/v1/application_controller.rb +17 -10
- data/app/serializers/tramway/api/v1/application_serializer.rb +2 -1
- data/lib/tramway/api.rb +15 -0
- data/lib/tramway/api/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed93d90eaaed7aa48a6b22b4961a91ee4ffccb7ca89e5572e605b4fbb438fde7
|
4
|
+
data.tar.gz: 5dfddda7b69e8d16ac6822f33d2980fdf689b10eb6fa207e5c111bc9cb87c69b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
-
|
78
|
-
|
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
|
-
|
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
|
-
|
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::
|
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
|
-
|
388
|
+
*config/initializers/tramway.rb*
|
345
389
|
|
346
|
-
|
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
|
-
|
431
|
+
*config/initializers/tramway.rb*
|
351
432
|
|
352
|
-
|
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
|
-
|
474
|
+
#### Description
|
357
475
|
|
358
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
32
|
-
collection =
|
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
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
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
|
|
data/lib/tramway/api.rb
CHANGED
@@ -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
|
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.
|
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-
|
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
|