tramway-api 1.7.1.3 → 1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/tramway/api/v1/records_controller.rb +40 -11
- data/lib/tramway/api.rb +44 -7
- data/lib/tramway/api/records_models.rb +40 -0
- data/lib/tramway/api/singleton_models.rb +31 -0
- data/lib/tramway/api/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fdcaae068ee8dbb36b6cfd6a85c414d5356c4e25d5d9404d8340f1093e18a786
|
4
|
+
data.tar.gz: 893e1421c8296743740e969d7740a536b98cca1c3f308b3b84c2959c717996c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68691b7551fb533604c7aafb6cb87d0b6770940c6da3d053800b55c6aeb0d191d8c377fe0a00581fb5dcd20206fa0483a1b47205403c9f781da88a72a1161bb7
|
7
|
+
data.tar.gz: b7988845eb7752b6e1f82d3956d52f2d13f419a221ee4aa7f1a4e0bea984417d61b84446b32d4b12cae68ffdf27b28ba0db16d4ff28901b6cc00171ce27d386a
|
@@ -29,7 +29,7 @@ module Tramway::Api::V1
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def update
|
32
|
-
record_form = form_class.new
|
32
|
+
record_form = form_class.new record
|
33
33
|
if record_form.submit snake_case params[:data][:attributes]
|
34
34
|
render json: record_form.model,
|
35
35
|
serializer: serializer_class,
|
@@ -41,7 +41,6 @@ module Tramway::Api::V1
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def show
|
44
|
-
record = model_class.active.find_by! uuid: params[:id]
|
45
44
|
render json: record,
|
46
45
|
serializer: serializer_class,
|
47
46
|
include: '*',
|
@@ -49,7 +48,6 @@ module Tramway::Api::V1
|
|
49
48
|
end
|
50
49
|
|
51
50
|
def destroy
|
52
|
-
record = model_class.active.find_by! uuid: params[:id]
|
53
51
|
record.remove
|
54
52
|
render json: record,
|
55
53
|
serializer: serializer_class,
|
@@ -58,25 +56,46 @@ module Tramway::Api::V1
|
|
58
56
|
end
|
59
57
|
|
60
58
|
private
|
59
|
+
|
60
|
+
def record
|
61
|
+
if params[:id].present?
|
62
|
+
@record = model_class.find_by! uuid: params[:id]
|
63
|
+
end
|
64
|
+
end
|
61
65
|
|
62
66
|
def check_available_model_class
|
63
|
-
|
67
|
+
unless model_class
|
68
|
+
head(:unauthorized) && return unless current_user
|
69
|
+
head(:unprocessable_entity) && return
|
70
|
+
end
|
64
71
|
end
|
65
72
|
|
66
73
|
def check_available_model_action
|
67
|
-
|
68
|
-
|
69
|
-
|
74
|
+
action_is_available = checking_roles.map do |role|
|
75
|
+
Tramway::Api.action_is_available?(
|
76
|
+
record: record,
|
77
|
+
action: action_name.to_sym,
|
78
|
+
project: (@application_engine || @application.name),
|
79
|
+
role: role,
|
80
|
+
model_name: params[:model],
|
81
|
+
current_user: current_user
|
82
|
+
)
|
83
|
+
end.include? true
|
84
|
+
|
85
|
+
head(:unprocessable_entity) && return unless action_is_available
|
70
86
|
end
|
71
87
|
|
72
88
|
def authenticate_user_if_needed
|
73
|
-
|
74
|
-
|
75
|
-
|
89
|
+
action_is_open = Tramway::Api.action_is_available?(
|
90
|
+
action: action_name.to_sym,
|
91
|
+
project: (@application_engine || @application.name),
|
92
|
+
model_name: params[:model]
|
93
|
+
)
|
94
|
+
head(:unauthorized) && return if !current_user && !action_is_open
|
76
95
|
end
|
77
96
|
|
78
97
|
def model_class
|
79
|
-
if params[:model].to_s.in?
|
98
|
+
if params[:model].to_s.in? available_models_for_current_user
|
80
99
|
begin
|
81
100
|
params[:model].constantize
|
82
101
|
rescue ActiveSupport::Concern::MultipleIncludedBlocks => e
|
@@ -85,6 +104,16 @@ module Tramway::Api::V1
|
|
85
104
|
end
|
86
105
|
end
|
87
106
|
|
107
|
+
def available_models_for_current_user
|
108
|
+
checking_roles.reduce([]) do |models, role|
|
109
|
+
models += ::Tramway::Api.available_models(role: role).map(&:to_s)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def checking_roles
|
114
|
+
[ :open, current_user&.role ].compact
|
115
|
+
end
|
116
|
+
|
88
117
|
def decorator_class(model_name = nil)
|
89
118
|
"#{model_name || model_class}Decorator".constantize
|
90
119
|
end
|
data/lib/tramway/api.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'tramway/api/engine'
|
4
|
+
require 'tramway/api/records_models'
|
5
|
+
require 'tramway/api/singleton_models'
|
4
6
|
|
5
7
|
module Tramway
|
6
8
|
module Api
|
7
9
|
class << self
|
10
|
+
include ::Tramway::Api::RecordsModels
|
11
|
+
include ::Tramway::Api::SingletonModels
|
12
|
+
|
8
13
|
def auth_config
|
9
14
|
@@auth_config ||= [{ user_model: ::Tramway::User::User, auth_attributes: :email }]
|
10
15
|
end
|
@@ -31,16 +36,48 @@ module Tramway
|
|
31
36
|
end
|
32
37
|
end
|
33
38
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
37
|
-
|
39
|
+
def get_models_by_key(checked_models, project, role)
|
40
|
+
unless project.present?
|
41
|
+
error = Tramway::Error.new(
|
42
|
+
plugin: :admin,
|
43
|
+
method: :get_models_by_key,
|
44
|
+
message: "Looks like you have not create at lease one instance of #{Tramway::Core.application.model_class} model"
|
45
|
+
)
|
46
|
+
raise error.message
|
38
47
|
end
|
39
|
-
|
48
|
+
checked_models && checked_models != [] && checked_models[project][role]&.keys || []
|
49
|
+
end
|
50
|
+
|
51
|
+
def models_array(models_type:, role:)
|
52
|
+
instance_variable_get("@#{models_type}_models")&.map do |projects|
|
53
|
+
projects.last[role]&.keys
|
54
|
+
end&.flatten || []
|
55
|
+
end
|
56
|
+
|
57
|
+
def action_is_available?(record: nil, project:, role: :open, model_name:, action:, current_user: nil)
|
58
|
+
actions = select_actions(project: project, role: role, model_name: model_name)
|
59
|
+
availability = actions&.select do |a|
|
60
|
+
if a.is_a? Symbol
|
61
|
+
a == action.to_sym
|
62
|
+
elsif a.is_a? Hash
|
63
|
+
a.keys.first.to_sym == action.to_sym
|
64
|
+
end
|
65
|
+
end&.first
|
66
|
+
|
67
|
+
return false unless availability.present?
|
68
|
+
return true if availability.is_a? Symbol
|
69
|
+
|
70
|
+
availability.values.first.call record, current_user
|
40
71
|
end
|
41
72
|
|
42
|
-
def
|
43
|
-
|
73
|
+
def select_actions(project:, role:, model_name:)
|
74
|
+
stringify_keys(@singleton_models&.dig(project, role))&.dig(model_name) || stringify_keys(@available_models&.dig(project, role))&.dig(model_name)
|
75
|
+
end
|
76
|
+
|
77
|
+
def stringify_keys(hash)
|
78
|
+
hash&.reduce({}) do |new_hash, pair|
|
79
|
+
new_hash.merge! pair[0].to_s => pair[1]
|
80
|
+
end
|
44
81
|
end
|
45
82
|
end
|
46
83
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tramway::Api::RecordsModels
|
4
|
+
def set_available_models(*models, project:, role: :open)
|
5
|
+
@available_models ||= {}
|
6
|
+
@available_models[project] ||= {}
|
7
|
+
@available_models[project][role] ||= {}
|
8
|
+
models.each do |model|
|
9
|
+
if model.class == Class
|
10
|
+
@available_models[project][role].merge! model => %i[index show update create destroy]
|
11
|
+
elsif model.class == Hash
|
12
|
+
@available_models[project][role].merge! model
|
13
|
+
end
|
14
|
+
end
|
15
|
+
@available_models = @available_models.with_indifferent_access
|
16
|
+
end
|
17
|
+
|
18
|
+
def available_models_for(project, role: :open)
|
19
|
+
models = get_models_by_key(@available_models, project, role)
|
20
|
+
if project_is_engine?(project)
|
21
|
+
models += engine_class(project).dependencies.map do |dependency|
|
22
|
+
if @available_models&.dig(dependency, role).present?
|
23
|
+
@available_models&.dig(dependency, role).keys
|
24
|
+
else
|
25
|
+
error = Tramway::Error.new(
|
26
|
+
plugin: :admin,
|
27
|
+
method: :available_models_for,
|
28
|
+
message: "There is no dependency `#{dependency}` for plugin: #{project}. Please, check file `tramway-#{project}/lib/tramway/#{project}/#{project}.rb`"
|
29
|
+
)
|
30
|
+
raise error
|
31
|
+
end
|
32
|
+
end.flatten.compact
|
33
|
+
end
|
34
|
+
models
|
35
|
+
end
|
36
|
+
|
37
|
+
def available_models(role:)
|
38
|
+
models_array models_type: :available, role: role
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tramway::Api::SingletonModels
|
4
|
+
def set_singleton_models(*models, project:, role: :open)
|
5
|
+
@singleton_models ||= {}
|
6
|
+
@singleton_models[project] ||= {}
|
7
|
+
@singleton_models[project][role] ||= {}
|
8
|
+
models.each do |model|
|
9
|
+
if model.class == Class
|
10
|
+
@singleton_models[project][role].merge! model => %i[index show update create destroy]
|
11
|
+
elsif model.class == Hash
|
12
|
+
@singleton_models[project][role].merge! model
|
13
|
+
end
|
14
|
+
end
|
15
|
+
@singleton_models = @singleton_models.with_indifferent_access
|
16
|
+
end
|
17
|
+
|
18
|
+
def singleton_models_for(project, role: :open)
|
19
|
+
models = get_models_by_key(@singleton_models, project, role)
|
20
|
+
if project_is_engine?(project)
|
21
|
+
models += engine_class(project).dependencies.map do |dependency|
|
22
|
+
@singleton_models&.dig(dependency, role)&.keys
|
23
|
+
end.flatten.compact
|
24
|
+
end
|
25
|
+
models
|
26
|
+
end
|
27
|
+
|
28
|
+
def singleton_models(role:)
|
29
|
+
models_array models_type: :singleton, role: role
|
30
|
+
end
|
31
|
+
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.
|
4
|
+
version: '1.8'
|
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-03-
|
11
|
+
date: 2020-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_model_serializers
|
@@ -81,6 +81,8 @@ files:
|
|
81
81
|
- lib/tasks/tramway/api_tasks.rake
|
82
82
|
- lib/tramway/api.rb
|
83
83
|
- lib/tramway/api/engine.rb
|
84
|
+
- lib/tramway/api/records_models.rb
|
85
|
+
- lib/tramway/api/singleton_models.rb
|
84
86
|
- lib/tramway/api/version.rb
|
85
87
|
homepage: https://github.com/kalashnikovisme/tramway-dev
|
86
88
|
licenses: []
|