function parseNotification()

in typescript/src/pubsub/apple-common.ts [414:518]


function parseNotification(
  payload: unknown,
): Result<string, StatusUpdateNotification> {
  if (!isObject(payload)) {
    return err("The notification from Apple didn't have any data we can parse");
  }

  console.log(`[cc92c1a6] ${JSON.stringify(payload)}`);
  const unifiedReceipt = parseUnifiedReceipt(payload.unified_receipt);
  console.log(`[23666f1f] ${JSON.stringify(payload)}`);
  if (unifiedReceipt.kind === ResultKind.Err) {
    return unifiedReceipt;
  }

  const extractPromotionalOfferId = (
    unifiedReceipt: UnifiedReceiptInfo,
  ): string | null => {
    if (unifiedReceipt.latest_receipt_info.length > 0) {
      return unifiedReceipt.latest_receipt_info[0].promotional_offer_id || null;
    }
    return null;
  };

  const extractPromotionalOfferName = (
    unifiedReceipt: UnifiedReceiptInfo,
  ): string | null => {
    // essentially return the first product id and empty string if it could not be found
    // This should be corrected, but I cannot see a promotional offer name
    if (unifiedReceipt.latest_receipt_info.length > 0) {
      return unifiedReceipt.latest_receipt_info[0].offer_code_ref_name || null;
    }
    return null;
  };

  const extractProductId = (unifiedReceipt: UnifiedReceiptInfo): string => {
    // essentially return the first product id and empty string if it could not be found
    // This should be corrected, but I cannot see a promotional offer name
    if (unifiedReceipt.latest_receipt_info.length > 0) {
      return unifiedReceipt.latest_receipt_info[0].product_id;
    }
    return '';
  };

  const purchaseDateMs = (unifiedReceipt: UnifiedReceiptInfo): number => {
    if (unifiedReceipt.latest_receipt_info.length > 0) {
      return Number(
        unifiedReceipt.latest_receipt_info[0].purchase_date_ms || '0',
      );
    }
    return 0;
  };

  const expiresDateMs = (unifiedReceipt: UnifiedReceiptInfo): number => {
    if (unifiedReceipt.latest_receipt_info.length > 0) {
      return Number(
        unifiedReceipt.latest_receipt_info[0].purchase_date_ms || '0',
      );
    }
    return 0;
  };

  if (
    typeof payload.environment === 'string' &&
    typeof payload.bid === 'string' &&
    typeof payload.bvrs === 'string' &&
    typeof payload.notification_type === 'string' &&
    (typeof payload.original_transaction_id === 'string' ||
      typeof payload.original_transaction_id === 'undefined' ||
      typeof payload.original_transaction_id === 'number') &&
    (typeof payload.cancellation_date === 'string' ||
      typeof payload.cancellation_date === 'undefined') &&
    (typeof payload.web_order_line_item_id === 'string' ||
      typeof payload.web_order_line_item_id === 'undefined') &&
    typeof payload.auto_renew_status === 'string' &&
    (typeof payload.auto_renew_adam_id === 'string' ||
      typeof payload.auto_renew_adam_id === 'undefined') &&
    typeof payload.auto_renew_product_id === 'string' &&
    (typeof payload.expiration_intent === 'string' ||
      typeof payload.expiration_intent === 'undefined')
  ) {
    return ok({
      environment: payload.environment,
      bid: payload.bid,
      bvrs: payload.bvrs,
      notification_type: payload.notification_type,
      original_transaction_id:
        typeof payload.original_transaction_id === 'number'
          ? payload.original_transaction_id.toString()
          : payload.original_transaction_id,
      cancellation_date: payload.cancellation_date,
      web_order_line_item_id: payload.web_order_line_item_id,
      auto_renew_status: payload.auto_renew_status,
      auto_renew_adam_id: payload.auto_renew_adam_id,
      auto_renew_product_id: payload.auto_renew_product_id,
      expiration_intent: payload.expiration_intent,
      unified_receipt: unifiedReceipt.value,
      promotional_offer_id: extractPromotionalOfferId(unifiedReceipt.value),
      promotional_offer_name: extractPromotionalOfferName(unifiedReceipt.value),
      product_id: extractProductId(unifiedReceipt.value),
      purchase_date_ms: purchaseDateMs(unifiedReceipt.value),
      expires_date_ms: expiresDateMs(unifiedReceipt.value),
    });
  }
  return err('Notification from Apple cannot be parsed');
}