/**
   * Closes or marks the alert as read based on the received event.
   *
   * @param event the event - id of the alert to update is the only expected parameter
   */
  @MotechListener(subjects = {CLOSE_ALERT_SUBJECT, MARK_ALERT_READ_SUBJECT})
  public void updateStatus(MotechEvent event) {
    Long id = Long.valueOf(getValueAsString(event, ALERT_ID));
    UpdateCriteria criteria = new UpdateCriteria();

    if (event.getSubject().equals(CLOSE_ALERT_SUBJECT)) {
      criteria.status(AlertStatus.CLOSED);
    } else {
      criteria.status(AlertStatus.READ);
    }

    alertService.update(id, criteria);
  }
  /**
   * Creates a new alert from the received event.
   *
   * @param event the event to build the alert from
   */
  @MotechListener(subjects = {CREATE_ALERT_SUBJECT})
  public void create(MotechEvent event) {
    String externalId = getValueAsString(event, EXTERNAL_ID_KEY);
    String alertName = getValueAsString(event, ALERT_NAME);
    String alertDescription = getValueAsString(event, ALERT_DESCRIPTION);
    AlertType alertType = getValueAsEnum(AlertType.class, event, ALERT_TYPE);
    AlertStatus alertStatus = getValueAsEnum(AlertStatus.class, event, ALERT_STATUS);
    Integer alertPriority = Integer.valueOf(getValueAsString(event, ALERT_PRIORITY));
    Map<String, String> alertData = (Map<String, String>) getValue(event, ALERT_DATA);

    alertService.create(
        externalId, alertName, alertDescription, alertType, alertStatus, alertPriority, alertData);
  }