All files / ee/app/assets/javascripts/escalation_policies utils.js

100% Statements 18/18
100% Branches 12/12
100% Functions 9/9
100% Lines 17/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85                  4x 11x                 4x 10x 10x 10x                           4x 2x 2x 2x                       8x   13x                       4x 8x   6x         12x     6x                
import { pickBy, isNull, isNaN } from 'lodash';
import { EMAIL_ONCALL_SCHEDULE_USER, EMAIL_USER } from './constants';
 
/**
 * Returns `true` for non-empty string, otherwise returns `false`
 * @param {String} name
 *
 * @returns {Boolean}
 */
export const isNameFieldValid = (name) => {
  return Boolean(name?.length);
};
 
/**
 * Returns an array of booleans  - validation state for each rule
 * @param {Array} rules
 *
 * @returns {Array}
 */
export const getRulesValidationState = (rules) => {
  return rules.map(({ elapsedTimeMinutes, oncallScheduleIid, username, action }) => {
    const minutes = parseInt(elapsedTimeMinutes, 10);
    return {
      isTimeValid: minutes >= 0 && minutes <= 1440,
      isScheduleValid: action === EMAIL_ONCALL_SCHEDULE_USER ? Boolean(oncallScheduleIid) : true,
      isUserValid: action === EMAIL_USER ? Boolean(username) : true,
    };
  });
};
 
/**
 * Serializes a rule by converting elapsed minutes to seconds
 * @param {Object} rule
 *
 * @returns {Object} rule
 */
export const serializeRule = ({ elapsedTimeMinutes, ...ruleParams }) => {
  const params = { ...ruleParams };
  delete params.action;
  return {
    ...params,
    elapsedTimeSeconds: elapsedTimeMinutes * 60,
  };
};
 
/**
 * Parses a policy by converting elapsed seconds to minutes
 * @param {Object} policy
 *
 * @returns {Object} policy
 */
export const parsePolicy = (policy) => ({
  ...policy,
  rules: policy.rules.map(({ elapsedTimeSeconds, ...ruleParams }) => ({
    ...ruleParams,
    elapsedTimeMinutes: elapsedTimeSeconds / 60,
  })),
});
 
/**
 * Parses a rule for the UI form usage or doe BE params serializing
 * @param {Array} of transformed rules from BE
 *
 * @returns {Array} of rules
 */
export const getRules = (rules) => {
  return rules.map(
    ({ status, elapsedTimeMinutes, oncallScheduleIid, oncallSchedule, user, username }) => {
      const actionBasedProps = pickBy(
        {
          username: username ?? user?.username,
          oncallScheduleIid: parseInt(oncallScheduleIid ?? oncallSchedule?.iid, 10),
        },
        (prop) => !(isNull(prop) || isNaN(prop)),
      );
 
      return {
        status,
        elapsedTimeMinutes,
        ...actionBasedProps,
      };
    },
  );
};