protected override async Task <Order> ProcessAsync(Order order) { HookrRepository.Context.Orders.Remove(order); await HookrRepository.SaveChangesAsync(); return(order); }
protected sealed override async Task <Order> ProcessAsync(Order order) { order.State = NextOrderState; await HookrRepository.SaveChangesAsync(); await NotifyAsync(order, UserContextProvider.DatabaseUser); return(order); }
protected override async Task <Order> ProcessAsync(Order order) { var(productName, productIndex, count) = ExtractProductProperties(ArgumentsLeft); if (count < 1) { throw new InvalidOperationException("Seems like there is no real count."); } switch (productName) { case nameof(Hookah): { await AddProductToOrderAsync(order, productIndex, count, context => context.Hookahs, x => x.OrderedHookahs); break; } case nameof(Tobacco): { await AddProductToOrderAsync(order, productIndex, count, context => context.Tobaccos, x => x.OrderedTobaccos); break; } default: { throw new InvalidOperationException("Wrong product type " + productName); } } await HookrRepository.SaveChangesAsync(); return(order); }
private async Task AddProductToOrderAsync <TProduct, TOrderedProduct>( Order order, int productIndex, int count, Func <HookrContext, DbSet <TProduct> > productTableSelector, Func <Order, ICollection <TOrderedProduct>?> orderedCollectionSelector) where TProduct : Product where TOrderedProduct : Ordered <TProduct>, new() { var products = await HookrRepository.ReadAsync((context, token) => productTableSelector(context) .ToArrayAsync(token)); var product = products.ElementAt(productIndex - 1); if (product == null) { throw new InvalidOperationException($"Missing {typeof(TProduct)} with index {productIndex}"); } var collection = orderedCollectionSelector(order); if (collection == null) { throw new ArgumentNullException(nameof(collection)); } var existingProduct = collection.FirstOrDefault(x => x.ProductId == product.Id); if (existingProduct != null) { existingProduct.Count += count; return; } collection.Add(new TOrderedProduct { Product = product, Count = count }); }
protected override async Task <Order> ProcessAsync(Order order) { order.State = OrderStates.Confirmed; var( notificationFormat, fromFormat, hookahRowFormat, tobaccoRowFormat, unknownTranslated, approveTranslated, rejectTranslated ) = await TranslationsResolver.ResolveAsync( (TelegramTranslationKeys.NewOrderNotification, Array.Empty <object>()), (TelegramTranslationKeys.From, Array.Empty <object>()), (TelegramTranslationKeys.OrderNotificationHookahRow, Array.Empty <object>()), (TelegramTranslationKeys.OrderNotificationTobaccoRow, Array.Empty <object>()), (TelegramTranslationKeys.Unknown, Array.Empty <object>()), (TelegramTranslationKeys.Approve, Array.Empty <object>()), (TelegramTranslationKeys.Reject, Array.Empty <object>()) ); var from = UserContextProvider.Update.From; var notification = string.Format(notificationFormat, order.Id, //todo rework as there is a lot of warning about possible empty pointer dereference. order.OrderedHookahs .AggregateListString(hookahRowFormat, x => x.Product.Name, x => x.Product.Price, x => x.Count, x => x.Count * x.Product.Price), order.OrderedTobaccos .AggregateListString(tobaccoRowFormat, x => x.Product.Name, x => x.Product.Price, x => x.Count, x => x.Count * x.Product.Price), string.Format(fromFormat, string.IsNullOrEmpty(from.Username) ? $"[{unknownTranslated}]" : $"@{from.Username}", string.IsNullOrEmpty(from.FirstName) ? $"[{unknownTranslated}]" : from.FirstName, string.IsNullOrEmpty(from.LastName) ? $"[{unknownTranslated}]" : from.LastName) ); await HookrRepository.SaveChangesAsync(); await telegramUsersNotifier.SendAsync((client, user) => client.SendTextMessageAsync(user.Id, notification, ParseMode.MarkdownV2, replyMarkup: new InlineKeyboardMarkup(new[] { new InlineKeyboardButton { Text = approveTranslated, CallbackData = $"/{nameof(ApproveOrderCommand).ExtractCommandName()} {order.Id}" }, new InlineKeyboardButton { Text = rejectTranslated, CallbackData = $"/{nameof(RejectOrderCommand).ExtractCommandName()} {order.Id}" } })), TelegramUserStates.Service, TelegramUserStates.Dev); return(order); }