public async Task <QuoteValueCriterionSubscriptionResponse> Process() { decimal currentValue; try { currentValue = await _exchangeRatesProvider.GetAssetValue(_asset); var conditionAlreadyApplies = _request.Predicate(currentValue); if (conditionAlreadyApplies) { return(new QuoteValueCriterionSubscriptionResponse { Success = false, ResultMessage = string.Format(MessageTexts.ConditionAlreadySatisfied, currentValue) }); } var alreadySubscribed = await _subscriptionsManager.AlreadySubscribed(_asset, _request.ChatId, _request.Predicate); if (alreadySubscribed) { return(new QuoteValueCriterionSubscriptionResponse { Success = true, ResultMessage = MessageTexts.AlreadySubscribed }); } } catch (Exception) { return(new QuoteValueCriterionSubscriptionResponse { Success = false, ResultMessage = MessageTexts.ConditionCheckFailed }); } try { await _subscriptionsManager.Subscribe(_asset, _request.ChatId, _request.Predicate); return(new QuoteValueCriterionSubscriptionResponse { Success = true, ResultMessage = string.Format(MessageTexts.SubscribedSuccessfully, currentValue), CurrentPrice = currentValue }); } catch (Exception e) { return(new QuoteValueCriterionSubscriptionResponse { Success = false, ResultMessage = $"{MessageTexts.SubscriptionFailed}. {e.Message}" }); } }