70 lines
1.6 KiB
Ruby
70 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Onboarding
|
|
class Completion
|
|
include Gitlab::Utils::StrongMemoize
|
|
include Gitlab::Experiment::Dsl
|
|
|
|
ACTION_PATHS = [
|
|
:pipeline_created,
|
|
:trial_started,
|
|
:required_mr_approvals_enabled,
|
|
:code_owners_enabled,
|
|
:issue_created,
|
|
:git_write,
|
|
:merge_request_created,
|
|
:user_added,
|
|
:license_scanning_run,
|
|
:secure_dependency_scanning_run,
|
|
:secure_dast_run
|
|
].freeze
|
|
|
|
def initialize(project, current_user = nil)
|
|
@project = project
|
|
@namespace = project.namespace
|
|
@current_user = current_user
|
|
end
|
|
|
|
def percentage
|
|
return 0 unless onboarding_progress
|
|
|
|
total_actions = action_columns.count
|
|
completed_actions = action_columns.count { |column| completed?(column) }
|
|
|
|
(completed_actions.to_f / total_actions * 100).round
|
|
end
|
|
|
|
def completed?(column)
|
|
if column == :code_added
|
|
repository.commit_count > 1 || repository.branch_count > 1
|
|
else
|
|
attributes[column].present?
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def repository
|
|
project.repository
|
|
end
|
|
strong_memoize_attr :repository
|
|
|
|
def attributes
|
|
onboarding_progress.attributes.symbolize_keys
|
|
end
|
|
strong_memoize_attr :attributes
|
|
|
|
def onboarding_progress
|
|
::Onboarding::Progress.find_by(namespace: namespace)
|
|
end
|
|
strong_memoize_attr :onboarding_progress
|
|
|
|
def action_columns
|
|
[:code_added] +
|
|
ACTION_PATHS.map { |action_key| ::Onboarding::Progress.column_name(action_key) }
|
|
end
|
|
strong_memoize_attr :action_columns
|
|
|
|
attr_reader :project, :namespace, :current_user
|
|
end
|
|
end
|