public async Task <IActionResult> CreateVouchers( [FromRoute] int count ) { if (!Hosting.IsDevelopment()) { return(Unauthorized()); } if (count <= 0 || count > 100) { throw new ArgumentOutOfRangeException(nameof(count), "Voucher count out of range"); } Logger.LogInformation("Creating {0} test vouchers", count); var testSource = await Mongo.GetSourceById(_testSourceId); var rnd = new Random(); var aim = (await Mongo.GetAims()).OrderBy(a => rnd.NextDouble()).First(); Logger.LogTrace("Test source: {0}, random aim '{1}'", testSource.Name, aim.Code); var now = DateTime.UtcNow; var voucherInfos = new VoucherCreatePayload.VoucherInfo[] { new VoucherCreatePayload.VoucherInfo { Aim = aim.Code, Latitude = rnd.NextBetween(5, 40), Longitude = rnd.NextBetween(5, 50), Timestamp = DateTime.UtcNow, Count = count } }; (var otcGen, var pwd) = await Operator.CreateGenerationRequest(testSource, new VoucherCreatePayload.Content { Nonce = Guid.NewGuid().ToString("N"), SourceId = testSource.Id.ToString(), Vouchers = voucherInfos }, isPreVerified : true); Logger.LogDebug("New voucher generation request created with code {0}", otcGen); return(Ok(new { OtcGen = UrlGenerator.GenerateRedeemUrl(otcGen), Pin = pwd })); }
public async Task CreateAndRedeemMultipleVouchers() { var now = DateTime.UtcNow; var voucherInfos = new VoucherCreatePayload.VoucherInfo[] { new VoucherCreatePayload.VoucherInfo { Aim = "I", Latitude = 12.34, Longitude = 23.45, Timestamp = now }, new VoucherCreatePayload.VoucherInfo { Aim = "I", Latitude = 23.45, Longitude = 34.56, Timestamp = now, Count = 2 } }; var p = _womClient.CreatePocket(); await Collect(p, voucherInfos); Assert.AreEqual(3, p.VoucherCount); foreach (var v in p.Vouchers) { Assert.AreEqual("I", v.Aim); Assert.AreEqual(now.ToSecondPrecision(), v.Timestamp.ToSecondPrecision()); } Assert.AreEqual(voucherInfos[0].Latitude, p.Vouchers[0].Latitude); Assert.AreEqual(voucherInfos[0].Longitude, p.Vouchers[0].Longitude); Assert.AreEqual(voucherInfos[1].Latitude, p.Vouchers[1].Latitude); Assert.AreEqual(voucherInfos[1].Longitude, p.Vouchers[1].Longitude); Assert.AreEqual(voucherInfos[1].Latitude, p.Vouchers[2].Latitude); Assert.AreEqual(voucherInfos[1].Longitude, p.Vouchers[2].Longitude); }
public async Task <IActionResult> GenerateVouchers( [FromForm] string sourceId, [FromForm] int genCount, [FromForm] int voucherCount, [FromForm] double latitude, [FromForm] double longitude, [FromForm] string date, [FromForm] string time, [FromForm] string aimCode ) { if (sourceId == null) { _logger.LogError("SourceID not set"); return(RedirectToAction(nameof(ShowInstruments))); } if (genCount <= 0) { ErrorMessage = "Generation count cannot be 0 or negative"; return(RedirectToAction(nameof(ShowGenerationForm), new { sourceId })); } if (voucherCount <= 0) { ErrorMessage = "Number of vouchers cannot be 0 or negative"; return(RedirectToAction(nameof(ShowGenerationForm), new { sourceId })); } var tsString = $"{date}T{time}"; if (!DateTime.TryParseExact(tsString, "yyyy-MM-ddTHH:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var timestamp)) { _logger.LogError("Timestamp string {0} not parsable", tsString); ErrorMessage = "Date or time not set correctly"; return(RedirectToAction(nameof(ShowGenerationForm), new { sourceId })); } var session = HttpContext.Session.GetObject <SessionInfo>(Program.SessionKeyLogin); var login = await _client.LoginAsSource(session.Username, session.Password); string key = GetKey(login, sourceId); if (key == null) { _logger.LogError("SourceID does not match logged-in user's authorized sources"); return(RedirectToAction(nameof(ShowInstruments))); } using var keyStream = new MemoryStream(Encoding.ASCII.GetBytes(key)); var instrument = _client.CreateInstrument(sourceId, keyStream); _logger.LogInformation("Requesting {0} vouchers for aim {1}, in {2:F3}x{3:F3} at {4} ({5} reps)", voucherCount, aimCode, latitude, longitude, timestamp, genCount); var voucherInfo = new VoucherCreatePayload.VoucherInfo { Aim = aimCode, Count = voucherCount, Latitude = latitude, Longitude = longitude, Timestamp = timestamp }; try { var result = await instrument.RequestVouchers(new VoucherCreatePayload.VoucherInfo[] { voucherInfo }); return(Content($"{result.Link} {result.Password}")); } catch (Exception ex) { _logger.LogError(ex, "Failed to request vouchers"); ErrorMessage = "Failed to request vouchers"; return(RedirectToAction(nameof(ShowGenerationForm), new { sourceId })); } }