preload ids or objects for users, merge request and issues
This commit is contained in:
parent
de96f295a2
commit
98773ef974
6 changed files with 56 additions and 19 deletions
27
lib/gitlab/cycle_analytics/author_updater.rb
Normal file
27
lib/gitlab/cycle_analytics/author_updater.rb
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
module Gitlab
|
||||||
|
module CycleAnalytics
|
||||||
|
class AuthorUpdater
|
||||||
|
def self.update!(*args)
|
||||||
|
new(*args).update!
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(event_result)
|
||||||
|
@event_result = event_result
|
||||||
|
end
|
||||||
|
|
||||||
|
def update!
|
||||||
|
@event_result.each do |event|
|
||||||
|
event['author'] = users[event.delete('author_id').to_i].first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def user_ids
|
||||||
|
@event_result.map { |event| event['author_id'] }
|
||||||
|
end
|
||||||
|
|
||||||
|
def users
|
||||||
|
@users ||= User.find(user_ids).group_by { |user| user['id'] }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -12,7 +12,9 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch
|
def fetch
|
||||||
@query.execute(self).map do |event|
|
update_author! if event_result.first['author_id']
|
||||||
|
|
||||||
|
event_result.map do |event|
|
||||||
serialize(event) if has_permission?(event['id'])
|
serialize(event) if has_permission?(event['id'])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -25,12 +27,28 @@ module Gitlab
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def update_author!
|
||||||
|
AuthorUpdater.update!(event_result)
|
||||||
|
end
|
||||||
|
|
||||||
|
def event_result
|
||||||
|
@event_result ||= @query.execute(self).to_a
|
||||||
|
end
|
||||||
|
|
||||||
def serialize(_event)
|
def serialize(_event)
|
||||||
raise NotImplementedError.new("Expected #{self.name} to implement serialize(event)")
|
raise NotImplementedError.new("Expected #{self.name} to implement serialize(event)")
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_permission?(_id)
|
def has_permission?(id)
|
||||||
true
|
allowed_ids.nil? || allowed_ids.include?(id.to_i)
|
||||||
|
end
|
||||||
|
|
||||||
|
def allowed_ids
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def event_result_ids
|
||||||
|
event_result.map { |event| event['id'] }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,13 +19,11 @@ module Gitlab
|
||||||
private
|
private
|
||||||
|
|
||||||
def serialize(event)
|
def serialize(event)
|
||||||
event['author'] = User.find(event.delete('author_id'))
|
|
||||||
|
|
||||||
AnalyticsMergeRequestSerializer.new(project: @project).represent(event).as_json
|
AnalyticsMergeRequestSerializer.new(project: @project).represent(event).as_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_permission?(id)
|
def allowed_ids
|
||||||
@options[:current_user].can?(:read_merge_request, MergeRequest.find(id))
|
@allowed_ids ||= MergeRequestsFinder.new(@options[:current_user], project_id: @project.id).execute.where(id: event_result_ids).pluck(:id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,13 +18,11 @@ module Gitlab
|
||||||
private
|
private
|
||||||
|
|
||||||
def serialize(event)
|
def serialize(event)
|
||||||
event['author'] = User.find(event.delete('author_id'))
|
|
||||||
|
|
||||||
AnalyticsIssueSerializer.new(project: @project).represent(event).as_json
|
AnalyticsIssueSerializer.new(project: @project).represent(event).as_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_permission?(id)
|
def allowed_ids
|
||||||
@options[:current_user].can?(:read_issue, Issue.find(id))
|
@allowed_ids ||= IssuesFinder.new(@options[:current_user], project_id: @project.id).execute.where(id: event_result_ids).pluck(:id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,13 +17,11 @@ module Gitlab
|
||||||
private
|
private
|
||||||
|
|
||||||
def serialize(event)
|
def serialize(event)
|
||||||
event['author'] = User.find(event.delete('author_id'))
|
|
||||||
|
|
||||||
AnalyticsIssueSerializer.new(project: @project).represent(event).as_json
|
AnalyticsIssueSerializer.new(project: @project).represent(event).as_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_permission?(id)
|
def allowed_ids
|
||||||
@options[:current_user].can?(:read_issue, Issue.find(id))
|
@allowed_ids ||= IssuesFinder.new(@options[:current_user], project_id: @project.id).execute.where(id: event_result_ids).pluck(:id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,13 +16,11 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
def serialize(event)
|
def serialize(event)
|
||||||
event['author'] = User.find(event.delete('author_id'))
|
|
||||||
|
|
||||||
AnalyticsMergeRequestSerializer.new(project: @project).represent(event).as_json
|
AnalyticsMergeRequestSerializer.new(project: @project).represent(event).as_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_permission?(id)
|
def allowed_ids
|
||||||
@options[:current_user].can?(:read_merge_request, MergeRequest.find(id))
|
@allowed_ids ||= MergeRequestsFinder.new(@options[:current_user], project_id: @project.id).execute.where(id: event_result_ids).pluck(:id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue