Sha256: cbad2d8d84d3312459294e452f33cdfaf14e833c28336e8b280431ee24bfadd5

Contents?: true

Size: 1.8 KB

Versions: 224

Compression:

Stored size: 1.8 KB

Contents

# frozen_string_literal: true

module Motor
  module Configs
    class SyncMiddleware
      KeyNotSpecified = Class.new(StandardError)
      NotAuthenticated = Class.new(StandardError)

      def initialize(app)
        @app = app
      end

      def call(env)
        if env['PATH_INFO'] == Motor::Configs::SYNC_API_PATH
          authenticate!(env['HTTP_X_AUTHORIZATION'])

          case env['REQUEST_METHOD']
          when 'GET'
            respond_with_configs
          when 'POST'
            input = env['rack.input']
            input.rewind
            sync_configs(input.read)
          else
            @app.call(env)
          end
        else
          @app.call(env)
        end
      rescue NotAuthenticated
        [403, {}, ['Invalid synchronization API key']]
      rescue KeyNotSpecified
        [404, {}, ['Set `MOTOR_SYNC_API_KEY` environment variable in order to sync configs']]
      end

      private

      def authenticate!(token)
        raise KeyNotSpecified if Motor::Configs::SYNC_ACCESS_KEY.blank?
        raise NotAuthenticated if token.blank?

        is_token_valid =
          ActiveSupport::SecurityUtils.secure_compare(
            Digest::SHA256.hexdigest(token),
            Digest::SHA256.hexdigest(Motor::Configs::SYNC_ACCESS_KEY)
          )

        raise NotAuthenticated unless is_token_valid
      end

      def respond_with_configs
        [
          200,
          { 'Content-Type' => 'application/json' },
          [Motor::Configs::BuildConfigsHash.call.to_json]
        ]
      rescue StandardError => e
        [500, {}, [e.message]]
      end

      def sync_configs(body)
        configs_hash = JSON.parse(body)

        Motor::Configs::SyncFromHash.call(configs_hash)

        [200, {}, []]
      rescue StandardError => e
        [500, {}, [e.message]]
      end
    end
  end
end

Version data entries

224 entries across 224 versions & 7 rubygems

Version Path
motor-admin-0.4.36 lib/motor/configs/sync_middleware.rb
motor-admin-0.4.35 lib/motor/configs/sync_middleware.rb
motor-admin-0.4.34 lib/motor/configs/sync_middleware.rb
motor-admin-0.4.33 lib/motor/configs/sync_middleware.rb
motor-admin-0.4.32 lib/motor/configs/sync_middleware.rb
motor-admin-0.4.31 lib/motor/configs/sync_middleware.rb
motor-admin-0.4.30 lib/motor/configs/sync_middleware.rb
motor-admin-0.4.29 lib/motor/configs/sync_middleware.rb
motor-admin-0.4.28 lib/motor/configs/sync_middleware.rb
motor-admin-cstham8-0.4.35 lib/motor/configs/sync_middleware.rb
motor-admin-cstham8-0.4.34 lib/motor/configs/sync_middleware.rb
motor-admin-cstham8-0.4.33 lib/motor/configs/sync_middleware.rb
motor-admin-cstham8-0.4.32 lib/motor/configs/sync_middleware.rb
motor-admin-cstham8-0.4.31 lib/motor/configs/sync_middleware.rb
motor-admin-cstham8-0.4.30 lib/motor/configs/sync_middleware.rb
motor-admin-cstham8-0.4.29 lib/motor/configs/sync_middleware.rb
motor-admin-cstham8-0.4.28 lib/motor/configs/sync_middleware.rb
motor-admin-cstham8-0.4.27 lib/motor/configs/sync_middleware.rb
motor-admin-0.4.27 lib/motor/configs/sync_middleware.rb
motor-admin-unosquare-0.4.28 lib/motor/configs/sync_middleware.rb