InappifyPurchaseAttempt.fromMap constructor

InappifyPurchaseAttempt.fromMap(
  1. Map<String, dynamic> map
)

Implementation

factory InappifyPurchaseAttempt.fromMap(Map<String, dynamic> map) {
  final id = map['attemptId'];
  final product = map['productIdentifier'];
  final offering = map['offeringIdentifier'];
  final market = map['market'];
  final updated = map['updatedAtEpochMillis'];
  final status = switch (map['status']) {
    'PENDING' => InappifyPurchaseAttemptStatus.pending,
    'SUCCEEDED' => InappifyPurchaseAttemptStatus.succeeded,
    'FAILED' => InappifyPurchaseAttemptStatus.failed,
    _ => throw const FormatException('Invalid purchase attempt status.'),
  };
  if (id is! String ||
      !RegExp(r'^[A-Za-z0-9_.:-]{1,128}$').hasMatch(id) ||
      product is! String ||
      product.isEmpty ||
      offering is! String ||
      !{'none', 'bazar', 'myket'}.contains(market) ||
      updated is! num ||
      !updated.isFinite ||
      updated < 0 ||
      updated != updated.toInt()) {
    throw const FormatException('Invalid purchase attempt fields.');
  }
  final rawPurchase = map['purchase'];
  final purchase = rawPurchase == null
      ? null
      : PurchaseResult.fromJson(
          Map<String, dynamic>.from(rawPurchase as Map),
        );
  final rawError = map['error'];
  InappifyFailure? failure;
  if (rawError != null) {
    final error = Map<String, dynamic>.from(rawError as Map);
    if (error['code'] is! String ||
        error['message'] is! String ||
        error['retryable'] is! bool) {
      throw const FormatException('Invalid purchase attempt failure.');
    }
    failure = InappifyFailure(
      code: InappifyFailureCode.values.firstWhere(
        (value) => value.name == error['code'],
        orElse: () => InappifyFailureCode.unknown,
      ),
      message: error['message'] as String,
      isRetryable: error['retryable'] as bool,
      details: Map<String, Object?>.unmodifiable(
        Map<String, Object?>.from(error['details'] as Map? ?? const {}),
      ),
    );
  }
  if (purchase != null &&
          (purchase.mobile?.idempotencyKey != id ||
              purchase.mobile?.productIdentifier != product ||
              purchase.mobile?.offeringIdentifier != offering ||
              purchase.mobile?.market != market) ||
      status == InappifyPurchaseAttemptStatus.succeeded &&
          purchase?.purchaseStatus != PurchaseStatus.DONE ||
      status == InappifyPurchaseAttemptStatus.failed && failure == null) {
    throw const FormatException(
      'Purchase attempt result does not match its identity.',
    );
  }
  return InappifyPurchaseAttempt(
    attemptId: id,
    productIdentifier: product,
    offeringIdentifier: offering,
    market: market as String,
    status: status,
    updatedAtEpochMillis: updated.toInt(),
    purchase: purchase,
    failure: failure,
  );
}