public void ResumptionTokenConverter_Decode() { string token = "from=1987-02-16T00%3a00%3a00Z&until=2018-02-16T00%3a00%3a00Z&metadataPrefix=oai_dc" + "&set=test123&expirationDate=2019-02-16T00%3a00%3a00Z&completeListSize=123&cursor=321&placeholder=123&test=123"; IResumptionToken actual = _converter.Decode(token); IResumptionToken expected = new ResumptionToken() { From = new DateTime(1987, 2, 16, 0, 0, 0, DateTimeKind.Utc), Until = new DateTime(2018, 2, 16, 0, 0, 0, DateTimeKind.Utc), MetadataPrefix = "oai_dc", Set = "test123", ExpirationDate = new DateTime(2019, 2, 16, 0, 0, 0, DateTimeKind.Utc), CompleteListSize = 123, Cursor = 321 }; expected.Custom["placeholder"] = "123"; Assert.AreEqual(expected.From.Value.Kind, actual.From.Value.Kind); Assert.AreEqual(expected.From, actual.From); Assert.AreEqual(expected.Until.Value.Kind, actual.Until.Value.Kind); Assert.AreEqual(expected.Until, actual.Until); Assert.AreEqual(expected.MetadataPrefix, actual.MetadataPrefix); Assert.AreEqual(expected.Set, actual.Set); Assert.AreEqual(expected.ExpirationDate.Value.Kind, actual.ExpirationDate.Value.Kind); Assert.AreEqual(expected.ExpirationDate, actual.ExpirationDate); Assert.AreEqual(expected.CompleteListSize, actual.CompleteListSize); Assert.AreEqual(expected.Cursor, actual.Cursor); Assert.AreEqual(expected.Custom["placeholder"], actual.Custom["placeholder"]); Assert.IsFalse(actual.Custom.ContainsKey("test")); }
public void ResumptionTokenConverter_ToXElement() { ResumptionToken token = new ResumptionToken() { From = new DateTime(1987, 2, 16, 0, 0, 0, DateTimeKind.Utc), Until = new DateTime(2018, 2, 16, 0, 0, 0, DateTimeKind.Utc), MetadataPrefix = "oai_dc", Set = "test123", ExpirationDate = new DateTime(2019, 2, 16, 0, 0, 0, DateTimeKind.Utc), CompleteListSize = 123, Cursor = 321 }; token.Custom.Add("placeholder", "123"); token.Custom.Add("test", "123"); var actual = _converter.ToXElement(token).ToString(); var expected = "<resumptionToken expirationDate=\"2019-02-16T00:00:00Z\" completeListSize=\"123\" cursor=\"321\">" + "metadataPrefix%3doai_dc%26from%3d1987-02-16T00%3a00%3a00Z%26until%3d2018-02-16T00%3a00%3a00Z%26set%3dtest123%26placeholder%3d123</resumptionToken>"; Assert.AreEqual(expected, actual); }
public void ResumptionTokenConverter_Encode() { ResumptionToken token = new ResumptionToken() { From = new DateTime(1987, 2, 16, 0, 0, 0, DateTimeKind.Utc), Until = new DateTime(2018, 2, 16, 0, 0, 0, DateTimeKind.Utc), MetadataPrefix = "oai_dc", Set = "test123", ExpirationDate = new DateTime(2019, 2, 16, 0, 0, 0, DateTimeKind.Utc), CompleteListSize = 123, Cursor = 321 }; token.Custom.Add("placeholder", "123"); token.Custom.Add("test", "123"); string actual = _converter.Encode(token); string expected = "metadataPrefix%3doai_dc%26from%3d1987-02-16T00%3a00%3a00Z%26until%3d2018-02-16T00%3a00%3a00Z%26" + "set%3dtest123%26placeholder%3d123"; Assert.AreEqual(expected, actual); }
public IResumptionToken Decode(string resumptionToken) { ResumptionToken decoded = new ResumptionToken(); if (string.IsNullOrWhiteSpace(resumptionToken)) { return(decoded); } NameValueCollection nvc = HttpUtility.ParseQueryString(HttpUtility.UrlDecode(resumptionToken)); foreach (string key in nvc) { switch (key.ToLowerInvariant()) { case "metadataprefix": decoded.MetadataPrefix = nvc[key]; break; case "from": if (_dateConverter.TryDecode(nvc[key], out DateTime fromDate)) { decoded.From = fromDate; } break; case "until": if (_dateConverter.TryDecode(nvc[key], out DateTime untilDate)) { decoded.Until = untilDate; } break; case "set": decoded.Set = nvc[key]; break; case "expirationdate": if (_dateConverter.TryDecode(nvc[key], out DateTime expirationDate)) { decoded.ExpirationDate = expirationDate; } break; case "completelistsize": if (int.TryParse(nvc[key], out int completeListSize)) { decoded.CompleteListSize = completeListSize; } break; case "cursor": if (int.TryParse(nvc[key], out int cursor)) { decoded.Cursor = cursor; } break; default: if (_configuration.ResumptionTokenCustomParameterNames.Contains(key)) { if (decoded.Custom.ContainsKey(key)) { decoded.Custom[key] = nvc[key]; } else { decoded.Custom.Add(key, nvc[key]); } } break; } } return(decoded); }
public static XElement ResumptionToken(ResumptionToken rt, string resumptionToken, bool isCompleted) { return new XElement("resumptionToken", !rt.ExpirationDate.HasValue ? null : new XAttribute("expirationDate", rt.ExpirationDate.Value.ToUniversalTime().ToString(Enums.Granularity.DateTime)), rt.CompleteListSize.HasValue ? new XAttribute("completeListSize", rt.CompleteListSize.Value) : null, rt.Cursor.HasValue ? new XAttribute("cursor", rt.Cursor.Value) : null, isCompleted ? null : resumptionToken); }
public RecordContainer GetRecords(ArgumentContainer arguments, IResumptionToken resumptionToken = null) { RecordContainer container = new RecordContainer(); IQueryable <SampleRecord> records = _records.AsQueryable().OrderBy(r => r.Id); int totalCount = records.Count(); if (resumptionToken != null) { if (resumptionToken.From.HasValue) { records = records.Where(r => r.Date >= resumptionToken.From.Value); } if (resumptionToken.Until.HasValue) { records = records.Where(r => r.Date <= resumptionToken.Until.Value); } if (resumptionToken.Custom.ContainsKey("offset") && resumptionToken.Custom.TryGetValue("offset", out string offset)) { if (int.TryParse(offset, out int parsedOffset)) { records = records.Where(r => r.Id > parsedOffset); } } } ResumptionToken newResumptionToken = null; if (records.Count() > _configuration.PageSize) { newResumptionToken = new ResumptionToken(); container.ResumptionToken = newResumptionToken; if (_dateConverter.TryDecode(arguments.From, out DateTime from)) { newResumptionToken.From = from; } if (_dateConverter.TryDecode(arguments.Until, out DateTime until)) { newResumptionToken.Until = until; } newResumptionToken.MetadataPrefix = arguments.MetadataPrefix; newResumptionToken.Set = arguments.Set; if (_configuration.ExpirationTimeSpan.HasValue) { newResumptionToken.ExpirationDate = DateTime.UtcNow.Add(_configuration.ExpirationTimeSpan.Value); } newResumptionToken.CompleteListSize = totalCount; newResumptionToken.Cursor = 0; } records = records.Take(_configuration.PageSize); if (newResumptionToken != null) { if (resumptionToken != null) { // Increase the cursor value newResumptionToken.Cursor = resumptionToken.Cursor.HasValue ? resumptionToken.Cursor.Value + _configuration.PageSize : _configuration.PageSize; } // Add custom offset value var lastRecord = records.LastOrDefault(); if (lastRecord != null) { newResumptionToken.Custom.Add("offset", lastRecord.Id.ToString()); } } container.Records = records.Select(r => ToRecord(r)); return(container); }