class Api::V1::Users::UpdateEmailService < ApplicationService include ActiveModel::Model attr_reader :user, :token, :password, :mail, :old_mail, :code, :verify_code attr_accessor :gitea_data validates :password, :code, presence: true validates :mail, presence: true, format: { with: CustomRegexp::EMAIL } def initialize(user, params, token =nil) @user = user @token = token @password = params[:password] @mail = params[:email] @old_mail = user.mail @code = params[:code] @verify_code = VerificationCode.where(email: @mail, code_type: 10).last end def call raise Error, "此用户禁止修改邮箱." if @user.id.to_i === 104691 raise Error, errors.full_messages.join(",") unless valid? raise Error, "密码不正确." unless @user.check_password?(@password) exist_owner = Owner.find_by(mail: @mail) raise Error, "邮箱已被使用." if exist_owner is_debug = @code == "123123" && EduSetting.get("code_debug") # 万能验证码,用于测试 # TODO 万能验证码,用于测试 raise Error, "验证码不正确." if @verify_code&.code != @code && !is_debug raise Error, "验证码已失效." if !@verify_code&.effective? && !is_debug begin ActiveRecord::Base.transaction do change_user_email excute_data_to_gitea excute_change_email_from_gitea remove_old_cache_for_user end return gitea_data rescue raise Error, "服务器错误,请联系系统管理员!" end end private def request_params { access_token: @user.gitea_token } end def request_body { email: @mail, login_name: @user.login, source_id: 0 } end def change_user_email @user.update_attributes!({mail: @mail}) end def excute_data_to_gitea @gitea_data = $gitea_client.patch_admin_users_by_username(@user.login, {body: request_body.to_json}) end def excute_change_email_from_gitea emails = $gitea_client.get_user_emails({query: request_params}) puts "emails=#{emails}" emails.each do |email| email = email.stringify_keys next if email["email"] == @mail $gitea_client.delete_user_emails({body: {emails: [email["email"]]}.to_json, query: request_params}) end end def remove_old_cache_for_user $redis_cache.del("v2-owner-common:#{@user.login}-#{@old_mail}") end end