summaryrefslogtreecommitdiff
path: root/app/helpers/jira_connect_helper.rb
blob: ef8e516a4d1a1c2053fa591b63c36b2f086f7f6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# frozen_string_literal: true

module JiraConnectHelper
  def jira_connect_app_data(subscriptions, installation)
    skip_groups = subscriptions.map(&:namespace_id)

    {
      groups_path: api_v4_groups_path(params: { min_access_level: Gitlab::Access::MAINTAINER, skip_groups: skip_groups }),
      subscriptions: subscriptions.map { |s| serialize_subscription(s) }.to_json,
      add_subscriptions_path: jira_connect_subscriptions_path,
      subscriptions_path: jira_connect_subscriptions_path(format: :json),
      users_path: current_user ? nil : jira_connect_users_path, # users_path is used to determine if user is signed in
      gitlab_user_path: current_user ? user_path(current_user) : nil,
      oauth_metadata: Feature.enabled?(:jira_connect_oauth, current_user) ? jira_connect_oauth_data(installation).to_json : nil,
      public_key_storage_enabled: Gitlab.config.jira_connect.enable_public_keys_storage
    }
  end

  private

  def jira_connect_oauth_data(installation)
    oauth_instance_url = installation.oauth_authorization_url

    oauth_authorize_path = oauth_authorization_path(
      client_id: Gitlab::CurrentSettings.jira_connect_application_key,
      response_type: 'code',
      scope: 'api',
      redirect_uri: jira_connect_oauth_callbacks_url,
      state: oauth_state
    )

    {
      oauth_authorize_url: Gitlab::Utils.append_path(oauth_instance_url, oauth_authorize_path),
      oauth_token_path: oauth_token_path,
      state: oauth_state,
      oauth_token_payload: {
        grant_type: :authorization_code,
        client_id: Gitlab::CurrentSettings.jira_connect_application_key,
        redirect_uri: jira_connect_oauth_callbacks_url
      }
    }
  end

  def oauth_state
    @oauth_state ||= SecureRandom.hex(32)
  end

  def serialize_subscription(subscription)
    {
      group: {
        name: subscription.namespace.name,
        avatar_url: subscription.namespace.avatar_url,
        full_name: subscription.namespace.full_name,
        description: subscription.namespace.description
      },
      created_at: subscription.created_at,
      unlink_path: jira_connect_subscription_path(subscription)
    }
  end
end