lib/gds_api/email_alert_api.rb



require_relative 'base'
require_relative 'exceptions'

# Adapter for the Email Alert API
#
# @see https://github.com/alphagov/email-alert-api
# @api documented
class GdsApi::EmailAlertApi < GdsApi::Base
  # Get or Post subscriber list
  #
  # @param attributes [Hash] document_type, links, tags used to search existing subscriber lists
  def find_or_create_subscriber_list(attributes)
    find_subscriber_list(attributes)
  rescue GdsApi::HTTPNotFound
    create_subscriber_list(attributes)
  end

  # Get a subscriber list
  #
  # @param attributes [Hash] document_type, links, tags used to search existing subscriber lists
  def find_subscriber_list(attributes)
    tags = attributes["tags"]
    links = attributes["links"]
    document_type = attributes["document_type"]
    email_document_supertype = attributes["email_document_supertype"]
    government_document_supertype = attributes["government_document_supertype"]
    gov_delivery_id = attributes["gov_delivery_id"]

    if tags && links
      message = "please provide either tags or links (or neither), but not both"
      raise ArgumentError, message
    end

    params = {}
    params[:tags] = tags if tags
    params[:links] = links if links
    params[:document_type] = document_type if document_type
    params[:email_document_supertype] = email_document_supertype if email_document_supertype
    params[:government_document_supertype] = government_document_supertype if government_document_supertype
    params[:gov_delivery_id] = gov_delivery_id if gov_delivery_id

    query_string = nested_query_string(params)
    get_json("#{endpoint}/subscriber-lists?" + query_string)
  end

  # Post a subscriber list
  #
  # @param attributes [Hash] document_type, links, tags used to search existing subscriber lists
  def create_subscriber_list(attributes)
    post_json("#{endpoint}/subscriber-lists", attributes)
  end

  # Post notification
  #
  # @param publication [Hash] Valid publication attributes
  def send_alert(publication, headers = {})
    post_json("#{endpoint}/notifications", publication, headers)
  end

  # Get notifications
  #
  # @option start_at [String] Optional GovDelivery bulletin id to page back through notifications
  #
  # @return [Hash] notifications
  def notifications(start_at = nil)
    url = "#{endpoint}/notifications"
    url += "?start_at=#{start_at}" if start_at
    get_json(url)
  end

  # Get notification
  #
  # @param id [String] GovDelivery bulletin id
  #
  # @return [Hash] notification
  def notification(id)
    get_json("#{endpoint}/notifications/#{id}")
  end

  # Get topic matches
  #
  # @param attributes [Hash] tags, links, document_type,
  # email_document_supertype, government_document_supertype
  #
  # @return [Hash] topics, enabled, disabled
  def topic_matches(attributes)
    query_string = nested_query_string(attributes)
    get_json("#{endpoint}/topic-matches.json?#{query_string}")
  end

private

  def nested_query_string(params)
    Rack::Utils.build_nested_query(params)
  end
end