Sha256: 2a4fa15b4af313af24547f4cea05ce2f9753aa55fc409461297a0ff3d66922d6

Contents?: true

Size: 1.75 KB

Versions: 33

Compression:

Stored size: 1.75 KB

Contents

# frozen_string_literal: true

require "octokit"
require "jwt"

module CiToolkit
  # Utility class that provides an access token that can be used with the Github API
  class GithubBot
    # Provides a jwt token for authentication. Sores the private key and app id for the bot
    class Credentials
      attr_reader :app_id

      def initialize(app_id = ENV["CRVSH_BOT_GITHUB_APP_ID"], private_key = ENV["CRVSH_BOT_GITHUB_APP_PRIVATE_KEY"])
        @app_id = app_id.to_i
        @private_key = private_key
      end

      def jwt_token
        return if @private_key.nil?

        JWT.encode(
          {
            iat: Time.now.to_i,
            exp: Time.now.to_i + (9 * 60),
            iss: @app_id
          },
          OpenSSL::PKey::RSA.new(@private_key),
          "RS256"
        )
      end
    end
    # stack = Faraday::RackBuilder.new do |builder|
    #   builder.response :logger
    #   builder.use Octokit::Response::RaiseError
    #   builder.adapter Faraday.default_adapter
    # end
    # Octokit.middleware = stack

    def initialize(
      credentials = CiToolkit::GithubBot::Credentials.new,
      client = Octokit::Client.new(bearer_token: credentials.jwt_token, auto_paginate: true)
    )
      @app_id = credentials.app_id
      @client = client
    end

    def create_token
      return unless (installation_id = find_app_installation)

      @client.create_app_installation_access_token(
        installation_id,
        { accept: Octokit::Preview::PREVIEW_TYPES[:integrations] }
      )[:token]
    end

    private

    def find_app_installation
      @client.find_app_installations(
        { accept: Octokit::Preview::PREVIEW_TYPES[:integrations] }
      ).select { |installation| @app_id.equal?(installation[:app_id]) }.first[:id]
    end
  end
end

Version data entries

33 entries across 33 versions & 1 rubygems

Version Path
ci_toolkit-1.5.22 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.21 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.20 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.19 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.17 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.16 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.15 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.14 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.13 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.12 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.11 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.10 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.9 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.8 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.7 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.6 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.5 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.4 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.3 lib/ci_toolkit/github_bot.rb
ci_toolkit-1.5.2 lib/ci_toolkit/github_bot.rb