Exemplo n.º 1
0
        public Task PublishToQueueAsync(KitchenArea kitchenArea, ProductQueueDto productQueue)
        {
            if (connection.IsOpen)
            {
                using (var channel = connection.CreateModel())
                {
                    channel.ConfirmSelect();
                    var queue = channel.QueueDeclare(queue: kitchenArea.Name + " - waiting",
                                                     durable: false,
                                                     exclusive: false,
                                                     autoDelete: false,
                                                     arguments: null);

                    string message = JsonConvert.SerializeObject(productQueue);
                    var    body    = Encoding.UTF8.GetBytes(message);

                    channel.BasicPublish(exchange: "",
                                         routingKey: kitchenArea.Name + " - waiting",
                                         basicProperties: null,
                                         body: body);

                    channel.WaitForConfirmsOrDie(new TimeSpan(0, 0, 1));

                    return(Task.CompletedTask);
                }
            }

            return(Task.FromCanceled(_stoppingCts.Token));
        }
Exemplo n.º 2
0
        public async Task <IActionResult> PlaceOrder([FromBody] OrderDto orderDto)
        {
            try
            {
                var order = service.Create(orderDto);

                var addOrder = await service.Add(order);

                if (!addOrder)
                {
                    return(BadRequest());
                }

                var count = 0;
                foreach (var item in orderDto.ProductOrder)
                {
                    var result = await _productService.GetById(item.ProductId);

                    if (result != null && result.Value.Price == item.Price)
                    {
                        var kitchenQueue = await _kitchenAreaService.GetById(result.Value.KitchenAreaId);

                        if (!kitchenQueue)
                        {
                            return(StatusCode(kitchenQueue.StatusCode, ErrorDto.Create(kitchenQueue.StatusCode, kitchenQueue.Error)));
                        }

                        Console.WriteLine(kitchenQueue.Value.Name);

                        var getOrder = await service.GetOrderByCreatedDate(order.CreatedAt);

                        if (!getOrder)
                        {
                            return(StatusCode(getOrder.StatusCode, ErrorDto.Create(getOrder.StatusCode, getOrder.Error)));
                        }

                        var productQueue = ProductQueueDto.CreateProductQueueDto(getOrder.Value, result.Value, kitchenQueue.Value, count);

                        var publisher = _rabbitMQService.PublishToQueueAsync(kitchenQueue.Value, productQueue).ConfigureAwait(true);

                        if (!publisher.GetAwaiter().IsCompleted)
                        {
                            return(BadRequest());
                        }
                    }
                    count++;
                }
                return(Ok(order));
            }
            catch (Exception ex)
            {
                return(StatusCode(500, ErrorDto.Create(500, "Internal server error: " + ex.Message)));
            }
        }