Module: SpreeCmCommissioner::UserDecorator

Defined in:
app/models/spree_cm_commissioner/user_decorator.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.define_user_places(base) ⇒ Object



82
83
84
85
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 82

def self.define_user_places(base)
  base.has_many :user_places, class_name: 'SpreeCmCommissioner::UserPlace'
  base.has_many :places, through: :user_places, class_name: 'SpreeCmCommissioner::Place'
end

.prepended(base) ⇒ Object

rubocop:disable Metrics/AbcSize,Metrics/MethodLength



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 5

def self.prepended(base) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
  base.include SpreeCmCommissioner::UserNotification
  base.include SpreeCmCommissioner::UserIdentity
  base.include SpreeCmCommissioner::UserPreference

  base.enum gender: %i[male female other]

  base.has_many :subscriptions, through: :customer, class_name: 'SpreeCmCommissioner::Subscription'
  base.has_many :payments, as: :payable, class_name: 'Spree::Payment', dependent: :nullify
  base.has_many :role_permissions, through: :spree_roles, class_name: 'SpreeCmCommissioner::RolePermission'
  base.has_many :permissions, through: :role_permissions, class_name: 'SpreeCmCommissioner::Permission'
  base.has_many :line_items, through: :orders, source: :line_items
  base.has_many :check_ins, foreign_key: 'check_in_by_id', class_name: 'SpreeCmCommissioner::CheckIn'
  base.has_many :user_events, class_name: 'SpreeCmCommissioner::UserEvent'
  base.has_many :events, through: :user_events, class_name: 'Spree::Taxon', source: 'taxon'
  base.has_many :guests, class_name: 'SpreeCmCommissioner::Guest', dependent: :destroy

  base.has_many :google_user_identity_providers,
                -> { where(identity_type: :google) },
                class_name: 'SpreeCmCommissioner::UserIdentityProvider'

  base.has_many :wished_items, class_name: 'Spree::WishedItem', through: :wishlists
  base.has_many :promotions, through: :promotion_rules, class_name: 'Spree::Promotion'

  base.has_one :profile, as: :viewable, dependent: :destroy, class_name: 'SpreeCmCommissioner::UserProfile'
  base.has_one :customer, class_name: 'SpreeCmCommissioner::Customer'

  base.has_secure_password :confirm_pin_code, validations: false

  base.multi_tenant :tenant, class_name: 'SpreeCmCommissioner::Tenant'

  base.scope :by_tenant, -> (tenant_id) { where(tenant_id: tenant_id) }
  base.scope :by_non_tenant, -> { where(tenant_id: nil) }
  base.scope :vendor_users, -> (vendor_id) { joins(:role_users => :role).where(spree_roles: { vendor_id: vendor_id }).distinct }

  base.whitelisted_ransackable_attributes = %w[email first_name last_name gender phone_number]

  base.before_save :update_otp_enabled
  base.attr_accessor :assigned_roles
  base.validates_password_strength :password, if: -> { requires_strong_password? && password.present? }

  # Store has_incomplete_guest_info in public_metadata for easy frontend access
  base.store :public_metadata, accessors: [:has_incomplete_guest_info], coder: JSON

  base.devise :two_factor_authenticatable

  base.store :private_metadata, accessors: %i[otp_secret otp_required_for_login consumed_timestep], coder: JSON

  define_user_places(base)

  def base.end_users
    joins('LEFT JOIN spree_vendor_users ON spree_users.id = spree_vendor_users.user_id').where(spree_vendor_users: { user_id: nil })
  end

  def normal_user?
    system_user = admin? || !vendors.empty?
    normal_user = spree_roles.length == 1 ? spree_roles[0].name == 'user' : spree_roles.empty?
    normal_user && !system_user
  end

  def soft_deleted?
    !.nil?
  end
end

Instance Method Details

#consumed_timestepObject



78
79
80
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 78

def consumed_timestep
  ['consumed_timestep']
end

#display_nameObject



131
132
133
134
135
136
137
138
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 131

def display_name
  return full_name if full_name.present?
  return first_name if first_name.present?
  return last_name if last_name.present?
  return email if email.present?

  phone_number
end

#early_adopter?Boolean

Returns:

  • (Boolean)


100
101
102
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 100

def early_adopter?
  has_spree_role?('early_adopter')
end

#ensure_unique_database_delivery_method(attributes) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 140

def ensure_unique_database_delivery_method(attributes)
  recipient = self

  options = {
    recipient_id: recipient.id,
    notificable_id: attributes[:notificable].id,
    notificable_type: attributes[:notificable].class.to_s,
    type: attributes[:type]
  }

  notification = recipient.notifications.where(options).first_or_initialize

  if notification.persisted?
    notification.update(attributes)
  else
    notification.assign_attributes(attributes)
    notification.save!
  end

  notification
end

#full_nameObject



118
119
120
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 118

def full_name
  [first_name, last_name].compact_blank.join(' ')
end

#has_spree_role?(role_name) ⇒ Boolean

override

Returns:

  • (Boolean)


92
93
94
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 92

def has_spree_role?(role_name) # rubocop:disable Naming/PredicateName
  spree_roles.non_vendor.exists?(name: role_name)
end

#normal_user?Boolean

Returns:

  • (Boolean)


59
60
61
62
63
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 59

def normal_user?
  system_user = admin? || !vendors.empty?
  normal_user = spree_roles.length == 1 ? spree_roles[0].name == 'user' : spree_roles.empty?
  normal_user && !system_user
end

#operator?Boolean

Returns:

  • (Boolean)


108
109
110
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 108

def operator?
  has_spree_role?('operator')
end

#organizer?Boolean

Returns:

  • (Boolean)


104
105
106
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 104

def organizer?
  has_spree_role?('organizer')
end

#otp_required_for_loginObject



74
75
76
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 74

def 
  ['otp_required_for_login']
end

#otp_secretObject



70
71
72
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 70

def otp_secret
  ['otp_secret']
end

#permissions_for_vendor(vendor_id) ⇒ Object



87
88
89
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 87

def permissions_for_vendor(vendor_id)
  permissions.joins(role_permissions: :role).where(spree_roles: { vendor_id: vendor_id })
end

#privileged_role?Boolean

Returns:

  • (Boolean)


122
123
124
125
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 122

def privileged_role?
  assigned = assigned_roles || []
  assigned.map(&:to_s).include?('admin')
end

#push_notificable?Boolean

Returns:

  • (Boolean)


162
163
164
165
166
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 162

def push_notificable?
  return false if device_tokens_count.blank?

  device_tokens_count.positive?
end

#requires_strong_password?Boolean

Returns:

  • (Boolean)


127
128
129
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 127

def requires_strong_password?
  admin? || privileged_role?
end

#soft_deleted?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 65

def soft_deleted?
  !.nil?
end

#super_admin?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 96

def super_admin?
  has_spree_role?('super_admin')
end

#update_otp_enabledObject



174
175
176
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 174

def update_otp_enabled
  self.otp_enabled = otp_email || otp_phone_number
end

#update_tracked_fields!(request) ⇒ Object



178
179
180
181
182
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 178

def update_tracked_fields!(request)
  ActiveRecord::Base.connected_to(role: :writing) do
    super(request)
  end
end

#validate_current_password!(password) ⇒ Object



168
169
170
171
172
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 168

def validate_current_password!(password)
  return if valid_password?(password)

  errors.add(:password, I18n.t('spree_user.invalid_password'))
end

#vendor_organizer?(vendor) ⇒ Boolean

Returns:

  • (Boolean)


112
113
114
115
116
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 112

def vendor_organizer?(vendor)
  spree_roles.any? do |role|
    role.name == "#{vendor.id}-organizer"
  end
end