Skip to content

Commit

Permalink
Support return repos_count and origin on latest metrics API (#10)
Browse files Browse the repository at this point in the history
Signed-off-by: EdmondFrank <[email protected]>
  • Loading branch information
EdmondFrank committed Mar 15, 2023
1 parent 462981f commit de64767
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 24 deletions.
25 changes: 25 additions & 0 deletions app/controllers/concerns/director.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module Director
include Common

COMMUNITY_CACHE_KEY = 'compass-community-list'

def director_repo_list(remote_url)
begin
Rails.cache.fetch("#{COMMUNITY_CACHE_KEY}-#{__method__}-#{remote_url}-list", expires_in: 15.minutes) do
encode_url = URI.encode_www_form_component(remote_url)
response =
Faraday.get(
"#{CELERY_SERVER}/api/compass/#{encode_url}/repositories",
{ 'Content-Type' => 'application/json' }
)
repo_resp = JSON.parse(response.body)
repo_resp.inject([]) do |sum, (_, resource)|
sum + resource.map { |_, list| list }
end.flatten.uniq
end
rescue => ex
Rails.logger.error("failed to retrive repositories, error: #{ex.message}")
[]
end
end
end
2 changes: 2 additions & 0 deletions app/graphql/types/latest_metrics_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ class LatestMetricsType < Types::BaseObject
field :code_quality_guarantee_updated_at, GraphQL::Types::ISO8601DateTime, description: 'latest score of code quality metric model updated_at'
field :organizations_activity, Float, description: 'latest score of organizations activity metric model'
field :organizations_activity_updated_at, GraphQL::Types::ISO8601DateTime, description: 'latest score of organizations activity metric model updated_at'
field :repos_count, Float, description: 'repositories count'
field :origin, String, description: 'repositories origin'
field :label, String, description: 'metric model object identification'
field :level, String, description: 'metric model object level'
end
Expand Down
30 changes: 30 additions & 0 deletions app/graphql/types/queries/base_query.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module Types
module Queries
class BaseQuery < GraphQL::Schema::Resolver
include Director

SEVEN_DAYS = 7 * 24 * 60 * 60
HALF_YEAR = 180 * 24 * 60 * 60
Expand Down Expand Up @@ -145,6 +146,35 @@ def normalize_label(label)
end
end

def extract_repos_count(label, level)
if level == 'community'
project = ProjectTask.find_by(project_name: label)
project ? director_repo_list(project.remote_url).length : 1
else
1
end
end

def extract_repos_source(label, level)
repo_list = [label]
if level == 'community'
project = ProjectTask.find_by(project_name: label)
repo_list = director_repo_list(project.remote_url)
end
github_count, gitee_count = 0,0
repo_list.each do |url|
gitee_count += 1 if url =~ /gitee\.com/
github_count += 1 if url =~ /github\.com/
end
if github_count > 0 && gitee_count == 0
'github'
elsif gitee_count > 0 && github_count == 0
'gitee'
else
'combine'
end
end

def generate_interval_aggs(base_type, date_field, interval_str='1M', avg_type='Float', aliases={}, suffixs=[])
metric_fields =
base_type.fields.select{|k, v| v.type.name.end_with?(avg_type)}.keys.map(&:underscore)
Expand Down
26 changes: 2 additions & 24 deletions app/graphql/types/queries/community_overview_query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ module Types
module Queries
class CommunityOverviewQuery < BaseQuery
include Common
include Director

OVERVIEW_CACHE_KEY = 'compass-group-overview'

Expand All @@ -14,33 +15,11 @@ class CommunityOverviewQuery < BaseQuery
argument :per, Integer, required: false, description: 'per page number'

def resolve(label: nil, page: 1, per: 9)
# result =
# Rails.cache.fetch(
# "#{OVERVIEW_CACHE_KEY}-#{__method__}-#{label}-#{page}-#{per}",
# expires_in: 2.minutes
# ) do
project = ProjectTask.find_by(project_name: label)
skeleton = Hash[Types::CommunityOverviewType.fields.keys.zip([])].symbolize_keys
result =
if project
repo_list =
begin
Rails.cache.fetch("#{OVERVIEW_CACHE_KEY}-#{__method__}-#{label}-list", expires_in: 15.minutes) do
encode_url = URI.encode_www_form_component(project.remote_url)
response =
Faraday.get(
"#{CELERY_SERVER}/api/compass/#{encode_url}/repositories",
{ 'Content-Type' => 'application/json' }
)
repo_resp = JSON.parse(response.body)
repo_resp.inject([]) do |sum, (_, resource)|
sum + resource.map { |_, list| list }
end.flatten.uniq
end
rescue => ex
Rails.logger.error("failed to retrive repositories, error: #{ex.message}")
[]
end
repo_list = director_repo_list(project.remote_url)
current_page = repo_list.in_groups_of(per)&.[]([page.to_i - 1, 0].max) || []
gitee_repos = current_page.select {|row| row =~ /gitee\.com/ }
github_repos = current_page.select {|row| row =~ /github\.com/ }
Expand All @@ -55,7 +34,6 @@ def resolve(label: nil, page: 1, per: 9)
skeleton['trends'] = []
skeleton
end
# end
OpenStruct.new(result)
end
end
Expand Down
4 changes: 4 additions & 0 deletions app/graphql/types/queries/latest_metrics_query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ class LatestMetricsQuery < BaseQuery

def resolve(label: nil, level: 'repo')
label = normalize_label(label)
origin = extract_repos_source(label, level)
repos_count = extract_repos_count(label, level)

result = {}
[ActivityMetric, CommunityMetric, CodequalityMetric, GroupActivityMetric].map do |metric|
Expand All @@ -18,6 +20,8 @@ def resolve(label: nil, level: 'repo')
keys = Types::LatestMetricsType.fields.keys
skeleton = Hash[keys.zip([])].symbolize_keys
skeleton = skeleton.merge(Hash[keys.map(&:underscore).zip([])].symbolize_keys)
skeleton['origin'] = origin
skeleton['repos_count'] = repos_count
OpenStruct.new(skeleton.merge(result))
end

Expand Down

0 comments on commit de64767

Please sign in to comment.