lib/tanita/api/client/base.rb in tanita-api-client-0.2.3 vs lib/tanita/api/client/base.rb in tanita-api-client-0.3.0

- old
+ new

@@ -1,13 +1,11 @@ # frozen_string_literal: true -require 'time' -require 'tanita/api/client/helpers' - module Tanita module Api module Client + module Scope INNERSCAN = 'innerscan' SPHYGMOMANOMETER = 'sphygmomanometer' PEDOMETER = 'pedometer' SMUG = 'smug' @@ -17,124 +15,8 @@ end class Error < StandardError end - DATE_TYPE_REGISTERD_AT = 0 - DATE_TYPE_MEASURED_AT = 1 - - class BaseApiClient - include HttpHelper - - def initialize(access_token: nil, date_type: DATE_TYPE_MEASURED_AT) - config = Tanita::Api::Client.configuration - @access_token = access_token || config.access_token - raise Error.new("param:'access_token' is required.'") if @access_token.nil? - - @date_type = date_type - raise Error.new("param:'date_type' is invalid.'") unless [DATE_TYPE_REGISTERD_AT, DATE_TYPE_MEASURED_AT].include? date_type - end - - def status( - from: nil, - to: nil - ) - tags = measurement_tags.values.map { |i| i[:code] }.join(',') - params = { - :access_token => @access_token, - :date => @date_type, - :tag => tags - } - params[:from] = time_format(from) unless from.nil? - params[:to] = time_format(to) unless to.nil? - res = request(endpoint, params) - Result.new(:client => self, :response => res) - end - - def endpoint - raise NotImplementedError - end - - def measurement_tags - raise NotImplementedError - end - - def find_measurement_tag(code:) - return @inverted_measurement[code] unless @inverted_measurement.nil? - - @inverted_measurement = {} - measurement_tags.each do |m_name, m_info| - @inverted_measurement[m_info[:code]] = {:name => m_name, :type => m_info[:type]} - end - @inverted_measurement[code] - end - - def date_key - case @date_type - when DATE_TYPE_REGISTERD_AT - :registered_at - when DATE_TYPE_MEASURED_AT - :measured_at - end - end - - private - - def time_format(time) - time.strftime('%Y%m%d%H%M%S') - end - end - - class Result - include HttpHelper - - # [Date] - attr_reader :birth_date - - # [Float] (centimeter) - attr_reader :height - - # [String] 'male' or 'female' - attr_reader :sex - - # [Array<Hash>] - attr_reader :items - - def initialize(client:, response:) - @client = client - result = parse_json(response.body) - @birth_date = Date.parse(result[:birth_date]) - @height = result[:height].to_f - @sex = result[:sex] - @items = build_items(result[:data]) - end - - private - - def build_items(raw_items) - item_dic = {} - raw_items.each do |item| - date = item[:date] - model = item[:model] - key = "#{date}_#{model}" - measurement = @client.find_measurement_tag(:code => item[:tag]) - value = cast(:value => item[:keydata], :type => measurement[:type]) - item_dic[key] ||= {} - item_dic[key][@client.date_key] = Time.parse("#{date} +09:00").to_i unless item_dic[key].key? :date - item_dic[key][:model] = model unless item_dic[key].key? :model - item_dic[key][measurement[:name]] = value - end - # sort by date in ascending order - item_dic.values.sort_by { |dic| dic[@client.date_key] } - end - - def cast(value:, type:) - return value if value.nil? - return value.to_i if type == Integer - return value.to_f if type == Float - - value - end - end end end end