delete method

Future<void> delete({
  1. required DocumentBase<StripePurchaseModel> purchase,
  2. Duration timeout = const Duration(seconds: 15),
})

Delete (cancel) a subscription to purchase that has been started.

開始したpurchaseのサブスクリプションを削除(キャンセル)します。

Implementation

Future<void> delete({
  required DocumentBase<StripePurchaseModel> purchase,
  Duration timeout = const Duration(seconds: 15),
}) async {
  if (_completer != null) {
    return _completer!.future;
  }
  _completer = Completer<void>();
  try {
    final value = purchase.value;
    if (value == null) {
      throw Exception(
        "Purchase information is empty. Please run [create] method.",
      );
    }
    final modelQuery = collection(userId: userId).modelQuery;
    final purchaseCollection = StripePurchaseModelCollection(
      modelQuery.equal(StripePurchaseModelKeys.orderId.name, value.orderId),
    );
    final functionsAdapter =
        StripePurchaseMasamuneAdapter.primary.functionsAdapter ??
            FunctionsAdapter.primary;

    await functionsAdapter.execute(
      StripeDeleteSubscriptionAction(
        orderId: value.orderId,
      ),
    );
    await Future.doWhile(() async {
      await Future.delayed(const Duration(milliseconds: 100));
      await purchaseCollection.reload();
      return purchaseCollection.every(
        (element) =>
            element.value != null && element.value!.cancelAtPeriodEnd,
      );
    }).timeout(timeout);
    _completer?.complete();
    _completer = null;
    notifyListeners();
  } catch (e) {
    _completer?.completeError(e);
    _completer = null;
    rethrow;
  } finally {
    _completer?.complete();
    _completer = null;
  }
}