Skip to content

Commit e1a758e

Browse files
Merge pull request #79 from MarkusMeyer13/master
#66 Get Meals by date
2 parents f9d66a0 + be4901e commit e1a758e

File tree

2 files changed

+222
-12
lines changed

2 files changed

+222
-12
lines changed

PlanB.Butler.Services/PlanB.Butler.Services.Test/MealServiceTest.cs

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) PlanB. GmbH. All Rights Reserved.
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

4+
using System;
5+
46
using Microsoft.VisualStudio.TestTools.UnitTesting;
57

68
namespace PlanB.Butler.Services.Test
@@ -80,5 +82,113 @@ public void LengthFailTest()
8082
var result = MealService.CreateBlobPrefix("2020-02-25", "2020-03-0");
8183
Assert.AreEqual(string.Empty, result);
8284
}
85+
86+
/// <summary>
87+
/// Determines whether date is in range ok.
88+
/// </summary>
89+
[TestMethod]
90+
public void IsDateInRangeOK()
91+
{
92+
var start = "2020-02-01";
93+
var end = "2020-02-12";
94+
var toCheck = "2020-02-10";
95+
96+
var startDate = DateTime.Parse(start);
97+
var endDate = DateTime.Parse(end);
98+
var toCheckDate = DateTime.Parse(toCheck);
99+
100+
var result = MealService.IsDateInRange(startDate, endDate, toCheckDate);
101+
Assert.AreEqual(true, result);
102+
}
103+
104+
/// <summary>
105+
/// Determines whether date is too early.
106+
/// </summary>
107+
[TestMethod]
108+
public void IsDateInRangeCheckDateEarlierOK()
109+
{
110+
var start = "2020-02-01";
111+
var end = "2020-02-12";
112+
var toCheck = "2020-01-10";
113+
114+
var startDate = DateTime.Parse(start);
115+
var endDate = DateTime.Parse(end);
116+
var toCheckDate = DateTime.Parse(toCheck);
117+
118+
var result = MealService.IsDateInRange(startDate, endDate, toCheckDate);
119+
Assert.AreEqual(false, result);
120+
}
121+
122+
/// <summary>
123+
/// Determines whether date is too late.
124+
/// </summary>
125+
[TestMethod]
126+
public void IsDateInRangeCheckDateLaterOK()
127+
{
128+
var start = "2020-02-01";
129+
var end = "2020-02-12";
130+
var toCheck = "2021-01-10";
131+
132+
var startDate = DateTime.Parse(start);
133+
var endDate = DateTime.Parse(end);
134+
var toCheckDate = DateTime.Parse(toCheck);
135+
136+
var result = MealService.IsDateInRange(startDate, endDate, toCheckDate);
137+
Assert.AreEqual(false, result);
138+
}
139+
140+
/// <summary>
141+
/// Determines whether all dates are equal.
142+
/// </summary>
143+
[TestMethod]
144+
public void IsDateInRangeCheckDateAllEqual()
145+
{
146+
var start = "2020-02-01";
147+
var end = "2020-02-01";
148+
var toCheck = "2020-02-01";
149+
150+
var startDate = DateTime.Parse(start);
151+
var endDate = DateTime.Parse(end);
152+
var toCheckDate = DateTime.Parse(toCheck);
153+
154+
var result = MealService.IsDateInRange(startDate, endDate, toCheckDate);
155+
Assert.AreEqual(true, result);
156+
}
157+
158+
/// <summary>
159+
/// Determines whether Startdate is equal to CheckDate.
160+
/// </summary>
161+
[TestMethod]
162+
public void IsDateInRangeCheckStartEqualCheck()
163+
{
164+
var start = "2020-02-01";
165+
var end = "2020-12-01";
166+
var toCheck = "2020-02-01";
167+
168+
var startDate = DateTime.Parse(start);
169+
var endDate = DateTime.Parse(end);
170+
var toCheckDate = DateTime.Parse(toCheck);
171+
172+
var result = MealService.IsDateInRange(startDate, endDate, toCheckDate);
173+
Assert.AreEqual(true, result);
174+
}
175+
176+
/// <summary>
177+
/// Determines whether Enddate is equal to CheckDate.
178+
/// </summary>
179+
[TestMethod]
180+
public void IsDateInRangeCheckEndEqualCheck()
181+
{
182+
var start = "2020-01-01";
183+
var end = "2020-02-01";
184+
var toCheck = "2020-02-01";
185+
186+
var startDate = DateTime.Parse(start);
187+
var endDate = DateTime.Parse(end);
188+
var toCheckDate = DateTime.Parse(toCheck);
189+
190+
var result = MealService.IsDateInRange(startDate, endDate, toCheckDate);
191+
Assert.AreEqual(true, result);
192+
}
83193
}
84194
}

PlanB.Butler.Services/PlanB.Butler.Services/MealService.cs

Lines changed: 112 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ namespace PlanB.Butler.Services
2727
/// </summary>
2828
public static class MealService
2929
{
30+
/// <summary>
31+
/// The meta date.
32+
/// </summary>
33+
private const string MetaDate = "date";
34+
35+
/// <summary>
36+
/// The meta restaurant.
37+
/// </summary>
38+
private const string MetaRestaurant = "restaurant";
39+
3040
/// <summary>
3141
/// Create meal.
3242
/// </summary>
@@ -72,8 +82,8 @@ public static async Task<IActionResult> CreateMeal(
7282
if (blob != null)
7383
{
7484
blob.Properties.ContentType = "application/json";
75-
blob.Metadata.Add("date", date);
76-
blob.Metadata.Add("restaurant", mealModel.Restaurant);
85+
blob.Metadata.Add(MetaDate, date);
86+
blob.Metadata.Add(MetaRestaurant, mealModel.Restaurant);
7787
blob.Metadata.Add(Constants.ButlerCorrelationTraceName, correlationId.ToString().Replace("-", string.Empty));
7888
var meal = JsonConvert.SerializeObject(mealModel);
7989
trace.Add("meal", meal);
@@ -128,25 +138,68 @@ public static async Task<IActionResult> GetMeals(
128138

129139
try
130140
{
131-
string startDate = req.Query["startDate"];
132-
string endDate = req.Query["endDate"];
133-
string restaurant = req.Query["restaurant"];
141+
string startDateQuery = req.Query["startDate"];
142+
string endDateQuery = req.Query["endDate"];
143+
string restaurantQuery = req.Query["restaurant"];
134144
string prefix = string.Empty;
135145

136-
prefix = CreateBlobPrefix(startDate, endDate);
146+
bool checkForDate = false;
147+
DateTime start = DateTime.MinValue;
148+
DateTime end = DateTime.MinValue;
149+
150+
if (!(string.IsNullOrEmpty(startDateQuery) && string.IsNullOrEmpty(endDateQuery)))
151+
{
152+
checkForDate = true;
153+
DateTime.TryParse(startDateQuery, out start);
154+
DateTime.TryParse(endDateQuery, out end);
155+
}
156+
157+
if (checkForDate)
158+
{
159+
prefix = CreateBlobPrefix(startDateQuery, endDateQuery);
160+
}
137161

138162
BlobContinuationToken blobContinuationToken = null;
139163
var options = new BlobRequestOptions();
140164
var operationContext = new OperationContext();
141165

142-
var blobs = await cloudBlobContainer.ListBlobsSegmentedAsync(prefix, true, BlobListingDetails.All, null, blobContinuationToken, options, operationContext).ConfigureAwait(false);
143-
foreach (var item in blobs.Results)
166+
List<IListBlobItem> cloudBlockBlobs = new List<IListBlobItem>();
167+
do
144168
{
145-
CloudBlockBlob blob = (CloudBlockBlob)item;
169+
var blobs = await cloudBlobContainer.ListBlobsSegmentedAsync(prefix, true, BlobListingDetails.All, null, blobContinuationToken, options, operationContext).ConfigureAwait(false);
170+
blobContinuationToken = blobs.ContinuationToken;
171+
cloudBlockBlobs.AddRange(blobs.Results);
172+
}
173+
while (blobContinuationToken != null);
146174

147-
var content = blob.DownloadTextAsync();
148-
var meal = JsonConvert.DeserializeObject<MealModel>(await content);
149-
meals.Add(meal);
175+
foreach (var item in cloudBlockBlobs)
176+
{
177+
CloudBlockBlob blob = (CloudBlockBlob)item;
178+
if (checkForDate)
179+
{
180+
await blob.FetchAttributesAsync();
181+
if (blob.Metadata.ContainsKey(MetaDate))
182+
{
183+
var mealMetaDate = blob.Metadata[MetaDate];
184+
DateTime mealDate = DateTime.MinValue;
185+
if (DateTime.TryParse(mealMetaDate, out mealDate))
186+
{
187+
var isDateInRange = IsDateInRange(start, end, mealDate);
188+
if (isDateInRange)
189+
{
190+
var blobContent = blob.DownloadTextAsync();
191+
var blobMeal = JsonConvert.DeserializeObject<MealModel>(await blobContent);
192+
meals.Add(blobMeal);
193+
}
194+
}
195+
}
196+
}
197+
else
198+
{
199+
var content = blob.DownloadTextAsync();
200+
var meal = JsonConvert.DeserializeObject<MealModel>(await content);
201+
meals.Add(meal);
202+
}
150203
}
151204

152205
log.LogInformation(correlationId, $"'{methodName}' - success", trace);
@@ -222,6 +275,53 @@ public static IActionResult GetMealById(
222275
return (ActionResult)new OkObjectResult(mealModel);
223276
}
224277

278+
/// <summary>
279+
/// Determines whether the date in range compared to start and end.
280+
/// </summary>
281+
/// <param name="start">The start.</param>
282+
/// <param name="end">The end.</param>
283+
/// <param name="toCheck">To check.</param>
284+
/// <returns>
285+
/// <c>true</c> if date is in range; otherwise, <c>false</c>.
286+
/// </returns>
287+
internal static bool IsDateInRange(DateTime start, DateTime end, DateTime toCheck)
288+
{
289+
if (toCheck < start)
290+
{
291+
return false;
292+
}
293+
294+
if (end < toCheck)
295+
{
296+
return false;
297+
}
298+
299+
if (start.Equals(toCheck))
300+
{
301+
return true;
302+
}
303+
304+
if (end.Equals(toCheck))
305+
{
306+
return true;
307+
}
308+
309+
if (start.Equals(end) && start.Equals(toCheck))
310+
{
311+
return true;
312+
}
313+
314+
long difference = toCheck.Ticks - start.Ticks;
315+
long sum = start.Ticks + difference;
316+
317+
if (sum < end.Ticks)
318+
{
319+
return true;
320+
}
321+
322+
return false;
323+
}
324+
225325
/// <summary>
226326
/// Creates the BLOB prefix.
227327
/// </summary>

0 commit comments

Comments
 (0)