ecom_core 1.0.21 → 1.0.22

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: d027263661773bc60c6bdc7d7c9670677e71cac3d2712d9bc27fffffcc642da5
4
- data.tar.gz: 9a7ae3f3ef1cb7e44d433d88af9590d46769744618b8caef78fcbda76543ad72
3
+ metadata.gz: f45781b38a120c782949fe3133566f994e81fe5723ce77f4e535b61b7d2ef3ad
4
+ data.tar.gz: 66f86d09d7b065950b202b2c5ffce8943da5168d8f96cc80b1763a312afe2aa9
5
5
  SHA512:
6
- metadata.gz: fb5a60fba164169fe9cc1cd0d30b3e50461b5d7bb22c421d7a2c751de77f474dad4e17be02564e5b2aefc237aaa65d70597d2287984a29802fc1cf05bfdf3547
7
- data.tar.gz: 53a72197660a7ad6ffb5f0b84976f90515f61b4cb840fc80f8498325e7956f96f36ae7a500d712f4d07787d43adae2681f699f05dda502f2335f69b24562f8d5
6
+ metadata.gz: bc70b7327aa2af6160cdb074430fa6ddc744c80df67a264c40cb20a577f7d248733c07d32894b714a28f9dd1c6f49ffabbdb25beae6174da7f9e0c662bdf8686
7
+ data.tar.gz: 4cc556044dc408bfec968a8e9f04c44c9a373fb02ed0a6af49ad2206d84fabc985cbeb404fae691740dbf1d209e5e6680c14f5499fd3c1494a9327b65fcd64cf
@@ -0,0 +1,33 @@
1
+ module Ecom
2
+ module Core
3
+ class AccessController < ApplicationController
4
+ skip_before_action :authenticate, only: [:login]
5
+
6
+ def login
7
+ user = User.find_by(email: auth_params[:email])
8
+ if user
9
+ if user.authenticate(auth_params[:password])
10
+ roles = user.user_roles.each_with_object([]) do |role, result|
11
+ result << role.name
12
+ end
13
+
14
+ payload = { id: user.id, email: user.email, name: user.full_name, roles: roles }
15
+ jwt = TokenAuthService.issue(payload)
16
+ render json: { token: jwt, user: payload, error: nil }
17
+ else
18
+ render json: { error: 'Invalid username or password' }, status: 400
19
+ end
20
+ else
21
+ render json: { error: 'User does not exist' }, status: 400
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def auth_params
28
+ params.require(:auth).permit(:email, :password)
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -1,7 +1,46 @@
1
1
  module Ecom
2
2
  module Core
3
3
  class ApplicationController < ActionController::API
4
- # protect_from_forgery with: :exception
4
+ before_action :authenticate
5
+
6
+ def logged_in?
7
+ !current_user.nil?
8
+ end
9
+
10
+ def current_user
11
+ return unless auth_present?
12
+
13
+ user = User.find(auth['id'])
14
+ @current_user ||= user if user
15
+ end
16
+
17
+ private
18
+
19
+ def authenticate
20
+ render json: { error: 'Unauthorized' }, status: 401 unless logged_in?
21
+ end
22
+
23
+ def token
24
+ return nil if request.env['HTTP_AUTHORIZATION'].nil?
25
+
26
+ request.env['HTTP_AUTHORIZATION'].scan(/Bearer (.*)$/).flatten.last
27
+ end
28
+
29
+ def auth
30
+ TokenAuthService.decode(token)
31
+ end
32
+
33
+ def auth_present?
34
+ !token.nil?
35
+ end
36
+
37
+ def generate_error_message(entity)
38
+ value = entity.errors.details.first[1][0][:value]
39
+ field = entity.errors.keys[0]
40
+ message = entity.errors.values[0][0]
41
+
42
+ entity.errors.full_message(field, "'#{value}' #{message}")
43
+ end
5
44
  end
6
45
  end
7
46
  end
@@ -0,0 +1,33 @@
1
+ module Ecom
2
+ module Core
3
+ class ApplicationModulesController < ApplicationController
4
+ def index
5
+ render json: ApplicationModuleSerializer.new(ApplicationModule.all)
6
+ end
7
+
8
+ def create
9
+ application_module = ApplicationModule.new(application_module_params)
10
+ if application_module.save
11
+ render json: ApplicationModuleSerializer.new(application_module), status: :created
12
+ else
13
+ render json: { success: false, errors: application_module.errors }, status: :unprocessable_entity
14
+ end
15
+ end
16
+
17
+ def update
18
+ application_module = ApplicationModule.find(params[:id])
19
+ if application_module.update(application_module_params)
20
+ render json: ApplicationModuleSerializer.new(application_module)
21
+ else
22
+ render json: { success: false, errors: application_module.errors }, status: :unprocessable_entity
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def application_module_params
29
+ params.require(:application_module).permit(:code, :name)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ module Ecom
2
+ module Core
3
+ class MenusController < ApplicationController
4
+ def index
5
+ user = current_user
6
+ roles = user.user_roles
7
+ app_module = roles[0].application_module
8
+ menus = []
9
+ roles.each do |role|
10
+ menu_list = role.menus.where(parent: nil, application_module: app_module)
11
+ menu_list.each do |menu|
12
+ children = []
13
+ menu.children.order(:label).each do |child|
14
+ if role.menus.include? child
15
+ children << { label: child.label, icon: child.icon, route: child.route }
16
+ end
17
+ end
18
+ menus << { label: menu.label, icon: menu.icon, children: children }
19
+ end
20
+ end
21
+
22
+ render json: menus
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,40 @@
1
+ module Ecom
2
+ module Core
3
+ class UserRolesController < ApplicationController
4
+ before_action :set_user_role, only: [:update]
5
+
6
+ def index
7
+ render json: UserRoleSerializer.new(UserRole.all)
8
+ end
9
+
10
+ def create
11
+ user_role = UserRole.new(user_role_params)
12
+
13
+ if user_role.save
14
+ render json: UserRoleSerializer.new(user_role), status: :created
15
+ else
16
+ render json: { success: false, errors: user_role.errors }, status: :unprocessable_entity
17
+ end
18
+ end
19
+
20
+ def update
21
+ if @user_role.update(user_role_params)
22
+ render json: UserRoleSerializer.new(@user_role)
23
+ else
24
+ render json: { success: false, errors: @user_role.errors }, status: :unprocessable_entity
25
+ end
26
+ end
27
+
28
+
29
+ private
30
+
31
+ def set_user_role
32
+ @user_role = UserRole.find(params[:id])
33
+ end
34
+
35
+ def user_role_params
36
+ params.require(:user_role).permit(:name, :application_module_id)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,43 @@
1
+ module Ecom
2
+ module Core
3
+ class UsersController < ApplicationController
4
+ before_action :set_user, only: [:update]
5
+
6
+ def index
7
+ render json: UserSerializer.new(User.all)
8
+ end
9
+
10
+ def active
11
+ render json: UserSerializer.new(User.active)
12
+ end
13
+
14
+ def create
15
+ user = User.new(user_params)
16
+ if user.save
17
+ render json: UserSerializer.new(user), status: :created
18
+ else
19
+ render json: { success: false, errors: user.errors }, status: :unprocessable_entity
20
+ end
21
+ end
22
+
23
+ def update
24
+ if @user.update(user_params)
25
+ render json: UserSerializer.new(@user)
26
+ else
27
+ render json: { success: false, errors: @user.errors }, status: :unprocessable_entity
28
+ end
29
+ end
30
+
31
+
32
+ private
33
+
34
+ def set_user
35
+ @user = User.find(params[:id])
36
+ end
37
+
38
+ def user_params
39
+ params.require(:user).permit(:first_name, :last_name, :email, :password, :active)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,7 +1,7 @@
1
1
  module Ecom
2
2
  module Core
3
3
  class ApplicationModule < ApplicationRecord
4
- validates :code, :name, uniqueness: true
4
+ validates :code, :name, presence: true, uniqueness: true
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,10 @@
1
+ module Ecom
2
+ module Core
3
+ class CustomPaymentDetail < ApplicationRecord
4
+ belongs_to :payment, class_name: 'Ecom::Core::Payment'
5
+
6
+ validates :name, :hours, :ot_hours, :base_salary, :overtime, :gross_salary, :tax, :pension, :net_salary, :net_pay,
7
+ :advance, :wage, presence: true
8
+ end
9
+ end
10
+ end
@@ -3,6 +3,7 @@ module Ecom
3
3
  class Menu < ApplicationRecord
4
4
  belongs_to :parent, class_name: 'Ecom::Core::Menu', optional: true
5
5
  belongs_to :application_module
6
+ has_many :children, class_name: 'Ecom::Core::Menu', foreign_key: 'parent_id'
6
7
 
7
8
  validates :label, :route, presence: true
8
9
  end
@@ -8,7 +8,9 @@ module Ecom
8
8
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i.freeze
9
9
  validates :first_name, :last_name, :active, presence: true
10
10
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
11
- validates :password, length: { minimum: 6 }
11
+ validates :password, presence: true, length: { minimum: 6 }, confirmation: true, if: :password
12
+
13
+ scope :active, -> { where(active: true) }
12
14
 
13
15
  def full_name
14
16
  "#{first_name} #{last_name}"
@@ -0,0 +1,9 @@
1
+ module Ecom
2
+ module Core
3
+ class ApplicationModuleSerializer
4
+ include FastJsonapi::ObjectSerializer
5
+
6
+ attributes :code, :name
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Ecom
2
+ module Core
3
+ class UserRoleSerializer
4
+ include FastJsonapi::ObjectSerializer
5
+
6
+ attributes :name
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Ecom
2
+ module Core
3
+ class UserSerializer
4
+ include FastJsonapi::ObjectSerializer
5
+
6
+ attributes :first_name, :last_name, :email, :active
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ require 'jwt'
2
+
3
+ module Ecom
4
+ module Core
5
+ class TokenAuthService
6
+ AUTH_SECRET = '31a70abfaa57e5e77a3fc9f27aeaaf59b9a9f5355b5e16c842ee172035a8ed40bf82c1c971ecc176e4f0b4c9e6141db07fd4a5af3f7db9265e719fbe340b105a'
7
+
8
+ def self.issue(payload)
9
+ JWT.encode(payload, auth_secret, 'HS256')
10
+ end
11
+
12
+ def self.decode(token)
13
+ JWT.decode(token, auth_secret, true, algorithm: 'HS256').first
14
+ end
15
+
16
+ def self.auth_secret
17
+ AUTH_SECRET
18
+ end
19
+ end
20
+ end
21
+ end
data/config/routes.rb CHANGED
@@ -1,5 +1,15 @@
1
1
  Ecom::Core::Engine.routes.draw do
2
+ post '/login', controller: :access, action: :login
3
+
4
+ resources :application_modules, only: %i[index create update]
5
+ resources :user_roles, only: %i[index create update]
6
+ resources :menus, only: %i[index]
7
+ resources :users, only: %i[index create update]
8
+ get '/users/active', controller: :users, action: :active
9
+
10
+
2
11
  resources :crew_types
3
12
  resources :equipment_types
4
13
  resources :material_types
14
+ resources :menus, only: %i[index]
5
15
  end
@@ -0,0 +1,24 @@
1
+ class CreateEcomCoreCustomPaymentDetails < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :ecom_core_custom_payment_details do |t|
4
+ t.string :name, null: false
5
+ t.float :hours, null: false
6
+ t.float :ot_hours, null: false, default: 0
7
+ t.float :base_salary, null: false
8
+ t.float :overtime, null: false
9
+ t.float :gross_salary, null: false
10
+ t.float :tax, null: false, default: 0
11
+ t.float :pension, null: false, default: 0
12
+ t.float :net_salary, null: false
13
+ t.float :net_pay, null: false
14
+ t.float :advance, null: false
15
+ t.float :wage, null: false
16
+ t.string :qualification
17
+ t.references :payment, null: false, index: { name: 'cpd_on_payment_indx' }
18
+
19
+ t.timestamps
20
+ end
21
+
22
+ add_foreign_key :ecom_core_custom_payment_details, :ecom_core_payments, column: :payment_id
23
+ end
24
+ end
@@ -1,5 +1,5 @@
1
1
  module Ecom
2
2
  module Core
3
- VERSION = '1.0.21'.freeze
3
+ VERSION = '1.0.22'.freeze
4
4
  end
5
5
  end
@@ -0,0 +1,18 @@
1
+ FactoryBot.define do
2
+ factory :custom_payment_detail, class: 'Ecom::Core::CustomPaymentDetail' do
3
+ name { FFaker::Name.name }
4
+ hours { 1.5 }
5
+ ot_hours { 1.5 }
6
+ base_salary { 1.5 }
7
+ overtime { 1.5 }
8
+ gross_salary { 100 }
9
+ tax { 15 }
10
+ pension { 5 }
11
+ net_salary { 80 }
12
+ net_pay { 80 }
13
+ advance { 0 }
14
+ wage { 1.5 }
15
+ qualification { FFaker::Name.name }
16
+ association :payment
17
+ end
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecom_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.21
4
+ version: 1.0.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henock L.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-21 00:00:00.000000000 Z
11
+ date: 2020-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aasm
@@ -53,21 +53,21 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rails
56
+ name: fast_jsonapi
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 6.0.2
61
+ version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 6.0.2
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: fast_jsonapi
70
+ name: jwt
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 6.0.2
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 6.0.2
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: factory_bot_rails
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -191,16 +205,22 @@ files:
191
205
  - Rakefile
192
206
  - app/controllers/concerns/ecom/core/lookupable.rb
193
207
  - app/controllers/concerns/ecom/core/resource_typeable.rb
208
+ - app/controllers/ecom/core/access_controller.rb
194
209
  - app/controllers/ecom/core/application_controller.rb
210
+ - app/controllers/ecom/core/application_modules_controller.rb
195
211
  - app/controllers/ecom/core/crew_types_controller.rb
196
212
  - app/controllers/ecom/core/equipment_types_controller.rb
197
213
  - app/controllers/ecom/core/material_types_controller.rb
214
+ - app/controllers/ecom/core/menus_controller.rb
215
+ - app/controllers/ecom/core/user_roles_controller.rb
216
+ - app/controllers/ecom/core/users_controller.rb
198
217
  - app/models/ecom/core/application_module.rb
199
218
  - app/models/ecom/core/application_record.rb
200
219
  - app/models/ecom/core/crew.rb
201
220
  - app/models/ecom/core/crew_time.rb
202
221
  - app/models/ecom/core/crew_type.rb
203
222
  - app/models/ecom/core/currency.rb
223
+ - app/models/ecom/core/custom_payment_detail.rb
204
224
  - app/models/ecom/core/equipment_type.rb
205
225
  - app/models/ecom/core/lookup.rb
206
226
  - app/models/ecom/core/material_type.rb
@@ -223,8 +243,12 @@ files:
223
243
  - app/models/ecom/core/work_component_template.rb
224
244
  - app/models/ecom/core/work_product.rb
225
245
  - app/models/ecom/core/work_product_template.rb
246
+ - app/serializers/ecom/core/application_module_serializer.rb
226
247
  - app/serializers/ecom/core/lookup_serializer.rb
227
248
  - app/serializers/ecom/core/resource_type_serializer.rb
249
+ - app/serializers/ecom/core/user_role_serializer.rb
250
+ - app/serializers/ecom/core/user_serializer.rb
251
+ - app/services/ecom/core/token_auth_service.rb
228
252
  - config/database.ci.yml
229
253
  - config/routes.rb
230
254
  - db/migrate/20190101112620_create_ecom_core_lookups.rb
@@ -256,6 +280,7 @@ files:
256
280
  - db/migrate/20200207040844_add_net_pay_column_to_payment_details.rb
257
281
  - db/migrate/20200210095535_add_advance_column_to_payment_details.rb
258
282
  - db/migrate/20200221123207_add_employee_id_to_crew.rb
283
+ - db/migrate/20200307112519_create_ecom_core_custom_payment_details.rb
259
284
  - lib/ecom/core.rb
260
285
  - lib/ecom/core/engine.rb
261
286
  - lib/ecom/core/version.rb
@@ -266,6 +291,7 @@ files:
266
291
  - spec/factories/ecom/core/crew_types.rb
267
292
  - spec/factories/ecom/core/crews.rb
268
293
  - spec/factories/ecom/core/currencies.rb
294
+ - spec/factories/ecom/core/custom_payment_details.rb
269
295
  - spec/factories/ecom/core/equipment_types.rb
270
296
  - spec/factories/ecom/core/lookups.rb
271
297
  - spec/factories/ecom/core/material_types.rb