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)); }
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}"); }