public ActionResult EditSearch(Guid id, string name, bool isAlert, MemberSearchCriteria criteria, string deviceToken) { try { var search = _memberSearchAlertsQuery.GetMemberSearch(id); if (search == null) { return(JsonNotFound("search")); } search.Name = name; search.Criteria = criteria; _memberSearchAlertsCommand.UpdateMemberSearch(CurrentEmployer, search, new Tuple <AlertType, bool>(AlertType.AppleDevice, isAlert)); RegisterDevice(CurrentEmployer.Id, deviceToken); return(Json(new JsonResponseModel())); } catch (UserException ex) { ModelState.AddModelError(ex, new StandardErrorHandler()); } return(Json(new JsonResponseModel())); }
public ActionResult SaveSearch(string name, bool isAlert) { try { var employer = CurrentEmployer; var context = EmployerContext; var currentSearch = context.CurrentSearch; if (currentSearch != null) { // Check the name against the current saved search. if (!string.IsNullOrEmpty(context.SavedSearchName) && context.SavedSearchName == name) { // Trying to do an update. var search = _memberSearchAlertsQuery.GetMemberSearch(CurrentEmployer.Id, name); // If not found then create it or update as needed. if (search == null) { CreateSearch(employer, name, isAlert, currentSearch.Criteria); context.SavedSearchName = name; } else { search.Criteria = currentSearch.Criteria.Clone(); _memberSearchAlertsCommand.UpdateMemberSearch(employer, search, new Tuple <AlertType, bool>(AlertType.Email, isAlert)); } } else { // Creating new search. CreateSearch(employer, name, isAlert, currentSearch.Criteria); context.SavedSearchName = name; } } return(Json(new JsonResponseModel())); } catch (UserException ex) { ModelState.AddModelError(ex, new StandardErrorHandler()); } return(Json(new JsonResponseModel())); }
public void TestCreateMemberSearch() { var owner = new Employer { Id = Guid.NewGuid() }; var search = CreateMemberSearch(1); _memberSearchAlertsCommand.CreateMemberSearch(owner, search); AssertSearch(search, _memberSearchAlertsQuery.GetMemberSearch(search.Id)); AssertSearch(search, _memberSearchAlertsQuery.GetMemberSearch(search.OwnerId, search.Name)); Assert.IsNull(_memberSearchAlertsQuery.GetMemberSearchAlert(search.Id, AlertType.Email)); Assert.IsNull(_memberSearchAlertsQuery.GetMemberSearchAlert(search.Id, AlertType.AppleDevice)); }
public void SendNotification(Employer employer, MemberSearchResults results, Guid savedSearchId, Guid savedSearchAlertId) { const string method = "SendNotification"; var devices = _appleDevicesQuery.GetDevices(employer.Id); var savedSearch = _memberSearchAlertsQuery.GetMemberSearch(savedSearchId); if (devices == null || devices.Count == 0) { EventSource.Raise(Event.Error, method, "No devices registered for user with notifications turned on", Event.Arg("employer", employer.Id)); return; } foreach (var device in devices) { if (!device.Active) { continue; } if (results.MemberIds.Count == 0) { continue; } //Exclude any ids that haven't already been viewed var unviewed = _memberSearchAlertsQuery.GetUnviewedCandidates(employer.Id, savedSearchAlertId); var potentationAlertableMemberIds = unviewed == null || unviewed.Count() == 0 ? results.MemberIds : results.MemberIds.Except(unviewed.Select(r => r.CandidateId)); var alertableMemberIds = new List <Guid>(); //Exclude any ids that haven't been updated since last alert (possible where the alert was sent earlier today) foreach (var memberId in potentationAlertableMemberIds) { var lastAlert = _memberSearchAlertsQuery.LastAlert(memberId, savedSearchAlertId); if (lastAlert == null) { alertableMemberIds.Add(memberId); } else { //Need to determine if this is genuinely a new alert or just an update from earlier today var member = _membersQuery.GetMember(memberId); var candidate = _candidatesQuery.GetCandidate(memberId); var resume = candidate == null ? null : candidate.ResumeId.HasValue ? null : _resumesQuery.GetResume(candidate.ResumeId.Value); var lastUpdatedTime = new[] { member.LastUpdatedTime, candidate == null ? DateTime.MinValue : candidate.LastUpdatedTime, resume == null ? DateTime.MinValue : resume.LastUpdatedTime, }.Max(); //if the member has updated since the last alert was sent then send a new one if (lastUpdatedTime > lastAlert.CreatedTime) { alertableMemberIds.Add(memberId); } } } if (alertableMemberIds.Count() == 0) { continue; } _memberSearchAlertsCommand.AddResults(employer.Id, alertableMemberIds.Select( r => new SavedResumeSearchAlertResult { CandidateId = r, SavedResumeSearchAlertId = savedSearchAlertId, Viewed = false }).ToList()); var alertNotification = new Notification(device.DeviceToken); alertNotification.Payload.Alert.ActionLocalizedKey = "View"; alertNotification.Payload.Sound = "default"; var badgeCount = _memberSearchAlertsQuery.GetBadgeCount(employer.Id); alertNotification.Payload.Badge = badgeCount; //Max payload size is 256 bytes; can't add memberIds //alertNotification.Payload.AddCustom("SavedSearchId", new[] {savedSearchId.ToString()}); //alertNotification.Payload.AddCustom("MemberIds", alertableMemberIds.Select(a => a.ToString()).ToList()); alertNotification.Payload.Alert.Body = alertableMemberIds.Count() == 1 ? string.Format("A new candidate has matched your \"{0}\" saved search", savedSearch.Name) : string.Format("Your \"{0}\" saved search has new candidates", savedSearch.Name); if (EventSource.IsEnabled(Event.Trace)) { EventSource.Raise(Event.Trace, method, "Sending push notification", Event.Arg("employerId", employer.Id), Event.Arg("result count", alertableMemberIds.Count()), Event.Arg("saved search", savedSearchId), Event.Arg("saved searchname ", savedSearch.Name), Event.Arg("badge count", badgeCount), Event.Arg("deviceToken", device.DeviceToken), Event.Arg("alert payload", alertNotification.Payload.ToJson())); } //Queue the notification to be sent if (!_service.QueueNotification(alertNotification)) { EventSource.Raise(Event.Error, method, "Unable to queue notification", Event.Arg("deviceToken", device.DeviceToken)); } } }