tramway-api 1.5 → 1.6.0.2
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 +5 -0
- data/Rakefile +3 -1
- data/app/controllers/tramway/api/application_controller.rb +15 -5
- data/app/controllers/tramway/api/v1/application_controller.rb +2 -0
- data/app/controllers/tramway/api/v1/records_controller.rb +21 -21
- data/app/controllers/tramway/api/v1/user_tokens_controller.rb +3 -1
- data/app/controllers/tramway/api/v1/users_controller.rb +9 -3
- data/app/forms/tramway/api/authentication_form.rb +2 -0
- data/app/helpers/tramway/api/application_helper.rb +2 -0
- data/app/jobs/tramway/api/application_job.rb +2 -0
- data/app/mailers/tramway/api/application_mailer.rb +2 -0
- data/app/models/tramway/api/application_record.rb +2 -0
- data/app/serializers/tramway/api/v1/error_serializer.rb +12 -14
- data/config/initializers/json_param_key_transform.rb +3 -1
- data/config/routes.rb +4 -2
- data/lib/tasks/tramway/api_tasks.rake +2 -0
- data/lib/tramway/api.rb +16 -6
- data/lib/tramway/api/engine.rb +2 -0
- data/lib/tramway/api/version.rb +3 -1
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14b227fe2c5a72ce92a967c1a1abf17b0f3a3480cee4f4e9fc5a1a53c978aca4
|
4
|
+
data.tar.gz: ffe812022a1229e947c0db0edbda374c174d7632970099107f0d8f556a7ebcd1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14f9d4a3aff794718f346dc0ace3ec0a92f1abe05d2123164ae8d1dc0b9b5f9ad5f2c08dee24264e691bbc798d0af758bb48fcb8079423c1833795b105ca83a0
|
7
|
+
data.tar.gz: cbbd904561dee654dccf93f2279f7a1e6dcf6069e85f705cd4efdef58175c99138647a18e14d1878b7f726535089239683966b4fbb4e01d8c8822737e5f5b58c
|
data/README.md
CHANGED
@@ -43,6 +43,7 @@ coming soon...
|
|
43
43
|
gem 'tramway-core'
|
44
44
|
gem 'state_machine', github: 'seuros/state_machine'
|
45
45
|
gem 'knock'
|
46
|
+
gem 'audited'
|
46
47
|
```
|
47
48
|
|
48
49
|
## Usage
|
@@ -82,6 +83,10 @@ t.uuid :uid, default: 'uuid_generate_v4()'
|
|
82
83
|
```ruby
|
83
84
|
class User < Tramway::Core::ApplicationRecord
|
84
85
|
has_secure_password
|
86
|
+
|
87
|
+
def self.from_token_payload(payload)
|
88
|
+
find_by uid: payload['sub']
|
89
|
+
end
|
85
90
|
end
|
86
91
|
```
|
87
92
|
|
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
begin
|
2
4
|
require 'bundler/setup'
|
3
5
|
rescue LoadError
|
@@ -14,7 +16,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
14
16
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
17
|
end
|
16
18
|
|
17
|
-
APP_RAKEFILE = File.expand_path(
|
19
|
+
APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
|
18
20
|
load 'rails/tasks/engine.rake'
|
19
21
|
|
20
22
|
load 'rails/tasks/statistics.rake'
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tramway
|
2
4
|
module Api
|
3
5
|
class ApplicationController < ::Tramway::Core::ApplicationController
|
@@ -18,7 +20,7 @@ module Tramway
|
|
18
20
|
protected
|
19
21
|
|
20
22
|
def authenticate
|
21
|
-
return unauthorized
|
23
|
+
return unauthorized if current_user.nil? || !params[:user_based_model].in?(Tramway::Api.user_based_models)
|
22
24
|
end
|
23
25
|
|
24
26
|
def auth_token
|
@@ -30,17 +32,19 @@ module Tramway
|
|
30
32
|
end
|
31
33
|
|
32
34
|
def entity
|
35
|
+
user_based_model = params[:user_based_model].constantize
|
33
36
|
@entity ||=
|
34
|
-
if
|
35
|
-
|
37
|
+
if user_based_model.respond_to? :from_token_request
|
38
|
+
user_based_model.active.from_token_request request
|
36
39
|
else
|
37
40
|
params[:auth] && find_user_by_auth_attributes
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
41
44
|
def find_user_by_auth_attributes
|
42
|
-
|
43
|
-
|
45
|
+
user_based_model = params[:user_based_model].constantize
|
46
|
+
Tramway::Api.auth_attributes[user_based_model].each do |attribute|
|
47
|
+
object = user_based_model.active.where.not(attribute => nil).find_by(attribute => auth_params[:login])
|
44
48
|
return object if object
|
45
49
|
end
|
46
50
|
nil
|
@@ -49,6 +53,12 @@ module Tramway
|
|
49
53
|
def auth_params
|
50
54
|
params[:auth]&.permit(:login, :password)
|
51
55
|
end
|
56
|
+
|
57
|
+
def current_user
|
58
|
+
Tramway::Api.user_based_models.map do |user_based_model|
|
59
|
+
send("current_#{user_based_model.name.underscore}")
|
60
|
+
end.compact.first
|
61
|
+
end
|
52
62
|
end
|
53
63
|
end
|
54
64
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tramway::Api::V1
|
2
4
|
class RecordsController < ::Tramway::Api::V1::ApplicationController
|
3
5
|
before_action :check_available_model_class
|
@@ -8,18 +10,18 @@ module Tramway::Api::V1
|
|
8
10
|
records = model_class.active.order(id: :desc).send params[:scope] || :all
|
9
11
|
records = records.full_text_search params[:search] if params[:search]
|
10
12
|
render json: records,
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
each_serializer: serializer_class,
|
14
|
+
include: '*',
|
15
|
+
status: :ok
|
14
16
|
end
|
15
17
|
|
16
18
|
def create
|
17
19
|
record_form = form_class.new model_class.new
|
18
20
|
if record_form.submit snake_case params[:data][:attributes]
|
19
21
|
render json: record_form.model,
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
serializer: serializer_class,
|
23
|
+
include: '*',
|
24
|
+
status: :created
|
23
25
|
else
|
24
26
|
render_errors_for record_form
|
25
27
|
end
|
@@ -29,9 +31,9 @@ module Tramway::Api::V1
|
|
29
31
|
record_form = form_class.new model_class.active.find params[:id]
|
30
32
|
if record_form.submit snake_case params[:data][:attributes]
|
31
33
|
render json: record_form.model,
|
32
|
-
|
33
|
-
|
34
|
-
|
34
|
+
serializer: serializer_class,
|
35
|
+
include: '*',
|
36
|
+
status: :ok
|
35
37
|
else
|
36
38
|
render_errors_for record_form
|
37
39
|
end
|
@@ -40,36 +42,34 @@ module Tramway::Api::V1
|
|
40
42
|
def show
|
41
43
|
record = model_class.active.find params[:id]
|
42
44
|
render json: record,
|
43
|
-
|
44
|
-
|
45
|
-
|
45
|
+
serializer: serializer_class,
|
46
|
+
include: '*',
|
47
|
+
status: :ok
|
46
48
|
end
|
47
49
|
|
48
50
|
def destroy
|
49
51
|
record = model_class.active.find params[:id]
|
50
52
|
record.remove
|
51
53
|
render json: record,
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
serializer: serializer_class,
|
55
|
+
include: '*',
|
56
|
+
status: :no_content
|
55
57
|
end
|
56
58
|
|
57
59
|
private
|
58
60
|
|
59
61
|
def check_available_model_class
|
60
|
-
head
|
62
|
+
head(:unprocessable_entity) && return unless model_class
|
61
63
|
end
|
62
64
|
|
63
65
|
def check_available_model_action
|
64
66
|
open_actions = Tramway::Api.available_models[model_class.to_s][:open]&.map(&:to_s) || []
|
65
|
-
closed_actions =
|
66
|
-
head
|
67
|
+
closed_actions = Tramway::Api.available_models[model_class.to_s][:closed]&.map(&:to_s) || []
|
68
|
+
head(:unprocessable_entity) && return unless action_name.in? open_actions + closed_actions
|
67
69
|
end
|
68
70
|
|
69
71
|
def authenticate_user_if_needed
|
70
|
-
if action_name.in?
|
71
|
-
authenticate_user
|
72
|
-
end
|
72
|
+
head :unauthorized and return if action_name.in?(Tramway::Api.available_models[model_class.to_s][:closed]&.map(&:to_s) || []) && !current_user
|
73
73
|
end
|
74
74
|
|
75
75
|
def model_class
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
class Tramway::Api::V1::UserTokensController < ::Tramway::Api::V1::ApplicationController
|
3
4
|
def create
|
4
5
|
if entity.present? && entity.authenticate(auth_params[:password])
|
@@ -7,7 +8,8 @@ class Tramway::Api::V1::UserTokensController < ::Tramway::Api::V1::ApplicationCo
|
|
7
8
|
auth_token: token,
|
8
9
|
user: {
|
9
10
|
email: @entity.email,
|
10
|
-
uid: @entity.uid
|
11
|
+
uid: @entity.uid,
|
12
|
+
id: @entity.id
|
11
13
|
}
|
12
14
|
}, status: :created
|
13
15
|
else
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tramway/helpers/class_name_helpers'
|
2
4
|
|
3
5
|
class Tramway::Api::V1::UsersController < ::Tramway::Api::V1::ApplicationController
|
@@ -5,11 +7,11 @@ class Tramway::Api::V1::UsersController < ::Tramway::Api::V1::ApplicationControl
|
|
5
7
|
include Tramway::ClassNameHelpers
|
6
8
|
|
7
9
|
def create
|
8
|
-
user_form = sign_up_form_class_name(
|
10
|
+
user_form = sign_up_form_class_name(user_based_model).new user_based_model.new
|
9
11
|
# Implement JSON API spec here
|
10
|
-
if user_form.submit params[
|
12
|
+
if user_form.submit snake_case params[user_based_model.name.underscore]
|
11
13
|
token = ::Knock::AuthToken.new(payload: { sub: user_form.model.uid }).token
|
12
|
-
# FIXME refactor this bullshit
|
14
|
+
# FIXME: refactor this bullshit
|
13
15
|
serialized_user = OpenStruct.new(
|
14
16
|
user_form.model.attributes.merge(
|
15
17
|
authentication_token: token,
|
@@ -31,4 +33,8 @@ class Tramway::Api::V1::UsersController < ::Tramway::Api::V1::ApplicationControl
|
|
31
33
|
def sign_up_form_class_name(model_class)
|
32
34
|
form_class_name "#{model_class}SignUp"
|
33
35
|
end
|
36
|
+
|
37
|
+
def user_based_model
|
38
|
+
params[:user_based_model].constantize if params[:user_based_model].in? Tramway::Api.user_based_models.map(&:to_s)
|
39
|
+
end
|
34
40
|
end
|
@@ -26,21 +26,19 @@ class Tramway::Api::V1::ErrorSerializer < ActiveModel::Serializer
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
error_messages
|
38
|
-
|
39
|
-
|
40
|
-
path + [attribute_key] + [array_attribute_key]
|
41
|
-
)
|
29
|
+
object.model&.attributes&.each do |attribute_key, attribute_value|
|
30
|
+
if attribute_value.is_a?(Reform::Form)
|
31
|
+
error_messages.merge!(error_messages(attribute_value, path + [attribute_key]))
|
32
|
+
elsif attribute_value.is_a?(Array)
|
33
|
+
attribute_value.each_with_index do |array_attribute_value, array_attribute_key|
|
34
|
+
next unless array_attribute_value.is_a?(Reform::Form)
|
35
|
+
|
36
|
+
error_messages.merge!(
|
37
|
+
error_messages(
|
38
|
+
array_attribute_value,
|
39
|
+
path + [attribute_key] + [array_attribute_key]
|
42
40
|
)
|
43
|
-
|
41
|
+
)
|
44
42
|
end
|
45
43
|
end
|
46
44
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
ActionDispatch::Request.parameter_parsers[:json] = lambda { |raw_post|
|
2
4
|
data = ActiveSupport::JSON.decode(raw_post)
|
3
5
|
data = { _json: data } unless data.is_a?(Hash)
|
4
6
|
|
data/config/routes.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Tramway::Api::Engine.routes.draw do
|
2
4
|
namespace :v1 do
|
3
|
-
resource :user_token, only: [
|
4
|
-
resource :user, only: [
|
5
|
+
resource :user_token, only: [:create]
|
6
|
+
resource :user, only: %i[create show]
|
5
7
|
resources :records
|
6
8
|
end
|
7
9
|
end
|
data/lib/tramway/api.rb
CHANGED
@@ -1,22 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tramway/api/engine'
|
2
4
|
|
3
5
|
module Tramway
|
4
6
|
module Api
|
5
7
|
class << self
|
6
8
|
def auth_config
|
7
|
-
@@auth_config ||= { user_model: ::Tramway::User::User, auth_attributes: :email }
|
9
|
+
@@auth_config ||= [{ user_model: ::Tramway::User::User, auth_attributes: :email }]
|
8
10
|
end
|
9
11
|
|
10
|
-
def auth_config=(
|
11
|
-
|
12
|
+
def auth_config=(params)
|
13
|
+
if params.is_a? Hash
|
14
|
+
@@auth_config = [params]
|
15
|
+
elsif params.is_a? Array
|
16
|
+
@@auth_config = params
|
17
|
+
end
|
12
18
|
end
|
13
19
|
|
14
|
-
def
|
15
|
-
@@auth_config
|
20
|
+
def user_based_models
|
21
|
+
@@auth_config.map do |conf|
|
22
|
+
conf[:user_model]
|
23
|
+
end
|
16
24
|
end
|
17
25
|
|
18
26
|
def auth_attributes
|
19
|
-
@@auth_config
|
27
|
+
@@auth_config.reduce({}) do |hash, conf|
|
28
|
+
hash.merge! conf[:user_model] => conf[:auth_attributes]
|
29
|
+
end
|
20
30
|
end
|
21
31
|
|
22
32
|
def set_available_models(**models)
|
data/lib/tramway/api/engine.rb
CHANGED
data/lib/tramway/api/version.rb
CHANGED
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tramway-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.6.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Kalashnikov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: active_model_serializers
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.10.5
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.10.5
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: knock
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: tramway-core
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.9.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 1.9.2
|
55
55
|
description: Engine for api
|
56
56
|
email:
|
57
57
|
- kalashnikovisme@gmail.com
|