diff --git a/app/models/import_repo.rb b/app/models/import_repo.rb new file mode 100644 index 000000000..8b53a7765 --- /dev/null +++ b/app/models/import_repo.rb @@ -0,0 +1,6 @@ + + +# for oauth2 application +class ImportRepo < ApplicationRecord + self.table_name = "open_shixuns" +end diff --git a/lib/tasks/import_educoder_cource_repo.rake b/lib/tasks/import_educoder_cource_repo.rake new file mode 100644 index 000000000..0b35882ee --- /dev/null +++ b/lib/tasks/import_educoder_cource_repo.rake @@ -0,0 +1,97 @@ +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 + 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 do |row| + begin + puts row.id + 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 \ No newline at end of file