# frozen_string_literal: true require_relative "../base" module Neetob class CLI module Cronitor class Base < CLI::Base MONITORS_URL = "https://cronitor.io/api/monitors" def initialize super() end def process(*args) raise(StandardError, "CRONITOR_ONE_API_KEY is not given") if ENV["CRONITOR_ONE_API_KEY"].nil? raise(StandardError, "CRONITOR_THREE_API_KEY is not given") if ENV["CRONITOR_THREE_API_KEY"].nil? run(*args) end private def parse_response(http_result) case http_result when Net::HTTPSuccess JSON.parse(http_result.body, symbolize_names: true) else error_message = JSON.parse(http_result.body)["errors"][0]["message"] raise(StandardError, "Request failed with status code #{http_result.code}: #{error_message}") end end def get(username:, password:, headers: { "Accept" => "application/json" }) monitors = [] move_to_next_page = true page = 1 while move_to_next_page url_to_fetch_from = MONITORS_URL url_to_fetch_from += "?page=#{page}" if page > 1 uri = URI(url_to_fetch_from) request = Net::HTTP::Get.new(uri) headers.each { |key, value| request[key] = value } request.basic_auth(username, password) response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end parsed_response = parse_response(response) total_monitor_count = parsed_response[:total_monitor_count] page_size = parsed_response[:page_size] if total_monitor_count > (page * page_size) page += 1 else move_to_next_page = false end monitors += parsed_response[:monitors] end monitors end end end end end