diff --git a/app/controllers/hooks_controller.rb b/app/controllers/hooks_controller.rb new file mode 100644 index 000000000..d897c1a83 --- /dev/null +++ b/app/controllers/hooks_controller.rb @@ -0,0 +1,85 @@ +class HooksController < ApplicationController + before_action :require_login, except: [:index, :show] + before_action :find_project_with_id + before_action :set_repository + + def index + hooks_response = Gitea::Hooks::ListService.new(@user, @repository.try(:identifier)).call + if hooks_response.status == 200 + lists = JSON.parse(hooks_response.body) + @hooks_size = lists.size + @hooks = paginate(lists) + else + normal_status(-1, "出现错误") + end + end + + def create + # hook_params = { + # active: true, + # type: "gitea", + # branch_filter: "", + # config: { + # content_type: "application/json", + # url: "#{EduSetting.get("host_name")}/repositories/#{project.id}/repo_hooks.json", + # http_method: "post" + # }, + # events: ["create", "pull", "push"], + # } + # hook_params = { + # is_active: params[:is_active] || false, + # type: params[:type], + # http_method: params[:http_method] || "POST", + # content_type: params[:content_type].to_i, + # secret: params[:secret], + # events: { + # push_only: params[:push_only] || false, # 是否为推送事件 + # send_everything: params[:send_everything] || false, #是否为所有事件 + # choose_events: params[:choose_events] || false, #是否为自定义事件 + # branch_filter: params[:branch_filter] || "*", + # events: { + # create: params[:create] || false, #创建分支/标签 + # delete: params[:delete] || false, #删除分支/标签 + # fork: params[:fork] || false, #仓库被派生 + # issues: params[:issues] || false, #工单 + # issue_comment: params[:issue_comment] || false, #评论 + # push: params[:push] || false # 推送 + # pull_request: params[:pull_request] || false #合并请求 + # repository: params[:repository] || false #仓库 + # release: params[:release] || false #版本发布 + # } + # } + # } + + hook_params = params[:hook_params].compact + Gitea::Hooks::CreateService.new(@user, @repository.try(:identifier), hook_params).call #创建gitea的hook功能 + end + + def update + hook_params = params[:hook_params].compact + response = Gitea::Hooks::UpdateService.new(@user, @repository.try(:identifier), hook_params, params[:id]).call + if response.status == 200 + normal_status(1, "更新成功") + else + normal_status(-1, "更新失败") + end + end + + def destroy + response = Gitea::Hooks::DestroyService.new(@user, @repository.try(:identifier), params[:id]).call + if response.status == 204 + normal_status(1, "删除成功") + else + normal_status(-1, "删除失败") + end + end + + private + + def set_repository + @repository = @project.repository + @user = @project.owner + normal_status(-1, "仓库不存在") unless @repository.present? + normal_status(-1, "用户不存在") unless @user.present? + end +end diff --git a/app/helpers/hooks_helper.rb b/app/helpers/hooks_helper.rb new file mode 100644 index 000000000..14354af9c --- /dev/null +++ b/app/helpers/hooks_helper.rb @@ -0,0 +1,2 @@ +module HooksHelper +end diff --git a/app/services/gitea/repository/hooks/create_service.rb b/app/services/gitea/hooks/create_service.rb similarity index 83% rename from app/services/gitea/repository/hooks/create_service.rb rename to app/services/gitea/hooks/create_service.rb index 422807760..9c66c9a7e 100644 --- a/app/services/gitea/repository/hooks/create_service.rb +++ b/app/services/gitea/hooks/create_service.rb @@ -1,4 +1,4 @@ -class Gitea::Repository::Hooks::CreateService < Gitea::ClientService +class Gitea::Hooks::CreateService < Gitea::ClientService attr_reader :user, :repo_name, :body def initialize(user, repo_name, body) diff --git a/app/services/gitea/hooks/destroy_service.rb b/app/services/gitea/hooks/destroy_service.rb new file mode 100644 index 000000000..779ebd41d --- /dev/null +++ b/app/services/gitea/hooks/destroy_service.rb @@ -0,0 +1,23 @@ +class Gitea::Hooks::DestroyService < Gitea::ClientService + attr_reader :user, :repo_name,:hook_id + + def initialize(user, repo_name, hook_id) + @user = user + @repo_name = repo_name + @hook_id = hook_id + end + + def call + response = delete(url, params) + end + + private + def params + Hash.new.merge(token: user.gitea_token) + end + + def url + "/repos/#{user.login}/#{repo_name}/hooks/#{hook_id}".freeze + end + +end \ No newline at end of file diff --git a/app/services/gitea/hooks/list_service.rb b/app/services/gitea/hooks/list_service.rb new file mode 100644 index 000000000..00170073f --- /dev/null +++ b/app/services/gitea/hooks/list_service.rb @@ -0,0 +1,23 @@ +class Gitea::Hooks::ListService < Gitea::ClientService + attr_reader :user, :repo_name + + def initialize(user, repo_name) + @user = user + @repo_name = repo_name + @body = body + end + + def call + response = get(url, params) + end + + private + def params + Hash.new.merge(token: user.gitea_token) + end + + def url + "/repos/#{user.login}/#{repo_name}/hooks".freeze + end + +end \ No newline at end of file diff --git a/app/services/gitea/hooks/update_service.rb b/app/services/gitea/hooks/update_service.rb new file mode 100644 index 000000000..d59467588 --- /dev/null +++ b/app/services/gitea/hooks/update_service.rb @@ -0,0 +1,24 @@ +class Gitea::Hooks::UpdateService < Gitea::ClientService + attr_reader :user, :repo_name, :body,:hook_id + + def initialize(user, repo_name, body, hook_id) + @user = user + @repo_name = repo_name + @body = body + @hook_id = hook_id + end + + def call + response = patch(url, params) + end + + private + def params + body.merge(token: user.gitea_token) + end + + def url + "/repos/#{user.login}/#{repo_name}/hooks/#{hook_id}".freeze + end + +end \ No newline at end of file diff --git a/app/services/repositories/create_service.rb b/app/services/repositories/create_service.rb index 5d9feda92..3a038497a 100644 --- a/app/services/repositories/create_service.rb +++ b/app/services/repositories/create_service.rb @@ -15,25 +15,14 @@ class Repositories::CreateService < ApplicationService sync_project(@repository, gitea_repository) sync_repository(@repository, gitea_repository) if project.project_type == "common" - hook_params = { - active: true, - type: "gitea", - branch_filter: "", - config: { - content_type: "application/json", - url: "#{EduSetting.get("host_name")}/repositories/#{project.id}/repo_hooks.json", - http_method: "post" - }, - events: ["create", "pull", "push"], - } + chain_params = { type: "create", ownername: user.try(:login), reponame: @repository.try(:id) } ProjectCreateChainJob.perform_later(chain_params) #创建上链操作 - #暂时gitea的hook功能未完善 - #Gitea::Repository::Hooks::CreateService.new(user, @repository.try(:identifier), hook_params).call #创建gitea的hook功能 + end end @repository diff --git a/app/views/hooks/index.json.jbuilder b/app/views/hooks/index.json.jbuilder new file mode 100644 index 000000000..c1449b811 --- /dev/null +++ b/app/views/hooks/index.json.jbuilder @@ -0,0 +1,6 @@ +json.count @hooks_size +json.hooks do + json.array! @hooks.each do |h| + json.merge! h + end +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 6e40144f4..f9f932cdd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -53,6 +53,7 @@ Rails.application.routes.draw do end end resources :projects do + resources :hooks resources :pull_requests, except: [:destroy] do member do post :pr_merge