Skip to content

Commit be2a06f

Browse files
authored
Extend POI search with media, comment, and check-in filters (#246)
1 parent 8895ecc commit be2a06f

File tree

4 files changed

+110
-2
lines changed

4 files changed

+110
-2
lines changed

API/OCM.Net/OCM.API.Core/Common/POIManager.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,42 @@ public static bool CanUserEditPOI(Model.ChargePoint poi, Model.User user)
344344
poiList = poiList.Where(c => c.ConnectionInfos.Any(conn => conn.LevelTypeId != null && filter.LevelIDs.Contains((int)conn.LevelTypeId)));
345345
}
346346

347+
if (filter.HasMedia != null)
348+
{
349+
if (filter.HasMedia == true)
350+
{
351+
poiList = poiList.Where(c => c.MediaItems.Any(m => m.IsEnabled == true));
352+
}
353+
else
354+
{
355+
poiList = poiList.Where(c => !c.MediaItems.Any(m => m.IsEnabled == true));
356+
}
357+
}
358+
359+
if (filter.HasComment != null)
360+
{
361+
if (filter.HasComment == true)
362+
{
363+
poiList = poiList.Where(c => c.UserComments.Any());
364+
}
365+
else
366+
{
367+
poiList = poiList.Where(c => !c.UserComments.Any());
368+
}
369+
}
370+
371+
if (filter.HasCheckins != null)
372+
{
373+
if (filter.HasCheckins == true)
374+
{
375+
poiList = poiList.Where(c => c.UserComments.Any(comment => comment.CheckinStatusTypeId != null));
376+
}
377+
else
378+
{
379+
poiList = poiList.Where(c => !c.UserComments.Any(comment => comment.CheckinStatusTypeId != null));
380+
}
381+
}
382+
347383
poiList = poiList.Where(c => c.AddressInfo != null);
348384
return poiList;
349385
}

API/OCM.Net/OCM.API.Core/Common/SearchFilterSettings.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ public class APIRequestParams : ServiceParameterParser
9090

9191
public double? MinPowerKW { get; set; }
9292
public double? MaxPowerKW { get; set; }
93-
93+
public bool? HasMedia { get; set; }
94+
public bool? HasComment { get; set; }
95+
public bool? HasCheckins { get; set; }
9496
/// <summary>
9597
/// list of (lat,lng) points to search along (route etc)
9698
/// </summary>
@@ -219,7 +221,9 @@ public void ParseParameters(APIRequestParams settings, NullSafeDictionary<string
219221
settings.MaxPowerKW = ParseDouble(requestParams["maxpowerkw"]);
220222
if (settings.MaxPowerKW < 1) settings.MaxPowerKW = null;
221223
}
222-
224+
if (!String.IsNullOrEmpty(requestParams["hasmedia"])) settings.HasMedia = ParseBoolNullable(requestParams["hasmedia"]);
225+
if (!String.IsNullOrEmpty(requestParams["hascomment"])) settings.HasComment = ParseBoolNullable(requestParams["hascomment"]);
226+
if (!String.IsNullOrEmpty(requestParams["hascheckins"])) settings.HasCheckins = ParseBoolNullable(requestParams["hascheckins"]);
223227
if (!String.IsNullOrEmpty(requestParams["dataprovidername"])) settings.DataProviderName = ParseString(requestParams["dataprovidername"]);
224228
if (!String.IsNullOrEmpty(requestParams["locationtitle"])) settings.LocationTitle = ParseString(requestParams["locationtitle"]);
225229
if (!String.IsNullOrEmpty(requestParams["address"])) settings.Address = ParseString(requestParams["address"]);
@@ -332,6 +336,9 @@ public string HashKey
332336
if (DataProviderIDs != null) key += ":prov_id:" + IntArrayToString(DataProviderIDs);
333337
if (IsOpenData != null) key += ":opendata:" + IsOpenData.ToString();
334338
if (MinPowerKW != null) key += ":minpowerkw:" + MinPowerKW.ToString();
339+
if (HasMedia != null) key += ":hasmedia:" + HasMedia.ToString();
340+
if (HasComment != null) key += ":hascomment:" + HasComment.ToString();
341+
if (HasCheckins != null) key += ":hascheckins:" + HasCheckins.ToString();
335342
if (Polyline != null) key += ":polyline:" + Polyline.GetHashCode().ToString();
336343
if (Polygon != null) key += ":polygon:" + Polygon.GetHashCode().ToString();
337344
if (BoundingBox != null) key += ":boundingbox:" + BoundingBox.GetHashCode().ToString();

API/OCM.Net/OCM.API.Core/Util/CacheProviderMongoDB.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,6 +1310,41 @@ public static IQueryable<POIMongoDB> ApplyQueryFilters(APIRequestParams filter,
13101310
{
13111311
poiList = poiList.Where(c => c.Connections.Any(conn => conn.LevelID != null && filter.LevelIDs.Contains((int)conn.LevelID)));
13121312
}
1313+
if (filter.HasMedia != null)
1314+
{
1315+
if (filter.HasMedia == true)
1316+
{
1317+
poiList = poiList.Where(c => c.MediaItems != null && c.MediaItems.Any(m => m.IsEnabled));
1318+
}
1319+
else
1320+
{
1321+
poiList = poiList.Where(c => c.MediaItems == null || !c.MediaItems.Any(m => m.IsEnabled));
1322+
}
1323+
}
1324+
1325+
if (filter.HasComment != null)
1326+
{
1327+
if (filter.HasComment == true)
1328+
{
1329+
poiList = poiList.Where(c => c.UserComments != null && c.UserComments.Any());
1330+
}
1331+
else
1332+
{
1333+
poiList = poiList.Where(c => c.UserComments == null || !c.UserComments.Any());
1334+
}
1335+
}
1336+
1337+
if (filter.HasCheckins != null)
1338+
{
1339+
if (filter.HasCheckins == true)
1340+
{
1341+
poiList = poiList.Where(c => c.UserComments != null && c.UserComments.Any(comment => comment.CheckinStatusTypeID != null));
1342+
}
1343+
else
1344+
{
1345+
poiList = poiList.Where(c => c.UserComments == null || !c.UserComments.Any(comment => comment.CheckinStatusTypeID != null));
1346+
}
1347+
}
13131348

13141349
poiList = poiList.Where(c => c.AddressInfo != null);
13151350
return poiList;

Website/OCM.Web/Views/POI/_POISearch.cshtml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,36 @@
128128
@Html.DropDownList("submissionstatustypeid", Model.SubmissionTypeList, new { @class = "form-control" })
129129
</div>
130130
</div>
131+
<div class="form-group">
132+
<label class="control-label col-md-4" for="hasmedia">Media</label>
133+
<div class="col-md-8">
134+
<select id="hasmedia" name="HasMedia" class="form-control">
135+
<option value="" selected="@(Model.HasMedia == null ? "selected" : null)">Any</option>
136+
<option value="true" selected="@(Model.HasMedia == true ? "selected" : null)">Has media</option>
137+
<option value="false" selected="@(Model.HasMedia == false ? "selected" : null)">No media</option>
138+
</select>
139+
</div>
140+
</div>
141+
<div class="form-group">
142+
<label class="control-label col-md-4" for="hascomment">Comments</label>
143+
<div class="col-md-8">
144+
<select id="hascomment" name="HasComment" class="form-control">
145+
<option value="" selected="@(Model.HasComment == null ? "selected" : null)">Any</option>
146+
<option value="true" selected="@(Model.HasComment == true ? "selected" : null)">Has comments</option>
147+
<option value="false" selected="@(Model.HasComment == false ? "selected" : null)">No comments</option>
148+
</select>
149+
</div>
150+
</div>
151+
<div class="form-group">
152+
<label class="control-label col-md-4" for="hascheckins">Check-ins</label>
153+
<div class="col-md-8">
154+
<select id="hascheckins" name="HasCheckins" class="form-control">
155+
<option value="" selected="@(Model.HasCheckins == null ? "selected" : null)">Any</option>
156+
<option value="true" selected="@(Model.HasCheckins == true ? "selected" : null)">Has check-ins</option>
157+
<option value="false" selected="@(Model.HasCheckins == false ? "selected" : null)">No check-ins</option>
158+
</select>
159+
</div>
160+
</div>
131161
</div>
132162
<div class="form-group">
133163
<div class="col-sm-offset-3 col-sm-7">

0 commit comments

Comments
 (0)