Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/graphql / src / endpoints / loyalty / transform.ts
Size: Mime:
import { autofixSafe } from 'exotic'
import { fromArrayToInfiniteIterator } from 'chain-able'
import { getTyped } from '@skava/modules/___dist/composition'

// what is an lpoints vs apoints?!
const isLabelOrName = label => points =>
  points.label === label || points.name === label

// label:
const isCurrentPoints = isLabelOrName('balance')
const isEarnedPoints = isLabelOrName('totalApprovedPoints')
// name:
const isAdjustedPoints = isLabelOrName('adjustedPoints')
const isRedeemedPoints = isLabelOrName('redeemedPoints')
const isBalancedPoints = isLabelOrName('pendingPoints')
const isSkippedPoints = isLabelOrName('skippedPoints')
// inout
const isTransferredOutPoints = isLabelOrName('transferedOutPoints')
const isTransferredInPoints = isLabelOrName('transferedInPoints')
// approved n such
const isReverseApprovedPoints = isLabelOrName('reversedApprovedPoints')
const isExcludedPoints = isLabelOrName('excludedPoints')
const isCanceledApprovedPoints = isLabelOrName('canceledApprovedPoints')
// isLabelOrName('cappedPoints')
// isLabelOrName('canceledRedeemedPoints')
// isLabelOrName('reverseRedeemedPoints')
// isLabelOrName('expiredPoints')
// isLabelOrName('canceledPoints')
// isLabelOrName('canceledPoints')
// isLabelOrName('forfeitedPoints')

const FAKE_DATE_LIST = Object.freeze([
  '01/01/2018',
  '02/01/2018',
  '05/02/2018',
  '04/01/2018',
  '28/12/2017',
])
const dateIterator = fromArrayToInfiniteIterator(FAKE_DATE_LIST)

const loyaltyTransactionsData = packages => {
  const { obj, string, array } = getTyped(packages)
  const points = array('properties.buyinfo.loyalty.points')
  // @todo - prettydate
  const date = string('transactionDate.value') || dateIterator.next()

  const indexed = {
    /**
     * Added the same data to both startpoints & earned points
     * since seperate data is not availble in the call/fixture
     */
    start: points.find(isTransferredOutPoints).value,
    earned: points.find(isTransferredInPoints).value,

    // @todo unsafe
    adjusted: points.find(isAdjustedPoints).value,
    redeemed: points.find(isRedeemedPoints).value,
    balanced: points.find(isBalancedPoints).value,
  }

  autofixSafe(indexed)

  return {
    // indexedPoints: indexed,
    startPoints: indexed.start,
    earnedPoints: indexed.earned,

    date,
    transactionDate: date,

    adjustedPoints: indexed.adjusted,
    redeemedPoints: indexed.redeemed,
    balancedPoints: indexed.balanced,
  }
}

const loyaltyPointsTransform = response => {
  console.log('loyaltyPointsTransform', response)

  const { array, obj, string, number } = getTyped(response)
  const points = array('properties.userinfo[0].math.points')
  const current = points.find(isCurrentPoints)
  const earned = points.find(isEarnedPoints)

  const transformed = {
    type: string('type'),
    // count: obj('properties.state.count'),
    count: number('properties.state.count'),
    points,
    // @todo fix casing
    currentpoints: current,
    earnedpoints: earned,
    // =>
    // currentPoints: current,
    // earnedPoints: earned,
    // testPoints: JSON.stringify(response),
  }
  return transformed
}

const loyaltyTransactionTransform = response => {
  // console.dev('loyaltyTransactionTransform', response)

  const { string, array, number } = getTyped(response)
  const packages = array('children.packages')

  const loyaltyTransactionResponse = {
    type: string('type'),
    count: number('properties.state.count'),
    // old name: loyaltypointsTableData
    transactionList: packages.map(loyaltyTransactionsData),
    earnedloyaltypoints: packages.map(loyaltyTransactionsData),
    loyaltypackages: packages,
  }
  return loyaltyTransactionResponse
}

// unused
// const loyaltyCreateTransactionTransform = response => {
//   console.dev('loyaltyCreateTransactionTransform', response)
//   const { obj, string } = getTyped(response)
//   // this is wrong >>>>
//   // this gets passed 'properties.buyinfo.loyalty.points'
//   const loyaltyCreateTransactionResponse = {
//     type: string('type'),
//     responseMessage: string('responseMessage'),
//     properties: obj('properties'),
//     responseCode: string('responseCode'),
//   }
//   return loyaltyCreateTransactionResponse
// }

const loyaltyTransform = response => {
  // console.dev('inside transaction transform 0', response)

  const { obj } = getTyped(response)
  const transaction = obj('transaction')
  const loyalty = obj('loyaltyPoints')
  const create = obj('createloyaltyTransaction')

  const loyaltyResponse = {
    transaction: loyaltyTransactionTransform(transaction),
    loyaltyPoints: loyaltyPointsTransform(loyalty),
  }
  return loyaltyResponse
}

// generateRedemption?
// side effect free, as all transforms
// * 2 || * 1/2
const multiplierIterator = fromArrayToInfiniteIterator([1 / 2, 2])
const generateLoyaltyTransactionsList = transformed => {
  const multiplier = multiplierIterator.next()
  // console.dev(multiplierIterator, multiplier, 'mmmmmmmmmmmmm')

  const {
    startPoints,
    earnedPoints,
    transactionDate,
    redeemedPoints,
    adjustedPoints,
    balancedPoints,
  } = transformed

  const transaction = {
    startPoints,
    earnedPoints,
    adjustedPoints,
    redeemedPoints,
    balancedPoints,
  }

  Object.keys(transaction).forEach(key => {
    // * multiplier...
    if (multiplier > 1) {
      transaction[key] = transaction[key] + 1
    } else {
      transaction[key] = transaction[key] - 1
    }
  })

  transaction.transactionDate = dateIterator.next()

  return autofixSafe(transaction)

  // just generating list
  // return {
  //   // ...transformed,
  //   ...transaction,
  // }
}

const generateLoyaltyTransactionsFrom = listOfLists => {
  return listOfLists.map(generateLoyaltyTransactionsList)
}

export {
  loyaltyTransform,
  loyaltyTransactionTransform,
  generateLoyaltyTransactionsFrom,
}
export default loyaltyTransform