public Model.UserSubscription GetUserSubscription(int userId, int subscriptionId) { var dataModel = new OCM.Core.Data.OCMEntities(); var item = dataModel.UserSubscriptions.FirstOrDefault(u => u.ID == subscriptionId && u.UserID == userId); return(OCM.API.Common.Model.Extensions.UserSubscription.FromDataModel(item, true)); }
public static void Log(User user, AuditEventType eventType, string eventDescription, string comment) { try { OCM.Core.Data.OCMEntities dataModel = new OCM.Core.Data.OCMEntities(); var auditEntry = new Core.Data.AuditLog(); if (user == null) { auditEntry.User = dataModel.Users.First(u => u.ID == (int)StandardUsers.System); } else { auditEntry.UserID = user.ID; } auditEntry.EventDescription = "[" + eventType.ToString() + "]:" + (eventDescription != null ? eventDescription : ""); auditEntry.Comment = comment; auditEntry.EventDate = DateTime.UtcNow; dataModel.AuditLogs.Add(auditEntry); dataModel.SaveChanges(); System.Diagnostics.Debug.WriteLine("Log:"+auditEntry.EventDescription); } catch (Exception) { //TODO: fallback to alternative logging } }
/// <summary> /// Get all subscription matches for all active subscriptions where applicable /// </summary> /// <returns></returns> public List <SubscriptionMatchGroup> GetAllSubscriptionMatches(bool excludeRecentlyNotified = true) { List <SubscriptionMatchGroup> allMatches = new List <SubscriptionMatchGroup>(); //TODO: performance/optimisation (use cache for POI queries is done) //for each subscription, check if any changes match the criteria var dataModel = new OCM.Core.Data.OCMEntities(); //var cacheManager = new OCM.Core.Data.CacheProviderMongoDB(); var poiManager = new POIManager(); var currentTime = DateTime.UtcNow; int minHoursBetweenNotifications = 3; var minDateSinceNotification = currentTime.AddHours(-minHoursBetweenNotifications); var allsubscriptions = dataModel.UserSubscriptions.Where(s => s.IsEnabled == true && s.User.EmailAddress != null && (s.DateLastNotified == null || s.DateLastNotified < minDateSinceNotification)); foreach (var subscription in allsubscriptions) { if (!excludeRecentlyNotified || (subscription.DateLastNotified == null || subscription.DateLastNotified.Value < currentTime.AddMinutes(-subscription.NotificationFrequencyMins))) { var subscriptionMatchGroup = GetSubscriptionMatches(dataModel, poiManager, subscription); if (subscriptionMatchGroup.SubscriptionMatches.Any()) { subscriptionMatchGroup.Subscription = OCM.API.Common.Model.Extensions.UserSubscription.FromDataModel(subscription, true); allMatches.Add(subscriptionMatchGroup); } } } return(allMatches); }
public static void Log(User user, AuditEventType eventType, string eventDescription, string comment) { try { OCM.Core.Data.OCMEntities dataModel = new OCM.Core.Data.OCMEntities(); var auditEntry = new Core.Data.AuditLog(); if (user == null) { auditEntry.User = dataModel.Users.First(u => u.ID == (int)StandardUsers.System); } else { auditEntry.UserID = user.ID; } auditEntry.EventDescription = "[" + eventType.ToString() + "]:" + (eventDescription != null ? eventDescription : ""); auditEntry.Comment = comment; auditEntry.EventDate = DateTime.UtcNow; dataModel.AuditLogs.Add(auditEntry); dataModel.SaveChanges(); System.Diagnostics.Debug.WriteLine("Log:" + auditEntry.EventDescription); } catch (Exception) { //TODO: fallback to alternative logging } }
public void DeleteSubscription(int userId, int subscriptionId) { var dataModel = new OCM.Core.Data.OCMEntities(); var item = dataModel.UserSubscriptions.FirstOrDefault(u => u.ID == subscriptionId && u.UserID == userId); if (item != null) { dataModel.UserSubscriptions.Remove(item); dataModel.SaveChanges(); } }
public List <Model.UserSubscription> GetUserSubscriptions(int userId) { var dataModel = new OCM.Core.Data.OCMEntities(); var list = dataModel.UserSubscriptions.Where(u => u.UserID == userId); var results = new List <Model.UserSubscription>(); foreach (var i in list) { results.Add(OCM.API.Common.Model.Extensions.UserSubscription.FromDataModel(i, true)); } return(results); }
public SubscriptionMatchGroup GetSubscriptionMatches(int subscriptionId, int userId, DateTime?dateFrom) { var dataModel = new OCM.Core.Data.OCMEntities(); var subscription = dataModel.UserSubscriptions.FirstOrDefault(s => s.ID == subscriptionId && s.UserID == userId); if (subscription != null) { return(GetSubscriptionMatches(dataModel, subscription, dateFrom)); } else { return(null); } }
public async Task <SubscriptionMatchGroup> GetSubscriptionMatches(int subscriptionId, int userId, DateTime?dateFrom) { var refData = new ReferenceDataManager().GetCoreReferenceData(); var dataModel = new OCM.Core.Data.OCMEntities(); var poiManager = new POIManager(); var subscription = dataModel.UserSubscriptions.FirstOrDefault(s => s.Id == subscriptionId && s.UserId == userId); if (subscription != null) { return(await GetSubscriptionMatches(dataModel, poiManager, subscription, refData, dateFrom)); } else { return(null); } }
/// <summary> /// Get all subscription matches for all active subscriptions where applicable /// </summary> /// <returns></returns> public List <SubscriptionMatchGroup> GetAllSubscriptionMatches(bool excludeRecentlyNotified = true) { List <SubscriptionMatchGroup> allMatches = new List <SubscriptionMatchGroup>(); //TODO: performance/optimisation //for each subscription, check if any changes match the criteria var dataModel = new OCM.Core.Data.OCMEntities(); var currentTime = DateTime.UtcNow; var allsubscriptions = dataModel.UserSubscriptions.Where(s => s.IsEnabled == true); foreach (var subscription in allsubscriptions) { if (!excludeRecentlyNotified || (subscription.DateLastNotified == null || subscription.DateLastNotified.Value < currentTime.AddMinutes(-subscription.NotificationFrequencyMins))) { var subscriptionMatchGroup = GetSubscriptionMatches(dataModel, subscription); if (subscriptionMatchGroup.SubscriptionMatches.Any()) { subscriptionMatchGroup.Subscription = OCM.API.Common.Model.Extensions.UserSubscription.FromDataModel(subscription, true); allMatches.Add(subscriptionMatchGroup); } } } return(allMatches); }
public ManagerBase() { dataModel = new Core.Data.OCMEntities(); }
public POIDuplicates GetAllPOIDuplicates(POIManager poiManager, int countryId, double maxDupeRange = 500) { List<DuplicatePOIItem> allDuplicates = new List<DuplicatePOIItem>(); var dataModel = new OCM.Core.Data.OCMEntities(); double DUPLICATE_DISTANCE_METERS = 25; double POSSIBLE_DUPLICATE_DISTANCE_METERS = maxDupeRange; //TODO: better method for large number of POIs //grab all live POIs (30-100,000 items) //var allPOIs = dataModel.ChargePoints.Where(s => s.AddressInfo.CountryID == countryId && (s.SubmissionStatusTypeID == 100 || s.SubmissionStatusTypeID == 200)).ToList(); var allPOIs = poiManager.GetChargePoints(new APIRequestParams { CountryIDs = new int[] { countryId }, MaxResults=100000 }); foreach (var poi in allPOIs) { //find pois which duplicate the given poi var dupePOIs = allPOIs.Where(p => p.ID != poi.ID && ( p.DataProvidersReference != null && p.DataProvidersReference.Length > 0 && p.DataProvidersReference == poi.DataProvidersReference || new System.Device.Location.GeoCoordinate(p.AddressInfo.Latitude, p.AddressInfo.Longitude).GetDistanceTo(new System.Device.Location.GeoCoordinate(poi.AddressInfo.Latitude, poi.AddressInfo.Longitude)) < POSSIBLE_DUPLICATE_DISTANCE_METERS ) ); if (dupePOIs.Any()) { var poiModel = poi;// OCM.API.Common.Model.Extensions.ChargePoint.FromDataModel(poi, true, true, true, true); foreach (var dupe in dupePOIs) { //poi has duplicates DuplicatePOIItem dupePoi = new DuplicatePOIItem { DuplicatePOI = dupe, DuplicateOfPOI = poiModel }; dupePoi.Reasons = new List<string>(); if (dupe.AddressInfo.Latitude == poi.AddressInfo.Latitude && dupe.AddressInfo.Longitude == poi.AddressInfo.Longitude) { dupePoi.Reasons.Add("POI location is exact match for OCM-" + poi.ID); dupePoi.Confidence = 95; } else { double distanceMeters = new System.Device.Location.GeoCoordinate(dupe.AddressInfo.Latitude, dupe.AddressInfo.Longitude).GetDistanceTo(new System.Device.Location.GeoCoordinate(poi.AddressInfo.Latitude, poi.AddressInfo.Longitude)); if (distanceMeters < DUPLICATE_DISTANCE_METERS) { dupePoi.Reasons.Add("POI location is close proximity (" + distanceMeters + "m) to OCM-" + poi.ID); dupePoi.Confidence = 75; } else { if (distanceMeters < POSSIBLE_DUPLICATE_DISTANCE_METERS) { dupePoi.Reasons.Add("POI location is in surrounding proximity (" + distanceMeters + "m) to OCM-" + poi.ID); dupePoi.Confidence = 50; } } } allDuplicates.Add(dupePoi); } } } //arrange all duplicates into groups POIDuplicates duplicatesSummary = new POIDuplicates(); duplicatesSummary.DuplicateSummaryList = new List<DuplicatePOIGroup>(); foreach (var dupe in allDuplicates) { bool isNewGroup = false; var dupeGroup = duplicatesSummary.DuplicateSummaryList.FirstOrDefault(d => d.DuplicatePOIList.Any(p => p.DuplicateOfPOI.ID == dupe.DuplicateOfPOI.ID || p.DuplicatePOI.ID == dupe.DuplicatePOI.ID) || d.SuggestedBestPOI.ID == dupe.DuplicatePOI.ID); if (dupeGroup == null) { isNewGroup = true; dupeGroup = new DuplicatePOIGroup(); dupeGroup.SuggestedBestPOI = dupe.DuplicatePOI;//TODO: select best dupeGroup.DuplicatePOIList = new List<DuplicatePOIItem>(); } //only add to dupe group if not already added for another reason if (!dupeGroup.DuplicatePOIList.Contains(dupe) && !dupeGroup.DuplicatePOIList.Any(d => d.DuplicatePOI.ID == dupe.DuplicatePOI.ID)) { dupeGroup.DuplicatePOIList.Add(dupe); } if (isNewGroup) { duplicatesSummary.DuplicateSummaryList.Add(dupeGroup); } } //loop through groups and rearrange RearrangeDuplicates(duplicatesSummary); //go through all groups and populate final list of All POI per group foreach (var g in duplicatesSummary.DuplicateSummaryList) { var poiList = new List<OCM.API.Common.Model.ChargePoint>(); foreach (var d in g.DuplicatePOIList) { if (!poiList.Contains(d.DuplicatePOI)) { poiList.Add(d.DuplicatePOI); } if (!poiList.Contains(d.DuplicateOfPOI)) { poiList.Add(d.DuplicateOfPOI); } g.AllPOI = poiList; } } //TODO: go through all dupe groups and nominate best poi to be main poi (most comments, most equipment info etc) return duplicatesSummary; }
public POIDuplicates GetAllPOIDuplicates(POIManager poiManager, int countryId, double maxDupeRange = 500) { List <DuplicatePOIItem> allDuplicates = new List <DuplicatePOIItem>(); var dataModel = new OCM.Core.Data.OCMEntities(); double DUPLICATE_DISTANCE_METERS = 25; double POSSIBLE_DUPLICATE_DISTANCE_METERS = maxDupeRange; //TODO: better method for large number of POIs //grab all live POIs (30-100,000 items) //var allPOIs = dataModel.ChargePoints.Where(s => s.AddressInfo.CountryID == countryId && (s.SubmissionStatusTypeID == 100 || s.SubmissionStatusTypeID == 200)).ToList(); var allPOIs = poiManager.GetPOIList(new APIRequestParams { CountryIDs = new int[] { countryId }, MaxResults = 100000 }); foreach (var poi in allPOIs) { //find pois which duplicate the given poi var dupePOIs = allPOIs.Where(p => p.ID != poi.ID && ( p.DataProvidersReference != null && p.DataProvidersReference.Length > 0 && p.DataProvidersReference == poi.DataProvidersReference || new GeoCoordinate(p.AddressInfo.Latitude, p.AddressInfo.Longitude).GetDistanceTo(new GeoCoordinate(poi.AddressInfo.Latitude, poi.AddressInfo.Longitude)) < POSSIBLE_DUPLICATE_DISTANCE_METERS ) ); if (dupePOIs.Any()) { var poiModel = poi;// OCM.API.Common.Model.Extensions.ChargePoint.FromDataModel(poi, true, true, true, true); foreach (var dupe in dupePOIs) { //poi has duplicates DuplicatePOIItem dupePoi = new DuplicatePOIItem { DuplicatePOI = dupe, DuplicateOfPOI = poiModel }; dupePoi.Reasons = new List <string>(); if (dupe.AddressInfo.Latitude == poi.AddressInfo.Latitude && dupe.AddressInfo.Longitude == poi.AddressInfo.Longitude) { dupePoi.Reasons.Add("POI location is exact match for OCM-" + poi.ID); dupePoi.Confidence = 95; } else { double distanceMeters = new GeoCoordinate(dupe.AddressInfo.Latitude, dupe.AddressInfo.Longitude).GetDistanceTo(new GeoCoordinate(poi.AddressInfo.Latitude, poi.AddressInfo.Longitude)); if (distanceMeters < DUPLICATE_DISTANCE_METERS) { dupePoi.Reasons.Add("POI location is close proximity (" + distanceMeters + "m) to OCM-" + poi.ID); dupePoi.Confidence = 75; } else { if (distanceMeters < POSSIBLE_DUPLICATE_DISTANCE_METERS) { dupePoi.Reasons.Add("POI location is in surrounding proximity (" + distanceMeters + "m) to OCM-" + poi.ID); dupePoi.Confidence = 50; } } } allDuplicates.Add(dupePoi); } } } //arrange all duplicates into groups POIDuplicates duplicatesSummary = new POIDuplicates(); duplicatesSummary.DuplicateSummaryList = new List <DuplicatePOIGroup>(); foreach (var dupe in allDuplicates) { bool isNewGroup = false; var dupeGroup = duplicatesSummary.DuplicateSummaryList.FirstOrDefault(d => d.DuplicatePOIList.Any(p => p.DuplicateOfPOI.ID == dupe.DuplicateOfPOI.ID || p.DuplicatePOI.ID == dupe.DuplicatePOI.ID) || d.SuggestedBestPOI.ID == dupe.DuplicatePOI.ID); if (dupeGroup == null) { isNewGroup = true; dupeGroup = new DuplicatePOIGroup(); dupeGroup.SuggestedBestPOI = dupe.DuplicatePOI;//TODO: select best dupeGroup.DuplicatePOIList = new List <DuplicatePOIItem>(); } //only add to dupe group if not already added for another reason if (!dupeGroup.DuplicatePOIList.Contains(dupe) && !dupeGroup.DuplicatePOIList.Any(d => d.DuplicatePOI.ID == dupe.DuplicatePOI.ID)) { dupeGroup.DuplicatePOIList.Add(dupe); } if (isNewGroup) { duplicatesSummary.DuplicateSummaryList.Add(dupeGroup); } } //loop through groups and rearrange RearrangeDuplicates(duplicatesSummary); //go through all groups and populate final list of All POI per group foreach (var g in duplicatesSummary.DuplicateSummaryList) { var poiList = new List <OCM.API.Common.Model.ChargePoint>(); foreach (var d in g.DuplicatePOIList) { if (!poiList.Contains(d.DuplicatePOI)) { poiList.Add(d.DuplicatePOI); } if (!poiList.Contains(d.DuplicateOfPOI)) { poiList.Add(d.DuplicateOfPOI); } g.AllPOI = poiList; } } //TODO: go through all dupe groups and nominate best poi to be main poi (most comments, most equipment info etc) return(duplicatesSummary); }
public int SendAllPendingSubscriptionNotifications(string templateFolderPath) { int notificationsSent = 0; List <int> subscriptionsNotified = new List <int>(); List <int> subscriptionsSkipped = new List <int>(); var allSubscriptionMatches = GetAllSubscriptionMatches(true); var userManager = new UserManager(); NotificationManager notificationManager = new NotificationManager(); notificationManager.TemplateFolderPath = templateFolderPath; foreach (var subscriptionMatch in allSubscriptionMatches) { if (subscriptionMatch.SubscriptionMatches != null && subscriptionMatch.SubscriptionMatches.Count > 0) { bool hasItemMatches = subscriptionMatch.SubscriptionMatches.Any(m => m.ItemList.Count > 0); if (hasItemMatches) { string summaryHTML = GetSubscriptionMatchHTMLSummary(subscriptionMatch); var userDetails = userManager.GetUser(subscriptionMatch.Subscription.UserID); //prepare and send email Hashtable msgParams = new Hashtable(); msgParams.Add("SummaryContent", summaryHTML); msgParams.Add("SubscriptionTitle", subscriptionMatch.Subscription.Title); msgParams.Add("UserName", userDetails.Username); msgParams.Add("SubscriptionEditURL", "https://openchargemap.org/site/profile/subscriptionedit?id=" + subscriptionMatch.Subscription.ID); if (!String.IsNullOrEmpty(userDetails.EmailAddress)) { notificationManager.PrepareNotification(NotificationType.SubscriptionNotification, msgParams); bool sentOK = notificationManager.SendNotification(userDetails.EmailAddress); if (sentOK) { notificationsSent++; subscriptionsNotified.Add(subscriptionMatch.Subscription.ID); } } } else { subscriptionsSkipped.Add(subscriptionMatch.Subscription.ID); } //mark all subscriptions notified where sent ok var dataModel = new OCM.Core.Data.OCMEntities(); foreach (var subscriptionId in subscriptionsNotified) { var s = dataModel.UserSubscriptions.Find(subscriptionId); s.DateLastNotified = DateTime.UtcNow; } //mark all subscriptions with no matching items as processed/skipped foreach (var subscriptionId in subscriptionsSkipped) { var s = dataModel.UserSubscriptions.Find(subscriptionId); s.DateLastNotified = DateTime.UtcNow; } dataModel.SaveChanges(); } } return(notificationsSent); }
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); }
public Model.UserSubscription UpdateUserSubscription(Model.UserSubscription subscription) { var dataModel = new OCM.Core.Data.OCMEntities(); Core.Data.UserSubscription update = new Core.Data.UserSubscription(); if (subscription.ID > 0) { //edit update = dataModel.UserSubscriptions.FirstOrDefault(u => u.ID == subscription.ID && u.UserID == subscription.UserID); } else { //new item update.User = dataModel.Users.FirstOrDefault(u => u.ID == subscription.UserID); update.DateCreated = DateTime.UtcNow; update.DateLastNotified = update.DateCreated; } if (update != null) { update.Title = subscription.Title; update.IsEnabled = subscription.IsEnabled; if (subscription.CountryID != null) { update.Country = dataModel.Countries.FirstOrDefault(c => c.ID == subscription.CountryID); } else { update.Country = null; update.CountryID = null; } update.DistanceKM = subscription.DistanceKM; if (subscription.FilterSettings != null) { update.FilterSettings = JsonConvert.SerializeObject(subscription.FilterSettings); } else { update.FilterSettings = null; } update.Latitude = subscription.Latitude; update.Longitude = subscription.Longitude; update.NotificationFrequencyMins = subscription.NotificationFrequencyMins; update.NotifyComments = subscription.NotifyComments; update.NotifyEmergencyChargingRequests = subscription.NotifyEmergencyChargingRequests; update.NotifyGeneralChargingRequests = subscription.NotifyGeneralChargingRequests; update.NotifyMedia = subscription.NotifyMedia; update.NotifyPOIAdditions = subscription.NotifyPOIAdditions; update.NotifyPOIEdits = subscription.NotifyPOIEdits; update.NotifyPOIUpdates = subscription.NotifyPOIUpdates; } if (update.ID == 0) { dataModel.UserSubscriptions.Add(update); } dataModel.SaveChanges(); return(OCM.API.Common.Model.Extensions.UserSubscription.FromDataModel(update, true)); }