97 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
namespace :import_educoder_cource_repo do
 | 
						|
  desc "sync outer repository to gitlink"
 | 
						|
  task done: :environment do
 | 
						|
    data = ImportRepo.all
 | 
						|
    if ENV['name'].present?
 | 
						|
      data = data.where("name like '%#{ENV['name']}%'")
 | 
						|
    end
 | 
						|
    data.each_with_index do |row, index|
 | 
						|
      puts index
 | 
						|
      root_repo = Repository.find_by(mirror_url: row.git_url)
 | 
						|
      next if root_repo.blank?
 | 
						|
      root_project = root_repo.project
 | 
						|
 | 
						|
      begin
 | 
						|
        user = User.find_by(phone: row.myshixun_user_phone) || User.find_by(mail: row.myshixun_user_mail)
 | 
						|
        unless user.present?
 | 
						|
          username = generate_user_login('p')
 | 
						|
          email = row.myshixun_user_mail.blank? ? "#{username}@gitlink.org.cn" : row.myshixun_user_mail
 | 
						|
          phone = row.myshixun_user_phone
 | 
						|
          password = "a12345678"
 | 
						|
          user = User.new(nickname: row.myshixun_user_name, login: username, mail: email, password: password, type: 'User', phone: phone)
 | 
						|
          interactor = Gitea::RegisterInteractor.call({ username: username, email: email, password: password })
 | 
						|
          gitea_user = interactor.result
 | 
						|
          result = Gitea::User::GenerateTokenService.call(username, password)
 | 
						|
          user.gitea_token = result['sha1']
 | 
						|
          user.gitea_uid = gitea_user[:body]['id']
 | 
						|
          user.save!
 | 
						|
          UserExtension.create!(user_id: user.id)
 | 
						|
          puts "import_user batch success: phone #{phone} email: #{email}"
 | 
						|
        end
 | 
						|
 | 
						|
        repo = Repository.find_by(mirror_url: row.myshixun_git_url)
 | 
						|
        next if repo.present? && repo.project.present?
 | 
						|
        mirror_params = {
 | 
						|
          user_id: user.id,
 | 
						|
          auth_username: "xxqfamous@gmail.com",
 | 
						|
          auth_password: "eHhxMTIzNDU2Nzg5NTIx",
 | 
						|
          name: root_project.name,
 | 
						|
          description: root_project.description,
 | 
						|
          repository_name: root_project.identifier,
 | 
						|
          project_category_id: root_project.project_category_id,
 | 
						|
          project_language_id: root_project.project_language_id,
 | 
						|
          clone_addr: row.myshixun_git_url
 | 
						|
        }
 | 
						|
        Projects::MigrateService.call(user, mirror_params)
 | 
						|
 | 
						|
        puts "sync outer repository to gitlink Success repo: #{row.myshixun_git_url}"
 | 
						|
      rescue Exception => e
 | 
						|
        puts "sync outer repository to gitlink Error repo: #{row.myshixun_git_url}, error:#{e}"
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  desc "batch forked project"
 | 
						|
  task forked: :environment do
 | 
						|
    data =ImportRepo.all
 | 
						|
    if ENV['name'].present?
 | 
						|
      data = data.where("name like '%#{ENV['name']}%'")
 | 
						|
    end
 | 
						|
    puts data.to_sql
 | 
						|
    data.each_with_index do |row, index|
 | 
						|
      begin
 | 
						|
        puts index
 | 
						|
        user = User.find_by(phone: row.myshixun_user_phone) || User.find_by(mail: row.myshixun_user_mail)
 | 
						|
        next if user.blank?
 | 
						|
        root_repo = Repository.find_by(mirror_url: row.git_url)
 | 
						|
        next if root_repo.blank?
 | 
						|
        root_project = root_repo.project
 | 
						|
        repo = Repository.find_by(mirror_url: row.myshixun_git_url)
 | 
						|
        # 学员项目未导入就跳过
 | 
						|
        next if repo.blank?
 | 
						|
        # 已绑定的跳过
 | 
						|
        next if repo.project.forked_from_project_id.present?
 | 
						|
        # 绑定fork关系
 | 
						|
        ForkUser.create(project_id: root_project.id, fork_project_id: repo.project.id, user_id: repo.project.user_id)
 | 
						|
        # 处理时间防止列表刷屏
 | 
						|
        new_date = root_project.created_on > Time.now - 30.days ? Time.now - 1.years + rand(5..90).day + rand(5..60).hour : root_project.created_on
 | 
						|
        root_project.update_columns(created_on: new_date, updated_on: new_date, forked_count: (root_project.forked_count.to_i + 1))
 | 
						|
        # fork时间同样处理在创建时间之后
 | 
						|
        new_date2 = new_date + rand(5..50).day + rand(5..30).hour
 | 
						|
        repo.project.update_columns(created_on: new_date2, updated_on: new_date2, forked_from_project_id: root_project.id)
 | 
						|
        puts "forked project success username: #{user.id}:#{repo.project.id}"
 | 
						|
      rescue Exception => e
 | 
						|
        puts "forked project error username: #{username}"
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  # 生成邀请码
 | 
						|
  CODES = %W(0 1 2 3 4 5 6 7 8 9)
 | 
						|
  def generate_user_login type
 | 
						|
    code = CODES.sample(8).join
 | 
						|
    code = type + code.to_s
 | 
						|
    return generate_user_login(type) if User.where(login: code).present?
 | 
						|
    code
 | 
						|
  end
 | 
						|
end |