forgeplus/app/services/sonar/ApiService.rb

107 lines
3.9 KiB
Ruby

class Sonar::ApiService < ApplicationService
attr_reader :projectId
def initialize(projectId)
@projectId = projectId
end
def call
projects_body = []
projects = Project.where(id: @projectId)
projects.each do |p|
project_language = p.project_language&.name || "Java"
projects_body << {
"projectId": "#{p.identifier}",
"gitUrl": "#{p.repository.url}",
"projectName": "#{p.name}",
"language": "#{project_language}"
}
sonar_task = SonarTask.find_or_initialize_by(project_id: p.id)
sonar_task.user_id = p.user_id
sonar_task.branch = "master"
sonar_task.git_url = p.repository.url
sonar_task.project_identifier = "#{p.identifier}"
sonar_task.project_name = "#{p.name}"
sonar_task.language = p.project_language&.name || "其他"
sonar_task.task_id = nil
sonar_task.complete_status = 0
sonar_task.save
end
url = URI("#{domain}/api/cloudQualityInspect")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
# request["User-Agent"] = "apifox/1.0.0 (https://www.apifox.cn)"
request["Content-Type"] = "application/json"
request.body = JSON.dump(projects_body)
response = http.request(request)
puts "api/cloudQualityInspect response.read_body======#{response.read_body}"
res = JSON.parse(response.body)
if res["code"].to_s == "1"
data = res["data"]
data.each do |task|
sonar_task = SonarTask.find_by(project_identifier: task["projectId"].to_s)
sonar_task.update(task_id: task["taskId"].to_s) if sonar_task.present?
end
end
end
def task_result(task_id)
sonar_task = SonarTask.find_by(task_id: task_id)
return nil if sonar_task.blank?
url = URI("#{domain}/api/cloudQualityInspectResult?taskId=#{sonar_task.task_id}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
# request["User-Agent"] = "apifox/1.0.0 (https://www.apifox.cn)"
response = http.request(request)
Rails.logger.info "api/cloudQualityInspectResult response.read_body======#{response.read_body}"
res = JSON.parse(response.body)
if res["code"].to_s == "1"
data = res["data"]
completed = data["completed"]
if completed.to_i == 1
sonar_task.update(complete_status: completed,
task_name: data["taskName"].to_s,
codeLines: data["codeLines"].to_i,
bugs: data["bugs"].to_i,
codeSmell: data["codeSmell"].to_i,
vulnerability: data["vulnerability"].to_i)
end
end
sonar_task
end
def type_detail(task_id, type)
sonar_task = SonarTask.find_by(task_id: task_id)
return nil if sonar_task.blank?
url = URI("#{domain}/api/issues/search?taskName=#{sonar_task.task_name}&type=#{type}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
# request["User-Agent"] = "apifox/1.0.0 (https://www.apifox.cn)"
response = http.request(request)
Rails.logger.info "api/issues/search response.read_body======#{response.read_body.force_encoding("utf-8")}"
res = JSON.parse(response.body)
res["code"].to_s == "1" ? res["data"] : []
end
def source_code(task_id, component)
sonar_task = SonarTask.find_by(task_id: task_id)
return nil if sonar_task.blank?
url = URI("#{domain}/api/getSourceCode?component=#{component}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
# request["User-Agent"] = "apifox/1.0.0 (https://www.apifox.cn)"
response = http.request(request)
Rails.logger.info "api/getSourceCode response.read_body======#{response.read_body.force_encoding("utf-8")}"
res = JSON.parse(response.body.force_encoding("utf-8"))
res["code"].to_s == "1" ? res["data"]["sources"] : []
end
def domain
EduSetting.get("sonar_api_domain") || "http://117.50.14.123:8001"
end
end