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



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

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
69
70
71
72
73
74
75
76
77
78
79
# 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.include SpreeCmCommissioner::StoreMetadata
  base.include SpreeCmCommissioner::ServiceType

  base.enum gender: %i[male female other]
  base.enum registered_by: {
    self_registered: 0,
    system_registered: 1
  }, _prefix: true

  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. :primary_service_type, :string
  base.validates :primary_service_type,
                 inclusion: { in: SpreeCmCommissioner::ServiceType::SERVICE_TYPES.map(&:to_s) },
                 allow_nil: true
  base. :branch_ids, :array, default: []

  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



89
90
91
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 89

def consumed_timestep
  ['consumed_timestep']
end

#display_nameObject



142
143
144
145
146
147
148
149
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 142

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)


111
112
113
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 111

def early_adopter?
  has_spree_role?('early_adopter')
end

#ensure_unique_database_delivery_method(attributes) ⇒ Object



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 151

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



129
130
131
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 129

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

#has_spree_role?(role_name) ⇒ Boolean

override

Returns:

  • (Boolean)


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

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

#normal_user?Boolean

Returns:

  • (Boolean)


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

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)


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

def operator?
  has_spree_role?('operator')
end

#organizer?Boolean

Returns:

  • (Boolean)


115
116
117
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 115

def organizer?
  has_spree_role?('organizer')
end

#otp_required_for_loginObject



85
86
87
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 85

def 
  ['otp_required_for_login']
end

#otp_secretObject



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

def otp_secret
  ['otp_secret']
end

#permissions_for_vendor(vendor_id) ⇒ Object



98
99
100
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 98

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

#privileged_role?Boolean

Returns:

  • (Boolean)


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

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

#push_notificable?Boolean

Returns:

  • (Boolean)


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

def push_notificable?
  return false if device_tokens_count.blank?

  device_tokens_count.positive?
end

#requires_strong_password?Boolean

Returns:

  • (Boolean)


138
139
140
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 138

def requires_strong_password?
  admin? || privileged_role?
end

#soft_deleted?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 76

def soft_deleted?
  !.nil?
end

#super_admin?Boolean

Returns:

  • (Boolean)


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

def super_admin?
  has_spree_role?('super_admin')
end

#update_otp_enabledObject



185
186
187
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 185

def update_otp_enabled
  self.otp_enabled = otp_email || otp_phone_number
end

#update_tracked_fields!(request) ⇒ Object



189
190
191
192
193
# File 'app/models/spree_cm_commissioner/user_decorator.rb', line 189

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

#validate_current_password!(password) ⇒ Object



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

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)


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

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