Browse Source

新增: webhooks使用token访问的接口

pull/313/head
yystopf 4 years ago
parent
commit
fe58175ee0
18 changed files with 358 additions and 3 deletions
  1. +1
    -1
      Gemfile
  2. +2
    -2
      Gemfile.lock
  3. +55
    -0
      app/controllers/api/v1/projects/webhooks_controller.rb
  4. +60
    -0
      app/services/api/v1/projects/webhooks/create_service.rb
  5. +30
    -0
      app/services/api/v1/projects/webhooks/delete_service.rb
  6. +30
    -0
      app/services/api/v1/projects/webhooks/get_service.rb
  7. +30
    -0
      app/services/api/v1/projects/webhooks/hooktasks_service.rb
  8. +29
    -0
      app/services/api/v1/projects/webhooks/list_service.rb
  9. +30
    -0
      app/services/api/v1/projects/webhooks/tests_service.rb
  10. +61
    -0
      app/services/api/v1/projects/webhooks/update_service.rb
  11. +3
    -0
      app/views/api/v1/projects/webhooks/_simple_detail.json.jbuilder
  12. +8
    -0
      app/views/api/v1/projects/webhooks/_simple_gitea_detail.json.jbuilder
  13. +1
    -0
      app/views/api/v1/projects/webhooks/create.json.jbuilder
  14. +6
    -0
      app/views/api/v1/projects/webhooks/hooktasks.json.jbuilder
  15. +4
    -0
      app/views/api/v1/projects/webhooks/index.json.jbuilder
  16. +1
    -0
      app/views/api/v1/projects/webhooks/show.json.jbuilder
  17. +1
    -0
      app/views/api/v1/projects/webhooks/update.json.jbuilder
  18. +6
    -0
      config/routes/api.rb

+ 1
- 1
Gemfile View File

@@ -135,4 +135,4 @@ gem 'doorkeeper'

gem 'doorkeeper-jwt'

gem 'gitea-client', '~> 0.6.2'
gem 'gitea-client', '~> 0.8.1'

+ 2
- 2
Gemfile.lock View File

@@ -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)


+ 55
- 0
app/controllers/api/v1/projects/webhooks_controller.rb View 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
- 0
app/services/api/v1/projects/webhooks/create_service.rb View 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
- 0
app/services/api/v1/projects/webhooks/delete_service.rb View 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
- 0
app/services/api/v1/projects/webhooks/get_service.rb View 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
- 0
app/services/api/v1/projects/webhooks/hooktasks_service.rb View 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
- 0
app/services/api/v1/projects/webhooks/list_service.rb View 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
- 0
app/services/api/v1/projects/webhooks/tests_service.rb View 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
- 0
app/services/api/v1/projects/webhooks/update_service.rb View 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

+ 3
- 0
app/views/api/v1/projects/webhooks/_simple_detail.json.jbuilder View File

@@ -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")

+ 8
- 0
app/views/api/v1/projects/webhooks/_simple_gitea_detail.json.jbuilder View File

@@ -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
- 0
app/views/api/v1/projects/webhooks/create.json.jbuilder View File

@@ -0,0 +1 @@
json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object

+ 6
- 0
app/views/api/v1/projects/webhooks/hooktasks.json.jbuilder View File

@@ -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
- 0
app/views/api/v1/projects/webhooks/index.json.jbuilder View 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
- 0
app/views/api/v1/projects/webhooks/show.json.jbuilder View File

@@ -0,0 +1 @@
json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object

+ 1
- 0
app/views/api/v1/projects/webhooks/update.json.jbuilder View File

@@ -0,0 +1 @@
json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object

+ 6
- 0
config/routes/api.rb View File

@@ -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



Loading…
Cancel
Save