Sha256: 99153d02260b3f74bc1979a5cb8a6727ceb3d53a5cd841ac5f9695ee9644b2f0

Contents?: true

Size: 1.15 KB

Versions: 6

Compression:

Stored size: 1.15 KB

Contents

# frozen_string_literal: true
module Shipit
  class ApiClient < Record
    InsufficientPermission = Class.new(StandardError)

    belongs_to :creator, class_name: 'User'
    belongs_to :stack, optional: true

    validates :creator, :name, presence: true

    serialize :permissions, Array
    PERMISSIONS = %w(
      read:stack
      write:stack
      deploy:stack
      lock:stack
      read:hook
      write:hook
    ).freeze
    validates :permissions, subset: { of: PERMISSIONS }

    class << self
      def authenticate(token)
        find_by(id: message_verifier.verify(token).to_i)
      rescue Shipit::SimpleMessageVerifier::InvalidSignature
      end

      def message_verifier
        @message_verifier ||= Shipit::SimpleMessageVerifier.new(Shipit.api_clients_secret)
      end
    end

    def authentication_token
      self.class.message_verifier.generate(id)
    end

    def check_permissions!(operation, scope)
      required_permission = "#{operation}:#{scope}"
      unless permissions.include?(required_permission)
        raise InsufficientPermission, "This operation requires the `#{required_permission}` permission"
      end
      true
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
shipit-engine-0.36.0 app/models/shipit/api_client.rb
shipit-engine-0.35.1 app/models/shipit/api_client.rb
shipit-engine-0.35.0 app/models/shipit/api_client.rb
shipit-engine-0.34.0 app/models/shipit/api_client.rb
shipit-engine-0.33.0 app/models/shipit/api_client.rb
shipit-engine-0.32.0 app/models/shipit/api_client.rb