mirror of
https://gitlink.org.cn/Gitlink/forgeplus.git
synced 2026-05-21 20:25:45 +08:00
新增: webhooks使用token访问的接口
This commit is contained in:
55
app/controllers/api/v1/projects/webhooks_controller.rb
Normal file
55
app/controllers/api/v1/projects/webhooks_controller.rb
Normal file
@@ -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
|
||||
60
app/services/api/v1/projects/webhooks/create_service.rb
Normal file
60
app/services/api/v1/projects/webhooks/create_service.rb
Normal file
@@ -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
|
||||
30
app/services/api/v1/projects/webhooks/delete_service.rb
Normal file
30
app/services/api/v1/projects/webhooks/delete_service.rb
Normal file
@@ -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
|
||||
30
app/services/api/v1/projects/webhooks/get_service.rb
Normal file
30
app/services/api/v1/projects/webhooks/get_service.rb
Normal file
@@ -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
|
||||
30
app/services/api/v1/projects/webhooks/hooktasks_service.rb
Normal file
30
app/services/api/v1/projects/webhooks/hooktasks_service.rb
Normal file
@@ -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
|
||||
29
app/services/api/v1/projects/webhooks/list_service.rb
Normal file
29
app/services/api/v1/projects/webhooks/list_service.rb
Normal file
@@ -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
|
||||
30
app/services/api/v1/projects/webhooks/tests_service.rb
Normal file
30
app/services/api/v1/projects/webhooks/tests_service.rb
Normal file
@@ -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
|
||||
61
app/services/api/v1/projects/webhooks/update_service.rb
Normal file
61
app/services/api/v1/projects/webhooks/update_service.rb
Normal file
@@ -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
|
||||
@@ -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")
|
||||
@@ -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)
|
||||
1
app/views/api/v1/projects/webhooks/create.json.jbuilder
Normal file
1
app/views/api/v1/projects/webhooks/create.json.jbuilder
Normal file
@@ -0,0 +1 @@
|
||||
json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object
|
||||
@@ -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
|
||||
4
app/views/api/v1/projects/webhooks/index.json.jbuilder
Normal file
4
app/views/api/v1/projects/webhooks/index.json.jbuilder
Normal file
@@ -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
|
||||
1
app/views/api/v1/projects/webhooks/show.json.jbuilder
Normal file
1
app/views/api/v1/projects/webhooks/show.json.jbuilder
Normal file
@@ -0,0 +1 @@
|
||||
json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object
|
||||
1
app/views/api/v1/projects/webhooks/update.json.jbuilder
Normal file
1
app/views/api/v1/projects/webhooks/update.json.jbuilder
Normal file
@@ -0,0 +1 @@
|
||||
json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object
|
||||
Reference in New Issue
Block a user