| @@ -11,17 +11,10 @@ class AccountsController < ApplicationController | |||||
| Users::SyncGiteaForm.new(sync_gitea_params).validate! | Users::SyncGiteaForm.new(sync_gitea_params).validate! | ||||
| user = User.find_by(login: sync_gitea_params[:login]) | user = User.find_by(login: sync_gitea_params[:login]) | ||||
| return render_error("该用户已同步协作平台") if user.gitea_token.present? && user.gitea_uid.present? | return render_error("该用户已同步协作平台") if user.gitea_token.present? && user.gitea_uid.present? | ||||
| interactor = Gitea::RegisterInteractor.call({username: sync_gitea_params[:login], email: sync_gitea_params[:email], password: sync_gitea_params[:password]}) | |||||
| if interactor.success? | |||||
| gitea_user = interactor.result | |||||
| result = Gitea::User::GenerateTokenService.call(sync_gitea_params[:login], sync_gitea_params[:password]) | |||||
| user.gitea_token = result['sha1'] | |||||
| user.gitea_uid = gitea_user[:body]['id'] | |||||
| user.save! | |||||
| render_ok | |||||
| else | |||||
| render_error(interactor.error) | |||||
| end | |||||
| result = create_gitea_user!(user, sync_gitea_params[:login], sync_gitea_params[:email], sync_gitea_params[:password]) | |||||
| result[:user] ? render_ok : render_error(result[:message]) | |||||
| rescue Exception => e | rescue Exception => e | ||||
| uid_logger_error(e.message) | uid_logger_error(e.message) | ||||
| tip_exception(-1, e.message) | tip_exception(-1, e.message) | ||||
| @@ -2,8 +2,6 @@ module RegisterHelper | |||||
| extend ActiveSupport::Concern | extend ActiveSupport::Concern | ||||
| def autologin_register(username, email, password, platform= 'forge') | def autologin_register(username, email, password, platform= 'forge') | ||||
| result = {message: nil, user: nil} | |||||
| user = User.new(admin: false, login: username, mail: email, type: "User") | user = User.new(admin: false, login: username, mail: email, type: "User") | ||||
| user.password = password | user.password = password | ||||
| user.platform = platform | user.platform = platform | ||||
| @@ -11,20 +9,29 @@ module RegisterHelper | |||||
| return unless user.valid? | return unless user.valid? | ||||
| create_gitea_user!(user, username, email, password) | |||||
| end | |||||
| def create_gitea_user!(forge_user, username, email, password=random_password) | |||||
| result = {message: nil, user: nil} | |||||
| interactor = Gitea::RegisterInteractor.call({username: username, email: email, password: password}) | interactor = Gitea::RegisterInteractor.call({username: username, email: email, password: password}) | ||||
| if interactor.success? | if interactor.success? | ||||
| gitea_user = interactor.result | gitea_user = interactor.result | ||||
| result = Gitea::User::GenerateTokenService.call(username, password) | result = Gitea::User::GenerateTokenService.call(username, password) | ||||
| user.gitea_token = result['sha1'] | |||||
| user.gitea_uid = gitea_user[:body]['id'] | |||||
| if user.save! | |||||
| UserExtension.create!(user_id: user.id) | |||||
| result[:user] = {id: user.id, token: user.gitea_token} | |||||
| forge_user.gitea_token = result['sha1'] | |||||
| forge_user.gitea_uid = gitea_user[:body]['id'] | |||||
| if forge_user.save | |||||
| UserExtension.create!(user_id: forge_user.id) unless forge_user.user_extension.blank? | |||||
| result[:user] = {id: forge_user.id, token: forge_user.gitea_token} | |||||
| end | end | ||||
| else | else | ||||
| result[:message] = interactor.error | result[:message] = interactor.error | ||||
| end | end | ||||
| result | result | ||||
| end | end | ||||
| def random_password | |||||
| "#{Random.rand(11111111)}" | |||||
| end | |||||
| end | end | ||||
| @@ -7,7 +7,16 @@ class MembersController < ApplicationController | |||||
| before_action :check_member_not_exists!, only: %i[remove change_role] | before_action :check_member_not_exists!, only: %i[remove change_role] | ||||
| def create | def create | ||||
| if @user.gitea_token.blank? | |||||
| result = Gitea::User::GetService.call(@user.login) | |||||
| if result[:status] == :error | |||||
| # gitea不存在用户@user,直接注册 | |||||
| user_result = create_gitea_user!(@user, @user.login, @user.mail) | |||||
| return render_error(user_result[:message]) if user_result[:message] | |||||
| end | |||||
| end | |||||
| interactor = Projects::AddMemberInteractor.call(@project.owner, @project, @user) | interactor = Projects::AddMemberInteractor.call(@project.owner, @project, @user) | ||||
| render_response(interactor) | render_response(interactor) | ||||
| rescue Exception => e | rescue Exception => e | ||||
| uid_logger_error(e.message) | uid_logger_error(e.message) | ||||
| @@ -8,6 +8,7 @@ class Users::SyncGiteaForm | |||||
| validate :check_user, :check_password | validate :check_user, :check_password | ||||
| def check_user | def check_user | ||||
| Rails.logger.info " ............ #{login}" | |||||
| @user = User.find_by(login: login) | @user = User.find_by(login: login) | ||||
| raise '用户不存在.' unless user.present? | raise '用户不存在.' unless user.present? | ||||
| end | end | ||||
| @@ -0,0 +1,33 @@ | |||||
| class Gitea::User::GetService < Gitea::ClientService | |||||
| attr_reader :username | |||||
| # params: | |||||
| # username* string # required | |||||
| def initialize(username) | |||||
| @username = username | |||||
| end | |||||
| def call | |||||
| response = get(url, params) | |||||
| status, message, body = render_response(response) | |||||
| json_format(status, message, body) | |||||
| end | |||||
| private | |||||
| def url | |||||
| "/users/#{username}" | |||||
| end | |||||
| def params | |||||
| {username: username} | |||||
| end | |||||
| def json_format(status, message, body) | |||||
| case status | |||||
| when 200 then success(body) | |||||
| else | |||||
| error(message, status) | |||||
| end | |||||
| end | |||||
| end | |||||