Пример #1
0
        public async Task <IActionResult> ProcessSwipe(ProcessSwipe command)
        {
            if (User.IsPointOfSale())
            {
                command = command.Bind(cmd => cmd.PointOfSaleId, User.GetPointOfSaleId());
            }

            var result = await SendRequest <IProcessSwipe, IIdentifierResult>(command);

            if (!result.Successful)
            {
                return(result.ToActionResult());
            }

            return(CreatedAtAction("GetSale", "Sales", new { id = result.Id.Value }, null));
        }
Пример #2
0
        protected override async Task HandleAsync(Guid posId, JObject messagePayload)
        {
            var cardId     = messagePayload[MessageKey].Value <string>();
            var offersPage = await _offersService.BrowseOffers(new BrowseOffers { AtPointOfSaleId = posId, ValidAt = DateTime.UtcNow, ResultsPerPage = 1 });

            if (offersPage.TotalResults != 1)
            {
                Logger.LogError("The point of sale {posId} must have exactly one valid offer, else swipes cannot be processed", posId);
                return;
            }

            if (!(offersPage.Items?.SingleOrDefault() is Offer offer))
            {
                Logger.LogError("A single offer was expected in the offers result set");
                return;
            }

            var command       = new ProcessSwipe(AuthenticationMeansType, cardId, posId, offer.Id, 1);
            var processResult = await _busPublisher.SendRequest <IProcessSwipe, IIdentifierResult>(command);

            if (!processResult.Successful)
            {
                Logger.LogError(processResult.ToException(), "Could not process swipe");
                return;
            }
            else if (!processResult.Id.HasValue)
            {
                Logger.LogError("Swipe process was successful but did not yield a sale identifier");
                return;
            }

            var dispenseResult = await _busPublisher.SendRequest(new Commands.DispenseProduct(posId, offer.ProductId));

            var confirmResult = await _busPublisher.SendRequest <IConfirmSwipe>(new ConfirmSwipe(posId, processResult.Id.Value));

            if (!confirmResult.Successful)
            {
                Logger.LogError(confirmResult.ToException(), "Could not confirm swipe");
                return;
            }

            Logger.LogInformation($"Successfully handled sale with ID {processResult.Id.Value}");
        }