forgeplus/app/services/gitea/client_service.rb

165 lines
3.8 KiB
Ruby

class Gitea::ClientService < ApplicationService
attr_reader :username, :secret, :token, :url, :params
def initialize(options={})
@username = options[:username]
@secret = options[:password]
@token = options[:token]
@url = options[:url]
@params = options[:params]
end
# params
# EXA:
# {
# token: {},
# data: {}
# }
def post(url, params={})
puts "[gitea] request params: #{params}"
request_url = [api_url, url].join('').freeze
auth_token = authen_params(params[:token])
response = conn(auth_token).post do |req|
req.url "#{request_url}"
req.body = params[:data].to_json
end
render_status(response)
end
def get(url, params={})
auth_token = authen_params(params[:token])
conn(auth_token).get do |req|
req.url full_url(url)
params.except(:token).each_pair do |key, value|
req.params["#{key}"] = value
end
end
# response.headers.each do |k,v|
# puts "#{k}:#{v}"
# end #=> 响应头
end
def delete(url, params={})
auth_token = authen_params(params[:token])
conn(auth_token).delete do |req|
req.url full_url(url)
req.body = params[:data].to_json
end
end
def patch(url, params={})
puts "[gitea] request params: #{params}"
auth_token = authen_params(params[:token])
conn(auth_token).patch do |req|
req.url full_url(url)
req.body = params[:data].to_json
end
end
def put(url, params={})
puts "[gitea] put request params: #{params}"
conn(authen_params(params[:token])).put do |req|
req.url full_url(url)
req.body = params[:data].to_json
end
end
private
def conn(auth={})
username = auth[:username] || access_key_id
secret = auth[:password] || access_key_secret
token = auth[:token]
puts "[gitea] username: #{username}"
puts "[gitea] secret: #{secret}"
puts "[gitea] token: #{token}"
@client ||= begin
Faraday.new(url: domain) do |req|
req.request :url_encoded
req.headers['Content-Type'] = 'application/json'
req.response :logger # 显示日志
req.adapter Faraday.default_adapter
if token.blank?
req.basic_auth(username, secret)
else
req.authorization :Bearer, token
req.headers['Authorization']
end
end
end
@client
end
def base_url
Gitea.gitea_config[:base_url]
end
def domain
Gitea.gitea_config[:domain]
end
def access_key_id
Gitea.gitea_config[:access_key_id]
end
def access_key_secret
Gitea.gitea_config[:access_key_secret]
end
def api_url
[domain, base_url].join('')
end
def full_url(api_rest)
[api_url, api_rest].join('').freeze
end
def render_status(response)
mark = "[gitea] "
case response.status
when 201, 200, 202
if response.body.size > 0
JSON.parse(response&.body)
else
{status: 200}
end
when 401
raise Error, mark + "401"
when 422
result = JSON.parse(response&.body)
puts "[gitea] parse body: #{result}"
# return {status: -1, message: result[0]}
raise Error, result[0]
when 204
puts "[gitea] "
raise Error, "[gitea] delete ok"
when 409
message = "创建失败,请检查该分支合并是否已存在"
raise Error, mark + message
else
if response&.body.blank?
message = "请求失败"
else
result = JSON.parse(response&.body)
message = result['message']
end
raise Error, mark + message
end
end
def authen_params(token)
(token.is_a? String) ? {token: token} : Hash(token)
end
def render_data(response)
case response.status
when 201, 200
JSON.parse(response.body)
else
nil
end
end
end