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}");
        }
Exemple #2
0
 public async Task <ActionResult <IPagedResult <Offer> > > BrowseOffers([FromQuery] BrowseOffers query)
 => Collection(await _offersService.BrowseOffers(query));
 protected override async Task <IEnumerable <Guid> > FindAsync(StockItemIdParameters args)
 => (await _offersService.BrowseOffers(new BrowseOffers()
 {
     OfStockItemId = args.StockItemId
 })).Items.Select(i => i.Id);
 protected override async Task <IEnumerable <Guid> > FindAsync(ProductIdParameters args)
 => (await _offersService.BrowseOffers(new BrowseOffers()
 {
     OfProductId = args.ProductId
 })).Items.Select(o => o.Id);