Sha256: e2d418dcde62c90927b8bbbf580bc0e5cef5caa1ad31b9d06bb82a28b6cf31e9

Contents?: true

Size: 1.88 KB

Versions: 2

Compression:

Stored size: 1.88 KB

Contents

# frozen_string_literal: true
require "uri"
require "httparty"
require "toggl_api/base_client"

module TogglAPI

  # The Toggl API Client
  class ReportsClient < BaseClient
    API_URL = "https://toggl.com/reports/api/v2"

    # @param params [Hash]: Toggl API params
    #   - since
    #   - until
    #   - workspace_id
    #   - ... more params available, see Toggl API documentation for details
    def fetch_reports(params)
      raise "Must give a block" unless block_given?
      page = 1
      current_total = 0
      loop do
        results_raw = fetch_reports_details_raw(
          params.merge(page: page)
        )
        yield(results_raw["data"])

        current_total += results_raw["data"].count
        break if current_total == results_raw["total_count"]
        page += 1
      end
    end

    def fetch_reports_details_raw(params)
      fetch_reports_raw(api_url(:details), params)
    end

    def fetch_reports_summary_raw(params)
      fetch_reports_raw(api_url(:summary), params)
    end

    private

    # @param url [String]
    # @param params [Hash]: Toggl API params
    def fetch_reports_raw(url, params)
      logger.info "Fetching Toggl reports for params #{params}" if logger
      params = { user_agent: @user_agent }.merge(params)
      response = HTTParty.get(
        url,
        headers: headers,
        query: params,
        basic_auth: credentials
      )

      handle_response(response)
    end

    def headers
      { "Content-Type" => "application/json" }
    end

    def credentials
      {
        username: @api_token,
        password: "api_token"
      }
    end

    def handle_response(response)
      if response.code == 200 || response.code == 201
        JSON.parse(response.body)
      else
        fail(Error, "Toggl API error #{response.code}: #{response.body}")
      end
    end

    def api_url(resource)
      "#{API_URL}/#{resource}"
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
toggl_cache-0.2.1 lib/toggl_api/reports_client.rb
toggl_cache-0.2.0 lib/toggl_api/reports_client.rb