public SubscriptionMatchGroup GetSubscriptionMatches(OCM.Core.Data.OCMEntities dataModel, POIManager poiManager, OCM.Core.Data.UserSubscription subscription, DateTime?dateFrom = null) { SubscriptionMatchGroup subscriptionMatchGroup = new SubscriptionMatchGroup(); var checkFromDate = DateTime.UtcNow.AddMinutes(-CHECK_INTERVAL_MINS); //check from last 5 mins etc if (subscription.DateLastNotified != null) { checkFromDate = subscription.DateLastNotified.Value; //check from date last notified } else { checkFromDate = subscription.DateCreated; } if (dateFrom != null) { checkFromDate = dateFrom.Value; } subscriptionMatchGroup.DateFrom = checkFromDate; System.Data.Entity.Spatial.DbGeography searchPos = null; UserSubscriptionFilter filter = null; if (subscription.FilterSettings != null) { try { filter = JsonConvert.DeserializeObject <UserSubscriptionFilter>(subscription.FilterSettings); } catch (Exception) { //failed to parse subscription filter } } if (subscription.Latitude != null && subscription.Longitude != null) { searchPos = System.Data.Entity.Spatial.DbGeography.PointFromText("POINT(" + subscription.Longitude + " " + subscription.Latitude + ")", 4326); } if (subscription.NotifyEmergencyChargingRequests) { var emergencyCharging = dataModel.UserChargingRequests.Where(c => c.DateCreated >= checkFromDate && c.IsActive == true && c.IsEmergency == true); var subscriptionMatch = new SubscriptionMatch { Category = SubscriptionMatchCategory.ChargingRequestEmergency, Description = "New Emergency Charging Requests" }; foreach (var chargingRequest in emergencyCharging) { //filter on location if (searchPos != null) { if (GeoManager.CalcDistance(chargingRequest.Latitude, chargingRequest.Longitude, (double)searchPos.Latitude, (double)searchPos.Longitude, DistanceUnit.KM) < subscription.DistanceKM) { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = chargingRequest }); } } else { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = chargingRequest }); } } if (subscriptionMatch.ItemList.Any()) { subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch); } } if (subscription.NotifyGeneralChargingRequests) { //TODO: subscription not filtered on lat/long will return global charging requests var generalCharging = dataModel.UserChargingRequests.Where(c => c.DateCreated >= checkFromDate && c.IsActive == true && c.IsEmergency == false); var subscriptionMatch = new SubscriptionMatch { Category = SubscriptionMatchCategory.ChargingRequestGeneral, Description = "New Charging Requests" }; //filter on location foreach (var gc in generalCharging) { if (searchPos != null) { if (GeoManager.CalcDistance(gc.Latitude, gc.Longitude, (double)searchPos.Latitude, (double)searchPos.Longitude, DistanceUnit.KM) < subscription.DistanceKM) { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = gc }); } } else { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = gc }); } } if (subscriptionMatch.ItemList.Any()) { subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch); } } //check if any POI Edits (pending approval) match this subscription if (subscription.NotifyPOIEdits) { var poiEdits = dataModel.EditQueueItems.Where(c => c.DateSubmitted >= checkFromDate && c.PreviousData != null && c.IsProcessed == false); if (poiEdits.Any()) { var subscriptionMatch = new SubscriptionMatch { Category = SubscriptionMatchCategory.EditedPOI, Description = "Proposed POI Edits" }; foreach (var p in poiEdits) { try { var updatedPOI = JsonConvert.DeserializeObject <ChargePoint>(p.EditData); if (IsPOISubscriptionFilterMatch(updatedPOI, filter, subscription)) { if (searchPos != null) { if (GeoManager.CalcDistance(updatedPOI.AddressInfo.Latitude, updatedPOI.AddressInfo.Longitude, (double)searchPos.Latitude, (double)searchPos.Longitude, DistanceUnit.KM) < subscription.DistanceKM) { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = p, POI = updatedPOI }); } } else { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = p, POI = updatedPOI }); } } } catch (Exception) { ;; } } if (subscriptionMatch.ItemList.Any()) { subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch); } } } //check if any new POIs if (subscription.NotifyPOIAdditions) { /* var newPOIs = dataModel.ChargePoints.Where(c => c.DateCreated >= checkFromDate && c.SubmissionStatusType.IsLive == true && * (searchPos == null || * (searchPos != null && * c.AddressInfo.SpatialPosition.Distance(searchPos) / 1000 < subscription.DistanceKM * )) * ).ToList();*/ var filterParams = new APIRequestParams { CreatedFromDate = checkFromDate, AllowMirrorDB = true }; if (searchPos != null) { filterParams.DistanceUnit = DistanceUnit.KM; filterParams.Distance = subscription.DistanceKM; filterParams.Latitude = searchPos.Latitude; filterParams.Longitude = searchPos.Longitude; } if (subscription.CountryID != null) { filterParams.CountryIDs = new int[] { (int)subscription.CountryID }; } var poiCollection = poiManager.GetChargePoints(filterParams); if (poiCollection.Any()) { var subscriptionMatch = new SubscriptionMatch { Category = SubscriptionMatchCategory.NewPOI, Description = "New POIs Added" }; foreach (var p in poiCollection) { //var poi = OCM.API.Common.Model.Extensions.ChargePoint.FromDataModel(p); if (IsPOISubscriptionFilterMatch(p, filter, subscription)) { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { POI = p }); } } if (subscriptionMatch.ItemList.Any()) { subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch); } } } //check if any POI Updates match this subscription if (subscription.NotifyPOIUpdates) { var poiUpdates = dataModel.EditQueueItems.Where(c => c.DateProcessed >= checkFromDate && c.IsProcessed == true && c.PreviousData != null); if (poiUpdates.Any()) { var subscriptionMatch = new SubscriptionMatch { Category = SubscriptionMatchCategory.UpdatedPOI, Description = "POIs Updated" }; foreach (var p in poiUpdates) { try { var updatedPOI = JsonConvert.DeserializeObject <ChargePoint>(p.EditData); if (IsPOISubscriptionFilterMatch(updatedPOI, filter, subscription)) { if (searchPos != null) { if (GeoManager.CalcDistance(updatedPOI.AddressInfo.Latitude, updatedPOI.AddressInfo.Longitude, (double)searchPos.Latitude, (double)searchPos.Longitude, DistanceUnit.KM) < subscription.DistanceKM) { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = p, POI = updatedPOI }); } } else { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = p, POI = updatedPOI }); } } } catch (Exception) { ;; } } if (subscriptionMatch.ItemList.Any()) { subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch); } } } //check if any new comments match this subscription if (subscription.NotifyComments) { var newComments = dataModel.UserComments.Where(c => c.DateCreated >= checkFromDate && (searchPos == null || (searchPos != null && c.ChargePoint.AddressInfo.SpatialPosition.Distance(searchPos) / 1000 < subscription.DistanceKM )) ); if (newComments.Any()) { var subscriptionMatch = new SubscriptionMatch { Category = SubscriptionMatchCategory.NewComment, Description = "New Comments Added" }; foreach (var c in newComments) { var poi = OCM.API.Common.Model.Extensions.ChargePoint.FromDataModel(c.ChargePoint); if (IsPOISubscriptionFilterMatch(poi, filter, subscription)) { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = OCM.API.Common.Model.Extensions.UserComment.FromDataModel(c, true), POI = poi }); } } if (subscriptionMatch.ItemList.Any()) { subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch); } } } //check if any new Media uploads match this subscription if (subscription.NotifyMedia) { var newMedia = dataModel.MediaItems.Where(c => c.DateCreated >= checkFromDate && (searchPos == null || (searchPos != null && c.ChargePoint.AddressInfo.SpatialPosition.Distance(searchPos) / 1000 < subscription.DistanceKM )) ); if (newMedia.Any()) { var subscriptionMatch = new SubscriptionMatch { Category = SubscriptionMatchCategory.NewMediaUpload, Description = "New Photos Added" }; foreach (var c in newMedia) { var poi = OCM.API.Common.Model.Extensions.ChargePoint.FromDataModel(c.ChargePoint); if (IsPOISubscriptionFilterMatch(poi, filter, subscription)) { subscriptionMatch.ItemList.Add(new SubscriptionMatchItem { Item = OCM.API.Common.Model.Extensions.MediaItem.FromDataModel(c), POI = poi }); } } if (subscriptionMatch.ItemList.Any()) { subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch); } } } return(subscriptionMatchGroup); }
private bool IsPOISubscriptionFilterMatch(ChargePoint poi, UserSubscriptionFilter filter, OCM.Core.Data.UserSubscription subscription) { if (poi == null) { return(false); } bool isMatch = true; if (subscription.CountryID != null) { if (poi.AddressInfo.CountryID != subscription.CountryID) { isMatch = false; } } if (filter == null) { return(isMatch); //no more filtering to do } if (filter.ConnectionTypeIDs != null && filter.ConnectionTypeIDs.Any()) { //if no matching connection types, poi is not a match foreach (var connTypeId in filter.ConnectionTypeIDs) { if (!poi.Connections.Any(c => c.ConnectionTypeID == connTypeId)) { isMatch = false; } } } if (filter.LevelIDs != null && filter.LevelIDs.Any()) { //if no matching levels Ids, poi is not a match foreach (var levelTypeId in filter.LevelIDs) { if (!poi.Connections.Any(c => c.LevelID == levelTypeId)) { isMatch = false; } } } if (filter.OperatorIDs != null && filter.OperatorIDs.Any() && !filter.OperatorIDs.Any(op => op == poi.OperatorID)) { //does not match by operator ID isMatch = false; } if (filter.StatusTypeIDs != null && filter.StatusTypeIDs.Any() && !filter.StatusTypeIDs.Any(st => st == poi.StatusTypeID)) { //does not match by status type ID isMatch = false; } if (filter.UsageTypeIDs != null && filter.UsageTypeIDs.Any() && !filter.UsageTypeIDs.Any(usage => usage == poi.UsageTypeID)) { //does not match by usage type ID isMatch = false; } return(isMatch); }