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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be852b8025894c89dbc01109337011ac3178b1fcc14cb8d7655bebfcbf8083ec
4
- data.tar.gz: 8a13ec95aee745c0b262664658cf14807eb823ada87d845ae34e21a4b3c4720c
3
+ metadata.gz: 14b227fe2c5a72ce92a967c1a1abf17b0f3a3480cee4f4e9fc5a1a53c978aca4
4
+ data.tar.gz: ffe812022a1229e947c0db0edbda374c174d7632970099107f0d8f556a7ebcd1
5
5
  SHA512:
6
- metadata.gz: 47512dbe567f7b258f2f1b411545503bf0c7a964b822030061e328dee94865c9d93a4c549183ef00386af44177b818fcd2339b3658f78bd81225246256188489
7
- data.tar.gz: d45547b8ca370a7357a6123330f51a90451d48663408f682fabe81ff1081955b219cef6608c0eda484284c0f6863371f456c419905513b5632b394b40ea09390
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("spec/dummy/Rakefile", __dir__)
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 unless current_user
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 Tramway::Api.user_based_model.respond_to? :from_token_request
35
- Tramway::Api.user_based_model.active.from_token_request request
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
- Tramway::Api.auth_attributes.each do |attribute|
43
- object = Tramway::Api.user_based_model.active.where.not(attribute => nil).find_by(attribute => auth_params[:login])
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
2
4
  module Api
3
5
  module V1
@@ -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
- each_serializer: serializer_class,
12
- include: '*',
13
- status: :ok
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
- serializer: serializer_class,
21
- include: '*',
22
- status: :created
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
- serializer: serializer_class,
33
- include: '*',
34
- status: :ok
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
- serializer: serializer_class,
44
- include: '*',
45
- status: :ok
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
- serializer: serializer_class,
53
- include: '*',
54
- status: :no_content
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 :unprocessable_entity and return unless model_class
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 = Tramway::Api.available_models[model_class.to_s][:closed]&.map(&:to_s) || []
66
- head :unprocessable_entity and return unless action_name.in? open_actions + closed_actions
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? Tramway::Api::available_models[model_class.to_s][:closed]&.map(&:to_s) || []
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(Tramway::Api.user_based_model).new Tramway::Api.user_based_model.new
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[Tramway::Api.user_based_model.name.underscore]
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Tramway::Api::AuthenticationForm < Tramway::Core::ApplicationForm
2
4
  properties :email, :password
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Tramway
2
4
  module Api
3
5
  module ApplicationHelper
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Tramway
2
4
  module Api
3
5
  class ApplicationJob < ActiveJob::Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Tramway
2
4
  module Api
3
5
  class ApplicationMailer < ActionMailer::Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Tramway
2
4
  module Api
3
5
  class ApplicationRecord < ActiveRecord::Base
@@ -26,21 +26,19 @@ class Tramway::Api::V1::ErrorSerializer < ActiveModel::Serializer
26
26
  end
27
27
  end
28
28
 
29
- if object.model
30
- object.model.attributes.each do |attribute_key, attribute_value|
31
- if attribute_value.is_a?(Reform::Form)
32
- error_messages.merge!(error_messages(attribute_value, path + [attribute_key]))
33
- elsif attribute_value.is_a?(Array)
34
- attribute_value.each_with_index do |array_attribute_value, array_attribute_key|
35
- next unless array_attribute_value.is_a?(Reform::Form)
36
-
37
- error_messages.merge!(
38
- error_messages(
39
- array_attribute_value,
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
- end
41
+ )
44
42
  end
45
43
  end
46
44
  end
@@ -1,4 +1,6 @@
1
- ActionDispatch::Request.parameter_parsers[:json] = -> (raw_post) {
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
 
@@ -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: [ :create ]
4
- resource :user, only: [ :create, :show ]
5
+ resource :user_token, only: [:create]
6
+ resource :user, only: %i[create show]
5
7
  resources :records
6
8
  end
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # desc "Explaining what the task does"
2
4
  # task :tramway_api do
3
5
  # # Task goes here
@@ -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=(**params)
11
- @@auth_config = params
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 user_based_model
15
- @@auth_config[:user_model]
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[:auth_attributes]
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)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Tramway
2
4
  module Api
3
5
  class Engine < ::Rails::Engine
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Tramway
2
4
  module Api
3
- VERSION = '1.5'
5
+ VERSION = '1.6.0.2'
4
6
  end
5
7
  end
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: '1.5'
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-09-22 00:00:00.000000000 Z
11
+ date: 2019-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: knock
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: '0'
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: '0'
26
+ version: 0.10.5
27
27
  - !ruby/object:Gem::Dependency
28
- name: tramway-core
28
+ name: knock
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.9.2
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: 1.9.2
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: active_model_serializers
42
+ name: tramway-core
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.10.5
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: 0.10.5
54
+ version: 1.9.2
55
55
  description: Engine for api
56
56
  email:
57
57
  - kalashnikovisme@gmail.com