forked from Gitlink/forgeplus
296 lines
6.6 KiB
Ruby
296 lines
6.6 KiB
Ruby
class Gitea::ClientService < ApplicationService
|
|
attr_reader :username, :secret, :token, :url, :params
|
|
|
|
PAGINATE_DEFAULT_PAGE = 1
|
|
PAGINATE_DEFAULT_LIMIT = 20
|
|
|
|
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}"
|
|
auth_token = authen_params(params[:token])
|
|
conn(auth_token).post do |req|
|
|
req.url full_url(url)
|
|
req.body = params[:data].to_json
|
|
end
|
|
end
|
|
|
|
def get(url, params={})
|
|
auth_token = authen_params(params[:token])
|
|
conn(auth_token).get do |req|
|
|
req.url full_url(url, 'get')
|
|
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]
|
|
secret = auth[:password]
|
|
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 api_url
|
|
[domain, base_url].join('')
|
|
end
|
|
|
|
def full_url(api_rest, action='post')
|
|
url = [api_url, api_rest].join('').freeze
|
|
url = action === 'get' ? url : URI.escape(url)
|
|
url = URI.escape(url) unless url.ascii_only?
|
|
puts "[gitea] request url: #{url}"
|
|
return url
|
|
end
|
|
|
|
def render_status(response)
|
|
puts "[gitea] response status: #{response.status}"
|
|
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['message']}"
|
|
# return {status: -1, message: result[0]}
|
|
raise Error, result['message']
|
|
when 204
|
|
|
|
puts "[gitea] "
|
|
# raise Error, "[gitea] delete ok"
|
|
{status: 204}
|
|
when 409
|
|
message = "创建失败,请检查该分支合并是否已存在"
|
|
raise Error, mark + message
|
|
when 403
|
|
{status: 403, message: '你没有权限操作!'}
|
|
when 404
|
|
{status: 404, 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
|
|
|
|
def render_response(response)
|
|
status = response.status
|
|
body = response&.body
|
|
|
|
log_error(status, body)
|
|
|
|
body, message = get_body_by_status(status, body)
|
|
|
|
[status, message, body]
|
|
end
|
|
|
|
def render_gitea_response(response)
|
|
status = response.status
|
|
body = response&.body
|
|
|
|
log_error(status, body)
|
|
message = nil
|
|
begin
|
|
translate = YAML.load(File.read('config/gitea_response.yml'))
|
|
|
|
self.class.to_s.underscore.split("/").map{|i| translate=translate[i]}
|
|
message = body.nil? ? translate[status]['default'] : JSON.parse(body)['message']
|
|
message = translate[status][message].nil? ? message : translate[status][message]
|
|
|
|
return [status, message]
|
|
rescue
|
|
return [status, message]
|
|
end
|
|
end
|
|
|
|
def get_body_by_status(status, body)
|
|
body, message =
|
|
case status
|
|
when 401 then [nil, "401"]
|
|
when 404 then [nil, "404"]
|
|
when 403 then [nil, "403"]
|
|
when 500 then [nil, "500"]
|
|
else
|
|
if body.present?
|
|
body = JSON.parse(body)
|
|
fix_body(body)
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
[body, message]
|
|
end
|
|
|
|
def json_parse!(body)
|
|
return nil unless body.present?
|
|
|
|
body = JSON.parse(body)
|
|
body, message = fix_body(body)
|
|
body
|
|
end
|
|
|
|
def log_error(status, body)
|
|
puts "[gitea] status: #{status}"
|
|
puts "[gitea] body: #{body&.force_encoding('UTF-8')}"
|
|
end
|
|
|
|
def fix_body(body)
|
|
return [body, nil] if body.is_a?(Array) || body.is_a?(Hash)
|
|
|
|
body['message'].blank? ? [body, nil] : [nil, body['message']]
|
|
end
|
|
|
|
def render_json_data(status, message, body, success=true)
|
|
if success
|
|
success(body)
|
|
else
|
|
error(message, status)
|
|
end
|
|
end
|
|
|
|
def error(message, http_status = nil)
|
|
result = {
|
|
message: message,
|
|
status: :error
|
|
}
|
|
|
|
result[:http_status] = http_status if http_status
|
|
result
|
|
end
|
|
|
|
def success(body=nil)
|
|
{
|
|
status: :success,
|
|
body: body
|
|
}
|
|
end
|
|
|
|
def render_body(body)
|
|
success(body)[:body]
|
|
end
|
|
|
|
def render_200_response(response)
|
|
extract_statuses(response)
|
|
end
|
|
|
|
def render_200_no_body(response)
|
|
response.status
|
|
case response.status
|
|
when 200
|
|
{status: 200}
|
|
else
|
|
end
|
|
end
|
|
|
|
def render_201_response(response)
|
|
extract_statuses(response)
|
|
end
|
|
|
|
def render_202_response(response)
|
|
extract_statuses(response)
|
|
end
|
|
|
|
def extract_statuses(response)
|
|
success_statuses = [200, 201, 202, 204]
|
|
status, message, body = render_response(response)
|
|
|
|
return error(message, status) unless success_statuses.include? status
|
|
|
|
render_body(body)
|
|
end
|
|
end
|