BathHacked/energy-sparks

View on GitHub
app/services/meters/n3rgy_metering_service.rb

Summary

Maintainability
A
35 mins
Test Coverage
module Meters
  # Provides a set of useful methods for interacting with the n3rgy API to fetch
  # information about meters
  class N3rgyMeteringService
    RETRY_INTERVAL = 2
    MAX_RETRIES = 4

    def initialize(meter)
      @meter = meter
    end

    def self.consented_meters
      api_client = DataFeeds::N3rgy::DataApiClient.production_client
      response = api_client.list_consented_meters
      response['entries']
    rescue => e
      Rollbar.error(e)
      []
    end

    def status
      api_client.find_mpxn(@meter.mpan_mprn)
      :available
    rescue MeterReadingsFeeds::N3rgyDataApi::NotFound
      :unknown
    rescue MeterReadingsFeeds::N3rgyDataApi::NotAllowed
      :consent_required
    end

    def available?
      api_client.find_mpxn(@meter.mpan_mprn)
      true
    rescue
      false
    end

    def consented?
      return unless available?
      # need to be consented to call this successfully
      api_client.utilities(@meter.mpan_mprn)
      true
    rescue
      false
    end

    def find_mpxn
      api_client.find_mpxn(@meter.mpan_mprn)
    rescue => e
      Rollbar.warning(e, meter: @meter.id, mpan: @meter.mpan_mprn)
      {}
    end

    def available_data
      return [] unless @meter.dcc_meter?
      response = api_client.consumption(@meter.mpan_mprn, @meter.fuel_type)
      return [] if response.dig('availableCacheRange', 'start').blank? &&
                   response.dig('availableCacheRange', 'end').blank?
      start_range = DateTime.parse(response['availableCacheRange']['start'])
      end_range = DateTime.parse(response['availableCacheRange']['end'])
      return [start_range, end_range]
    rescue => e
      Rollbar.warning(e, meter: @meter.id, mpan: @meter.mpan_mprn)
      return []
    end

    def inventory
      details = api_client.read_inventory(device_type, mpxns: @meter.mpan_mprn)
      api_client.fetch_with_retry(details['uri'], RETRY_INTERVAL, MAX_RETRIES)
    rescue
      nil
    end

    private

    def device_type
      @meter.gas? ? 'GSME' : 'ESME'
    end

    def api_client
      DataFeeds::N3rgy::DataApiClient.production_client
    end
  end
end