# frozen_string_literal: true # Provides helper methods for User actions class Members::MembersService attr_accessor :member def initialize(member) @member = member end def update(params) if params[:group_id] && @member.group_id != params[:group_id].to_i && !@member.subscribed_plan.nil? # here a group change is requested but unprocessable, handle the exception @member.errors.add(:group_id, I18n.t('members.unable_to_change_the_group_while_a_subscription_is_running')) return false end if params[:group_id] && params[:group_id].to_i != Group.find_by(slug: 'admins').id && @member.admin? # an admin cannot change his group @member.errors.add(:group_id, I18n.t('members.admins_cant_change_group')) return false end not_complete = member.need_completion? up_result = member.update(params) notify_user_profile_complete(not_complete) if up_result up_result end def create(current_user, params) @member.password = password(params) # if the user is created by an admin and the authentication is made through an SSO, generate a migration token @member.generate_auth_migration_token if current_user.admin? && AuthProvider.active.providable_type != DatabaseProvider.name # setup the attached profiles (invoicing & statistics) @member.invoicing_profile.email = params[:email] @member.invoicing_profile.first_name = params[:profile_attributes][:first_name] @member.invoicing_profile.last_name = params[:profile_attributes][:last_name] @member.statistic_profile.group_id = params[:group_id] @member.statistic_profile.role_id = Role.find_or_create_by!(name: 'member').id ActiveRecord::Base.transaction do if @member.save @member.update_statistic_profile @member.generate_subscription_invoice(current_user.id) @member.send_confirmation_instructions UsersMailer.notify_user_account_created(@member, @member.password).deliver_later true else false end end end def merge_from_sso(user) merge_result = member.merge_from_sso(user) notify_admin_user_merged if merge_result merge_result end private def notify_user_profile_complete(previous_state) return unless previous_state && !member.need_completion? NotificationCenter.call type: :notify_user_profile_complete, receiver: member, attached_object: member NotificationCenter.call type: :notify_admin_profile_complete, receiver: User.admins, attached_object: member end def notify_admin_user_merged NotificationCenter.call type: :notify_admin_user_merged, receiver: User.admins, attached_object: member end def password(params) if !params[:password] && !params[:password_confirmation] Devise.friendly_token.first(8) else params[:password] end end end