forked from Gitlink/forgeplus
107 lines
3.9 KiB
Ruby
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
|