tramway-api 1.5.0.2 → 1.6.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c7c200630528335bf88fc29901da97260dcff159e14d4e05f948a25211fdffb3
4
- data.tar.gz: f777b6bbc9ff7288e1b49d123b27ba7350a904305650cbbeafd738e31a64b828
3
+ metadata.gz: bca58876f3668111e2468cbc1f4c891addfc537f922d962df2e0d7fed1ce3c0c
4
+ data.tar.gz: 1ab78086fb53b2caaa91afd84f03f253044b2bb2795aabbad1bbb2e4a39cfe95
5
5
  SHA512:
6
- metadata.gz: 8a1ceb5825fb2ddccc0155b98de5ebd1cc36c707a61c9b61729eb6d23437ca7fd6fd2440fcaba32eb7e700f86054ffb77ce1258d6a26ef601002da0e7a86764f
7
- data.tar.gz: 891faee71e40942898a9848b01fe61dbe203f6af05efb32d9029b7a9aa771ce694784dde8076b3164ad2dfdd1878def1683beab1d790551aef5d41e83585faa2
6
+ metadata.gz: 4d2ac014846f179a7dcfb5878f78f344df7ea4c693aa9d16eb4f344462ff3ac0723901dd3c88bb7378ca09e09380891270ecf0a21f689e3372a74da6c9f8ca8a
7
+ data.tar.gz: acd4515b5542e5abf1e3f61916dfd6c26fb9e34f48a34b2098c1c498955a65ab3b2053cfa17b1ac7c89be5349d6eef8b879344b66ec6345b4c118d7186cda082
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
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
@@ -15,12 +17,13 @@ module Tramway
15
17
  head :unauthorized
16
18
  end
17
19
 
18
- protected
19
-
20
20
  def authenticate
21
- return unauthorized unless current_user
21
+ return if current_user || params[:user_based_model].in?(Tramway::Api.user_based_models)
22
+ unauthorized
22
23
  end
23
24
 
25
+ protected
26
+
24
27
  def auth_token
25
28
  if entity.respond_to? :to_token_payload
26
29
  ::Knock::AuthToken.new payload: entity.to_token_payload
@@ -30,17 +33,19 @@ module Tramway
30
33
  end
31
34
 
32
35
  def entity
36
+ user_based_model = params[:user_based_model].constantize
33
37
  @entity ||=
34
- if Tramway::Api.user_based_model.respond_to? :from_token_request
35
- Tramway::Api.user_based_model.active.from_token_request request
38
+ if user_based_model.respond_to? :from_token_request
39
+ user_based_model.active.from_token_request request
36
40
  else
37
41
  params[:auth] && find_user_by_auth_attributes
38
42
  end
39
43
  end
40
44
 
41
45
  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])
46
+ user_based_model = params[:user_based_model].constantize
47
+ Tramway::Api.auth_attributes[user_based_model].each do |attribute|
48
+ object = user_based_model.active.where.not(attribute => nil).find_by(attribute => auth_params[:login])
44
49
  return object if object
45
50
  end
46
51
  nil
@@ -49,6 +54,12 @@ module Tramway
49
54
  def auth_params
50
55
  params[:auth]&.permit(:login, :password)
51
56
  end
57
+
58
+ def current_user
59
+ Tramway::Api.user_based_models.map do |user_based_model|
60
+ send("current_#{user_based_model.name.underscore}")
61
+ end.compact.first
62
+ end
52
63
  end
53
64
  end
54
65
  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])
@@ -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,15 +7,16 @@ 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 snake_case 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,
16
- id: user_form.model.uid
18
+ uid: user_form.model.uid,
19
+ id: user_form.model.id
17
20
  )
18
21
  )
19
22
  render json: serialized_user, status: :created
@@ -31,4 +34,8 @@ class Tramway::Api::V1::UsersController < ::Tramway::Api::V1::ApplicationControl
31
34
  def sign_up_form_class_name(model_class)
32
35
  form_class_name "#{model_class}SignUp"
33
36
  end
37
+
38
+ def user_based_model
39
+ params[:user_based_model].constantize if params[:user_based_model].in? Tramway::Api.user_based_models.map(&:to_s)
40
+ end
34
41
  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.0.2'
5
+ VERSION = '1.6.1.1'
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.0.2
4
+ version: 1.6.1.1
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-10-07 00:00:00.000000000 Z
11
+ date: 2019-11-08 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