迁移数据的修改
This commit is contained in:
		
							parent
							
								
									ea4cfab819
								
							
						
					
					
						commit
						cc242a2765
					
				| 
						 | 
				
			
			@ -10,7 +10,7 @@ class Gitea::UserForm
 | 
			
		|||
 | 
			
		||||
  validates :password, presence: true
 | 
			
		||||
 | 
			
		||||
  validate :check_username, :check_email
 | 
			
		||||
  # validate :check_username, :check_email
 | 
			
		||||
 | 
			
		||||
  attr_reader :record
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,12 +2,17 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
  queue_as :default
 | 
			
		||||
 | 
			
		||||
  def perform(sync_params)
 | 
			
		||||
    @change_issue_ids = []
 | 
			
		||||
    @change_journal_ids =[]
 | 
			
		||||
    @change_watcher_ids = []
 | 
			
		||||
    @change_pr_ids = []
 | 
			
		||||
    @change_praise_trend_ids = []
 | 
			
		||||
    @change_version_ids = []
 | 
			
		||||
 | 
			
		||||
    Rails.logger.info("#######______sync__start__########")
 | 
			
		||||
    sync_params = ActiveSupport::JSON.decode(sync_params)
 | 
			
		||||
 | 
			
		||||
    all_target_params = sync_params["target_params"]
 | 
			
		||||
    roles_params = sync_params["roles"]
 | 
			
		||||
 | 
			
		||||
    user_params = sync_params["user_params"]["user_params"]
 | 
			
		||||
    owner_extension_params = sync_params["user_params"]["user_extension_params"]
 | 
			
		||||
| 
						 | 
				
			
			@ -19,8 +24,6 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
      if new_user.present?
 | 
			
		||||
        ActiveRecord::Base.transaction do
 | 
			
		||||
          begin
 | 
			
		||||
 | 
			
		||||
            sync_roles(roles_params, platform)
 | 
			
		||||
            if all_target_params.present?
 | 
			
		||||
              all_target_params.each do |project|
 | 
			
		||||
                target_params = {
 | 
			
		||||
| 
						 | 
				
			
			@ -38,13 +41,6 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
                sync_projects(new_user, user_old_id,target_params, platform)
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
            Issue.select(:id, :assigned_to_id).where(assigned_to_id: user_old_id)&.update_all(assigned_to_id: new_user.id)
 | 
			
		||||
            Issue.select(:id, :author_id).where(author_id: user_old_id)&.update_all(author_id: new_user.id)
 | 
			
		||||
            Journal.select(:id,:user_id).where(user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
            Watcher.select(:id,:user_id).where(user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
            ProjectTrend.select(:id,:user_id).where(user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
            PullRequest.select(:id,:user_id).where(user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
            Version.select(:id,:user_id).where(user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
          rescue Exception => e
 | 
			
		||||
            Rails.logger.info("#######_______forge_new_user_sync_failed___#########{e}")
 | 
			
		||||
            raise ActiveRecord::Rollback
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +53,7 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def old_version_source
 | 
			
		||||
    %w(trustie)
 | 
			
		||||
    %w(trustie military)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
| 
						 | 
				
			
			@ -66,28 +62,21 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
    ActiveRecord::Base.transaction do
 | 
			
		||||
      begin
 | 
			
		||||
        Rails.logger.info("#######______sync_user_start__########")
 | 
			
		||||
        keys_other_delete = %w(id created_at updated_at user_id)
 | 
			
		||||
        keys_to_delete = %w(id created_on updated_on platform)
 | 
			
		||||
        keys_other_delete = %w(id created_at updated_at user_id province)
 | 
			
		||||
        keys_to_delete = %w(id created_on updated_on platform admin_role enterprise_certification)
 | 
			
		||||
        owner_params = owner_params["user"] if old_version_source.include?(platform)   #trustie上需要
 | 
			
		||||
 | 
			
		||||
        owner_params = owner_params&.except!(*keys_to_delete)
 | 
			
		||||
        user_password = random_password
 | 
			
		||||
        new_user = []
 | 
			
		||||
 | 
			
		||||
        if owner_params.present?
 | 
			
		||||
          if User.exists?(login: owner_params["login"])
 | 
			
		||||
            new_user = User.find_by(login: owner_params["login"])
 | 
			
		||||
          elsif  User.exists?(mail: owner_params["mail"])
 | 
			
		||||
            new_user = User.find_by(mail: owner_params["mail"])
 | 
			
		||||
          else
 | 
			
		||||
            new_user = User.new(owner_params.merge(platform: platform))
 | 
			
		||||
            interactor = Gitea::RegisterInteractor.call({username: owner_params["login"], email: owner_params["mail"], password: user_password})
 | 
			
		||||
            if interactor.success?
 | 
			
		||||
              gitea_user = interactor.result
 | 
			
		||||
              result = Gitea::User::GenerateTokenService.new(owner_params["login"], user_password).call
 | 
			
		||||
              new_user.gitea_token = result['sha1']
 | 
			
		||||
              new_user.gitea_uid = gitea_user['id']
 | 
			
		||||
            user_mail = owner_params["mail"]
 | 
			
		||||
            unless user_mail.present?
 | 
			
		||||
              user_mail = "#{owner_params["login"]}_example@example.com"
 | 
			
		||||
            end
 | 
			
		||||
            new_user = User.new(owner_params.merge(platform: platform,mail: user_mail))
 | 
			
		||||
            if new_user.save!
 | 
			
		||||
              if owner_extension_params.present?
 | 
			
		||||
                owner_extension_params = owner_extension_params["user_extensions"] if old_version_source.include?(platform)  #trustie上需要
 | 
			
		||||
| 
						 | 
				
			
			@ -109,14 +98,10 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def random_password
 | 
			
		||||
    [*('a'..'z'),*(0..9),*('A'..'Z')].shuffle[0..8].join + ['$','#','&','*','@','_'].shuffle[0..2].join
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  #同步项目
 | 
			
		||||
  def sync_projects(new_user,old_user_id, targets,platform)
 | 
			
		||||
  def sync_projects(new_user,user_old_id, targets,platform)
 | 
			
		||||
    Rails.logger.info("#######__projects_sync__start__########")
 | 
			
		||||
    keys_to_delete = %w(id created_on updated_on user_id language)
 | 
			
		||||
    keys_to_delete = %w(id created_on updated_on user_id language homepage_show image_url image_status audit_status_cd)
 | 
			
		||||
    score_to_delete = %w(id created_at updated_at project_id)
 | 
			
		||||
    begin
 | 
			
		||||
      if targets.present?
 | 
			
		||||
| 
						 | 
				
			
			@ -127,34 +112,13 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
        version_params = targets[:versions_params]
 | 
			
		||||
        member_params = targets[:member_params]
 | 
			
		||||
        project_score = targets[:project_score_params]
 | 
			
		||||
        repo_params = targets[:repo_params]
 | 
			
		||||
        praise_trends_params = targets[:praise_trends_params]
 | 
			
		||||
        watchers_params = targets[:watchers_params]
 | 
			
		||||
 | 
			
		||||
        if project.present?
 | 
			
		||||
          project = project["project"] if old_version_source.include?(platform)
 | 
			
		||||
 | 
			
		||||
          project_identifier = project["identifier"]
 | 
			
		||||
          if repo_params.present?
 | 
			
		||||
            project_identifier = repo_params["identifier"]
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          if Project.exists?(identifier: project_identifier)
 | 
			
		||||
            failed_dic = "public/sync_failed_users.dic"
 | 
			
		||||
            File.open(failed_dic,"a") do |file|
 | 
			
		||||
              file.puts "[\nTime---#{Time.now}\nproject_info---#{project}\nerrors---exists the same project:#{project_identifier}]\n "
 | 
			
		||||
            end
 | 
			
		||||
          else
 | 
			
		||||
          new_project = Project.new(project&.except!(*keys_to_delete).merge(user_id: new_user.id))
 | 
			
		||||
          if new_project.save!(:validate => false)
 | 
			
		||||
              if project_identifier.present?
 | 
			
		||||
                repository_params = {
 | 
			
		||||
                  hidden: project["is_public"],
 | 
			
		||||
                  user_id: new_user.id,
 | 
			
		||||
                  identifier: project_identifier
 | 
			
		||||
                }
 | 
			
		||||
                Repositories::CreateService.new(new_user, new_project, repository_params).call
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
            if project_score.present?
 | 
			
		||||
              project_score = project_score["project_score"] if old_version_source.include?(platform) #trustie上需要
 | 
			
		||||
| 
						 | 
				
			
			@ -168,12 +132,24 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
            sync_versions(new_project.id, new_user.id, version_params,platform)
 | 
			
		||||
            sync_watchers(new_project.id, watchers_params, platform)
 | 
			
		||||
            sync_praises(new_project.id,praise_trends_params,platform)
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            Issue.select(:id, :assigned_to_id).where(id:@change_issue_ids, assigned_to_id: user_old_id)&.update_all(assigned_to_id: new_user.id)
 | 
			
		||||
            Issue.select(:id, :author_id).where(id:@change_issue_ids, author_id: user_old_id)&.update_all(author_id: new_user.id)
 | 
			
		||||
            Journal.select(:id,:user_id).where(id: @change_journal_ids, user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
            Watcher.select(:id,:user_id).where(id: @change_watcher_ids, user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
            PraiseTread.select(:id,:user_id).where(id: @change_praise_trend_ids, user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
            PullRequest.select(:id,:user_id).where(id: @change_pr_ids, user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
            Version.select(:id,:user_id).where(id: @change_version_ids, user_id: user_old_id)&.update_all(user_id: new_user.id)
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    rescue Exception => e
 | 
			
		||||
      failed_dic = "public/sync_failed_users.dic"
 | 
			
		||||
      File.open(failed_dic,"a") do |file|
 | 
			
		||||
        file.puts "[\nTime---#{Time.now}\nproject_create_exception---\nerrors---project_created_failed:#{e}]\n "
 | 
			
		||||
      end
 | 
			
		||||
      Rails.logger.info("#######_______projects_sync__failed__#########{e}")
 | 
			
		||||
 | 
			
		||||
      raise ActiveRecord::Rollback
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -191,6 +167,7 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
                r = r["watcher"] if old_version_source.include?(platform)
 | 
			
		||||
                new_wathcer = Watcher.new(r&.except!(*roles_other_delete).merge(watchable_id: project_id))
 | 
			
		||||
                new_wathcer.save(:validate => false)
 | 
			
		||||
                @change_watcher_ids.push(new_wathcer.id)
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
| 
						 | 
				
			
			@ -217,6 +194,7 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
                r = r["praise_tread"] if old_version_source.include?(platform)  #trustie上需要
 | 
			
		||||
                new_tread = PraiseTread.new(r&.except!(*roles_other_delete).merge(praise_tread_object_id: project_id))
 | 
			
		||||
                new_tread.save(:validate => false)
 | 
			
		||||
                @change_praise_trend_ids.push(new_tread.id)
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
| 
						 | 
				
			
			@ -230,34 +208,6 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def sync_roles(roles,platform)
 | 
			
		||||
    Rails.logger.info("#######______sync_roles_start__#######")
 | 
			
		||||
    roles_other_delete = %w(id)
 | 
			
		||||
    ActiveRecord::Base.transaction do
 | 
			
		||||
      begin
 | 
			
		||||
 | 
			
		||||
        if roles.present?
 | 
			
		||||
          Role.transaction do
 | 
			
		||||
            roles.each do |r|
 | 
			
		||||
              if r.present?
 | 
			
		||||
                r = r["role"] if old_version_source.include?(platform)  #trustie上需要
 | 
			
		||||
                unless Role.exists?(name: r["name"])
 | 
			
		||||
                  Role.create!(r&.except!(*roles_other_delete))
 | 
			
		||||
                end
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
        Rails.logger.info("#######______sync_roles_end__#######")
 | 
			
		||||
 | 
			
		||||
      rescue Exception => e
 | 
			
		||||
        Rails.logger.info("#######_______sync_roles__failed__#########{e}")
 | 
			
		||||
        raise ActiveRecord::Rollback
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def sync_members(project_id,members_params,platform)
 | 
			
		||||
    Rails.logger.info("#######______sync_members_start__#######")
 | 
			
		||||
    member_to_delete = %w(id created_on project_id)
 | 
			
		||||
| 
						 | 
				
			
			@ -331,6 +281,7 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
              issue_params = issue_params["issue"] if old_version_source.include?(platform) #trustie上需要
 | 
			
		||||
              issue = Issue.new(issue_params&.except!(*issue_to_delete).merge(project_id: project_id))
 | 
			
		||||
              if issue.save!(:validate => false)
 | 
			
		||||
                @change_issue_ids.push(issue.id)
 | 
			
		||||
                sync_journals(issue.id, jours_params, platform)
 | 
			
		||||
                sync_commit_issues(issue.id,project_id, commit_params, platform)
 | 
			
		||||
              else
 | 
			
		||||
| 
						 | 
				
			
			@ -363,7 +314,7 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
                new_journal = new_journal["journal"] if old_version_source.include?(platform) #trustie上需要
 | 
			
		||||
                new_journal = Journal.new(new_journal&.except!(*jour_to_delete).merge(journalized_id: issue_id))
 | 
			
		||||
                if new_journal.save(:validate => false)
 | 
			
		||||
 | 
			
		||||
                  @change_journal_ids.push(new_journal.id)
 | 
			
		||||
                  if new_journal_detail.present?
 | 
			
		||||
                    sync_journal_details(new_journal_detail, new_journal.id, platform)
 | 
			
		||||
                  end
 | 
			
		||||
| 
						 | 
				
			
			@ -445,8 +396,8 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
                i = i["pull_request"] if old_version_source.include?(platform) #trustie上需要
 | 
			
		||||
                newpr = PullRequest.new(i&.except!(*commit_to_delete).merge(project_id: project_id))
 | 
			
		||||
                newpr.save(:validate => false)
 | 
			
		||||
                @change_pr_ids.push(newpr.id)
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
| 
						 | 
				
			
			@ -497,6 +448,7 @@ class SyncForgeJob < ApplicationJob
 | 
			
		|||
                i = i["version"] if old_version_source.include?(platform) #trustie上需要
 | 
			
		||||
                new_v = Version.new(i&.except!(*version_to_delete).merge(project_id: project_id))
 | 
			
		||||
                new_v.save!(:validate => false)
 | 
			
		||||
                @change_version_ids.push(new_v.id)
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,7 +41,8 @@ class User < ApplicationRecord
 | 
			
		|||
  # educoder: 来自Educoder平台
 | 
			
		||||
  # trustie: 来自Trustie平台
 | 
			
		||||
  # forge: 平台本身注册的用户
 | 
			
		||||
  enumerize :platform, in: [:forge, :educoder, :trustie], default: :forge, scope: :shallow
 | 
			
		||||
  # military: 军科的用户
 | 
			
		||||
  enumerize :platform, in: [:forge, :educoder, :trustie, :military], default: :forge, scope: :shallow
 | 
			
		||||
 | 
			
		||||
  belongs_to :laboratory, optional: true
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,64 @@
 | 
			
		|||
desc "Generate gitea data"
 | 
			
		||||
 | 
			
		||||
namespace :create_gitea_data do
 | 
			
		||||
  task created_user: :environment do
 | 
			
		||||
 | 
			
		||||
    puts "__________begin_to_create_user_gitea_data___________"
 | 
			
		||||
 | 
			
		||||
    gitea_users = User.where(platform: "military", gitea_uid: nil)
 | 
			
		||||
    gitea_users.each_with_index do |u,index|
 | 
			
		||||
      puts "___#{index+1}_______u.login:#{u.login}___________"
 | 
			
		||||
      user_password = random_password
 | 
			
		||||
 | 
			
		||||
      user_mail = u.mail ? u.mail : "#{u.login}_#{u.id}_example@example.com"
 | 
			
		||||
      begin
 | 
			
		||||
        interactor = Gitea::RegisterInteractor.call({username: u.login, email: user_mail, password: user_password})
 | 
			
		||||
        if interactor.success?
 | 
			
		||||
          gitea_user = interactor.result
 | 
			
		||||
          result = Gitea::User::GenerateTokenService.new(u.login, user_password).call
 | 
			
		||||
          u.gitea_token = result['sha1']
 | 
			
		||||
          u.gitea_uid = gitea_user['id']
 | 
			
		||||
          u.save!
 | 
			
		||||
          puts "____creat_success______u.login:#{u.login}___________"
 | 
			
		||||
        end
 | 
			
		||||
      rescue Exception => e
 | 
			
		||||
        failed_dic = "#{Rails.root}/public/sync_failed_users.dic"
 | 
			
		||||
        File.open(failed_dic,"a") do |file|
 | 
			
		||||
          file.puts "[\nTime---#{Time.now}\nuser_info---#{u.login}\nerrors--#{e}]\n "
 | 
			
		||||
        end
 | 
			
		||||
        puts "____creat_failed______u.login:#{u.login}_____message:#{e}______"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  task created_repo: :environment do
 | 
			
		||||
    puts "__________begin_to_create_repository_gitea_data___________"
 | 
			
		||||
    user_ids = User.select(:id,:platform).all.where(platform: "military").pluck(:id)
 | 
			
		||||
 | 
			
		||||
    gitea_projects = Project.where(user_id: user_ids)
 | 
			
		||||
    gitea_projects.each_with_index do |p,index|
 | 
			
		||||
      puts "___#{index+1}_______project.id:#{p.id}___________"
 | 
			
		||||
      unless p.repository.present?
 | 
			
		||||
        identifier = p.identifier ? p.identifier : "#{Time.now.to_i}_#{p.id}"
 | 
			
		||||
        begin
 | 
			
		||||
          repository_params = {
 | 
			
		||||
            hidden: p["is_public"],
 | 
			
		||||
            user_id: p.user_id,
 | 
			
		||||
            identifier: identifier
 | 
			
		||||
          }
 | 
			
		||||
          Repositories::CreateService.new(p.owner, p, repository_params).call
 | 
			
		||||
          puts "____creat_success______project.id:#{p.id}___________"
 | 
			
		||||
        rescue Exception => e
 | 
			
		||||
          failed_dic = "#{Rails.root}/public/sync_failed_users.dic"
 | 
			
		||||
          File.open(failed_dic,"a") do |file|
 | 
			
		||||
            file.puts "[\nTime---#{Time.now}\nproject_id---#{p.id}\nerrors--#{e}]\n "
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def random_password
 | 
			
		||||
    [*('a'..'z'),*(0..9),*('A'..'Z')].shuffle[0..8].join + ['$','#','&','*','@','_'].shuffle[0..2].join
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -4,7 +4,7 @@ namespace :sync_table_structure do
 | 
			
		|||
  task import_csv: :environment do
 | 
			
		||||
    puts "init table structure......."
 | 
			
		||||
 | 
			
		||||
    system "mysql -uroot -p123456 -h127.0.0.1 forge_development < #{Rails.root}/db/structure.sql"
 | 
			
		||||
    system "mysql -uroot -poracle10g -h127.0.0.1 forge_development < #{Rails.root}/db/structure.sql"
 | 
			
		||||
 | 
			
		||||
    puts "init success"
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue