Sha256: f0032b04b34085f11175e5cd27a7c0999d57b7d8f320af6eb526b481797e6619

Contents?: true

Size: 1.95 KB

Versions: 1

Compression:

Stored size: 1.95 KB

Contents

require "date"

module Opsgenie
  class Schedule
    attr_reader :id, :name, :rotations

    class << self
      def all
        body = Opsgenie::Client.get("schedules?expand=rotation")
        body["data"].map { |s| new(s) }
      end

      def find_by_name(name)
        find(name, "name")
      end

      def find_by_id(id)
        find(id)
      end

      def find(id_or_name, type = "id")
        body = Opsgenie::Client.get("schedules/#{id_or_name}?identifierType=#{type}")
        new(body["data"]) unless body["data"].nil?
      end
    end

    def initialize(attrs)
      @id = attrs["id"]
      @name = attrs["name"]
      @rotations = attrs["rotations"].map { |r| Rotation.new(self, r) }
    end

    def on_calls(datetime = nil)
      endpoint = "schedules/#{id}/on-calls"
      endpoint += "?date=#{escape_datetime(datetime)}" unless datetime.nil?
      body = Opsgenie::Client.get(endpoint)
      get_participants(body).map { |u| User.find_by_username(u["name"]) }
    end

    def timeline(date: Date.today, interval: nil, interval_unit: nil)
      check_interval_unit(interval_unit) if interval_unit

      datetime = date.to_datetime
      endpoint = "schedules/#{id}/timeline?date=#{escape_datetime(datetime)}"
      endpoint += "&interval=#{interval}" if interval
      endpoint += "&intervalUnit=#{interval_unit}" if interval_unit
      body = Opsgenie::Client.get(endpoint)
      body.dig("data", "finalTimeline", "rotations").map do |rotation|
        TimelineRotation.new(rotation)
      end
    end

    private

    def get_participants(body)
      body["data"]["onCallParticipants"].select do |p|
        p["type"] == "user"
      end
    end

    def escape_datetime(datetime)
      CGI.escape(datetime.to_s)
    end

    def check_interval_unit(value)
      return if valid_intervals.include?(value)

      raise ArgumentError, "`interval_unit` must be one of `#{valid_intervals}``"
    end

    def valid_intervals
      %i[days weeks months]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
opsgenie-schedule-0.1.2 lib/opsgenie/schedule.rb