diff --git a/Gemfile b/Gemfile index 1542856cf..1b3ff3e0c 100644 --- a/Gemfile +++ b/Gemfile @@ -135,4 +135,4 @@ gem 'doorkeeper' gem 'doorkeeper-jwt' -gem 'gitea-client', '~> 0.6.2' \ No newline at end of file +gem 'gitea-client', '~> 0.8.1' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 467e19a2d..e231bbef7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -135,7 +135,7 @@ GEM fugit (1.4.1) et-orbi (~> 1.1, >= 1.1.8) raabro (~> 1.4) - gitea-client (0.6.2) + gitea-client (0.8.1) rest-client (~> 2.1.0) globalid (0.4.2) activesupport (>= 4.2.0) @@ -478,7 +478,7 @@ DEPENDENCIES enumerize faraday (~> 0.15.4) font-awesome-sass (= 4.7.0) - gitea-client (~> 0.6.2) + gitea-client (~> 0.8.1) grape-entity (~> 0.7.1) groupdate (~> 4.1.0) harmonious_dictionary (~> 0.0.1) diff --git a/app/controllers/api/v1/projects/webhooks_controller.rb b/app/controllers/api/v1/projects/webhooks_controller.rb new file mode 100644 index 000000000..bb828a70e --- /dev/null +++ b/app/controllers/api/v1/projects/webhooks_controller.rb @@ -0,0 +1,55 @@ +class Api::V1::Projects::WebhooksController < Api::V1::BaseController + before_action :load_project + before_action :find_webhook, only: [:show, :update, :destroy, :tests, :hooktasks] + + def index + # @result_object = Api::V1::Projects::Webhooks::ListService.call(@project, current_user&.gitea_token) + @webhooks = @project.webhooks + @webhooks = kaminari_paginate(@webhooks) + end + + def create + @result_object = Api::V1::Projects::Webhooks::CreateService.call(@project, webhook_params, current_user&.gitea_token) + end + + def show + @result_object = Api::V1::Projects::Webhooks::GetService.call(@project, params[:id], current_user&.gitea_token) + end + + def update + @result_object = Api::V1::Projects::Webhooks::UpdateService.call(@project, params[:id], webhook_params, current_user&.gitea_token) + end + + def destroy + @result_object = Api::V1::Projects::Webhooks::DeleteService.call(@project, params[:id], current_user&.gitea_token) + if @result_object + return render_ok + else + return render_error('删除失败!') + end + end + + def tests + @result_object = Api::V1::Projects::Webhooks::TestsService.call(@project, params[:id], current_user&.gitea_token) + if @result_object + return render_ok + else + return render_error('推送失败!') + end + end + + def hooktasks + @hooktasks = @webhook.tasks.where(is_delivered: true).order("delivered desc") + @hooktasks = kaminari_paginate(@hooktasks) + end + + private + def webhook_params + params.require(:webhook).permit(:active, :branch_filter, :http_method, :url, :content_type, :secret, events: []) + end + + def find_webhook + @webhook = Gitea::Webhook.find_by_id(params[:id]) + return render_not_found unless @webhook.present? + 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 new file mode 100644 index 000000000..401ff9ff6 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/create_service.rb @@ -0,0 +1,60 @@ +class Api::V1::Projects::Webhooks::CreateService < ApplicationService + include ActiveModel::Model + + attr_reader :project, :token, :owner, :repo, :active, :branch_filter, :content_type, :url, :http_method, :secret, :events + attr_accessor :gitea_data + + validates :url, format: { with: URI::regexp(%w[http https]), message: "请输入正确的地址" } + 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"} + + def initialize(project, params, token=nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @active = params[:active] + @branch_filter = params[:branch_filter] + @content_type = params[:content_type] + @url = params[:url] + @http_method = params[:http_method] + @secret = params[:secret] + @events = params[:events] + @token = token + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + begin + $gitea_client.token = token unless token.blank? + + excute_data_to_gitea + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + end + + private + def request_body + { + active: active, + branch_filter: branch_filter, + config: { + content_type: content_type, + url: url, + http_method: http_method, + secret: secret + }, + events: events || [], + type: 'gitea', + } + end + + def excute_data_to_gitea + @gitea_data = $gitea_client.post_repos_hooks_by_owner_repo(owner, repo, {body: request_body.to_json}) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/delete_service.rb b/app/services/api/v1/projects/webhooks/delete_service.rb new file mode 100644 index 000000000..53fd8edd4 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/delete_service.rb @@ -0,0 +1,30 @@ +class Api::V1::Projects::Webhooks::DeleteService < ApplicationService + + attr_reader :project, :id, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, id, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + excute_data_to_gitea + + $gitea_client.token = nil unless token.blank? + + gitea_data + # rescue + # raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def excute_data_to_gitea + @gitea_data = $gitea_client.delete_repos_hooks_by_owner_repo_id(owner, repo, id) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/get_service.rb b/app/services/api/v1/projects/webhooks/get_service.rb new file mode 100644 index 000000000..1ae5c54e2 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/get_service.rb @@ -0,0 +1,30 @@ +class Api::V1::Projects::Webhooks::GetService < ApplicationService + + attr_reader :project, :id, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, id, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + load_gitea_data + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def load_gitea_data + @gitea_data = $gitea_client.get_repos_hooks_by_owner_repo_id(owner, repo, id) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/hooktasks_service.rb b/app/services/api/v1/projects/webhooks/hooktasks_service.rb new file mode 100644 index 000000000..4dd90ee3e --- /dev/null +++ b/app/services/api/v1/projects/webhooks/hooktasks_service.rb @@ -0,0 +1,30 @@ +class Api::V1::Projects::Webhooks::ListService < ApplicationService + + attr_reader :project, :id, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, id, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + load_gitea_data + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def load_gitea_data + @gitea_data = $gitea_client.get_repos_hooks_hooktasks_by_owner_repo(owner, repo, id) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/list_service.rb b/app/services/api/v1/projects/webhooks/list_service.rb new file mode 100644 index 000000000..fb746de48 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/list_service.rb @@ -0,0 +1,29 @@ +class Api::V1::Projects::Webhooks::ListService < ApplicationService + + attr_reader :project, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, token=nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + load_gitea_data + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def load_gitea_data + @gitea_data = $gitea_client.get_repos_hooks_by_owner_repo(owner, repo) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/tests_service.rb b/app/services/api/v1/projects/webhooks/tests_service.rb new file mode 100644 index 000000000..3d8b99c97 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/tests_service.rb @@ -0,0 +1,30 @@ +class Api::V1::Projects::Webhooks::TestsService < ApplicationService + + attr_reader :project, :id, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, id, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + excute_data_to_gitea + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def excute_data_to_gitea + @gitea_data = $gitea_client.post_repos_hooks_tests_by_owner_repo_id(owner, repo, id) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/update_service.rb b/app/services/api/v1/projects/webhooks/update_service.rb new file mode 100644 index 000000000..19ff4f32b --- /dev/null +++ b/app/services/api/v1/projects/webhooks/update_service.rb @@ -0,0 +1,61 @@ +class Api::V1::Projects::Webhooks::UpdateService < ApplicationService + include ActiveModel::Model + + attr_reader :project, :id, :token, :owner, :repo, :active, :branch_filter, :content_type, :url, :http_method, :secret, :events + attr_accessor :gitea_data + + validates :url, format: { with: URI::regexp(%w[http https]), message: "请输入正确的地址" } + 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"} + + def initialize(project, id, params, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @active = params[:active] + @branch_filter = params[:branch_filter] + @content_type = params[:content_type] + @url = params[:url] + @http_method = params[:http_method] + @secret = params[:secret] + @events = params[:events] + @token = token + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + begin + $gitea_client.token = token unless token.blank? + + excute_data_to_gitea + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + end + + private + def request_body + { + active: active, + branch_filter: branch_filter, + config: { + content_type: content_type, + url: url, + http_method: http_method, + secret: secret + }, + events: events || [], + type: 'gitea', + } + end + + def excute_data_to_gitea + @gitea_data = $gitea_client.patch_repos_hooks_by_owner_repo_id(owner, repo, id, {body: request_body.to_json}) + end +end \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/_simple_detail.json.jbuilder b/app/views/api/v1/projects/webhooks/_simple_detail.json.jbuilder new file mode 100644 index 000000000..145b3e59b --- /dev/null +++ b/app/views/api/v1/projects/webhooks/_simple_detail.json.jbuilder @@ -0,0 +1,3 @@ +json.(webhook, :id, :url, :http_method, :is_active) +json.last_status webhook.last_status +json.create_time Time.at(webhook.created_unix).strftime("%Y-%m-%d %H:%M:%S") \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/_simple_gitea_detail.json.jbuilder b/app/views/api/v1/projects/webhooks/_simple_gitea_detail.json.jbuilder new file mode 100644 index 000000000..ca180d8b1 --- /dev/null +++ b/app/views/api/v1/projects/webhooks/_simple_gitea_detail.json.jbuilder @@ -0,0 +1,8 @@ +json.id webhook["id"] +json.content_type webhook['config']['content_type'] +json.http_method webhook['config']['http_method'] +json.url webhook['config']['url'] +json.events webhook['events'] +json.active webhook['active'] +json.branch_filter webhook['branch_filter'] +json.created_at format_time(webhook['created_at'].to_time) \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/create.json.jbuilder b/app/views/api/v1/projects/webhooks/create.json.jbuilder new file mode 100644 index 000000000..01f91963d --- /dev/null +++ b/app/views/api/v1/projects/webhooks/create.json.jbuilder @@ -0,0 +1 @@ +json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/hooktasks.json.jbuilder b/app/views/api/v1/projects/webhooks/hooktasks.json.jbuilder new file mode 100644 index 000000000..618a05515 --- /dev/null +++ b/app/views/api/v1/projects/webhooks/hooktasks.json.jbuilder @@ -0,0 +1,6 @@ +json.total_count @hooktasks.total_count +json.hooktasks @hooktasks.each do |task| + json.(task, :id, :event_type, :type, :uuid, :is_succeed, :is_delivered, :payload_content, :request_content) + json.response_content task.response_content_json + json.delivered_time Time.at(task.delivered*10**-9).strftime("%Y-%m-%d %H:%M:%S") +end \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/index.json.jbuilder b/app/views/api/v1/projects/webhooks/index.json.jbuilder new file mode 100644 index 000000000..7a375619e --- /dev/null +++ b/app/views/api/v1/projects/webhooks/index.json.jbuilder @@ -0,0 +1,4 @@ +json.total_count @webhooks.total_count +json.webhooks @webhooks do |webhook| + json.partial! "api/v1/projects/webhooks/simple_detail", webhook: webhook +end \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/show.json.jbuilder b/app/views/api/v1/projects/webhooks/show.json.jbuilder new file mode 100644 index 000000000..01f91963d --- /dev/null +++ b/app/views/api/v1/projects/webhooks/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/update.json.jbuilder b/app/views/api/v1/projects/webhooks/update.json.jbuilder new file mode 100644 index 000000000..01f91963d --- /dev/null +++ b/app/views/api/v1/projects/webhooks/update.json.jbuilder @@ -0,0 +1 @@ +json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index 5cefe7930..32acdabd4 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -17,6 +17,12 @@ defaults format: :json do resources :pull_requests resources :versions resources :release_versions + resources :webhooks do + member do + post :tests + get :hooktasks + end + end end end