From 04e70b3b34ce3ca00d292f5d18a0748f35ee8032 Mon Sep 17 00:00:00 2001 From: yystopf Date: Sat, 13 Apr 2024 21:09:08 +0800 Subject: [PATCH 01/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3service=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/reposync/client_service.rb | 97 +++++++++++++++++++ .../reposync/create_sync_branch_service.rb | 30 ++++++ .../reposync/create_sync_repo_service.rb | 34 +++++++ .../reposync/delete_branch_service.rb | 19 ++++ app/services/reposync/delete_repo_service.rb | 18 ++++ app/services/reposync/get_logs_service.rb | 23 +++++ .../reposync/get_sync_branches_service.rb | 30 ++++++ .../reposync/get_sync_repos_service.rb | 28 ++++++ app/services/reposync/sync_branch_service.rb | 22 +++++ app/services/reposync/sync_repo_service.rb | 18 ++++ .../reposync/update_branch_status_service.rb | 21 ++++ .../reposync/update_repo_status_service.rb | 19 ++++ 12 files changed, 359 insertions(+) create mode 100644 app/services/reposync/client_service.rb create mode 100644 app/services/reposync/create_sync_branch_service.rb create mode 100644 app/services/reposync/create_sync_repo_service.rb create mode 100644 app/services/reposync/delete_branch_service.rb create mode 100644 app/services/reposync/delete_repo_service.rb create mode 100644 app/services/reposync/get_logs_service.rb create mode 100644 app/services/reposync/get_sync_branches_service.rb create mode 100644 app/services/reposync/get_sync_repos_service.rb create mode 100644 app/services/reposync/sync_branch_service.rb create mode 100644 app/services/reposync/sync_repo_service.rb create mode 100644 app/services/reposync/update_branch_status_service.rb create mode 100644 app/services/reposync/update_repo_status_service.rb diff --git a/app/services/reposync/client_service.rb b/app/services/reposync/client_service.rb new file mode 100644 index 00000000..984fee67 --- /dev/null +++ b/app/services/reposync/client_service.rb @@ -0,0 +1,97 @@ +class Reposync::ClientService < ApplicationService + attr_reader :url, :params + + def initialize(options={}) + @url = options[:url] + @params = options[:params] + end + + def post(url, params={}) + puts "[reposync][POST] request params: #{params}" + conn.post do |req| + req.url full_url(url) + req.body = params[:data].to_json + end + end + + def get(url, params={}) + puts "[reposync][GET] request params: #{params}" + conn.get do |req| + req.url full_url(url, 'get') + params.each_pair do |key, value| + req.params["#{key}"] = value + end + end + end + + def delete(url, params={}) + puts "[reposync][DELETE] request params: #{params}" + conn.delete do |req| + req.url full_url(url) + req.body = params[:data].to_json + end + end + + def patch(url, params={}) + puts "[reposync][PATCH] request params: #{params}" + conn.patch do |req| + req.url full_url(url) + req.body = params[:data].to_json + end + end + + def put(url, params={}) + puts "[reposync][PUT] request params: #{params}" + conn.put do |req| + req.url full_url(url) + req.body = params[:data].to_json + end + end + + def conn + @client ||= begin + Faraday.new(url: domain) do |req| + req.request :url_encoded + req.headers['Content-Type'] = 'application/json' + req.adapter Faraday.default_adapter + req.options.timeout = 100 # open/read timeout in seconds + req.options.open_timeout = 10 # connection open timeout in seconds + end + end + + @client + end + + def domain + EduSetting.get("reposync_api_domain") || "http://106.75.110.152:50087" + end + + def full_url(api_rest, action='post') + url = [domain, api_rest].join('').freeze + url = action === 'get' ? url : URI.escape(url) + url = URI.escape(url) unless url.ascii_only? + puts "[reposync] request url: #{url}" + return url + end + + def log_error(status, body) + puts "[reposync] status: #{status}" + puts "[reposync] body: #{body}" + end + + def render_response(response) + status = response.status + body = JSON.parse(response&.body) + + log_error(status, body) + + if status == 200 + if body["code_status"].to_i == 0 + return [body["code_status"], body["data"], body["msg"]] + else + puts "[reposync][ERROR] code: #{body["code_status"]}" + puts "[reposync][ERROR] message: #{body["msg"]}" + end + end + end +end \ No newline at end of file diff --git a/app/services/reposync/create_sync_branch_service.rb b/app/services/reposync/create_sync_branch_service.rb new file mode 100644 index 00000000..2b417a7e --- /dev/null +++ b/app/services/reposync/create_sync_branch_service.rb @@ -0,0 +1,30 @@ +class Reposync::CreateSyncBranchService < Reposync::ClientService + + attr_accessor :repo_name, :internal_branch_name, :external_branch_name, :enable + + def initialize(repo_name, internal_branch_name, external_branch_name, enable=true) + @repo_name = repo_name + @internal_branch_name = internal_branch_name + @external_branch_name = external_branch_name + @enable = enable + end + + def call + result = post(url, request_params) + response = render_response(result) + end + + private + def request_params + Hash.new.merge(data: { + internal_branch_name: internal_branch_name, + external_branch_name: external_branch_name, + enable: enable + }.stringify_keys) + end + + def url + "/cerobot/sync/#{repo_name}/branch".freeze + end + +end \ No newline at end of file diff --git a/app/services/reposync/create_sync_repo_service.rb b/app/services/reposync/create_sync_repo_service.rb new file mode 100644 index 00000000..6176e3b7 --- /dev/null +++ b/app/services/reposync/create_sync_repo_service.rb @@ -0,0 +1,34 @@ +class Reposync::CreateSyncRepoService < Reposync::ClientService + + attr_accessor :repo_name, :internal_repo_address, :external_repo_address, :sync_granularity, :sync_direction, :enable + + def initialize(repo_name, internal_repo_address, external_repo_address, sync_granularity, sync_direction, enable=true) + @repo_name = repo_name + @internal_repo_address = internal_repo_address + @external_repo_address = external_repo_address + @sync_granularity = sync_granularity + @sync_direction = sync_direction + @enable = enable + end + + def call + result = post(url, request_params) + response = render_response(result) + end + + private + def request_params + Hash.new.merge(data: { + repo_name: repo_name, + enable: enable, + internal_repo_address: internal_repo_address, + external_repo_address: external_repo_address, + sync_granularity: sync_granularity, + sync_direction: sync_direction + }.stringify_keys) + end + + def url + "/cerobot/sync/repo".freeze + end +end \ No newline at end of file diff --git a/app/services/reposync/delete_branch_service.rb b/app/services/reposync/delete_branch_service.rb new file mode 100644 index 00000000..6d3d7c32 --- /dev/null +++ b/app/services/reposync/delete_branch_service.rb @@ -0,0 +1,19 @@ +class Reposync::DeleteBranchService < Reposync::ClientService + + attr_accessor :repo_name, :branch_name + + def initialize(repo_name, branch_name) + @repo_name = repo_name + @branch_name = branch_name + end + + def call + result = delete(url) + response = render_response(result) + end + + private + def url + "/cerobot/sync/#{repo_name}/branch/#{branch_name}" + end +end \ No newline at end of file diff --git a/app/services/reposync/delete_repo_service.rb b/app/services/reposync/delete_repo_service.rb new file mode 100644 index 00000000..420a2d60 --- /dev/null +++ b/app/services/reposync/delete_repo_service.rb @@ -0,0 +1,18 @@ +class Reposync::DeleteRepoService < Reposync::ClientService + + attr_accessor :repo_name + + def initialize(repo_name) + @repo_name = repo_name + end + + def call + result = delete(url) + response = render_response(result) + end + + private + def url + "/cerobot/sync/repo/#{repo_name}" + end +end \ No newline at end of file diff --git a/app/services/reposync/get_logs_service.rb b/app/services/reposync/get_logs_service.rb new file mode 100644 index 00000000..e6657883 --- /dev/null +++ b/app/services/reposync/get_logs_service.rb @@ -0,0 +1,23 @@ +class Reposync::GetLogsService < Reposync::ClientService + + attr_accessor :repo_name, :branch_id + + def initialize(repo_name, branch_id=nil) + @repo_name = repo_name + @branch_id = branch_id + end + + def call + result = get(url, request_params) + response = render_response(result) + end + + private + def request_params + branch_id.present? ? {branch_id: branch_id}.stringify_keys : {} + end + + def url + "/cerobot/sync/repo/#{repo_name}/logs" + end +end \ No newline at end of file diff --git a/app/services/reposync/get_sync_branches_service.rb b/app/services/reposync/get_sync_branches_service.rb new file mode 100644 index 00000000..92c9d856 --- /dev/null +++ b/app/services/reposync/get_sync_branches_service.rb @@ -0,0 +1,30 @@ +class Reposync::GetSyncBranchesService < Reposync::ClientService + + attr_accessor :repo_name, :page, :limit, :create_sort + + def initialize(repo_name, page=1, limit=10, create_sort=false) + @repo_name = repo_name + @page = page + @limit = limit + @create_sort = create_sort + end + + def call + result = get(url, request_params) + response = render_response(result) + end + + private + def request_params + { + page: page, + limit: limit, + create_sort: create_sort + }.stringify_keys + end + + def url + "/cerobot/sync/#{repo_name}/branch".freeze + end + +end \ No newline at end of file diff --git a/app/services/reposync/get_sync_repos_service.rb b/app/services/reposync/get_sync_repos_service.rb new file mode 100644 index 00000000..3fc39d89 --- /dev/null +++ b/app/services/reposync/get_sync_repos_service.rb @@ -0,0 +1,28 @@ +class Reposync::GetSyncReposService < Reposync::ClientService + attr_accessor :page, :limit, :create_sort + + def initialize(page=1, limit=10, create_sort=false) + @page = page + @limit = limit + @create_sort = create_sort + end + + def call + result = get(url, request_params) + response = render_response(result) + end + + private + def request_params + { + page: page, + limit: limit, + create_sort: create_sort + }.stringify_keys + end + + def url + "/cerobot/sync/repo".freeze + end + +end \ No newline at end of file diff --git a/app/services/reposync/sync_branch_service.rb b/app/services/reposync/sync_branch_service.rb new file mode 100644 index 00000000..9ca71b3f --- /dev/null +++ b/app/services/reposync/sync_branch_service.rb @@ -0,0 +1,22 @@ +class Reposync::SyncBranchService < Reposync::ClientService + + attr_accessor :repo_name, :branch_name, :sync_direct + + def initialize(repo_name, branch_name, sync_direct) + @repo_name = repo_name + @branch_name = branch_name + @sync_direct = sync_direct + end + + def call + result = post(url) + response = render_response(result) + end + + private + + def url + "/cerobot/sync/#{repo_name}/branch/#{branch_name}?sync_direct=#{sync_direct}" + end + +end \ No newline at end of file diff --git a/app/services/reposync/sync_repo_service.rb b/app/services/reposync/sync_repo_service.rb new file mode 100644 index 00000000..8b9e6c24 --- /dev/null +++ b/app/services/reposync/sync_repo_service.rb @@ -0,0 +1,18 @@ +class Reposync::SyncRepoService < Reposync::ClientService + + attr_accessor :repo_name + + def initialize(repo_name) + @repo_name = repo_name + end + + def call + result = post(url) + response = render_response(result) + end + + private + def url + "/cerobot/sync/repo/#{repo_name}" + end +end \ No newline at end of file diff --git a/app/services/reposync/update_branch_status_service.rb b/app/services/reposync/update_branch_status_service.rb new file mode 100644 index 00000000..98ebcd5b --- /dev/null +++ b/app/services/reposync/update_branch_status_service.rb @@ -0,0 +1,21 @@ +class Reposync::UpdateBranchStatusService < Reposync::ClientService + + attr_accessor :repo_name, :branch_name, :enable + + def initialize(repo_name, branch_name, enable) + @repo_name = repo_name + @branch_name = branch_name + @enable = enable + end + + def call + result = put(url) + response = render_response(result) + end + + private + + def url + "/cerobot/sync/#{repo_name}/branch/#{branch_name}?enable=#{enable}" + end +end \ No newline at end of file diff --git a/app/services/reposync/update_repo_status_service.rb b/app/services/reposync/update_repo_status_service.rb new file mode 100644 index 00000000..db7065d8 --- /dev/null +++ b/app/services/reposync/update_repo_status_service.rb @@ -0,0 +1,19 @@ +class Reposync::UpdateRepoStatusService < Reposync::ClientService + + attr_accessor :repo_name, :enable + + def initialize(repo_name, enable) + @repo_name = repo_name + @enable = enable + end + + def call + result = put(url) + response = render_response(result) + end + + private + def url + "/cerobot/sync/repo/#{repo_name}?enable=#{enable}".freeze + end +end \ No newline at end of file From e358e3b6f68532ccfd1479af4ba57754b5ff7b2e Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 16 Apr 2024 17:15:22 +0800 Subject: [PATCH 02/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E4=BB=93=E5=BA=93=E5=92=8Cwebhook=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projects/sync_repositories_controller.rb | 24 +++++ app/jobs/touch_sync_job.rb | 24 +++++ app/models/sync_repositories/gitee.rb | 22 +++++ app/models/sync_repositories/github.rb | 21 ++++ app/models/sync_repository.rb | 25 +++++ app/models/sync_repository_branch.rb | 23 +++++ .../sync_repositories/create_service.rb | 95 +++++++++++++++++++ .../v1/projects/webhooks/create_service.rb | 2 +- config/routes/api.rb | 5 + ...20240415014011_create_sync_repositories.rb | 14 +++ ...5015216_create_sync_repository_branches.rb | 14 +++ 11 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 app/controllers/api/v1/projects/sync_repositories_controller.rb create mode 100644 app/jobs/touch_sync_job.rb create mode 100644 app/models/sync_repositories/gitee.rb create mode 100644 app/models/sync_repositories/github.rb create mode 100644 app/models/sync_repository.rb create mode 100644 app/models/sync_repository_branch.rb create mode 100644 app/services/api/v1/projects/sync_repositories/create_service.rb create mode 100644 db/migrate/20240415014011_create_sync_repositories.rb create mode 100644 db/migrate/20240415015216_create_sync_repository_branches.rb diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb new file mode 100644 index 00000000..41ea1393 --- /dev/null +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -0,0 +1,24 @@ +class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController + before_action :require_public_and_member_above + + def create + @sync_repositories = Api::V1::Projects::SyncRepositories::CreateService.call(@project, sync_repository_params) + end + + def sync + @sync_repositories = SyncRepository.where(project: @project) + @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories) + @sync_repositories.each do |item| + TouchSyncJob.perform_later(item) + end + @sync_repository_branches.each do |item| + TouchSyncJob.perform_later(item) + end + end + + private + def sync_repository_params + param.permit(:type, :external_token, :external_repo_address, :sync_granularity, :external_branch_name, :gitlink_branch_name, :first_sync_direction) + end + +end \ No newline at end of file diff --git a/app/jobs/touch_sync_job.rb b/app/jobs/touch_sync_job.rb new file mode 100644 index 00000000..e30b1cd3 --- /dev/null +++ b/app/jobs/touch_sync_job.rb @@ -0,0 +1,24 @@ +class TouchSyncJob < ApplicationJob + queue_as :default + + def perform(touchable) + puts "aaaa" + case touchable.class.to_s + when 'SyncRepositories::Github' || 'SyncRepositories::Gitee' + Reposync::SyncRepoService.call(touchable.repo_name) + when 'SyncRepositoryBranch' + sync_repository = touchable.sync_repository + result = [] + if sync_repository.sync_direction == 1 + result = Reposync::SyncBranchService.call(sync_repository.repo_name, touchable.gitlink_branch_name, sync_repository.sync_direction) + else + result = Reposync::SyncBranchService.call(sync_repository.repo_name, touchable.external_branch_name, sync_repository.sync_direction) + end + if result.is_a?(Array) + touchable.update_column(:sync_status, 1) + else + touchable.update_column(:sync_status, 2) + end + end + end +end \ No newline at end of file diff --git a/app/models/sync_repositories/gitee.rb b/app/models/sync_repositories/gitee.rb new file mode 100644 index 00000000..0a51b21c --- /dev/null +++ b/app/models/sync_repositories/gitee.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: sync_repositories +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# repo_name :string(255) +# external_repo_address :string(255) +# sync_granularity :integer +# sync_direction :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_sync_repositories_on_project_id (project_id) +# + +class SyncRepositories::Gitee < SyncRepository + +end diff --git a/app/models/sync_repositories/github.rb b/app/models/sync_repositories/github.rb new file mode 100644 index 00000000..1ef413a5 --- /dev/null +++ b/app/models/sync_repositories/github.rb @@ -0,0 +1,21 @@ +# == Schema Information +# +# Table name: sync_repositories +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# repo_name :string(255) +# external_repo_address :string(255) +# sync_granularity :integer +# sync_direction :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_sync_repositories_on_project_id (project_id) +# + +class SyncRepositories::Github < SyncRepository +end diff --git a/app/models/sync_repository.rb b/app/models/sync_repository.rb new file mode 100644 index 00000000..5ffdd542 --- /dev/null +++ b/app/models/sync_repository.rb @@ -0,0 +1,25 @@ +# == Schema Information +# +# Table name: sync_repositories +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# repo_name :string(255) +# external_repo_address :string(255) +# sync_granularity :integer +# sync_direction :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_sync_repositories_on_project_id (project_id) +# + +class SyncRepository < ApplicationRecord + + belongs_to :project + + validates :repo_name, uniqueness: { message: "已存在" } +end diff --git a/app/models/sync_repository_branch.rb b/app/models/sync_repository_branch.rb new file mode 100644 index 00000000..2f247823 --- /dev/null +++ b/app/models/sync_repository_branch.rb @@ -0,0 +1,23 @@ +# == Schema Information +# +# Table name: sync_repository_branches +# +# id :integer not null, primary key +# sync_repository_id :integer +# gitlink_branch_name :string(255) +# external_branch_name :string(255) +# sync_time :datetime +# sync_status :integer default("0") +# reposync_branch_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_sync_repository_branches_on_sync_repository_id (sync_repository_id) +# + +class SyncRepositoryBranch < ApplicationRecord + + belongs_to :sync_repository +end diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb new file mode 100644 index 00000000..088bd7b3 --- /dev/null +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -0,0 +1,95 @@ +class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService + + include ActiveModel::Model + + attr_reader :project, :type, :external_token, :external_repo_address, :sync_granularity, :external_branch_name, :gitlink_branch_name, :first_sync_direction + attr_accessor :sync_repository1, :sync_repository2 + + validates :type, inclusion: {in: %w(SyncRepositories::Gitee SyncRepositories::Github)} + validates :external_repo_address, format: { with: CustomRegexp::URL_REGEX, multiline: true, message: "地址格式不正确" } + validates :sync_granularity, :first_sync_direction, inclusion: {in: [1,2]} + validate :check_gitlink_branch_name + + def initialize(project, params) + @project = project + @type = params[:type] + @external_token = params[:external_token] + @external_repo_address = params[:external_repo_address] + @sync_granularity = params[:sync_granularity].to_i + @external_branch_name = params[:external_branch_name] + @gitlink_branch_name = params[:gitlink_branch_name] + @first_sync_direction = params[:first_sync_direction].to_i + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + + if sync_granularity == 2 + # 创建两个不同方向的同步仓库 + create_sync_repository + # 创建两个不同方向的同步分支 + create_sync_repository_branch + # 第一次同步 + touch_first_sync_branch + else + create_sync_repository + touch_first_sync + end + create_webhook + end + + def check_gitlink_branch_name + if sync_granularity == 2 + result = $gitea_hat_client.get_repos_branch_name_set_by_owner_repo(project&.owner&.login, project&.identifier) rescue nil + raise Error, '分支不存在' if !result.include?(gitlink_branch_name) + end + end + + private + def create_sync_repository + repository1 = Reposync::CreateSyncRepoService.call(repo_name(1), gitlink_repo_address, external_repo_address, sync_granularity, 1) + repository2 = Reposync::CreateSyncRepoService.call(repo_name(2), gitlink_repo_address, external_repo_address, sync_granularity, 2) + @sync_repository1 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(1), external_repo_address: external_repo_address, sync_granularity: sync_granularity, sync_direction: 1) + @sync_repository2 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(2), external_repo_address: external_repo_address, sync_granularity: sync_granularity, sync_direction: 2) + end + + def create_sync_repository_branch + branch1 = Reposync::CreateSyncBranchService.call(repo_name(1),gitlink_branch_name, external_branch_name) + branch2 = Reposync::CreateSyncBranchService.call(repo_name(2),gitlink_branch_name, external_branch_name) + @sync_repository_branch1 = SyncRepositoryBranch.create!(sync_repository: @sync_repository1, gitlink_branch_name: gitlink_branch_name, external_branch_name: external_branch_name ) + @sync_repository_branch2 = SyncRepositoryBranch.create!(sync_repository: @sync_repository2, gitlink_branch_name: gitlink_branch_name, external_branch_name: external_branch_name) + end + + def touch_first_sync + first_sync_direction == 1 ? TouchSyncJob.perform_later(@sync_repository1) : TouchSyncJob.perform_later(@sync_repository2) + end + + def touch_first_sync_branch + first_sync_direction == 1 ? TouchSyncJob.perform_later(@sync_repository_branch1) : TouchSyncJob.perform_later(@sync_repository_branch2) + end + + def create_webhook + webhook_params = { + active: true, + branch_filter: '*', + http_method: 'POST', + url: "#{Rails.application.config_for(:configuration)['platform_url']}/api/v1/#{project&.owner&.login}/#{project&.identifier}/sync_repositories/sync", + content_type: 'json', + type: 'reposync', + events: ["push"] + } + Api::V1::Projects::Webhooks::CreateService.call(project, webhook_params) + end + + def repo_name(sync_direction) + if type == "SyncRepositories::Gitee" + return "gitee:#{project.owner&.login}:#{project.identifier}:#{sync_granularity}:#{sync_direction}" + else + return "github:#{project.owner&.login}:#{project.identifier}:#{sync_granularity}:#{sync_direction}" + end + end + + def gitlink_repo_address + "#{EduSetting.get("gitlink_repo_domain")}/#{project.owner&.login}/#{project.identifier}.git" + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/create_service.rb b/app/services/api/v1/projects/webhooks/create_service.rb index 303f3b39..829710cb 100644 --- a/app/services/api/v1/projects/webhooks/create_service.rb +++ b/app/services/api/v1/projects/webhooks/create_service.rb @@ -8,7 +8,7 @@ class Api::V1::Projects::Webhooks::CreateService < ApplicationService validates :active, inclusion: {in: [true, false]} validates :http_method, inclusion: { in: %w(POST GET), message: "请输入正确的请求方式"} validates :content_type, inclusion: { in: %w(json form), message: "请输入正确的Content Type"} - validates :type, inclusion: {in: %w(gitea slack discord dingtalk telegram msteams feishu matrix jianmu softbot), message: "请输入正确的Webhook Type"} + validates :type, inclusion: {in: %w(gitea slack discord dingtalk telegram msteams feishu matrix jianmu softbot reposync), message: "请输入正确的Webhook Type"} def initialize(project, params, token=nil) @project = project @owner = project&.owner.login diff --git a/config/routes/api.rb b/config/routes/api.rb index 3f18235c..6c0aa48c 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -78,6 +78,11 @@ defaults format: :json do # projects文件夹下的 scope module: :projects do + resources :sync_repositories, only: [:create] do + collection do + post :sync + end + end resource :dataset, only: [:create, :update, :show] resources :actions, module: 'actions' do collection do diff --git a/db/migrate/20240415014011_create_sync_repositories.rb b/db/migrate/20240415014011_create_sync_repositories.rb new file mode 100644 index 00000000..d2908bfe --- /dev/null +++ b/db/migrate/20240415014011_create_sync_repositories.rb @@ -0,0 +1,14 @@ +class CreateSyncRepositories < ActiveRecord::Migration[5.2] + def change + create_table :sync_repositories do |t| + t.references :project + t.string :type + t.string :repo_name + t.string :external_repo_address + t.integer :sync_granularity + t.integer :sync_direction, comment: "1表示从gitlink到外部2表示从外部到gitlink" + + t.timestamps + end + end +end diff --git a/db/migrate/20240415015216_create_sync_repository_branches.rb b/db/migrate/20240415015216_create_sync_repository_branches.rb new file mode 100644 index 00000000..b44a6f39 --- /dev/null +++ b/db/migrate/20240415015216_create_sync_repository_branches.rb @@ -0,0 +1,14 @@ +class CreateSyncRepositoryBranches < ActiveRecord::Migration[5.2] + def change + create_table :sync_repository_branches do |t| + t.references :sync_repository + t.string :gitlink_branch_name, comment: 'gitlink分支' + t.string :external_branch_name, comment: '外部仓库分支' + t.datetime :sync_time + t.integer :sync_status, default: 0 + t.integer :reposync_branch_id + + t.timestamps + end + end +end From 7271603248f258c4d9e6a55496486e6ffcee7a2b Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 16 Apr 2024 17:53:35 +0800 Subject: [PATCH 03/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=97=B6=E9=97=B4=E5=92=8C=E5=88=9B=E5=BB=BA=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 4 ++-- app/jobs/touch_sync_job.rb | 4 ++-- app/models/sync_repository.rb | 1 + app/models/sync_repository_branch.rb | 2 ++ .../api/v1/projects/sync_repositories/create_service.rb | 4 +++- .../api/v1/projects/sync_repositories/create.json.jbuilder | 5 +++++ 6 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 app/views/api/v1/projects/sync_repositories/create.json.jbuilder diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 41ea1393..f4caef95 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -2,7 +2,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController before_action :require_public_and_member_above def create - @sync_repositories = Api::V1::Projects::SyncRepositories::CreateService.call(@project, sync_repository_params) + @sync_repository1, @sync_repository2, @sync_repository_branch1, @sync_repository_branch2 = Api::V1::Projects::SyncRepositories::CreateService.call(@project, sync_repository_params) end def sync @@ -18,7 +18,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController private def sync_repository_params - param.permit(:type, :external_token, :external_repo_address, :sync_granularity, :external_branch_name, :gitlink_branch_name, :first_sync_direction) + params.permit(:type, :external_token, :external_repo_address, :sync_granularity, :external_branch_name, :gitlink_branch_name, :first_sync_direction) end end \ No newline at end of file diff --git a/app/jobs/touch_sync_job.rb b/app/jobs/touch_sync_job.rb index e30b1cd3..d4c83be7 100644 --- a/app/jobs/touch_sync_job.rb +++ b/app/jobs/touch_sync_job.rb @@ -15,9 +15,9 @@ class TouchSyncJob < ApplicationJob result = Reposync::SyncBranchService.call(sync_repository.repo_name, touchable.external_branch_name, sync_repository.sync_direction) end if result.is_a?(Array) - touchable.update_column(:sync_status, 1) + touchable.update_attributes!({sync_status: 1, sync_time: Time.now}) else - touchable.update_column(:sync_status, 2) + touchable.update_attributes!({sync_status: 2, sync_time: Time.now}) end end end diff --git a/app/models/sync_repository.rb b/app/models/sync_repository.rb index 5ffdd542..7b3af11c 100644 --- a/app/models/sync_repository.rb +++ b/app/models/sync_repository.rb @@ -20,6 +20,7 @@ class SyncRepository < ApplicationRecord belongs_to :project + has_many :sync_repository_branches, dependent: :destroy validates :repo_name, uniqueness: { message: "已存在" } end diff --git a/app/models/sync_repository_branch.rb b/app/models/sync_repository_branch.rb index 2f247823..5e10dfa1 100644 --- a/app/models/sync_repository_branch.rb +++ b/app/models/sync_repository_branch.rb @@ -20,4 +20,6 @@ class SyncRepositoryBranch < ApplicationRecord belongs_to :sync_repository + + enum sync_status: {success: 1, failure: 2} end diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index 088bd7b3..1816c3e8 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -3,7 +3,7 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService include ActiveModel::Model attr_reader :project, :type, :external_token, :external_repo_address, :sync_granularity, :external_branch_name, :gitlink_branch_name, :first_sync_direction - attr_accessor :sync_repository1, :sync_repository2 + attr_accessor :sync_repository1, :sync_repository2, :sync_repository_branch1, :sync_repository_branch2 validates :type, inclusion: {in: %w(SyncRepositories::Gitee SyncRepositories::Github)} validates :external_repo_address, format: { with: CustomRegexp::URL_REGEX, multiline: true, message: "地址格式不正确" } @@ -36,6 +36,8 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService touch_first_sync end create_webhook + + [@sync_repository1, @sync_repository2, @sync_repository_branch1, @sync_repository_branch2] end def check_gitlink_branch_name diff --git a/app/views/api/v1/projects/sync_repositories/create.json.jbuilder b/app/views/api/v1/projects/sync_repositories/create.json.jbuilder new file mode 100644 index 00000000..ac7b6c1a --- /dev/null +++ b/app/views/api/v1/projects/sync_repositories/create.json.jbuilder @@ -0,0 +1,5 @@ +json.gitlink_repo_address "#{EduSetting.get("gitlink_repo_domain")}/#{@project.owner&.login}/#{@project.identifier}.git" +json.external_repo_address @sync_repository1.external_repo_address +json.sync_granularity @sync_repository1.sync_granularity +json.gitlink_branch_name @sync_repository_branch1.gitlink_branch_name +json.external_branch_name @sync_repository_branch1.external_branch_name \ No newline at end of file From 8b1ef7bf15b3d182462ca8ab43d0dc693d9e4828 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 17 Apr 2024 10:54:23 +0800 Subject: [PATCH 04/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E5=88=97=E8=A1=A8=E5=92=8C=E5=88=86=E6=94=AF=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 11 +++++++++++ app/models/project.rb | 6 ++---- app/models/sync_repository_branch.rb | 1 + .../projects/sync_repositories/branches.json.jbuilder | 11 +++++++++++ .../v1/projects/sync_repositories/index.json.jbuilder | 7 +++++++ config/routes/api.rb | 3 ++- ...0417025003_add_enable_to_sync_repository_branch.rb | 5 +++++ 7 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 app/views/api/v1/projects/sync_repositories/branches.json.jbuilder create mode 100644 app/views/api/v1/projects/sync_repositories/index.json.jbuilder create mode 100644 db/migrate/20240417025003_add_enable_to_sync_repository_branch.rb diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index f4caef95..e344f3ec 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -1,6 +1,11 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController before_action :require_public_and_member_above + def index + @sync_repositories = @project.sync_repositories + @group_sync_repository = @project.sync_repositories.group(:type, :external_repo_address, :sync_granularity).count + end + def create @sync_repository1, @sync_repository2, @sync_repository_branch1, @sync_repository_branch2 = Api::V1::Projects::SyncRepositories::CreateService.call(@project, sync_repository_params) end @@ -16,6 +21,12 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController end end + def branches + return render_error("请输入正确的同步项目ID") unless params[:sync_repository_ids].present? + @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: params[:sync_repository_ids].split(",")) + @group_sync_repository_branch = @sync_repository_branches.group(:gitlink_branch_name, :external_branch_name).count + end + private def sync_repository_params params.permit(:type, :external_token, :external_repo_address, :sync_granularity, :external_branch_name, :gitlink_branch_name, :first_sync_direction) diff --git a/app/models/project.rb b/app/models/project.rb index c2702fa0..1c235c71 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -55,14 +55,13 @@ # default_branch :string(255) default("master") # website :string(255) # lesson_url :string(255) +# use_blockchain :boolean default("0") # is_pinned :boolean default("0") # recommend_index :integer default("0") -# use_blockchain :boolean default("0") # pr_view_admin :boolean default("0") # # Indexes # -# index_projects_on_forked_count (forked_count) # index_projects_on_forked_from_project_id (forked_from_project_id) # index_projects_on_identifier (identifier) # index_projects_on_invite_code (invite_code) @@ -72,7 +71,6 @@ # index_projects_on_license_id (license_id) # index_projects_on_name (name) # index_projects_on_platform (platform) -# index_projects_on_praises_count (praises_count) # index_projects_on_project_category_id (project_category_id) # index_projects_on_project_language_id (project_language_id) # index_projects_on_project_type (project_type) @@ -80,7 +78,6 @@ # index_projects_on_rgt (rgt) # index_projects_on_status (status) # index_projects_on_updated_on (updated_on) -# index_projects_on_user_id (user_id) # class Project < ApplicationRecord @@ -138,6 +135,7 @@ class Project < ApplicationRecord has_many :commit_logs, dependent: :destroy has_many :daily_project_statistics, dependent: :destroy has_one :project_dataset, dependent: :destroy + has_many :sync_repositories, dependent: :destroy after_create :incre_user_statistic, :incre_platform_statistic after_save :check_project_members before_save :set_invite_code, :reset_unmember_followed, :set_recommend_and_is_pinned, :reset_cache_data diff --git a/app/models/sync_repository_branch.rb b/app/models/sync_repository_branch.rb index 5e10dfa1..f23f5fe3 100644 --- a/app/models/sync_repository_branch.rb +++ b/app/models/sync_repository_branch.rb @@ -11,6 +11,7 @@ # reposync_branch_id :integer # created_at :datetime not null # updated_at :datetime not null +# enable :boolean default("1") # # Indexes # diff --git a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder new file mode 100644 index 00000000..5a2c41aa --- /dev/null +++ b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder @@ -0,0 +1,11 @@ +json.total_count @group_sync_repository_branch.keys.count +json.sync_repository_branches @group_sync_repository_branch.each do |key| + json.gitlink_branch_name key[0][0] + json.external_branch_name key[0][1] + branches = @sync_repository_branches.where(gitlink_branch_name: key[0][0], external_branch_name: key[0][1]) + branch = branches.last + json.sync_time branch.sync_time + json.sync_status branch.sync_status + json.enable branch.enable + json.reposync_branch_ids branches.pluck(:reposync_branch_id) +end \ No newline at end of file diff --git a/app/views/api/v1/projects/sync_repositories/index.json.jbuilder b/app/views/api/v1/projects/sync_repositories/index.json.jbuilder new file mode 100644 index 00000000..f709bd33 --- /dev/null +++ b/app/views/api/v1/projects/sync_repositories/index.json.jbuilder @@ -0,0 +1,7 @@ +json.total_count @group_sync_repository.keys.count +json.sync_repositories @group_sync_repository.each do |key| + json.type key[0][0] + json.external_repo_address key[0][1] + json.sync_granularity key[0][2] + json.sync_repository_ids @sync_repositories.where(type: key[0][0], external_repo_address: key[0][1], sync_granularity: key[0][2]).pluck(:id) +end \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index 6c0aa48c..d0296748 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -78,9 +78,10 @@ defaults format: :json do # projects文件夹下的 scope module: :projects do - resources :sync_repositories, only: [:create] do + resources :sync_repositories, only: [:create, :index] do collection do post :sync + get :branches end end resource :dataset, only: [:create, :update, :show] diff --git a/db/migrate/20240417025003_add_enable_to_sync_repository_branch.rb b/db/migrate/20240417025003_add_enable_to_sync_repository_branch.rb new file mode 100644 index 00000000..fdbd7b7e --- /dev/null +++ b/db/migrate/20240417025003_add_enable_to_sync_repository_branch.rb @@ -0,0 +1,5 @@ +class AddEnableToSyncRepositoryBranch < ActiveRecord::Migration[5.2] + def change + add_column :sync_repository_branches, :enable, :boolean, default: true + end +end From 831d314ebdf7168ff801a6007451ea26be3c4459 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 17 Apr 2024 11:15:14 +0800 Subject: [PATCH 05/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=BF=94?= =?UTF-8?q?=E5=9B=9Ebranch=5Fid=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories/create_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index 1816c3e8..6c85d34d 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -58,8 +58,8 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService def create_sync_repository_branch branch1 = Reposync::CreateSyncBranchService.call(repo_name(1),gitlink_branch_name, external_branch_name) branch2 = Reposync::CreateSyncBranchService.call(repo_name(2),gitlink_branch_name, external_branch_name) - @sync_repository_branch1 = SyncRepositoryBranch.create!(sync_repository: @sync_repository1, gitlink_branch_name: gitlink_branch_name, external_branch_name: external_branch_name ) - @sync_repository_branch2 = SyncRepositoryBranch.create!(sync_repository: @sync_repository2, gitlink_branch_name: gitlink_branch_name, external_branch_name: external_branch_name) + @sync_repository_branch1 = SyncRepositoryBranch.create!(sync_repository: @sync_repository1, gitlink_branch_name: gitlink_branch_name, external_branch_name: external_branch_name, reposync_branch_id: branch1[1]["id"]) + @sync_repository_branch2 = SyncRepositoryBranch.create!(sync_repository: @sync_repository2, gitlink_branch_name: gitlink_branch_name, external_branch_name: external_branch_name, reposync_branch_id: branch2[1]["id"]) end def touch_first_sync From eeb09949619c273c961cbded0b5f2515a51eebd4 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 17 Apr 2024 16:37:01 +0800 Subject: [PATCH 06/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9Atoken=E9=89=B4?= =?UTF-8?q?=E6=9D=83repo=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories/create_service.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index 6c85d34d..37dda551 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -49,8 +49,8 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService private def create_sync_repository - repository1 = Reposync::CreateSyncRepoService.call(repo_name(1), gitlink_repo_address, external_repo_address, sync_granularity, 1) - repository2 = Reposync::CreateSyncRepoService.call(repo_name(2), gitlink_repo_address, external_repo_address, sync_granularity, 2) + repository1 = Reposync::CreateSyncRepoService.call(repo_name(1), gitlink_repo_address, act_external_repo_address, sync_granularity, 1) + repository2 = Reposync::CreateSyncRepoService.call(repo_name(2), gitlink_repo_address, act_external_repo_address, sync_granularity, 2) @sync_repository1 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(1), external_repo_address: external_repo_address, sync_granularity: sync_granularity, sync_direction: 1) @sync_repository2 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(2), external_repo_address: external_repo_address, sync_granularity: sync_granularity, sync_direction: 2) end @@ -91,6 +91,11 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService end end + def act_external_repo_address + body = external_repo_address.split("https://")[1] + return "https://oauth2:#{external_token}@#{body}" + end + def gitlink_repo_address "#{EduSetting.get("gitlink_repo_domain")}/#{project.owner&.login}/#{project.identifier}.git" end From 6f458e0e791038307089cc1e863315becba2cddc Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 18 Apr 2024 15:20:19 +0800 Subject: [PATCH 07/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=A7=A3?= =?UTF-8?q?=E7=BB=91=E5=92=8C=E6=9B=B4=E6=94=B9=E7=8A=B6=E6=80=81=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projects/sync_repositories_controller.rb | 33 +++++++++++++++++-- .../sync_repositories/create_service.rb | 2 +- .../sync_repositories/branches.json.jbuilder | 4 +-- config/routes/api.rb | 2 ++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index e344f3ec..9586b2c2 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -11,8 +11,9 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController end def sync - @sync_repositories = SyncRepository.where(project: @project) - @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories) + return render_error("请输入正确的同步方向!") if params[:sync_direction].blank? + @sync_repositories = SyncRepository.where(project: @project, sync_direction: params[:sync_direction]) + @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories, enable: true) @sync_repositories.each do |item| TouchSyncJob.perform_later(item) end @@ -21,6 +22,34 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController end end + def unbind + return render_error("请输入正确的同步项目ID") unless params[:sync_repository_ids].present? + @sync_repositories = SyncRepository.where(id: params[:sync_repository_ids].split(",")) + @sync_repositories.each do |repo| + Reposync::DeleteRepoService.call(repo.repo_name) + repo.destroy + end + render_ok + end + + def change_enable + return render_error("请输入正确的分支名称") if params[:gitlink_branch_name].blank? || params[:external_branch_name].blank? + return render_error("请输入正确的状态") if params[:enable].blank? + @sync_repository_branches = SyncRepositoryBranch.where(gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name]) + if @sync_repository_branches.update_all({enable: params[:enable]}) + @sync_repository_branches.each do |branch| + if branch&.sync_repository&.sync_direction.to_i == 1 + Reposync::UpdateBranchStatusService.call(branch&.sync_repository&.repo_name, branch.gitlink_branch_name, params[:enable]) + else + Reposync::UpdateBranchStatusService.call(branch&.sync_repository&.repo_name, branch.external_branch_name, params[:enable]) + end + end + render_ok + else + render_error("更新失败!") + end + end + def branches return render_error("请输入正确的同步项目ID") unless params[:sync_repository_ids].present? @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: params[:sync_repository_ids].split(",")) diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index 37dda551..1e1c361e 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -75,7 +75,7 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService active: true, branch_filter: '*', http_method: 'POST', - url: "#{Rails.application.config_for(:configuration)['platform_url']}/api/v1/#{project&.owner&.login}/#{project&.identifier}/sync_repositories/sync", + url: "#{Rails.application.config_for(:configuration)['platform_url']}/api/v1/#{project&.owner&.login}/#{project&.identifier}/sync_repositories/sync?sync_direction=1", content_type: 'json', type: 'reposync', events: ["push"] diff --git a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder index 5a2c41aa..4f548ee1 100644 --- a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder @@ -2,8 +2,8 @@ json.total_count @group_sync_repository_branch.keys.count json.sync_repository_branches @group_sync_repository_branch.each do |key| json.gitlink_branch_name key[0][0] json.external_branch_name key[0][1] - branches = @sync_repository_branches.where(gitlink_branch_name: key[0][0], external_branch_name: key[0][1]) - branch = branches.last + branches = @sync_repository_branches.where(gitlink_branch_name: key[0][0], external_branch_name: key[0][1]).order(updated_at: :desc) + branch = branches.first json.sync_time branch.sync_time json.sync_status branch.sync_status json.enable branch.enable diff --git a/config/routes/api.rb b/config/routes/api.rb index d0296748..762672bd 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -82,6 +82,8 @@ defaults format: :json do collection do post :sync get :branches + post :change_enable + post :unbind end end resource :dataset, only: [:create, :update, :show] From 565c1c1cab199695543f13650a97b1658e671e8e Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 18 Apr 2024 16:14:39 +0800 Subject: [PATCH 08/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=88=86?= =?UTF-8?q?=E6=94=AF=E5=88=97=E8=A1=A8=E5=88=86=E6=94=AF=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=8E=92=E5=BA=8F=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 3 ++- app/controllers/application_controller.rb | 2 +- .../api/v1/projects/sync_repositories/branches.json.jbuilder | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 9586b2c2..e9fe4400 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -52,7 +52,8 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController def branches return render_error("请输入正确的同步项目ID") unless params[:sync_repository_ids].present? - @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: params[:sync_repository_ids].split(",")) + @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: params[:sync_repository_ids].split(",")).order(updated_at: :desc) + @sync_repository_branches = @sync_repository_branches.ransack(gitlink_branch_name_or_external_branch_name_cont: params[:branch_name]).result if params[:branch_name].present? @group_sync_repository_branch = @sync_repository_branches.group(:gitlink_branch_name, :external_branch_name).count end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0c134a3b..3fbd29fd 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -348,7 +348,7 @@ class ApplicationController < ActionController::Base User.current = User.find 8686 elsif params[:debug] == 'admin' logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....." - user = User.find 36480 + user = User.find 102 User.current = user cookies.signed[:user_id] = user.id end diff --git a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder index 4f548ee1..09ef2e84 100644 --- a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder @@ -4,6 +4,7 @@ json.sync_repository_branches @group_sync_repository_branch.each do |key| json.external_branch_name key[0][1] branches = @sync_repository_branches.where(gitlink_branch_name: key[0][0], external_branch_name: key[0][1]).order(updated_at: :desc) branch = branches.first + json.type branch&.sync_repository&.type json.sync_time branch.sync_time json.sync_status branch.sync_status json.enable branch.enable From 240e086232a59876f59f3af9ac6ea31347ed0de5 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 18 Apr 2024 16:31:09 +0800 Subject: [PATCH 09/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Adebug=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 3fbd29fd..0c134a3b 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -348,7 +348,7 @@ class ApplicationController < ActionController::Base User.current = User.find 8686 elsif params[:debug] == 'admin' logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....." - user = User.find 102 + user = User.find 36480 User.current = user cookies.signed[:user_id] = user.id end From 0f5066f943224ca801b751ec1f3219241097c20b Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 19 Apr 2024 17:26:20 +0800 Subject: [PATCH 10/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=88=86?= =?UTF-8?q?=E6=94=AF=E5=90=8C=E6=AD=A5=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E5=88=9B=E5=BB=BA=E5=90=8C=E6=AD=A5=E5=88=86?= =?UTF-8?q?=E6=94=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projects/sync_repositories_controller.rb | 50 +++++++++++++++++-- app/services/reposync/client_service.rb | 1 + .../sync_repositories/branches.json.jbuilder | 12 ++--- .../sync_repositories/history.json.jbuilder | 8 +++ config/routes/api.rb | 2 + 5 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 app/views/api/v1/projects/sync_repositories/history.json.jbuilder diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index e9fe4400..7a74bddc 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -8,6 +8,9 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController def create @sync_repository1, @sync_repository2, @sync_repository_branch1, @sync_repository_branch2 = Api::V1::Projects::SyncRepositories::CreateService.call(@project, sync_repository_params) + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) end def sync @@ -20,16 +23,22 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController @sync_repository_branches.each do |item| TouchSyncJob.perform_later(item) end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) end def unbind - return render_error("请输入正确的同步项目ID") unless params[:sync_repository_ids].present? + return render_error("请输入正确的同步仓库ID") unless params[:sync_repository_ids].present? @sync_repositories = SyncRepository.where(id: params[:sync_repository_ids].split(",")) @sync_repositories.each do |repo| Reposync::DeleteRepoService.call(repo.repo_name) repo.destroy end render_ok + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) end def change_enable @@ -48,13 +57,46 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController else render_error("更新失败!") end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + def create_branch + return render_error("请输入正确的同步仓库ID") unless params[:sync_repository_ids].present? + return render_error("请输入正确的Gitlink分支名称") unless params[:gitlink_branch_name].present? + return render_error("请输入正确的外部仓库分支名称") unless params[:external_branch_name].present? + return render_error("请输入正确的首次同步方向") unless params[:first_sync_direction].present? + + params[:sync_repository_ids].split(",").each do |id| + repo = SyncRepository.find_by_id id + branch = Reposync::CreateSyncBranchService.call(repo.repo_name, params[:gitlink_branch_name], params[:external_branch_name]) + return render_error(branch[2]) if branch[0].to_i !=0 + SyncRepositoryBranch.create!(sync_repository_id: id, gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name], reposync_branch_id: branch[1]['id']) + TouchSyncJob.perform_later(branch) if params[:first_sync_direction].to_i == repo.sync_direction + end + render_ok + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) end def branches - return render_error("请输入正确的同步项目ID") unless params[:sync_repository_ids].present? - @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: params[:sync_repository_ids].split(",")).order(updated_at: :desc) + return render_error("请输入正确的同步仓库ID") unless params[:sync_repository_ids].present? + @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: params[:sync_repository_ids].split(",")) @sync_repository_branches = @sync_repository_branches.ransack(gitlink_branch_name_or_external_branch_name_cont: params[:branch_name]).result if params[:branch_name].present? - @group_sync_repository_branch = @sync_repository_branches.group(:gitlink_branch_name, :external_branch_name).count + @group_sync_repository_branch = @sync_repository_branches.group(:gitlink_branch_name, :external_branch_name).select("max(updated_at) as updated_at, gitlink_branch_name, external_branch_name").sort_by{|i|i.updated_at} + end + + def history + return render_error("请输入正确的同步分支ID") unless params[:reposync_branch_ids] + @reposync_branch_logs = [] + params[:reposync_branch_ids].split(",").each do |branch_id| + branch = SyncRepositoryBranch.find_by(reposync_branch_id: branch_id) + repo = branch.sync_repository + _, logs, _ = Reposync::GetLogsService.call(repo.repo_name, branch_id) + @reposync_branch_logs += logs + end end private diff --git a/app/services/reposync/client_service.rb b/app/services/reposync/client_service.rb index 984fee67..cca073df 100644 --- a/app/services/reposync/client_service.rb +++ b/app/services/reposync/client_service.rb @@ -91,6 +91,7 @@ class Reposync::ClientService < ApplicationService else puts "[reposync][ERROR] code: #{body["code_status"]}" puts "[reposync][ERROR] message: #{body["msg"]}" + return [body["code_status"], body["data"], body["msg"]] end end end diff --git a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder index 09ef2e84..018668b8 100644 --- a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder @@ -1,11 +1,11 @@ -json.total_count @group_sync_repository_branch.keys.count -json.sync_repository_branches @group_sync_repository_branch.each do |key| - json.gitlink_branch_name key[0][0] - json.external_branch_name key[0][1] - branches = @sync_repository_branches.where(gitlink_branch_name: key[0][0], external_branch_name: key[0][1]).order(updated_at: :desc) +json.total_count @group_sync_repository_branch.count +json.sync_repository_branches @group_sync_repository_branch.each do |item| + json.gitlink_branch_name item.gitlink_branch_name + json.external_branch_name item.external_branch_name + branches = @sync_repository_branches.where(gitlink_branch_name: item.gitlink_branch_name, external_branch_name: item.external_branch_name).order(updated_at: :desc) branch = branches.first json.type branch&.sync_repository&.type - json.sync_time branch.sync_time + json.sync_time branch.sync_time.strftime("%Y-%m-%d %H:%M:%S") json.sync_status branch.sync_status json.enable branch.enable json.reposync_branch_ids branches.pluck(:reposync_branch_id) diff --git a/app/views/api/v1/projects/sync_repositories/history.json.jbuilder b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder new file mode 100644 index 00000000..0b8d5864 --- /dev/null +++ b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder @@ -0,0 +1,8 @@ +json.total_count @reposync_branch_logs.count +json.logs @reposync_branch_logs.each do |log| + type = log['repo_name'].start_with?('gitee') ? 'gitee' : 'github' + json.change_from log['sync_direct'] == "to_inter" ? type : 'gitlink' + json.commit_id log['commit_id'] + json.sync_time log['update_at'] + json.log log['log'] +end \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index 762672bd..56e5f4f6 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -84,6 +84,8 @@ defaults format: :json do get :branches post :change_enable post :unbind + get :history + post :create_branch end end resource :dataset, only: [:create, :update, :show] From 946b449d9d86e4797adc416935e938dfd191a9c5 Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 22 Apr 2024 15:47:20 +0800 Subject: [PATCH 11/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=E5=90=8C=E6=AD=A5=E5=88=86=E6=94=AF=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E9=A6=96=E6=AC=A1=E5=90=8C=E6=AD=A5=E6=96=B9=E5=90=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 13 ++++++++----- .../sync_repositories/branches.json.jbuilder | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 7a74bddc..2306283f 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -17,9 +17,10 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController return render_error("请输入正确的同步方向!") if params[:sync_direction].blank? @sync_repositories = SyncRepository.where(project: @project, sync_direction: params[:sync_direction]) @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories, enable: true) - @sync_repositories.each do |item| - TouchSyncJob.perform_later(item) - end + # 全部分支同步暂时不做 + # @sync_repositories.each do |item| + # TouchSyncJob.perform_later(item) + # end @sync_repository_branches.each do |item| TouchSyncJob.perform_later(item) end @@ -44,10 +45,12 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController def change_enable return render_error("请输入正确的分支名称") if params[:gitlink_branch_name].blank? || params[:external_branch_name].blank? return render_error("请输入正确的状态") if params[:enable].blank? - @sync_repository_branches = SyncRepositoryBranch.where(gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name]) + @sync_repository_branches = SyncRepositoryBranch.joins(:sync_repository).where(sync_repositories: {project_id: @project.id}, gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name]) if @sync_repository_branches.update_all({enable: params[:enable]}) @sync_repository_branches.each do |branch| - if branch&.sync_repository&.sync_direction.to_i == 1 + branch_sync_direction = branch&.sync_repository&.sync_direction.to_i + TouchSyncJob.perform_later(branch) if params[:enable] && branch_sync_direction == params[:first_sync_direction].to_i + if branch_sync_direction == 1 Reposync::UpdateBranchStatusService.call(branch&.sync_repository&.repo_name, branch.gitlink_branch_name, params[:enable]) else Reposync::UpdateBranchStatusService.call(branch&.sync_repository&.repo_name, branch.external_branch_name, params[:enable]) diff --git a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder index 018668b8..a716148b 100644 --- a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder @@ -5,7 +5,7 @@ json.sync_repository_branches @group_sync_repository_branch.each do |item| branches = @sync_repository_branches.where(gitlink_branch_name: item.gitlink_branch_name, external_branch_name: item.external_branch_name).order(updated_at: :desc) branch = branches.first json.type branch&.sync_repository&.type - json.sync_time branch.sync_time.strftime("%Y-%m-%d %H:%M:%S") + json.sync_time branch.sync_time.present? ? branch.sync_time.strftime("%Y-%m-%d %H:%M:%S") : nil json.sync_status branch.sync_status json.enable branch.enable json.reposync_branch_ids branches.pluck(:reposync_branch_id) From 81d39588c66518fe201c84e7685a81f0f9281d7d Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 23 Apr 2024 17:42:26 +0800 Subject: [PATCH 12/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=88=86?= =?UTF-8?q?=E6=94=AF=E5=88=97=E8=A1=A8=E5=88=86=E6=94=AF=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=BB=A5=E5=8F=8Agitlink=20admin=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 6 +++--- .../api/v1/projects/sync_repositories/create_service.rb | 4 +++- .../api/v1/projects/sync_repositories/create.json.jbuilder | 4 ++-- .../api/v1/projects/sync_repositories/history.json.jbuilder | 3 +++ 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 2306283f..76e2bef4 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -95,9 +95,9 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController return render_error("请输入正确的同步分支ID") unless params[:reposync_branch_ids] @reposync_branch_logs = [] params[:reposync_branch_ids].split(",").each do |branch_id| - branch = SyncRepositoryBranch.find_by(reposync_branch_id: branch_id) - repo = branch.sync_repository - _, logs, _ = Reposync::GetLogsService.call(repo.repo_name, branch_id) + @branch = SyncRepositoryBranch.find_by(reposync_branch_id: branch_id) + repo = @branch&.sync_repository + _, logs, _ = Reposync::GetLogsService.call(repo&.repo_name, branch_id) @reposync_branch_logs += logs end end diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index 1e1c361e..0295049b 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -97,6 +97,8 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService end def gitlink_repo_address - "#{EduSetting.get("gitlink_repo_domain")}/#{project.owner&.login}/#{project.identifier}.git" + internal_repo_address = "#{EduSetting.get("gitlink_repo_domain")}/#{project.owner&.login}/#{project.identifier}.git" + body = internal_repo_address.split("https://")[1] + return "https://oauth2:#{EduSetting.get("gitlink_admin_token")}@#{body}" end end \ No newline at end of file diff --git a/app/views/api/v1/projects/sync_repositories/create.json.jbuilder b/app/views/api/v1/projects/sync_repositories/create.json.jbuilder index ac7b6c1a..20bb70c6 100644 --- a/app/views/api/v1/projects/sync_repositories/create.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/create.json.jbuilder @@ -1,5 +1,5 @@ json.gitlink_repo_address "#{EduSetting.get("gitlink_repo_domain")}/#{@project.owner&.login}/#{@project.identifier}.git" json.external_repo_address @sync_repository1.external_repo_address json.sync_granularity @sync_repository1.sync_granularity -json.gitlink_branch_name @sync_repository_branch1.gitlink_branch_name -json.external_branch_name @sync_repository_branch1.external_branch_name \ No newline at end of file +json.gitlink_branch_name @sync_repository_branch1&.gitlink_branch_name +json.external_branch_name @sync_repository_branch1&.external_branch_name \ No newline at end of file diff --git a/app/views/api/v1/projects/sync_repositories/history.json.jbuilder b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder index 0b8d5864..f0e5c325 100644 --- a/app/views/api/v1/projects/sync_repositories/history.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder @@ -1,4 +1,7 @@ json.total_count @reposync_branch_logs.count +json.gitlink_branch_name @branch&.gitlink_branch_name +json.external_type @branch&.repository&.type +json.external_branch_name @branch&.external_branch_name json.logs @reposync_branch_logs.each do |log| type = log['repo_name'].start_with?('gitee') ? 'gitee' : 'github' json.change_from log['sync_direct'] == "to_inter" ? type : 'gitlink' From e9237d77894bc13badeda114299ed7f97149e1f0 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 23 Apr 2024 17:44:56 +0800 Subject: [PATCH 13/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories/history.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/api/v1/projects/sync_repositories/history.json.jbuilder b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder index f0e5c325..fa211d9b 100644 --- a/app/views/api/v1/projects/sync_repositories/history.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder @@ -1,6 +1,6 @@ json.total_count @reposync_branch_logs.count json.gitlink_branch_name @branch&.gitlink_branch_name -json.external_type @branch&.repository&.type +json.external_type @branch&.sync_repository&.type json.external_branch_name @branch&.external_branch_name json.logs @reposync_branch_logs.each do |log| type = log['repo_name'].start_with?('gitee') ? 'gitee' : 'github' From 9c32cd8769e2514acf883d557a84ef0d2b69f55d Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 24 Apr 2024 15:17:13 +0800 Subject: [PATCH 14/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9Aexter=5Ftoken?= =?UTF-8?q?=E5=92=8Cinter=5Ftoken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v1/projects/sync_repositories_controller.rb | 2 +- .../sync_repositories/create_service.rb | 17 ++++++++--------- .../reposync/create_sync_repo_service.rb | 8 ++++++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 76e2bef4..27bc32e1 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -44,7 +44,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController def change_enable return render_error("请输入正确的分支名称") if params[:gitlink_branch_name].blank? || params[:external_branch_name].blank? - return render_error("请输入正确的状态") if params[:enable].blank? + # return render_error("请输入正确的状态") if params[:enable].blank? @sync_repository_branches = SyncRepositoryBranch.joins(:sync_repository).where(sync_repositories: {project_id: @project.id}, gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name]) if @sync_repository_branches.update_all({enable: params[:enable]}) @sync_repository_branches.each do |branch| diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index 0295049b..69617418 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -49,8 +49,9 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService private def create_sync_repository - repository1 = Reposync::CreateSyncRepoService.call(repo_name(1), gitlink_repo_address, act_external_repo_address, sync_granularity, 1) - repository2 = Reposync::CreateSyncRepoService.call(repo_name(2), gitlink_repo_address, act_external_repo_address, sync_granularity, 2) + repository1 = Reposync::CreateSyncRepoService.call(repo_name(1), gitlink_repo_address, gitlink_token, external_repo_address, external_token, sync_granularity, 1) + repository2 = Reposync::CreateSyncRepoService.call(repo_name(2), gitlink_repo_address, gitlink_token, external_repo_address, external_token, sync_granularity, 2) + raise Error, '创建同步仓库失败' if repository1[0].to_i > 0 || repository2[0].to_i > 0 @sync_repository1 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(1), external_repo_address: external_repo_address, sync_granularity: sync_granularity, sync_direction: 1) @sync_repository2 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(2), external_repo_address: external_repo_address, sync_granularity: sync_granularity, sync_direction: 2) end @@ -58,6 +59,7 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService def create_sync_repository_branch branch1 = Reposync::CreateSyncBranchService.call(repo_name(1),gitlink_branch_name, external_branch_name) branch2 = Reposync::CreateSyncBranchService.call(repo_name(2),gitlink_branch_name, external_branch_name) + raise Error, '创建同步仓库分支失败' if branch1[0].to_i > 0 || branch2[0].to_i > 0 @sync_repository_branch1 = SyncRepositoryBranch.create!(sync_repository: @sync_repository1, gitlink_branch_name: gitlink_branch_name, external_branch_name: external_branch_name, reposync_branch_id: branch1[1]["id"]) @sync_repository_branch2 = SyncRepositoryBranch.create!(sync_repository: @sync_repository2, gitlink_branch_name: gitlink_branch_name, external_branch_name: external_branch_name, reposync_branch_id: branch2[1]["id"]) end @@ -91,14 +93,11 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService end end - def act_external_repo_address - body = external_repo_address.split("https://")[1] - return "https://oauth2:#{external_token}@#{body}" + def gitlink_repo_address + "#{EduSetting.get("gitlink_repo_domain")}/#{project.owner&.login}/#{project.identifier}.git" end - def gitlink_repo_address - internal_repo_address = "#{EduSetting.get("gitlink_repo_domain")}/#{project.owner&.login}/#{project.identifier}.git" - body = internal_repo_address.split("https://")[1] - return "https://oauth2:#{EduSetting.get("gitlink_admin_token")}@#{body}" + def gitlink_token + EduSetting.get("gitlink_admin_token") end end \ No newline at end of file diff --git a/app/services/reposync/create_sync_repo_service.rb b/app/services/reposync/create_sync_repo_service.rb index 6176e3b7..0f0cc43e 100644 --- a/app/services/reposync/create_sync_repo_service.rb +++ b/app/services/reposync/create_sync_repo_service.rb @@ -1,11 +1,13 @@ class Reposync::CreateSyncRepoService < Reposync::ClientService - attr_accessor :repo_name, :internal_repo_address, :external_repo_address, :sync_granularity, :sync_direction, :enable + attr_accessor :repo_name, :internal_repo_address, :inter_token, :external_repo_address, :exter_token, :sync_granularity, :sync_direction, :enable - def initialize(repo_name, internal_repo_address, external_repo_address, sync_granularity, sync_direction, enable=true) + def initialize(repo_name, internal_repo_address, inter_token, external_repo_address, exter_token, sync_granularity, sync_direction, enable=true) @repo_name = repo_name @internal_repo_address = internal_repo_address + @inter_token = inter_token @external_repo_address = external_repo_address + @exter_token = exter_token @sync_granularity = sync_granularity @sync_direction = sync_direction @enable = enable @@ -22,7 +24,9 @@ class Reposync::CreateSyncRepoService < Reposync::ClientService repo_name: repo_name, enable: enable, internal_repo_address: internal_repo_address, + inter_token: inter_token, external_repo_address: external_repo_address, + exter_token: exter_token, sync_granularity: sync_granularity, sync_direction: sync_direction }.stringify_keys) From a273c1cfcf8895b7e5c48a13ac675bccf9fe516e Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 24 Apr 2024 16:11:32 +0800 Subject: [PATCH 15/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E4=BB=93=E5=BA=93=E6=9B=B4=E6=96=B0=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projects/sync_repositories_controller.rb | 13 ++++++ .../sync_repositories/update_service.rb | 40 +++++++++++++++++++ .../reposync/update_repo_addr_service.rb | 31 ++++++++++++++ config/routes/api.rb | 1 + 4 files changed, 85 insertions(+) create mode 100644 app/services/api/v1/projects/sync_repositories/update_service.rb create mode 100644 app/services/reposync/update_repo_addr_service.rb diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 27bc32e1..4f679037 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -13,6 +13,15 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController tip_exception(e.message) end + def update_info + return render_error("请输入正确的同步仓库ID") unless params[:sync_repository_ids].present? + Api::V1::Projects::SyncRepositories::UpdateService.call(@project, params[:sync_repository_ids] , sync_repository_update_params) + render_ok + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + def sync return render_error("请输入正确的同步方向!") if params[:sync_direction].blank? @sync_repositories = SyncRepository.where(project: @project, sync_direction: params[:sync_direction]) @@ -107,4 +116,8 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController params.permit(:type, :external_token, :external_repo_address, :sync_granularity, :external_branch_name, :gitlink_branch_name, :first_sync_direction) end + def sync_repository_update_params + params.permit(:external_token, :external_repo_address) + end + end \ No newline at end of file diff --git a/app/services/api/v1/projects/sync_repositories/update_service.rb b/app/services/api/v1/projects/sync_repositories/update_service.rb new file mode 100644 index 00000000..4db4005f --- /dev/null +++ b/app/services/api/v1/projects/sync_repositories/update_service.rb @@ -0,0 +1,40 @@ +class Api::V1::Projects::SyncRepositories::UpdateService < ApplicationService + + include ActiveModel::Model + attr_reader :project, :external_token, :external_repo_address, :sync_repositories + attr_accessor :sync_repository1, :sync_repository2 + + validates :external_repo_address, format: { with: CustomRegexp::URL_REGEX, multiline: true, message: "地址格式不正确" } + validates :external_token, presence: true + + #Api::V1::Projects::SyncRepositories::UpdateService.call(Project.last, "21,22", {external_repo_address: "https://github.com/viletyy/testdevops.git", external_token:"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"}) + def initialize(project, sync_repository_ids, params) + @project = project + @sync_repositories = SyncRepository.where(project_id: project.id, id: sync_repository_ids.split(",")) + @external_token = params[:external_token] + @external_repo_address = params[:external_repo_address] + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + + update_sync_repository + + end + + private + def update_sync_repository + @sync_repositories.each do |repo| + Reposync::UpdateRepoAddrService.call(repo&.repo_name, internal_repo_address, internal_token, external_repo_address, external_token) + repo.update_attributes!({external_repo_address: external_repo_address}) + end + end + + def internal_repo_address + "#{EduSetting.get("gitlink_repo_domain")}/#{project.owner&.login}/#{project.identifier}.git" + end + + def internal_token + EduSetting.get("gitlink_admin_token") + end +end \ No newline at end of file diff --git a/app/services/reposync/update_repo_addr_service.rb b/app/services/reposync/update_repo_addr_service.rb new file mode 100644 index 00000000..aa34f4fb --- /dev/null +++ b/app/services/reposync/update_repo_addr_service.rb @@ -0,0 +1,31 @@ +class Reposync::UpdateRepoAddrService < Reposync::ClientService + + attr_accessor :repo_name, :internal_repo_address, :inter_token, :external_repo_address, :exter_token + + def initialize(repo_name, internal_repo_address, inter_token, external_repo_address, exter_token) + @repo_name = repo_name + @internal_repo_address = internal_repo_address + @inter_token = inter_token + @external_repo_address = external_repo_address + @exter_token = exter_token + end + + def call + result = put(url, request_params) + response = render_response(result) + end + + private + def request_params + Hash.new.merge(data: { + internal_repo_address: internal_repo_address, + inter_token: inter_token, + external_repo_address: external_repo_address, + exter_token: exter_token + }.stringify_keys) + end + + def url + "/cerobot/sync/repo/#{repo_name}/repo_addr".freeze + end +end \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index 56e5f4f6..e42afba5 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -80,6 +80,7 @@ defaults format: :json do scope module: :projects do resources :sync_repositories, only: [:create, :index] do collection do + post :update_info post :sync get :branches post :change_enable From 589d2ae2e8e5f22c4981a936f1df062b06c2c744 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 24 Apr 2024 17:06:45 +0800 Subject: [PATCH 16/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=AE=B0?= =?UTF-8?q?=E5=BD=95external=5Ftoken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 4 ++-- app/models/sync_repository.rb | 1 + .../api/v1/projects/sync_repositories/create_service.rb | 4 ++-- .../api/v1/projects/sync_repositories/update_service.rb | 4 ++-- .../api/v1/projects/sync_repositories/index.json.jbuilder | 1 + .../20240424085125_add_external_token_to_sync_repository.rb | 5 +++++ 6 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 db/migrate/20240424085125_add_external_token_to_sync_repository.rb diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 4f679037..7a74ecc4 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -3,7 +3,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController def index @sync_repositories = @project.sync_repositories - @group_sync_repository = @project.sync_repositories.group(:type, :external_repo_address, :sync_granularity).count + @group_sync_repository = @project.sync_repositories.group(:type, :external_repo_address, :sync_granularity, :external_token).count end def create @@ -15,7 +15,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController def update_info return render_error("请输入正确的同步仓库ID") unless params[:sync_repository_ids].present? - Api::V1::Projects::SyncRepositories::UpdateService.call(@project, params[:sync_repository_ids] , sync_repository_update_params) + Api::V1::Projects::SyncRepositories::UpdateService.call(@project, params[:sync_repository_ids], sync_repository_update_params) render_ok rescue Exception => e uid_logger_error(e.message) diff --git a/app/models/sync_repository.rb b/app/models/sync_repository.rb index 7b3af11c..42579c81 100644 --- a/app/models/sync_repository.rb +++ b/app/models/sync_repository.rb @@ -11,6 +11,7 @@ # sync_direction :integer # created_at :datetime not null # updated_at :datetime not null +# external_token :string(255) # # Indexes # diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index 69617418..5a3fd1bb 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -52,8 +52,8 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService repository1 = Reposync::CreateSyncRepoService.call(repo_name(1), gitlink_repo_address, gitlink_token, external_repo_address, external_token, sync_granularity, 1) repository2 = Reposync::CreateSyncRepoService.call(repo_name(2), gitlink_repo_address, gitlink_token, external_repo_address, external_token, sync_granularity, 2) raise Error, '创建同步仓库失败' if repository1[0].to_i > 0 || repository2[0].to_i > 0 - @sync_repository1 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(1), external_repo_address: external_repo_address, sync_granularity: sync_granularity, sync_direction: 1) - @sync_repository2 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(2), external_repo_address: external_repo_address, sync_granularity: sync_granularity, sync_direction: 2) + @sync_repository1 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(1), external_repo_address: external_repo_address, external_token: external_token, sync_granularity: sync_granularity, sync_direction: 1) + @sync_repository2 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(2), external_repo_address: external_repo_address, external_token: external_token, sync_granularity: sync_granularity, sync_direction: 2) end def create_sync_repository_branch diff --git a/app/services/api/v1/projects/sync_repositories/update_service.rb b/app/services/api/v1/projects/sync_repositories/update_service.rb index 4db4005f..9b4fec3e 100644 --- a/app/services/api/v1/projects/sync_repositories/update_service.rb +++ b/app/services/api/v1/projects/sync_repositories/update_service.rb @@ -6,7 +6,7 @@ class Api::V1::Projects::SyncRepositories::UpdateService < ApplicationService validates :external_repo_address, format: { with: CustomRegexp::URL_REGEX, multiline: true, message: "地址格式不正确" } validates :external_token, presence: true - + #Api::V1::Projects::SyncRepositories::UpdateService.call(Project.last, "21,22", {external_repo_address: "https://github.com/viletyy/testdevops.git", external_token:"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"}) def initialize(project, sync_repository_ids, params) @project = project @@ -26,7 +26,7 @@ class Api::V1::Projects::SyncRepositories::UpdateService < ApplicationService def update_sync_repository @sync_repositories.each do |repo| Reposync::UpdateRepoAddrService.call(repo&.repo_name, internal_repo_address, internal_token, external_repo_address, external_token) - repo.update_attributes!({external_repo_address: external_repo_address}) + repo.update_attributes!({external_repo_address: external_repo_address, external_token: external_token}) end end diff --git a/app/views/api/v1/projects/sync_repositories/index.json.jbuilder b/app/views/api/v1/projects/sync_repositories/index.json.jbuilder index f709bd33..84bbdde5 100644 --- a/app/views/api/v1/projects/sync_repositories/index.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/index.json.jbuilder @@ -3,5 +3,6 @@ json.sync_repositories @group_sync_repository.each do |key| json.type key[0][0] json.external_repo_address key[0][1] json.sync_granularity key[0][2] + json.external_token key[0][3] json.sync_repository_ids @sync_repositories.where(type: key[0][0], external_repo_address: key[0][1], sync_granularity: key[0][2]).pluck(:id) end \ No newline at end of file diff --git a/db/migrate/20240424085125_add_external_token_to_sync_repository.rb b/db/migrate/20240424085125_add_external_token_to_sync_repository.rb new file mode 100644 index 00000000..fde46cab --- /dev/null +++ b/db/migrate/20240424085125_add_external_token_to_sync_repository.rb @@ -0,0 +1,5 @@ +class AddExternalTokenToSyncRepository < ActiveRecord::Migration[5.2] + def change + add_column :sync_repositories, :external_token, :string + end +end From 31ede9c69de62f166991c60e57de8de9b26d0101 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 25 Apr 2024 14:45:26 +0800 Subject: [PATCH 17/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9Agroup=20by=20s?= =?UTF-8?q?ync=20repository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/v1/projects/sync_repositories_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 7a74ecc4..d20b43bf 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -97,7 +97,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController return render_error("请输入正确的同步仓库ID") unless params[:sync_repository_ids].present? @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: params[:sync_repository_ids].split(",")) @sync_repository_branches = @sync_repository_branches.ransack(gitlink_branch_name_or_external_branch_name_cont: params[:branch_name]).result if params[:branch_name].present? - @group_sync_repository_branch = @sync_repository_branches.group(:gitlink_branch_name, :external_branch_name).select("max(updated_at) as updated_at, gitlink_branch_name, external_branch_name").sort_by{|i|i.updated_at} + @group_sync_repository_branch = @sync_repository_branches.group(:sync_repository_id, :gitlink_branch_name, :external_branch_name).select("max(updated_at) as updated_at, sync_repository_id, gitlink_branch_name, external_branch_name").sort_by{|i|i.updated_at} end def history From ae4ad2982133bb390b51d98278454d925d71424b Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 25 Apr 2024 15:14:00 +0800 Subject: [PATCH 18/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9Agroup=20by=20s?= =?UTF-8?q?ync=20repository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/v1/projects/sync_repositories_controller.rb | 2 +- .../api/v1/projects/sync_repositories/branches.json.jbuilder | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index d20b43bf..08956eec 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -97,7 +97,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController return render_error("请输入正确的同步仓库ID") unless params[:sync_repository_ids].present? @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: params[:sync_repository_ids].split(",")) @sync_repository_branches = @sync_repository_branches.ransack(gitlink_branch_name_or_external_branch_name_cont: params[:branch_name]).result if params[:branch_name].present? - @group_sync_repository_branch = @sync_repository_branches.group(:sync_repository_id, :gitlink_branch_name, :external_branch_name).select("max(updated_at) as updated_at, sync_repository_id, gitlink_branch_name, external_branch_name").sort_by{|i|i.updated_at} + @group_sync_repository_branch = @sync_repository_branches.joins(:sync_repository).group("sync_repositories.type, sync_repository_branches.gitlink_branch_name, sync_repository_branches.external_branch_name").select("sync_repositories.type as type,max(sync_repository_branches.updated_at) as updated_at, sync_repository_branches.gitlink_branch_name, sync_repository_branches.external_branch_name").sort_by{|i|i.updated_at} end def history diff --git a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder index a716148b..f040c647 100644 --- a/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/branches.json.jbuilder @@ -2,7 +2,7 @@ json.total_count @group_sync_repository_branch.count json.sync_repository_branches @group_sync_repository_branch.each do |item| json.gitlink_branch_name item.gitlink_branch_name json.external_branch_name item.external_branch_name - branches = @sync_repository_branches.where(gitlink_branch_name: item.gitlink_branch_name, external_branch_name: item.external_branch_name).order(updated_at: :desc) + branches = @sync_repository_branches.joins(:sync_repository).where(sync_repositories: {type: item.type}, gitlink_branch_name: item.gitlink_branch_name, external_branch_name: item.external_branch_name).order(updated_at: :desc) branch = branches.first json.type branch&.sync_repository&.type json.sync_time branch.sync_time.present? ? branch.sync_time.strftime("%Y-%m-%d %H:%M:%S") : nil From 5af5219f971674205d39a4bd38f79d82bc94c62d Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 25 Apr 2024 15:41:31 +0800 Subject: [PATCH 19/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E4=BB=93=E5=BA=93=E5=BB=B6=E8=BF=9F=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/v1/projects/sync_repositories_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 08956eec..c12e2206 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -58,7 +58,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController if @sync_repository_branches.update_all({enable: params[:enable]}) @sync_repository_branches.each do |branch| branch_sync_direction = branch&.sync_repository&.sync_direction.to_i - TouchSyncJob.perform_later(branch) if params[:enable] && branch_sync_direction == params[:first_sync_direction].to_i + TouchSyncJob.set(wait: 5.seconds).perform_later(branch) if params[:enable] && branch_sync_direction == params[:first_sync_direction].to_i if branch_sync_direction == 1 Reposync::UpdateBranchStatusService.call(branch&.sync_repository&.repo_name, branch.gitlink_branch_name, params[:enable]) else From e556e53f54fab0a9963fd9bb03b81be5a67cd355 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 25 Apr 2024 15:46:19 +0800 Subject: [PATCH 20/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E4=BB=93=E5=BA=93=E5=BB=B6=E8=BF=9F=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E7=A7=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/v1/projects/sync_repositories_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index c12e2206..73f4bec5 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -58,12 +58,12 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController if @sync_repository_branches.update_all({enable: params[:enable]}) @sync_repository_branches.each do |branch| branch_sync_direction = branch&.sync_repository&.sync_direction.to_i - TouchSyncJob.set(wait: 5.seconds).perform_later(branch) if params[:enable] && branch_sync_direction == params[:first_sync_direction].to_i if branch_sync_direction == 1 Reposync::UpdateBranchStatusService.call(branch&.sync_repository&.repo_name, branch.gitlink_branch_name, params[:enable]) else Reposync::UpdateBranchStatusService.call(branch&.sync_repository&.repo_name, branch.external_branch_name, params[:enable]) end + TouchSyncJob.perform_later(branch) if params[:enable] && branch_sync_direction == params[:first_sync_direction].to_i end render_ok else From d5f841441b8b4b22de2146c96a85a2139bfc998a Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 25 Apr 2024 17:00:01 +0800 Subject: [PATCH 21/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E5=88=86=E6=94=AF=E5=8F=98=E9=87=8F=E5=90=8D=E6=9B=B4?= =?UTF-8?q?=E6=AD=A3=E4=BB=A5=E5=8F=8A=E6=97=A5=E5=BF=97=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 73f4bec5..d4cc8a2e 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -82,10 +82,10 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController params[:sync_repository_ids].split(",").each do |id| repo = SyncRepository.find_by_id id - branch = Reposync::CreateSyncBranchService.call(repo.repo_name, params[:gitlink_branch_name], params[:external_branch_name]) + Reposync::CreateSyncBranchService.call(repo.repo_name, params[:gitlink_branch_name], params[:external_branch_name]) return render_error(branch[2]) if branch[0].to_i !=0 - SyncRepositoryBranch.create!(sync_repository_id: id, gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name], reposync_branch_id: branch[1]['id']) - TouchSyncJob.perform_later(branch) if params[:first_sync_direction].to_i == repo.sync_direction + sync_branch = SyncRepositoryBranch.create!(sync_repository_id: id, gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name], reposync_branch_id: branch[1]['id']) + TouchSyncJob.perform_later(sync_branch) if params[:first_sync_direction].to_i == repo.sync_direction end render_ok rescue Exception => e @@ -109,6 +109,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController _, logs, _ = Reposync::GetLogsService.call(repo&.repo_name, branch_id) @reposync_branch_logs += logs end + @reposync_branch_logs = @reposync_branch_logs.sort_by{|log|log["update_at"]} end private From 1c1cceabbecd087716011610b0992a7ce849f91b Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 25 Apr 2024 17:04:39 +0800 Subject: [PATCH 22/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/v1/projects/sync_repositories_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index d4cc8a2e..4a6473cd 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -82,7 +82,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController params[:sync_repository_ids].split(",").each do |id| repo = SyncRepository.find_by_id id - Reposync::CreateSyncBranchService.call(repo.repo_name, params[:gitlink_branch_name], params[:external_branch_name]) + branch = Reposync::CreateSyncBranchService.call(repo.repo_name, params[:gitlink_branch_name], params[:external_branch_name]) return render_error(branch[2]) if branch[0].to_i !=0 sync_branch = SyncRepositoryBranch.create!(sync_repository_id: id, gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name], reposync_branch_id: branch[1]['id']) TouchSyncJob.perform_later(sync_branch) if params[:first_sync_direction].to_i == repo.sync_direction From db40a21b044218d0389fd2b01610064959d986fa Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 29 Apr 2024 15:19:07 +0800 Subject: [PATCH 23/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E4=BB=93=E5=BA=93=E7=BB=91=E5=AE=9Awebhook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 1 + app/models/sync_repository.rb | 1 + .../v1/projects/sync_repositories/create_service.rb | 10 +++++----- ...0240429070012_add_webhook_gid_to_sync_repository.rb | 5 +++++ 4 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20240429070012_add_webhook_gid_to_sync_repository.rb diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 4a6473cd..c0600ef1 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -43,6 +43,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController @sync_repositories = SyncRepository.where(id: params[:sync_repository_ids].split(",")) @sync_repositories.each do |repo| Reposync::DeleteRepoService.call(repo.repo_name) + Api::V1::Projects::Webhooks::DeleteService.call(@project, repo.webhook_gid) repo.destroy end render_ok diff --git a/app/models/sync_repository.rb b/app/models/sync_repository.rb index 42579c81..13af04f8 100644 --- a/app/models/sync_repository.rb +++ b/app/models/sync_repository.rb @@ -12,6 +12,7 @@ # created_at :datetime not null # updated_at :datetime not null # external_token :string(255) +# webhook_gid :integer # # Indexes # diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index 5a3fd1bb..75d7f7e7 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -3,7 +3,7 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService include ActiveModel::Model attr_reader :project, :type, :external_token, :external_repo_address, :sync_granularity, :external_branch_name, :gitlink_branch_name, :first_sync_direction - attr_accessor :sync_repository1, :sync_repository2, :sync_repository_branch1, :sync_repository_branch2 + attr_accessor :sync_repository1, :sync_repository2, :sync_repository_branch1, :sync_repository_branch2, :gitea_webhook validates :type, inclusion: {in: %w(SyncRepositories::Gitee SyncRepositories::Github)} validates :external_repo_address, format: { with: CustomRegexp::URL_REGEX, multiline: true, message: "地址格式不正确" } @@ -24,6 +24,7 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService def call raise Error, errors.full_messages.join(",") unless valid? + create_webhook if sync_granularity == 2 # 创建两个不同方向的同步仓库 create_sync_repository @@ -35,7 +36,6 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService create_sync_repository touch_first_sync end - create_webhook [@sync_repository1, @sync_repository2, @sync_repository_branch1, @sync_repository_branch2] end @@ -52,8 +52,8 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService repository1 = Reposync::CreateSyncRepoService.call(repo_name(1), gitlink_repo_address, gitlink_token, external_repo_address, external_token, sync_granularity, 1) repository2 = Reposync::CreateSyncRepoService.call(repo_name(2), gitlink_repo_address, gitlink_token, external_repo_address, external_token, sync_granularity, 2) raise Error, '创建同步仓库失败' if repository1[0].to_i > 0 || repository2[0].to_i > 0 - @sync_repository1 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(1), external_repo_address: external_repo_address, external_token: external_token, sync_granularity: sync_granularity, sync_direction: 1) - @sync_repository2 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(2), external_repo_address: external_repo_address, external_token: external_token, sync_granularity: sync_granularity, sync_direction: 2) + @sync_repository1 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(1), external_repo_address: external_repo_address, external_token: external_token, sync_granularity: sync_granularity, sync_direction: 1, webhook_gid: @gitea_webhook["id"]) + @sync_repository2 = SyncRepository.create!(project: project, type: type, repo_name: repo_name(2), external_repo_address: external_repo_address, external_token: external_token, sync_granularity: sync_granularity, sync_direction: 2, webhook_gid: @gitea_webhook["id"]) end def create_sync_repository_branch @@ -82,7 +82,7 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService type: 'reposync', events: ["push"] } - Api::V1::Projects::Webhooks::CreateService.call(project, webhook_params) + @gitea_webhook = Api::V1::Projects::Webhooks::CreateService.call(project, webhook_params) end def repo_name(sync_direction) diff --git a/db/migrate/20240429070012_add_webhook_gid_to_sync_repository.rb b/db/migrate/20240429070012_add_webhook_gid_to_sync_repository.rb new file mode 100644 index 00000000..dfd3e6c7 --- /dev/null +++ b/db/migrate/20240429070012_add_webhook_gid_to_sync_repository.rb @@ -0,0 +1,5 @@ +class AddWebhookGidToSyncRepository < ActiveRecord::Migration[5.2] + def change + add_column :sync_repositories, :webhook_gid, :integer + end +end From 4cacc911300d3b2e7e5bc366fa1115d7db1b6b07 Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 6 May 2024 10:01:52 +0800 Subject: [PATCH 24/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E5=81=9C=E6=AD=A2=E5=90=8C=E6=AD=A5=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=8F=82=E6=95=B0=E4=BB=A5=E5=8F=8Awebhook=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E6=99=9A=E4=BA=94=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index c0600ef1..6aa9cb6e 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -31,7 +31,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController # TouchSyncJob.perform_later(item) # end @sync_repository_branches.each do |item| - TouchSyncJob.perform_later(item) + TouchSyncJob.set(wait: 5.seconds).perform_later(item) end rescue Exception => e uid_logger_error(e.message) @@ -53,9 +53,10 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController end def change_enable + return render_error("请输入正确的仓库类型") if params[:repo_type].blank? return render_error("请输入正确的分支名称") if params[:gitlink_branch_name].blank? || params[:external_branch_name].blank? # return render_error("请输入正确的状态") if params[:enable].blank? - @sync_repository_branches = SyncRepositoryBranch.joins(:sync_repository).where(sync_repositories: {project_id: @project.id}, gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name]) + @sync_repository_branches = SyncRepositoryBranch.joins(:sync_repository).where(sync_repositories: {project_id: @project.id, type: params[:repo_type]}, gitlink_branch_name: params[:gitlink_branch_name], external_branch_name: params[:external_branch_name]) if @sync_repository_branches.update_all({enable: params[:enable]}) @sync_repository_branches.each do |branch| branch_sync_direction = branch&.sync_repository&.sync_direction.to_i From 61f893ba0adee4e1cae6f8c93c4c5babd8c330f8 Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 6 May 2024 13:56:45 +0800 Subject: [PATCH 25/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E8=A7=A3?= =?UTF-8?q?=E7=BB=91=E6=93=8D=E4=BD=9C=E6=94=BE=E5=9C=A8=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 2 +- app/models/sync_repository.rb | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 6aa9cb6e..96e14faf 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -42,7 +42,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController return render_error("请输入正确的同步仓库ID") unless params[:sync_repository_ids].present? @sync_repositories = SyncRepository.where(id: params[:sync_repository_ids].split(",")) @sync_repositories.each do |repo| - Reposync::DeleteRepoService.call(repo.repo_name) + # Reposync::DeleteRepoService.call(repo.repo_name) # 解绑操作放在回调里 Api::V1::Projects::Webhooks::DeleteService.call(@project, repo.webhook_gid) repo.destroy end diff --git a/app/models/sync_repository.rb b/app/models/sync_repository.rb index 13af04f8..70018d7d 100644 --- a/app/models/sync_repository.rb +++ b/app/models/sync_repository.rb @@ -24,5 +24,12 @@ class SyncRepository < ApplicationRecord belongs_to :project has_many :sync_repository_branches, dependent: :destroy + before_destroy :unbind_reposyncer + validates :repo_name, uniqueness: { message: "已存在" } + + def unbind_reposyncer + Reposync::DeleteRepoService.call(self.repo_name) + end + end From 60857ed357db1178d006b79bf529182db4f23ea5 Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 6 May 2024 17:29:47 +0800 Subject: [PATCH 26/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E4=BB=BB=E5=8A=A1=E5=88=A4=E6=96=AD=E4=B8=BA=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/touch_sync_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/touch_sync_job.rb b/app/jobs/touch_sync_job.rb index d4c83be7..3beaf52e 100644 --- a/app/jobs/touch_sync_job.rb +++ b/app/jobs/touch_sync_job.rb @@ -14,7 +14,7 @@ class TouchSyncJob < ApplicationJob else result = Reposync::SyncBranchService.call(sync_repository.repo_name, touchable.external_branch_name, sync_repository.sync_direction) end - if result.is_a?(Array) + if result.is_a?(Array) && result[0].to_i == 0 touchable.update_attributes!({sync_status: 1, sync_time: Time.now}) else touchable.update_attributes!({sync_status: 2, sync_time: Time.now}) From ba228a7e9397428b3b9878590e349c1505ca6e93 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 7 May 2024 10:07:45 +0800 Subject: [PATCH 27/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E9=A1=B9=E7=9B=AE=E9=BB=98=E8=AE=A4=E4=B8=8D=E5=BC=80?= =?UTF-8?q?=E5=90=AF=E6=95=B0=E6=8D=AE=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/project_unit.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/project_unit.rb b/app/models/project_unit.rb index 8cf4ed6a..d2b6d208 100644 --- a/app/models/project_unit.rb +++ b/app/models/project_unit.rb @@ -23,6 +23,7 @@ class ProjectUnit < ApplicationRecord def self.init_types(project_id, project_type='common') unit_types = project_type == 'sync_mirror' ? ProjectUnit::unit_types.except("pulls") : ProjectUnit::unit_types + unit_types = unit_types.except("dataset") unit_types.each do |_, v| self.create!(project_id: project_id, unit_type: v) end From 8ae91ff55813d70d847bf22a2e8bd2b2e3512e05 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Tue, 7 May 2024 14:08:46 +0800 Subject: [PATCH 28/42] =?UTF-8?q?=E6=B5=81=E6=B0=B4=E7=BA=BF=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=AE=A1=E7=90=86=E5=92=8C=E6=A8=A1=E6=9D=BF=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/node_inputs_controller.rb | 75 +++++++++++++++++ .../action/node_selects_controller.rb | 76 +++++++++++++++++ .../action/node_types_controller.rb | 64 +++++++++++++++ app/controllers/action/nodes_controller.rb | 69 ++++++++++++++++ .../action/templates_controller.rb | 68 +++++++++++++++ app/helpers/action/node_helper.rb | 2 + app/models/action/node.rb | 71 ++++++++++++++++ app/models/action/node_input.rb | 27 ++++++ app/models/action/node_select.rb | 39 +++++++++ app/models/action/node_type.rb | 18 ++++ app/models/action/template.rb | 20 +++++ app/views/action/node_inputs/_form.html.erb | 39 +++++++++ .../node_inputs/_node_input.json.jbuilder | 6 ++ .../node_inputs/_node_select.json.jbuilder | 4 + app/views/action/node_inputs/edit.html.erb | 47 +++++++++++ app/views/action/node_inputs/index.html.erb | 46 +++++++++++ .../action/node_inputs/index.json.jbuilder | 20 +++++ app/views/action/node_inputs/new.html.erb | 5 ++ .../action/node_inputs/show.json.jbuilder | 7 ++ app/views/action/node_selects/_form.html.erb | 39 +++++++++ app/views/action/node_selects/edit.html.erb | 46 +++++++++++ app/views/action/node_selects/index.html.erb | 43 ++++++++++ app/views/action/node_selects/new.html.erb | 5 ++ app/views/action/node_types/_form.html.erb | 31 +++++++ app/views/action/node_types/edit.html.erb | 7 ++ app/views/action/node_types/index.html.erb | 37 +++++++++ app/views/action/node_types/new.html.erb | 5 ++ app/views/action/nodes/_form.html.erb | 63 ++++++++++++++ .../action/nodes/_node_input.json.jbuilder | 6 ++ .../action/nodes/_node_select.json.jbuilder | 4 + app/views/action/nodes/edit.html.erb | 7 ++ app/views/action/nodes/index.html.erb | 49 +++++++++++ app/views/action/nodes/index.json.jbuilder | 20 +++++ app/views/action/nodes/new.html.erb | 5 ++ app/views/action/nodes/show.json.jbuilder | 7 ++ app/views/action/templates/_form.html.erb | 43 ++++++++++ app/views/action/templates/edit.html.erb | 6 ++ app/views/action/templates/index.html.erb | 37 +++++++++ .../action/templates/index.json.jbuilder | 3 + app/views/action/templates/new.html.erb | 5 ++ app/views/action/templates/show.json.jbuilder | 1 + config/routes.rb | 31 +++++-- ...20240408010101_create_action_node_types.rb | 10 +++ .../20240408010102_create_action_nodes.rb | 18 ++++ ...240408010213_create_action_node_selects.rb | 17 ++++ ...0240408010227_create_action_node_inputs.rb | 14 ++++ .../20240408010233_create_action_templates.rb | 13 +++ lib/tasks/actions_download.rake | 82 +++++++++++++++++++ 48 files changed, 1348 insertions(+), 9 deletions(-) create mode 100644 app/controllers/action/node_inputs_controller.rb create mode 100644 app/controllers/action/node_selects_controller.rb create mode 100644 app/controllers/action/node_types_controller.rb create mode 100644 app/controllers/action/nodes_controller.rb create mode 100644 app/controllers/action/templates_controller.rb create mode 100644 app/helpers/action/node_helper.rb create mode 100644 app/models/action/node.rb create mode 100644 app/models/action/node_input.rb create mode 100644 app/models/action/node_select.rb create mode 100644 app/models/action/node_type.rb create mode 100644 app/models/action/template.rb create mode 100644 app/views/action/node_inputs/_form.html.erb create mode 100644 app/views/action/node_inputs/_node_input.json.jbuilder create mode 100644 app/views/action/node_inputs/_node_select.json.jbuilder create mode 100644 app/views/action/node_inputs/edit.html.erb create mode 100644 app/views/action/node_inputs/index.html.erb create mode 100644 app/views/action/node_inputs/index.json.jbuilder create mode 100644 app/views/action/node_inputs/new.html.erb create mode 100644 app/views/action/node_inputs/show.json.jbuilder create mode 100644 app/views/action/node_selects/_form.html.erb create mode 100644 app/views/action/node_selects/edit.html.erb create mode 100644 app/views/action/node_selects/index.html.erb create mode 100644 app/views/action/node_selects/new.html.erb create mode 100644 app/views/action/node_types/_form.html.erb create mode 100644 app/views/action/node_types/edit.html.erb create mode 100644 app/views/action/node_types/index.html.erb create mode 100644 app/views/action/node_types/new.html.erb create mode 100644 app/views/action/nodes/_form.html.erb create mode 100644 app/views/action/nodes/_node_input.json.jbuilder create mode 100644 app/views/action/nodes/_node_select.json.jbuilder create mode 100644 app/views/action/nodes/edit.html.erb create mode 100644 app/views/action/nodes/index.html.erb create mode 100644 app/views/action/nodes/index.json.jbuilder create mode 100644 app/views/action/nodes/new.html.erb create mode 100644 app/views/action/nodes/show.json.jbuilder create mode 100644 app/views/action/templates/_form.html.erb create mode 100644 app/views/action/templates/edit.html.erb create mode 100644 app/views/action/templates/index.html.erb create mode 100644 app/views/action/templates/index.json.jbuilder create mode 100644 app/views/action/templates/new.html.erb create mode 100644 app/views/action/templates/show.json.jbuilder create mode 100644 db/migrate/20240408010101_create_action_node_types.rb create mode 100644 db/migrate/20240408010102_create_action_nodes.rb create mode 100644 db/migrate/20240408010213_create_action_node_selects.rb create mode 100644 db/migrate/20240408010227_create_action_node_inputs.rb create mode 100644 db/migrate/20240408010233_create_action_templates.rb create mode 100644 lib/tasks/actions_download.rake diff --git a/app/controllers/action/node_inputs_controller.rb b/app/controllers/action/node_inputs_controller.rb new file mode 100644 index 00000000..65227c65 --- /dev/null +++ b/app/controllers/action/node_inputs_controller.rb @@ -0,0 +1,75 @@ +class Action::NodeInputsController < ApplicationController + before_action :require_admin, except: [:index] + before_action :find_action_node + + def index + @node_inputs = @node.action_node_inputs + respond_to do |format| + format.html + format.json + end + end + + def create + @node_input = Action::NodeInput.new(node_input_params) + @node_input.action_node = @node + respond_to do |format| + if @node_input.save + format.html { redirect_to action_node_node_inputs_path(@node), notice: '创建成功.' } + format.json { render_ok(data: @node_input.as_json) } + else + format.html { render :new } + format.json { render json: @node_input.errors, status: -1 } + end + end + end + + def new + + end + + def show + + end + + def edit + + end + + def update + @node_input.update(node_input_params) + respond_to do |format| + format.html { redirect_to action_node_node_inputs_path(@node), notice: '更新成功.' } + format.json { render_ok(data: @node_input.as_json) } + end + end + + def destroy + if @node_input.destroy! + flash[:success] = '删除成功' + else + flash[:danger] = '删除失败' + end + redirect_to "api/actions/nodes" + end + + private + + def find_action_node + @node = Action::Node.find(params[:node_id]) + if params[:id].present? + @node_input = @node.action_node_inputs.find(params[:id]) + else + @node_input = Action::NodeInput.new + end + + end + + def node_input_params + if params.require(:action_node_input) + params.require(:action_node_input).permit(:name, :input_type, :description, :is_required, :sort_no) + else + params.permit(:name, :input_type, :description, :is_required, :sort_no) + end + end +end diff --git a/app/controllers/action/node_selects_controller.rb b/app/controllers/action/node_selects_controller.rb new file mode 100644 index 00000000..9acd6fc5 --- /dev/null +++ b/app/controllers/action/node_selects_controller.rb @@ -0,0 +1,76 @@ +class Action::NodeSelectsController < ApplicationController + + before_action :require_admin, except: [:index] + before_action :find_action_node + + def index + @node_selects = @node.action_node_selects + respond_to do |format| + format.html + format.json + end + end + + def create + @node_select = Action::NodeSelect.new(node_select_params) + @node_select.action_node = @node + respond_to do |format| + if @node_select.save + format.html { redirect_to action_node_node_selects_path(@node), notice: '创建成功.' } + format.json { render_ok(data: @node_select.as_json) } + else + format.html { render :new } + format.json { render json: @node_select.errors, status: -1 } + end + end + end + + def new + + end + + def show + + end + + def edit + + end + + def update + @node_select.update(node_select_params) + respond_to do |format| + format.html { redirect_to action_node_node_selects_path(@node), notice: '更新成功.' } + format.json { render_ok(data: @node_select.as_json) } + end + end + + def destroy + if @node_select.destroy! + flash[:success] = '删除成功' + else + flash[:danger] = '删除失败' + end + redirect_to "api/actions/nodes" + end + + private + + def find_action_node + @node = Action::Node.find(params[:node_id]) + if params[:id].present? + @node_select = @node.action_node_selects.find(params[:id]) + else + @node_select = Action::NodeSelect.new + end + + end + + def node_select_params + if params.require(:action_node_select) + params.require(:action_node_select).permit(:name, :val, :val_ext, :description, :sort_no) + else + params.permit(:name, :val, :val_ext, :description, :sort_no) + end + end +end diff --git a/app/controllers/action/node_types_controller.rb b/app/controllers/action/node_types_controller.rb new file mode 100644 index 00000000..32508d94 --- /dev/null +++ b/app/controllers/action/node_types_controller.rb @@ -0,0 +1,64 @@ +class Action::NodeTypesController < ApplicationController + before_action :require_admin, except: [:index] + before_action :find_node_type, except: [:index, :create, :new] + + def index + @node_types = Action::NodeType.all + end + + def create + @node_type = Action::NodeType.new(node_types_params) + respond_to do |format| + if @node_type.save + format.html { redirect_to action_node_types_path, notice: '创建成功.' } + format.json { render_ok(data: @node_type.as_json) } + else + format.html { render :new } + format.json { render json: @node_type.errors, status: -1 } + end + end + end + + def show + + end + + def new + @node_type = Action::NodeType.new + end + + def edit + + end + + def update + @node_type.update(node_types_params) + respond_to do |format| + format.html { redirect_to action_node_types_path, notice: '更新成功.' } + format.json { render_ok(data: @node_type.as_json) } + end + end + + def destroy + if @node_type.destroy! + flash[:success] = '删除成功' + else + flash[:danger] = '删除失败' + end + redirect_to action_node_types_path + end + + private + + def find_node_type + @node_type = Action::NodeType.find(params[:id]) + end + + def node_types_params + if params.require(:action_node_type) + params.require(:action_node_type).permit(:name, :description, :sort_no) + else + params.permit(:name, :description, :sort_no) + end + end +end diff --git a/app/controllers/action/nodes_controller.rb b/app/controllers/action/nodes_controller.rb new file mode 100644 index 00000000..e1e7799f --- /dev/null +++ b/app/controllers/action/nodes_controller.rb @@ -0,0 +1,69 @@ +class Action::NodesController < ApplicationController + before_action :require_admin, except: [:index] + before_action :find_action_node, except: [:index, :create, :new] + + def index + @node_types = Action::NodeType.all + @no_type_nodes = Action::Node.where(action_node_types_id: nil) + respond_to do |format| + format.html { @nodes = Action::Node.all } + format.json + end + end + + def create + @node = Action::Node.new(node_params) + respond_to do |format| + if @node.save + format.html { redirect_to action_nodes_path, notice: '创建成功.' } + format.json { render_ok(data: @node.as_json) } + else + format.html { render :new } + format.json { render json: @node.errors, status: -1 } + end + end + end + + def new + @node = Action::Node.new + end + + def show + + end + + def edit + + end + + def update + @node.update(node_params) + respond_to do |format| + format.html { redirect_to action_nodes_path, notice: '更新成功.' } + format.json { render_ok(data: @node.as_json) } + end + end + + def destroy + if @node.destroy! + flash[:success] = '删除成功' + else + flash[:danger] = '删除失败' + end + redirect_to action_nodes_path + end + + private + + def find_action_node + @node = Action::Node.find(params[:id]) + end + + def node_params + if params.require(:action_node) + params.require(:action_node).permit(:name, :full_name, :description, :icon, :action_node_types_id, :is_local, :local_url, :yaml, :sort_no) + else + params.permit(:name, :full_name, :description, :icon, :action_node_types_id, :is_local, :local_url, :yaml, :sort_no) + end + end +end diff --git a/app/controllers/action/templates_controller.rb b/app/controllers/action/templates_controller.rb new file mode 100644 index 00000000..092d38d6 --- /dev/null +++ b/app/controllers/action/templates_controller.rb @@ -0,0 +1,68 @@ +class Action::TemplatesController < ApplicationController + before_action :require_admin, except: [:index] + before_action :find_action_template, except: [:index, :create, :new] + + def index + @templates = Action::Template.all + respond_to do |format| + format.html + format.json + end + end + + def create + @template = Action::Template.new(templates_params) + respond_to do |format| + if @template.save + format.html { redirect_to action_templates_path, notice: '创建成功.' } + format.json { render_ok(data: @template.as_json) } + else + format.html { render :new } + format.json { render json: @template.errors, status: -1 } + end + end + end + + def show + + end + + def new + @template = Action::Template.new + end + + def edit + + end + + def update + @template.update(templates_params) + respond_to do |format| + format.html { redirect_to action_templates_path, notice: '更新成功.' } + format.json { render_ok(data: @template.as_json) } + end + end + + def destroy + if @template.destroy! + flash[:success] = '删除成功' + else + flash[:danger] = '删除失败' + end + redirect_to action_templates_path + end + + private + + def find_action_template + @template = Action::Template.find(params[:id]) + end + + def templates_params + if params.require(:action_template) + params.require(:action_template).permit(:name, :description, :img, :sort_no, :json, :yaml) + else + params.permit(:name, :description, :img, :sort_no, :json, :yaml) + end + end +end diff --git a/app/helpers/action/node_helper.rb b/app/helpers/action/node_helper.rb new file mode 100644 index 00000000..05d08da2 --- /dev/null +++ b/app/helpers/action/node_helper.rb @@ -0,0 +1,2 @@ +module Action::NodeHelper +end diff --git a/app/models/action/node.rb b/app/models/action/node.rb new file mode 100644 index 00000000..69e45b3a --- /dev/null +++ b/app/models/action/node.rb @@ -0,0 +1,71 @@ +# == Schema Information +# +# Table name: action_nodes +# +# id :integer not null, primary key +# name :string(255) +# full_name :string(255) +# description :string(255) +# icon :string(255) +# action_node_types_id :integer +# is_local :boolean default("0") +# local_url :string(255) +# yaml :text(65535) +# sort_no :integer default("0") +# use_count :integer default("0") +# user_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_action_nodes_on_action_types_id (action_node_types_id) +# index_action_nodes_on_user_id (user_id) +# + +class Action::Node < ApplicationRecord + self.table_name = 'action_nodes' + default_scope { order(sort_no: :asc) } + + has_many :action_node_inputs, :class_name => 'Action::NodeInput', foreign_key: "action_nodes_id" + has_many :action_node_selects, :class_name => 'Action::NodeSelect', foreign_key: "action_nodes_id" + belongs_to :action_node_type, :class_name => 'Action::NodeType', foreign_key: "action_node_types_id" + + belongs_to :user, optional: true + + + # def content_yaml + # "foo".to_yaml + # <<~YAML + # - name: Set up JDK ${{ matrix.java }} + # uses: actions/setup-java@v3 + # with: + # distribution: 'temurin' + # java-version: ${{ matrix.java }} + # YAML + # end + + def yaml_hash + <<~YAML + name: Check dist + + on: + push: + branches: + - main + paths-ignore: + - '**.md' + pull_request: + paths-ignore: + - '**.md' + workflow_dispatch: + + jobs: + call-check-dist: + name: Check dist/ + uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main + with: + node-version: '20.x' + YAML + end +end diff --git a/app/models/action/node_input.rb b/app/models/action/node_input.rb new file mode 100644 index 00000000..4f382517 --- /dev/null +++ b/app/models/action/node_input.rb @@ -0,0 +1,27 @@ +# == Schema Information +# +# Table name: action_node_inputs +# +# id :integer not null, primary key +# action_nodes_id :integer +# name :string(255) +# input_type :string(255) +# description :string(255) +# is_required :boolean default("0") +# sort_no :string(255) default("0") +# user_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_action_node_inputs_on_action_nodes_id (action_nodes_id) +# index_action_node_inputs_on_user_id (user_id) +# + +class Action::NodeInput < ApplicationRecord + self.table_name = 'action_node_inputs' + default_scope { order(sort_no: :asc) } + + belongs_to :action_node, :class_name => 'Action::Node', foreign_key: "action_nodes_id" +end diff --git a/app/models/action/node_select.rb b/app/models/action/node_select.rb new file mode 100644 index 00000000..25be51f9 --- /dev/null +++ b/app/models/action/node_select.rb @@ -0,0 +1,39 @@ +# == Schema Information +# +# Table name: action_node_selects +# +# id :integer not null, primary key +# action_nodes_id :integer +# name :string(255) +# val :string(255) +# val_ext :string(255) +# description :string(255) +# download_url :string(255) +# sort_no :integer default("0") +# use_count :integer default("0") +# user_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_action_node_selects_on_action_nodes_id (action_nodes_id) +# index_action_node_selects_on_name (name) +# index_action_node_selects_on_user_id (user_id) +# + +class Action::NodeSelect < ApplicationRecord + self.table_name = 'action_node_selects' + default_scope { order(sort_no: :asc) } + + belongs_to :action_node, :class_name => 'Action::Node', foreign_key: "action_nodes_id" + belongs_to :user, optional: true + + def value + if self.val_ext.blank? + self.val + else + "#{self.val}@#{self.val_ext}" + end + end +end diff --git a/app/models/action/node_type.rb b/app/models/action/node_type.rb new file mode 100644 index 00000000..7ce78b0f --- /dev/null +++ b/app/models/action/node_type.rb @@ -0,0 +1,18 @@ +# == Schema Information +# +# Table name: action_node_types +# +# id :integer not null, primary key +# name :string(255) +# description :string(255) +# sort_no :integer +# created_at :datetime not null +# updated_at :datetime not null +# + +class Action::NodeType < ApplicationRecord + self.table_name = 'action_node_types' + default_scope { order(sort_no: :asc) } + + has_many :action_nodes, :class_name => 'Action::Node', foreign_key: "action_node_types_id" +end diff --git a/app/models/action/template.rb b/app/models/action/template.rb new file mode 100644 index 00000000..34b669f6 --- /dev/null +++ b/app/models/action/template.rb @@ -0,0 +1,20 @@ +# == Schema Information +# +# Table name: action_templates +# +# id :integer not null, primary key +# name :string(255) +# description :string(255) +# img :string(255) +# sort_no :string(255) default("0") +# json :text(65535) +# yaml :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# + +class Action::Template < ApplicationRecord + self.table_name = 'action_templates' + default_scope { order(sort_no: :asc) } + +end diff --git a/app/views/action/node_inputs/_form.html.erb b/app/views/action/node_inputs/_form.html.erb new file mode 100644 index 00000000..deccfa69 --- /dev/null +++ b/app/views/action/node_inputs/_form.html.erb @@ -0,0 +1,39 @@ +<%= form_with(model: node_input, url: action_node_node_inputs_path(@node), local: true) do |form| %> + <% if node_input.errors.any? %> +
+

<%= pluralize(node_input.errors.count, "error") %> prohibited this node_input from being saved:

+ +
    + <% node_input.errors.full_messages.each do |message| %> +
  • <%= message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :name, "参数名称" %> + <%= form.text_field :name %> +
+
+ <%= form.label :input_type, "参数类型" %> + <%= form.text_field :input_type %> +
+
+ <%= form.label :description, "描述" %> + <%= form.text_area :description, rows: 5, :style => 'width:800px;' %> +
+
+ <%= form.label :is_required, "是否必填项" %> + <%= form.check_box("is_required", {}, "true", "false") %> +
+
+ <%= form.label :sort_no, "排序号" %> + <%= form.text_field :sort_no %> +
+ +
+ + <%= form.submit("保存") %> +
+<% end %> diff --git a/app/views/action/node_inputs/_node_input.json.jbuilder b/app/views/action/node_inputs/_node_input.json.jbuilder new file mode 100644 index 00000000..9f0a6074 --- /dev/null +++ b/app/views/action/node_inputs/_node_input.json.jbuilder @@ -0,0 +1,6 @@ +json.extract! node_input, :id, :name, :input_type, :description +if node_input.input_type.to_s == "select" + json.select node.action_node_selects do |node_select| + json.partial! "node_select", locals: { node_select: node_select, node: node } + end +end diff --git a/app/views/action/node_inputs/_node_select.json.jbuilder b/app/views/action/node_inputs/_node_select.json.jbuilder new file mode 100644 index 00000000..4e90508e --- /dev/null +++ b/app/views/action/node_inputs/_node_select.json.jbuilder @@ -0,0 +1,4 @@ +json.extract! node_select, :id, :version +if node.is_local? + json.local_url node.local_url +end diff --git a/app/views/action/node_inputs/edit.html.erb b/app/views/action/node_inputs/edit.html.erb new file mode 100644 index 00000000..6ae9f8a7 --- /dev/null +++ b/app/views/action/node_inputs/edit.html.erb @@ -0,0 +1,47 @@ +

编辑 + +

+ +<%= form_with(model: @node_input, url: action_node_node_input_path(@node,@node_input), local: true) do |form| %> + <% if @node_input.errors.any? %> +
+

<%= pluralize(@node_input.errors.count, "error") %> prohibited this node_input from being saved:

+ +
    + <% @node_input.errors.full_messages.each do |message| %> +
  • <%= message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :name, "参数名称" %> + <%= form.text_field :name %> +
+
+ <%= form.label :input_type, "参数类型" %> + <%= form.text_field :input_type %> +
+
+ <%= form.label :description, "描述" %> + <%= form.text_area :description, rows: 5, :style => 'width:800px;' %> +
+
+ <%= form.label :is_required, "是否必填项" %> + <%= form.check_box("is_required", {}, "true", "false") %> +
+ +
+ <%= form.label :sort_no, "排序号" %> + <%= form.text_field :sort_no %> +
+ +
+ + <%= form.submit("保存赛事") %> +
+<% end %> + + +<%= link_to 'Back', action_node_node_inputs_path(@node) %> diff --git a/app/views/action/node_inputs/index.html.erb b/app/views/action/node_inputs/index.html.erb new file mode 100644 index 00000000..f070b3dd --- /dev/null +++ b/app/views/action/node_inputs/index.html.erb @@ -0,0 +1,46 @@ +<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + +

action 节点参数配置<%= link_to '>>>Back action节点首页', action_nodes_path %> + +

+

说明:该界面适用于action 节点参数配置

+ + + + + + + + + + + + + + + + + <% @node_inputs.each do |info| %> + + + + + + + + + + + + <% end %> + +
ID参数名称参数输入类型参数描述是否必填项排序号更新时间操作
<%= info.id %><%= info.name %><%= info.input_type %> + <% if info.input_type == "select" %> + <%= select_tag(:version, options_for_select(@node.action_node_selects.map(&:value)), class: 'form-control') %> + <%= link_to '修改选择项', edit_action_node_node_input_path(@node.id, info) %> + <% end %> + <%= info.description %><%= info.is_required %><%= info.sort_no %><%= info.updated_at&.strftime('%Y-%m-%d %H:%M') %><%= link_to '编辑', edit_action_node_node_input_path(@node.id, info) %><%= link_to 'Destroy', action_node_node_input_path(@node, info), method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to '新增', new_action_node_node_input_path(@node) %> diff --git a/app/views/action/node_inputs/index.json.jbuilder b/app/views/action/node_inputs/index.json.jbuilder new file mode 100644 index 00000000..3909639c --- /dev/null +++ b/app/views/action/node_inputs/index.json.jbuilder @@ -0,0 +1,20 @@ +json.types @node_types.each do |node_type| + if node_type.name.to_s == "未分类" + json.extract! node_type, :id, :name + json.nodes @no_type_nodes do |node| + json.extract! node, :id, :name, :full_name, :description, :action_node_types_id, :yaml, :sort_no, :use_count + json.inputs node.action_node_inputs do |node_input| + json.partial! "node_input", locals: { node_input: node_input, node: node } + end + end + else + json.extract! node_type, :id, :name + json.nodes node_type.action_nodes do |node| + json.extract! node, :id, :name, :full_name, :description, :action_node_types_id, :yaml, :sort_no, :use_count + json.inputs node.action_node_inputs do |node_input| + json.partial! "node_input", locals: { node_input: node_input, node: node } + end + end + end + +end diff --git a/app/views/action/node_inputs/new.html.erb b/app/views/action/node_inputs/new.html.erb new file mode 100644 index 00000000..965ae937 --- /dev/null +++ b/app/views/action/node_inputs/new.html.erb @@ -0,0 +1,5 @@ +

新增

+ +<%= render 'form', node_input: @node_input %> + +<%= link_to 'Back', action_node_node_inputs_path(@node) %> \ No newline at end of file diff --git a/app/views/action/node_inputs/show.json.jbuilder b/app/views/action/node_inputs/show.json.jbuilder new file mode 100644 index 00000000..64548544 --- /dev/null +++ b/app/views/action/node_inputs/show.json.jbuilder @@ -0,0 +1,7 @@ +json.status 0 +json.message "success" + +json.extract! @node, :id, :name, :full_name, :description, :action_node_types_id, :is_local, :local_url, :yaml, :sort_no, :use_count +json.inputs @node.action_node_inputs do |node_input| + json.partial! "node_input", locals: { node_input: node_input, node: @node } +end \ No newline at end of file diff --git a/app/views/action/node_selects/_form.html.erb b/app/views/action/node_selects/_form.html.erb new file mode 100644 index 00000000..7dd4a663 --- /dev/null +++ b/app/views/action/node_selects/_form.html.erb @@ -0,0 +1,39 @@ +<%= form_with(model: node_select, url: action_node_node_selects_path(@node), local: true) do |form| %> + <% if node_select.errors.any? %> +
+

<%= pluralize(node_select.errors.count, "error") %> prohibited this node select from being saved:

+ +
    + <% node_select.errors.full_messages.each do |message| %> +
  • <%= message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :name, "选择项名称" %> + <%= form.text_field :name %> +
+
+ <%= form.label :val, "选择项值" %> + <%= form.text_field :val %> +
+
+ <%= form.label :val_ext, "选择项值扩展" %> + <%= form.text_field :val_ext %> +
+
+ <%= form.label :description, "描述" %> + <%= form.text_area :description, rows: 5, :style => 'width:800px;' %> +
+
+ <%= form.label :sort_no, "排序号" %> + <%= form.text_field :sort_no %> +
+ +
+ + <%= form.submit("保存") %> +
+<% end %> diff --git a/app/views/action/node_selects/edit.html.erb b/app/views/action/node_selects/edit.html.erb new file mode 100644 index 00000000..fca5b3ce --- /dev/null +++ b/app/views/action/node_selects/edit.html.erb @@ -0,0 +1,46 @@ +

编辑 + +

+ +<%= form_with(model: @node_select, url: action_node_node_select_path(@node,@node_select), local: true) do |form| %> + <% if @node_select.errors.any? %> +
+

<%= pluralize(@node_select.errors.count, "error") %> prohibited this node select from being saved:

+ +
    + <% @node_select.errors.full_messages.each do |message| %> +
  • <%= message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :name, "选择项名称" %> + <%= form.text_field :name %> +
+
+ <%= form.label :val, "选择项值" %> + <%= form.text_field :val %> +
+
+ <%= form.label :val_ext, "选择项值扩展" %> + <%= form.text_field :val_ext %> +
+
+ <%= form.label :description, "描述" %> + <%= form.text_area :description, rows: 5, :style => 'width:800px;' %> +
+
+ <%= form.label :sort_no, "排序号" %> + <%= form.text_field :sort_no %> +
+ +
+ + <%= form.submit("保存") %> +
+<% end %> + + +<%= link_to 'Back', action_node_node_inputs_path(@node) %> diff --git a/app/views/action/node_selects/index.html.erb b/app/views/action/node_selects/index.html.erb new file mode 100644 index 00000000..09d427d9 --- /dev/null +++ b/app/views/action/node_selects/index.html.erb @@ -0,0 +1,43 @@ +<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + +

action 节点参数配置<%= link_to '>>>Back action节点首页', action_nodes_path %> + +

+

说明:该界面适用于action 节点参数配置

+ + + + + + + + + + + + + + + + + + <% @node_selects.each do |info| %> + + + + + + + + + + + + + <% end %> + +
ID选择项名称选择项值选择项值扩展描述下载地址排序号更新时间操作
<%= info.id %><%= info.name %><%= info.val %><%= info.val_ext %><%= info.description %><%= info.download_url %><%= info.sort_no %><%= info.updated_at&.strftime('%Y-%m-%d %H:%M') %><%= link_to '编辑', edit_action_node_node_select_path(@node.id, info) %><%= link_to 'Destroy', action_node_node_select_path(@node, info), method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to '新增', new_action_node_node_input_path(@node) %> diff --git a/app/views/action/node_selects/new.html.erb b/app/views/action/node_selects/new.html.erb new file mode 100644 index 00000000..c2fcaf12 --- /dev/null +++ b/app/views/action/node_selects/new.html.erb @@ -0,0 +1,5 @@ +

新增

+ +<%= render 'form', node_select: @node_select %> + +<%= link_to 'Back', action_node_node_selects_path(@node) %> \ No newline at end of file diff --git a/app/views/action/node_types/_form.html.erb b/app/views/action/node_types/_form.html.erb new file mode 100644 index 00000000..9a6a5d69 --- /dev/null +++ b/app/views/action/node_types/_form.html.erb @@ -0,0 +1,31 @@ +<%= form_with(model: node_type, local: true) do |form| %> + <% if node_type.errors.any? %> +
+

<%= pluralize(node_type.errors.count, "error") %> prohibited this node type from being saved:

+ +
    + <% node_type.errors.full_messages.each do |message| %> +
  • <%= message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :name, "分类名称" %> + <%= form.text_field :name %> +
+
+ <%= form.label :description, "描述" %> + <%= form.text_area :description, rows: 5, :style => 'width:800px;' %> +
+
+ <%= form.label :sort_no, "排序号" %> + <%= form.text_field :sort_no %> +
+ +
+ + <%= form.submit("保存") %> +
+<% end %> diff --git a/app/views/action/node_types/edit.html.erb b/app/views/action/node_types/edit.html.erb new file mode 100644 index 00000000..9a44930a --- /dev/null +++ b/app/views/action/node_types/edit.html.erb @@ -0,0 +1,7 @@ +

编辑 + +

+<%= render 'form', node_type: @node_type %> + + +<%= link_to 'Back', action_node_types_path %> diff --git a/app/views/action/node_types/index.html.erb b/app/views/action/node_types/index.html.erb new file mode 100644 index 00000000..812d06a2 --- /dev/null +++ b/app/views/action/node_types/index.html.erb @@ -0,0 +1,37 @@ +<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + +

action 节点分类配置<%= link_to '>>>Back action节点首页', action_nodes_path %> + +

+

说明:该界面适用于action 节点分类配置

+ + + + + + + + + + + + + + + <% @node_types.each do |info| %> + + + + + + + + + + <% end %> + +
ID分类名称描述排序号更新时间操作
<%= info.id %><%= info.name %><%= info.description %><%= info.sort_no %><%= info.updated_at&.strftime('%Y-%m-%d %H:%M') %><%= link_to '编辑', edit_action_node_type_path(info) %><%= link_to 'Destroy', action_node_type_path(info), method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to '新增', new_action_node_type_path %> diff --git a/app/views/action/node_types/new.html.erb b/app/views/action/node_types/new.html.erb new file mode 100644 index 00000000..1e053b9d --- /dev/null +++ b/app/views/action/node_types/new.html.erb @@ -0,0 +1,5 @@ +

新增

+ +<%= render 'form', node_type: @node_type %> + +<%= link_to 'Back', action_node_types_path %> \ No newline at end of file diff --git a/app/views/action/nodes/_form.html.erb b/app/views/action/nodes/_form.html.erb new file mode 100644 index 00000000..4e40f0ff --- /dev/null +++ b/app/views/action/nodes/_form.html.erb @@ -0,0 +1,63 @@ +<%= form_with(model: node, local: true) do |form| %> + <%# if node.errors.any? %> + + + + + <%# node.errors.full_messages.each do |message| %> + + <%# end %> + + + <%# end %> +
+ + <%= form.select :action_node_types_id, options_for_select(Action::NodeType.all.map { |key| [key.name, key.id]}, node.action_node_types_id), {}, class: "form-control" %> +
+ +
+ <%= form.label :name, "节点名称" %> + <%= form.text_field :name %> +
+
+ <%= form.label :full_name, "节点全称" %> + <%= form.text_field :full_name %> +
+ +
+ <%= form.label :description, "描述" %> + <%= form.text_area :description, rows: 5, :style => 'width:800px;' %> +
+ +
+ <%= form.label :icon, "Icon图标" %> + <%= form.text_field :icon %> +
+ +
+ <%= form.label :is_local, "是否本地化" %> + <%= form.check_box("is_local", {}, "true", "false") %> +
+ +
+ <%= form.label :local_url, "本地化地址" %> + <%= form.text_field :local_url, :style => 'width:1200px;' %> +
+ + + +
+ <%= form.label :sort_no, "排序号" %> + <%= form.text_field :sort_no %> +
+ +
+ <%= form.label :yaml, "yaml语法代码" %> + <%= form.text_area :yaml, rows: 5, :style => 'width:1200px;' %> +
+ +
+ + <%= form.submit("保存") %> +
+<% end %> diff --git a/app/views/action/nodes/_node_input.json.jbuilder b/app/views/action/nodes/_node_input.json.jbuilder new file mode 100644 index 00000000..9f0a6074 --- /dev/null +++ b/app/views/action/nodes/_node_input.json.jbuilder @@ -0,0 +1,6 @@ +json.extract! node_input, :id, :name, :input_type, :description +if node_input.input_type.to_s == "select" + json.select node.action_node_selects do |node_select| + json.partial! "node_select", locals: { node_select: node_select, node: node } + end +end diff --git a/app/views/action/nodes/_node_select.json.jbuilder b/app/views/action/nodes/_node_select.json.jbuilder new file mode 100644 index 00000000..897e3f8e --- /dev/null +++ b/app/views/action/nodes/_node_select.json.jbuilder @@ -0,0 +1,4 @@ +json.extract! node_select, :id, :val +if node.is_local? + json.local_url node.local_url +end diff --git a/app/views/action/nodes/edit.html.erb b/app/views/action/nodes/edit.html.erb new file mode 100644 index 00000000..ee9cb094 --- /dev/null +++ b/app/views/action/nodes/edit.html.erb @@ -0,0 +1,7 @@ +

编辑 + +

+ +<%= render 'form', node: @node %> + +<%= link_to 'Back', action_nodes_path %> diff --git a/app/views/action/nodes/index.html.erb b/app/views/action/nodes/index.html.erb new file mode 100644 index 00000000..763a8e46 --- /dev/null +++ b/app/views/action/nodes/index.html.erb @@ -0,0 +1,49 @@ +<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + +

action 节点配置

+

>>前往节点分类配置

+

>>前往模板配置

+

说明:该界面适用于action 节点配置参数配置

+ + + + + + + + + + + + + + + + + + + + + <% @nodes.each do |info| %> + + + + + + + + + + + + + + + + <% end %> + +
ID节点名称节点全称节点描述分类排序号更新时间操作
<%= info.id %><%= info.name %><%= info.full_name %><%= info.description %><%= info.action_node_type&.name %><%= info.sort_no %><%= info.updated_at&.strftime('%Y-%m-%d %H:%M') %><%= link_to '编辑', edit_action_node_path(info) %><%= link_to '参数列表', action_node_node_inputs_path(info) %><%= link_to 'Destroy', info, method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to '新增', new_action_node_path %> diff --git a/app/views/action/nodes/index.json.jbuilder b/app/views/action/nodes/index.json.jbuilder new file mode 100644 index 00000000..3909639c --- /dev/null +++ b/app/views/action/nodes/index.json.jbuilder @@ -0,0 +1,20 @@ +json.types @node_types.each do |node_type| + if node_type.name.to_s == "未分类" + json.extract! node_type, :id, :name + json.nodes @no_type_nodes do |node| + json.extract! node, :id, :name, :full_name, :description, :action_node_types_id, :yaml, :sort_no, :use_count + json.inputs node.action_node_inputs do |node_input| + json.partial! "node_input", locals: { node_input: node_input, node: node } + end + end + else + json.extract! node_type, :id, :name + json.nodes node_type.action_nodes do |node| + json.extract! node, :id, :name, :full_name, :description, :action_node_types_id, :yaml, :sort_no, :use_count + json.inputs node.action_node_inputs do |node_input| + json.partial! "node_input", locals: { node_input: node_input, node: node } + end + end + end + +end diff --git a/app/views/action/nodes/new.html.erb b/app/views/action/nodes/new.html.erb new file mode 100644 index 00000000..4a5d2fae --- /dev/null +++ b/app/views/action/nodes/new.html.erb @@ -0,0 +1,5 @@ +

新增

+ +<%= render 'form', node: @node %> + +<%= link_to 'Back', action_nodes_path %> \ No newline at end of file diff --git a/app/views/action/nodes/show.json.jbuilder b/app/views/action/nodes/show.json.jbuilder new file mode 100644 index 00000000..64548544 --- /dev/null +++ b/app/views/action/nodes/show.json.jbuilder @@ -0,0 +1,7 @@ +json.status 0 +json.message "success" + +json.extract! @node, :id, :name, :full_name, :description, :action_node_types_id, :is_local, :local_url, :yaml, :sort_no, :use_count +json.inputs @node.action_node_inputs do |node_input| + json.partial! "node_input", locals: { node_input: node_input, node: @node } +end \ No newline at end of file diff --git a/app/views/action/templates/_form.html.erb b/app/views/action/templates/_form.html.erb new file mode 100644 index 00000000..7d93cb76 --- /dev/null +++ b/app/views/action/templates/_form.html.erb @@ -0,0 +1,43 @@ +<%= form_with(model: template, local: true) do |form| %> + <% if template.errors.any? %> +
+

<%= pluralize(template.errors.count, "error") %> prohibited this node type from being saved:

+ +
    + <% template.errors.full_messages.each do |message| %> +
  • <%= message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :name, "模板名称" %> + <%= form.text_field :name %> +
+
+ <%= form.label :description, "描述" %> + <%= form.text_area :description, rows: 5, :style => 'width:800px;' %> +
+
+ <%= form.label :img, "配图" %> + <%= form.text_field :img %> +
+
+ <%= form.label :sort_no, "排序号" %> + <%= form.text_field :sort_no %> +
+
+ <%= form.label :yaml, "yaml语法代码" %> + <%= form.text_area :yaml, rows: 5, :style => 'width:1200px;' %> +
+
+ <%= form.label :json, "json语法代码" %> + <%= form.text_area :json, rows: 5, :style => 'width:1200px;' %> +
+ +
+ + <%= form.submit("保存") %> +
+<% end %> diff --git a/app/views/action/templates/edit.html.erb b/app/views/action/templates/edit.html.erb new file mode 100644 index 00000000..f9c1effc --- /dev/null +++ b/app/views/action/templates/edit.html.erb @@ -0,0 +1,6 @@ +

编辑 + +

+<%= render 'form', template: @template %> + +<%= link_to 'Back', action_templates_path %> diff --git a/app/views/action/templates/index.html.erb b/app/views/action/templates/index.html.erb new file mode 100644 index 00000000..b71aaede --- /dev/null +++ b/app/views/action/templates/index.html.erb @@ -0,0 +1,37 @@ +<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + +

action 模板配置<%= link_to '>>>Back action节点首页', action_nodes_path %> + +

+

说明:该界面适用于action 模板配置

+ + + + + + + + + + + + + + + <% @templates.each do |info| %> + + + + + + + + + + <% end %> + +
ID模板名称描述排序号更新时间操作
<%= info.id %><%= info.name %><%= info.description %><%= info.sort_no %><%= info.updated_at&.strftime('%Y-%m-%d %H:%M') %><%= link_to '编辑', edit_action_template_path(info) %><%= link_to 'Destroy', action_template_path(info), method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to '新增', new_action_template_path %> diff --git a/app/views/action/templates/index.json.jbuilder b/app/views/action/templates/index.json.jbuilder new file mode 100644 index 00000000..da534c84 --- /dev/null +++ b/app/views/action/templates/index.json.jbuilder @@ -0,0 +1,3 @@ +json.templates @templates.each do |tpl| + json.extract! tpl, :id, :name, :description, :img, :sort_no, :json, :yaml +end diff --git a/app/views/action/templates/new.html.erb b/app/views/action/templates/new.html.erb new file mode 100644 index 00000000..e67c6a67 --- /dev/null +++ b/app/views/action/templates/new.html.erb @@ -0,0 +1,5 @@ +

新增

+ +<%= render 'form', template: @template %> + +<%= link_to 'Back', action_templates_path %> \ No newline at end of file diff --git a/app/views/action/templates/show.json.jbuilder b/app/views/action/templates/show.json.jbuilder new file mode 100644 index 00000000..5db67424 --- /dev/null +++ b/app/views/action/templates/show.json.jbuilder @@ -0,0 +1 @@ +json.extract! @template, :id, :name, :description, :img, :sort_no, :json, :yaml \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index b5f5c75c..478531d2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -510,6 +510,19 @@ Rails.application.routes.draw do end end + # scope module: :action do + # + # end + + namespace :action do + resources :nodes do + resources :node_inputs + resources :node_selects + end + resources :node_types + resources :templates + end + # Project Area START scope "/:owner/:repo",constraints: { repo: /[^\/]+/ } do scope do @@ -1095,15 +1108,15 @@ Rails.application.routes.draw do resources :sub_repertoires, only: [:index, :create, :edit, :update, :destroy] resources :tag_repertoires, only: [:index, :create, :edit, :update, :destroy] - resources :salesmans, only: [:index, :create, :edit, :update, :destroy] do - post :batch_add, on: :collection - end - resources :salesman_channels, only: [:index, :create, :edit, :update, :destroy] do - post :batch_add, on: :collection - end - resources :salesman_customers, only: [:index, :create, :edit, :update, :destroy] do - post :batch_add, on: :collection - end + # resources :salesmans, only: [:index, :create, :edit, :update, :destroy] do + # post :batch_add, on: :collection + # end + # resources :salesman_channels, only: [:index, :create, :edit, :update, :destroy] do + # post :batch_add, on: :collection + # end + # resources :salesman_customers, only: [:index, :create, :edit, :update, :destroy] do + # post :batch_add, on: :collection + # end end diff --git a/db/migrate/20240408010101_create_action_node_types.rb b/db/migrate/20240408010101_create_action_node_types.rb new file mode 100644 index 00000000..b9c53078 --- /dev/null +++ b/db/migrate/20240408010101_create_action_node_types.rb @@ -0,0 +1,10 @@ +class CreateActionNodeTypes < ActiveRecord::Migration[5.2] + def change + create_table :action_node_types do |t| + t.string :name + t.string :description + t.integer :sort_no, default: 0 + t.timestamps + end + end +end diff --git a/db/migrate/20240408010102_create_action_nodes.rb b/db/migrate/20240408010102_create_action_nodes.rb new file mode 100644 index 00000000..67331e4d --- /dev/null +++ b/db/migrate/20240408010102_create_action_nodes.rb @@ -0,0 +1,18 @@ +class CreateActionNodes < ActiveRecord::Migration[5.2] + def change + create_table :action_nodes do |t| + t.string :name + t.string :full_name + t.string :description + t.string :icon + t.references :action_node_types + t.boolean :is_local, default: false + t.string :local_url + t.text :yaml + t.integer :sort_no, default: 0 + t.integer :use_count, default: 0 + t.references :user + t.timestamps + end + end +end diff --git a/db/migrate/20240408010213_create_action_node_selects.rb b/db/migrate/20240408010213_create_action_node_selects.rb new file mode 100644 index 00000000..5f49bcd8 --- /dev/null +++ b/db/migrate/20240408010213_create_action_node_selects.rb @@ -0,0 +1,17 @@ +class CreateActionNodeSelects < ActiveRecord::Migration[5.2] + def change + create_table :action_node_selects do |t| + t.references :action_nodes + t.string :name + t.string :val + t.string :val_ext + t.string :description + t.string :download_url + t.integer :sort_no, default: 0 + t.integer :use_count, default: 0 + t.references :user + t.timestamps + t.index :name + end + end +end diff --git a/db/migrate/20240408010227_create_action_node_inputs.rb b/db/migrate/20240408010227_create_action_node_inputs.rb new file mode 100644 index 00000000..501844e2 --- /dev/null +++ b/db/migrate/20240408010227_create_action_node_inputs.rb @@ -0,0 +1,14 @@ +class CreateActionNodeInputs < ActiveRecord::Migration[5.2] + def change + create_table :action_node_inputs do |t| + t.references :action_nodes + t.string :name + t.string :input_type + t.string :description + t.boolean :is_required, default: false + t.string :sort_no, default: 0 + t.references :user + t.timestamps + end + end +end diff --git a/db/migrate/20240408010233_create_action_templates.rb b/db/migrate/20240408010233_create_action_templates.rb new file mode 100644 index 00000000..47d33509 --- /dev/null +++ b/db/migrate/20240408010233_create_action_templates.rb @@ -0,0 +1,13 @@ +class CreateActionTemplates < ActiveRecord::Migration[5.2] + def change + create_table :action_templates do |t| + t.string :name + t.string :description + t.string :img + t.string :sort_no, default: 0 + t.text :json + t.text :yaml + t.timestamps + end + end +end diff --git a/lib/tasks/actions_download.rake b/lib/tasks/actions_download.rake new file mode 100644 index 00000000..bad2d535 --- /dev/null +++ b/lib/tasks/actions_download.rake @@ -0,0 +1,82 @@ +# actions 下载包 +# node go java +namespace :actions_download do + + task go: :environment do + # curl -X GET --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/repos/mindspore/mindspore/issues?access_token=5ccebd935915fb6cfcae634b161047a2&state=open&sort=created&direction=desc&page=1&per_page=10' + # api_url = "https://raw.githubusercontent.com/actions/go-versions/main/versions-manifest.json" + api_url = "https://testgitea2.trustie.net/actions/go-versions/raw/branch/main/versions-manifest.json" + uri = URI.parse(api_url) + response = Net::HTTP.get_response(uri) + puts "gitee api response.code ===== #{response.code}" + lists = JSON.parse(response.body) + puts "lists.size =====#{lists.size}" + lists.each do |data| + version_arr = data['version'].to_s.split(".") + if version_arr[0].to_i == 1 && version_arr[1].to_i >= 18 + action_node_select = Action::NodeSelect.find_or_initialize_by(name: "go-version", val: data["version"]) + puts data["version"] + data['files'].each do |file| + if file['platform'] == "linux" + puts "download_url==#{file['download_url']}" + action_node_select.download_url = file['download_url'] + end + end + action_node_select.action_nodes_id=1 + action_node_select.save + end + end + end + + task node: :environment do + # curl -X GET --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/repos/mindspore/mindspore/issues?access_token=5ccebd935915fb6cfcae634b161047a2&state=open&sort=created&direction=desc&page=1&per_page=10' + # api_url = "https://raw.githubusercontent.com/actions/go-versions/main/versions-manifest.json" + api_url = "https://testgitea2.trustie.net/actions/node-versions/raw/branch/main/versions-manifest.json" + uri = URI.parse(api_url) + response = Net::HTTP.get_response(uri) + puts "gitee api response.code ===== #{response.code}" + lists = JSON.parse(response.body) + puts "lists.size =====#{lists.size}" + lists.each do |data| + version_arr = data['version'].to_s.split(".") + if version_arr[0].to_i >= 16 + puts data["version"] + action_node_select = Action::NodeSelect.find_or_initialize_by(name: "node-version", val: data["version"]) + data['files'].each do |file| + if file['platform'] == "linux" + puts "download_url==#{file['download_url']}" + action_node_select.download_url = file['download_url'] + end + end + action_node_select.action_nodes_id=2 + action_node_select.save + end + end + end + + task java: :environment do + # curl -X GET --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/repos/mindspore/mindspore/issues?access_token=5ccebd935915fb6cfcae634b161047a2&state=open&sort=created&direction=desc&page=1&per_page=10' + # api_url = "https://raw.githubusercontent.com/actions/go-versions/main/versions-manifest.json" + [0, 1, 2].each do |page| + api_url = "https://api.adoptium.net/v3/assets/version/%5B1.0,100.0%5D?project=jdk&vendor=adoptium&heap_size=normal&sort_method=DEFAULT&sort_order=DESC&os=linux&architecture=x64&image_type=jdk&release_type=ga&jvm_impl=hotspot&page_size=20&page=#{page}" + uri = URI.parse(api_url) + response = Net::HTTP.get_response(uri) + puts "gitee api response.code ===== #{response.code}" + lists = JSON.parse(response.body) + puts "lists.size =====#{lists.size}" + lists.each do |data| + puts data["release_name"] + puts "#{data['version_data']['major']}@#{data['version_data']['openjdk_version']}" + action_node_select = Action::NodeSelect.find_or_initialize_by(name: "java-version", val: "#{data['version_data']['major']}", val_ext: "#{data['version_data']['openjdk_version']}") + data['binaries'].each do |file| + puts "download_url==#{file['package']['link']}" + action_node_select.download_url = file['package']['link'] + end + action_node_select.action_nodes_id=5 + action_node_select.save + end + end + + end + +end \ No newline at end of file From 2f880fe0688be9813d6cc74acfffc0aad8cc8b9e Mon Sep 17 00:00:00 2001 From: xxq250 Date: Tue, 7 May 2024 14:38:19 +0800 Subject: [PATCH 29/42] =?UTF-8?q?=E6=B5=81=E6=B0=B4=E7=BA=BF=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=AE=A1=E7=90=86=E5=92=8C=E6=A8=A1=E6=9D=BF=E7=AE=A1?= =?UTF-8?q?=E7=90=86,is=5Frequired?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/action/nodes/_node_input.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/action/nodes/_node_input.json.jbuilder b/app/views/action/nodes/_node_input.json.jbuilder index 9f0a6074..c41f93c7 100644 --- a/app/views/action/nodes/_node_input.json.jbuilder +++ b/app/views/action/nodes/_node_input.json.jbuilder @@ -1,4 +1,4 @@ -json.extract! node_input, :id, :name, :input_type, :description +json.extract! node_input, :id, :name, :input_type, :description, :is_required if node_input.input_type.to_s == "select" json.select node.action_node_selects do |node_select| json.partial! "node_select", locals: { node_select: node_select, node: node } From f0622b62619da35a3d1f161b8903af79814adc61 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 7 May 2024 14:54:31 +0800 Subject: [PATCH 30/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E8=A7=A6?= =?UTF-8?q?=E5=8F=91webhook=E6=96=B0=E5=8A=A0=E5=8F=82=E6=95=B0=E4=BB=A5?= =?UTF-8?q?=E5=8C=BA=E5=88=AB=E4=B8=8D=E5=90=8C=E6=9D=A5=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 96e14faf..bd7bc204 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -24,7 +24,11 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController def sync return render_error("请输入正确的同步方向!") if params[:sync_direction].blank? - @sync_repositories = SyncRepository.where(project: @project, sync_direction: params[:sync_direction]) + if params[:repo_type].present? + @sync_repositories = SyncRepository.where(project: @project, type: params[:repo_type], sync_direction: params[:sync_direction]) + else + @sync_repositories = SyncRepository.where(project: @project, sync_direction: params[:sync_direction]) + end @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories, enable: true) # 全部分支同步暂时不做 # @sync_repositories.each do |item| From ff57561aad69ccefc5ff3656dea1518ca0290ca5 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 7 May 2024 15:45:05 +0800 Subject: [PATCH 31/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E4=BC=A0?= =?UTF-8?q?=E8=87=B3reposyncer=E4=BB=93=E5=BA=93=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E4=B8=AD=E4=BD=BF=E7=94=A8id=E5=8C=BA=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories/create_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index 75d7f7e7..d5cb05a6 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -87,9 +87,9 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService def repo_name(sync_direction) if type == "SyncRepositories::Gitee" - return "gitee:#{project.owner&.login}:#{project.identifier}:#{sync_granularity}:#{sync_direction}" + return "gitee:#{project.id}:#{sync_granularity}:#{sync_direction}" else - return "github:#{project.owner&.login}:#{project.identifier}:#{sync_granularity}:#{sync_direction}" + return "github:#{project.id}:#{sync_granularity}:#{sync_direction}" end end From 08a50280068009c69c5bf7d76dd46449cd5d7e2f Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 8 May 2024 09:45:04 +0800 Subject: [PATCH 32/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Awebhook?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 3 ++- .../api/v1/projects/sync_repositories/create_service.rb | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index bd7bc204..1c98309d 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -29,7 +29,8 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController else @sync_repositories = SyncRepository.where(project: @project, sync_direction: params[:sync_direction]) end - @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories, enable: true) + branch = params[:ref].split("refs/heads/")[-1] + @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories, gitlink_branch_name: branch, enable: true) # 全部分支同步暂时不做 # @sync_repositories.each do |item| # TouchSyncJob.perform_later(item) diff --git a/app/services/api/v1/projects/sync_repositories/create_service.rb b/app/services/api/v1/projects/sync_repositories/create_service.rb index d5cb05a6..6b64efab 100644 --- a/app/services/api/v1/projects/sync_repositories/create_service.rb +++ b/app/services/api/v1/projects/sync_repositories/create_service.rb @@ -73,11 +73,17 @@ class Api::V1::Projects::SyncRepositories::CreateService < ApplicationService end def create_webhook + url = "" + if type == "SyncRepositories::Gitee" + url = "#{Rails.application.config_for(:configuration)['platform_url']}/api/v1/#{project&.owner&.login}/#{project&.identifier}/sync_repositories/sync?sync_direction=1&repo_type=SyncRepositories::Gitee" + else + url = "#{Rails.application.config_for(:configuration)['platform_url']}/api/v1/#{project&.owner&.login}/#{project&.identifier}/sync_repositories/sync?sync_direction=1&repo_type=SyncRepositories::Github" + end webhook_params = { active: true, branch_filter: '*', http_method: 'POST', - url: "#{Rails.application.config_for(:configuration)['platform_url']}/api/v1/#{project&.owner&.login}/#{project&.identifier}/sync_repositories/sync?sync_direction=1", + url: url, content_type: 'json', type: 'reposync', events: ["push"] From b3a51f2f74aca307b347c769c9c60a4c09701223 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 8 May 2024 10:34:40 +0800 Subject: [PATCH 33/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories/history.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/api/v1/projects/sync_repositories/history.json.jbuilder b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder index fa211d9b..37d4e239 100644 --- a/app/views/api/v1/projects/sync_repositories/history.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder @@ -8,4 +8,5 @@ json.logs @reposync_branch_logs.each do |log| json.commit_id log['commit_id'] json.sync_time log['update_at'] json.log log['log'] + json.sync_status log['log'].include?("************ 分支同步完成 ************") ? 'success' : "failure" end \ No newline at end of file From a98fe055992006895fbae919aad4ba881fb07a62 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 8 May 2024 11:13:02 +0800 Subject: [PATCH 34/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E5=90=8C=E6=AD=A5=E6=96=B9=E5=90=91=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/sync_repositories_controller.rb | 6 +++++- app/models/sync_repository_branch.rb | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index 1c98309d..ec01ed84 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -30,7 +30,11 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController @sync_repositories = SyncRepository.where(project: @project, sync_direction: params[:sync_direction]) end branch = params[:ref].split("refs/heads/")[-1] - @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories, gitlink_branch_name: branch, enable: true) + if params[:sync_direction].to_i == 1 + @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories, gitlink_branch_name: branch, enable: true) + else + @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: @sync_repositories, external_branch_name: branch, enable: true) + end # 全部分支同步暂时不做 # @sync_repositories.each do |item| # TouchSyncJob.perform_later(item) diff --git a/app/models/sync_repository_branch.rb b/app/models/sync_repository_branch.rb index f23f5fe3..4748cbec 100644 --- a/app/models/sync_repository_branch.rb +++ b/app/models/sync_repository_branch.rb @@ -22,5 +22,17 @@ class SyncRepositoryBranch < ApplicationRecord belongs_to :sync_repository + before_destroy :unbind_reposyncer + enum sync_status: {success: 1, failure: 2} + + + def unbind_reposyncer + if self.sync_repository.sync_direction.to_i == 1 + Reposync::DeleteRepoService.call(self.sync_repository&.repo_name, self.gitlink_branch_name) + else + Reposync::DeleteRepoService.call(self.sync_repository&.repo_name, self.external_branch_name) + end + end + end From d38531976430dab2733c5454ae006036dafc5304 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 8 May 2024 11:15:15 +0800 Subject: [PATCH 35/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/sync_repository_branch.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/sync_repository_branch.rb b/app/models/sync_repository_branch.rb index 4748cbec..3cca38c4 100644 --- a/app/models/sync_repository_branch.rb +++ b/app/models/sync_repository_branch.rb @@ -29,9 +29,9 @@ class SyncRepositoryBranch < ApplicationRecord def unbind_reposyncer if self.sync_repository.sync_direction.to_i == 1 - Reposync::DeleteRepoService.call(self.sync_repository&.repo_name, self.gitlink_branch_name) + Reposync::DeleteBranchService.call(self.sync_repository&.repo_name, self.gitlink_branch_name) else - Reposync::DeleteRepoService.call(self.sync_repository&.repo_name, self.external_branch_name) + Reposync::DeleteBranchService.call(self.sync_repository&.repo_name, self.external_branch_name) end end From 81b8255a54fcc46dc47da60c7248d4489c39b53c Mon Sep 17 00:00:00 2001 From: xxq250 Date: Wed, 8 May 2024 17:15:04 +0800 Subject: [PATCH 36/42] =?UTF-8?q?fork=E6=8A=A5=E9=94=99=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=B7=9F=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/projects/fork_service.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 37edf56e..63475f2b 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -18,6 +18,8 @@ class Projects::ForkService < ApplicationService :license_id, :ignore_id, {repository: [:identifier, :hidden]}] result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization, @new_identifier).call + Rails.logger.info("##### ForkService #{@project.identifier} result======#{result}") + raise Error, 'fork失败' if result.blank? or result['id'].blank? clone_project.owner = @target_owner clone_project.forked_from_project_id = @project.id clone_project.gpid = result['id'] @@ -41,7 +43,7 @@ class Projects::ForkService < ApplicationService clone_project end rescue => e - puts "clone project service error: #{e.message}" + Rails.logger.info "fork project service error: #{e.message}" raise Error, e.message end From b1b234d6c017b33b33b44876253548652de9116d Mon Sep 17 00:00:00 2001 From: xxq250 Date: Wed, 8 May 2024 17:15:04 +0800 Subject: [PATCH 37/42] =?UTF-8?q?fork=E6=8A=A5=E9=94=99=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=B7=9F=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/projects/fork_service.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 37edf56e..63475f2b 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -18,6 +18,8 @@ class Projects::ForkService < ApplicationService :license_id, :ignore_id, {repository: [:identifier, :hidden]}] result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization, @new_identifier).call + Rails.logger.info("##### ForkService #{@project.identifier} result======#{result}") + raise Error, 'fork失败' if result.blank? or result['id'].blank? clone_project.owner = @target_owner clone_project.forked_from_project_id = @project.id clone_project.gpid = result['id'] @@ -41,7 +43,7 @@ class Projects::ForkService < ApplicationService clone_project end rescue => e - puts "clone project service error: #{e.message}" + Rails.logger.info "fork project service error: #{e.message}" raise Error, e.message end From 2a3f2fb6200310d635c5f539a2ac4b7f892ff185 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 9 May 2024 09:11:51 +0800 Subject: [PATCH 38/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E8=AE=B0=E5=BD=95=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projects/sync_repositories_controller.rb | 10 ++-------- app/services/reposync/get_logs_service.rb | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index ec01ed84..d1c668ba 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -113,14 +113,8 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController def history return render_error("请输入正确的同步分支ID") unless params[:reposync_branch_ids] - @reposync_branch_logs = [] - params[:reposync_branch_ids].split(",").each do |branch_id| - @branch = SyncRepositoryBranch.find_by(reposync_branch_id: branch_id) - repo = @branch&.sync_repository - _, logs, _ = Reposync::GetLogsService.call(repo&.repo_name, branch_id) - @reposync_branch_logs += logs - end - @reposync_branch_logs = @reposync_branch_logs.sort_by{|log|log["update_at"]} + @branch = SyncRepositoryBranch.find_by(reposync_branch_id: params[:reposync_branch_ids].split(",")[0]) + _, @reposync_branch_logs, _ = Reposync::GetLogsService.call(nil, params[:reposync_branch_ids], page, limit) end private diff --git a/app/services/reposync/get_logs_service.rb b/app/services/reposync/get_logs_service.rb index e6657883..0aca0fab 100644 --- a/app/services/reposync/get_logs_service.rb +++ b/app/services/reposync/get_logs_service.rb @@ -1,10 +1,12 @@ class Reposync::GetLogsService < Reposync::ClientService - attr_accessor :repo_name, :branch_id + attr_accessor :repo_name, :branch_id, :page_num, :page_size - def initialize(repo_name, branch_id=nil) + def initialize(repo_name=nil, branch_id=nil, page_num=1, page_size=10) @repo_name = repo_name @branch_id = branch_id + @page_num = page_num + @page_size = page_size end def call @@ -14,10 +16,18 @@ class Reposync::GetLogsService < Reposync::ClientService private def request_params - branch_id.present? ? {branch_id: branch_id}.stringify_keys : {} + params = { + page_num: page_num, + page_size: page_size, + create_sort: true + } + params.merge(repo_name: repo_name) if repo_name.present? + params.merge(branch_id: branch_id) if branch_id.present? + + return params.stringify_keys end def url - "/cerobot/sync/repo/#{repo_name}/logs" + "/cerobot/sync/repo/logs" end end \ No newline at end of file From fd48f000973f5046a66da52127444c15200bdae0 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 9 May 2024 09:16:35 +0800 Subject: [PATCH 39/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/reposync/get_logs_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/reposync/get_logs_service.rb b/app/services/reposync/get_logs_service.rb index 0aca0fab..b2d0df33 100644 --- a/app/services/reposync/get_logs_service.rb +++ b/app/services/reposync/get_logs_service.rb @@ -21,8 +21,8 @@ class Reposync::GetLogsService < Reposync::ClientService page_size: page_size, create_sort: true } - params.merge(repo_name: repo_name) if repo_name.present? - params.merge(branch_id: branch_id) if branch_id.present? + params.merge!(repo_name: repo_name) if repo_name.present? + params.merge!(branch_id: branch_id) if branch_id.present? return params.stringify_keys end From e0b1d6fbb668d17c19675deb54d2b739ca0487db Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 9 May 2024 13:41:46 +0800 Subject: [PATCH 40/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E8=AE=B0=E5=BD=95=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v1/projects/sync_repositories_controller.rb | 2 +- app/services/reposync/client_service.rb | 17 +++++++++++++++++ app/services/reposync/get_logs_service.rb | 2 +- .../sync_repositories/history.json.jbuilder | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index d1c668ba..feabfc1e 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -114,7 +114,7 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController def history return render_error("请输入正确的同步分支ID") unless params[:reposync_branch_ids] @branch = SyncRepositoryBranch.find_by(reposync_branch_id: params[:reposync_branch_ids].split(",")[0]) - _, @reposync_branch_logs, _ = Reposync::GetLogsService.call(nil, params[:reposync_branch_ids], page, limit) + _, @reposync_branch_logs, @total_count, _ = Reposync::GetLogsService.call(nil, params[:reposync_branch_ids], page, limit) end private diff --git a/app/services/reposync/client_service.rb b/app/services/reposync/client_service.rb index cca073df..a8ddc18b 100644 --- a/app/services/reposync/client_service.rb +++ b/app/services/reposync/client_service.rb @@ -95,4 +95,21 @@ class Reposync::ClientService < ApplicationService end end end + + def render_list_response(response) + status = response.status + body = JSON.parse(response&.body) + + log_error(status, body) + + if status == 200 + if body["code_status"].to_i == 0 + return [body["code_status"], body["data"], body["total"], body["msg"]] + else + puts "[reposync][ERROR] code: #{body["code_status"]}" + puts "[reposync][ERROR] message: #{body["msg"]}" + return [body["code_status"], body["data"], body["total"], body["msg"]] + end + end + end end \ No newline at end of file diff --git a/app/services/reposync/get_logs_service.rb b/app/services/reposync/get_logs_service.rb index b2d0df33..1288de6b 100644 --- a/app/services/reposync/get_logs_service.rb +++ b/app/services/reposync/get_logs_service.rb @@ -11,7 +11,7 @@ class Reposync::GetLogsService < Reposync::ClientService def call result = get(url, request_params) - response = render_response(result) + response = render_list_response(result) end private diff --git a/app/views/api/v1/projects/sync_repositories/history.json.jbuilder b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder index 37d4e239..01546b29 100644 --- a/app/views/api/v1/projects/sync_repositories/history.json.jbuilder +++ b/app/views/api/v1/projects/sync_repositories/history.json.jbuilder @@ -1,4 +1,4 @@ -json.total_count @reposync_branch_logs.count +json.total_count @total_count json.gitlink_branch_name @branch&.gitlink_branch_name json.external_type @branch&.sync_repository&.type json.external_branch_name @branch&.external_branch_name From d5c8fe6e562d1c4b84bfaa6c5d8ad1481421a4d2 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 9 May 2024 14:13:51 +0800 Subject: [PATCH 41/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E5=88=86?= =?UTF-8?q?=E6=94=AF=E5=88=97=E8=A1=A8=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projects/sync_repositories_controller.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/controllers/api/v1/projects/sync_repositories_controller.rb b/app/controllers/api/v1/projects/sync_repositories_controller.rb index feabfc1e..04780041 100644 --- a/app/controllers/api/v1/projects/sync_repositories_controller.rb +++ b/app/controllers/api/v1/projects/sync_repositories_controller.rb @@ -109,6 +109,24 @@ class Api::V1::Projects::SyncRepositoriesController < Api::V1::BaseController @sync_repository_branches = SyncRepositoryBranch.where(sync_repository_id: params[:sync_repository_ids].split(",")) @sync_repository_branches = @sync_repository_branches.ransack(gitlink_branch_name_or_external_branch_name_cont: params[:branch_name]).result if params[:branch_name].present? @group_sync_repository_branch = @sync_repository_branches.joins(:sync_repository).group("sync_repositories.type, sync_repository_branches.gitlink_branch_name, sync_repository_branches.external_branch_name").select("sync_repositories.type as type,max(sync_repository_branches.updated_at) as updated_at, sync_repository_branches.gitlink_branch_name, sync_repository_branches.external_branch_name").sort_by{|i|i.updated_at} + @each_json = [] + @group_sync_repository_branch.each do |item| + branches = @sync_repository_branches.joins(:sync_repository).where(sync_repositories: {type: item.type}, gitlink_branch_name: item.gitlink_branch_name, external_branch_name: item.external_branch_name).order(updated_at: :desc) + branch = branches.first + @each_json << { + gitlink_branch_name: item.gitlink_branch_name, + external_branch_name: item.external_branch_name, + type: branch&.sync_repository&.type, + sync_time: branch.sync_time.present? ? branch.sync_time.strftime("%Y-%m-%d %H:%M:%S") : nil, + sync_status: branch.sync_status, + enable: branch.enable, + enable_num: branch.enable ? 1 : 0, + created_at: branch.created_at.to_i, + reposync_branch_ids: branches.pluck(:reposync_branch_id) + } + end + @each_json = @each_json.sort_by{|h| [-h[:enable_num], h[:created_at]]} + render :json => {total_count: @group_sync_repository_branch.count, sync_repository_branches: @each_json} end def history From 20e8561815c757a70798a56800c922e45fe146e7 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 9 May 2024 17:32:43 +0800 Subject: [PATCH 42/42] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/sync_repository.rb | 2 +- app/models/sync_repository_branch.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/sync_repository.rb b/app/models/sync_repository.rb index 70018d7d..94f7c663 100644 --- a/app/models/sync_repository.rb +++ b/app/models/sync_repository.rb @@ -29,7 +29,7 @@ class SyncRepository < ApplicationRecord validates :repo_name, uniqueness: { message: "已存在" } def unbind_reposyncer - Reposync::DeleteRepoService.call(self.repo_name) + Reposync::DeleteRepoService.call(self.repo_name) rescue nil end end diff --git a/app/models/sync_repository_branch.rb b/app/models/sync_repository_branch.rb index 3cca38c4..1940fd11 100644 --- a/app/models/sync_repository_branch.rb +++ b/app/models/sync_repository_branch.rb @@ -29,9 +29,9 @@ class SyncRepositoryBranch < ApplicationRecord def unbind_reposyncer if self.sync_repository.sync_direction.to_i == 1 - Reposync::DeleteBranchService.call(self.sync_repository&.repo_name, self.gitlink_branch_name) + Reposync::DeleteBranchService.call(self.sync_repository&.repo_name, self.gitlink_branch_name) rescue nil else - Reposync::DeleteBranchService.call(self.sync_repository&.repo_name, self.external_branch_name) + Reposync::DeleteBranchService.call(self.sync_repository&.repo_name, self.external_branch_name) rescue nil end end