require "date" module SearchConsoleApi module Resources module SearchAnalytics class Query def initialize(access_token:, site: nil, start_date: nil, end_date: nil, dimensions: [], type: nil, dimension_filter_groups: [], aggregation_type: nil, row_limit: nil, start_row: nil, data_state: nil) @access_token = access_token @site = site @start_date = DateTime.parse(start_date.to_s).strftime("%Y-%m-%d") @end_date = DateTime.parse(end_date.to_s).strftime("%Y-%m-%d") @dimensions = dimensions @type = type @dimension_filter_groups = dimension_filter_groups @aggregation_type = aggregation_type @row_limit = row_limit @start_row = start_row @data_state = data_state unless @site.is_a?(SearchConsoleApi::Objects::Site) @site = SearchConsoleApi::Objects::Site.new({"siteUrl" => @site}) end end def call return [] unless response["rows"].is_a?(Array) response["rows"].each_with_object([]) do |attrs, rows| rows << Objects::QueryResponseRow.new(attrs, @dimensions) end end def request_path "/sites/#{@site.encoded_site_url}/searchAnalytics/query" end private def response @response ||= Request.post( access_token: @access_token, path: request_path, payload: payload ) end def payload output = { startDate: @start_date, endDate: @end_date } output[:dimensions] = @dimensions if @dimensions.any? output[:type] = @type if @type output[:dimensionFilterGroups] = @dimension_filter_groups if @dimension_filter_groups.any? output[:aggregationType] = @aggregation_type if @aggregation_type output[:rowLimit] = @row_limit if @row_limit output[:startRow] = @start_row if @start_row output[:dataState] = @data_state if @data_state output.to_json end end end end end