Esempio n. 1
0
        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()));
        }
Esempio n. 2
0
        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()));
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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));
                }
            }
        }