diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 2beeaf32..0166ba43 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -11,17 +11,10 @@ class AccountsController < ApplicationController Users::SyncGiteaForm.new(sync_gitea_params).validate! user = User.find_by(login: sync_gitea_params[:login]) 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 uid_logger_error(e.message) tip_exception(-1, e.message) diff --git a/app/controllers/concerns/register_helper.rb b/app/controllers/concerns/register_helper.rb index 3a23a210..1584067a 100644 --- a/app/controllers/concerns/register_helper.rb +++ b/app/controllers/concerns/register_helper.rb @@ -2,8 +2,6 @@ module RegisterHelper extend ActiveSupport::Concern 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.password = password user.platform = platform @@ -11,20 +9,29 @@ module RegisterHelper 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}) if interactor.success? gitea_user = interactor.result 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 else result[:message] = interactor.error end result end - + + def random_password + "#{Random.rand(11111111)}" + end end diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index 2964eb1a..18ab03d5 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -7,7 +7,16 @@ class MembersController < ApplicationController before_action :check_member_not_exists!, only: %i[remove change_role] 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) + render_response(interactor) rescue Exception => e uid_logger_error(e.message) diff --git a/app/forms/users/sync_gitea_form.rb b/app/forms/users/sync_gitea_form.rb index 19751bfd..2ffb0921 100644 --- a/app/forms/users/sync_gitea_form.rb +++ b/app/forms/users/sync_gitea_form.rb @@ -8,6 +8,7 @@ class Users::SyncGiteaForm validate :check_user, :check_password def check_user + Rails.logger.info " ............ #{login}" @user = User.find_by(login: login) raise '用户不存在.' unless user.present? end diff --git a/app/services/gitea/user/get_service.rb b/app/services/gitea/user/get_service.rb new file mode 100644 index 00000000..f91eeb13 --- /dev/null +++ b/app/services/gitea/user/get_service.rb @@ -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 \ No newline at end of file