Esempio n. 1
0
        public ActionResult UnviewedAlertedCandidates()
        {
            try
            {
                var unviewedCandidates = _memberSearchAlertsQuery.GetUnviewedCandidates(CurrentEmployer.Id);

                var results = unviewedCandidates.Select(c => c.SavedResumeSearchAlertId).Distinct().Select(i =>
                                                                                                           new SavedSearchResultsModel
                {
                    SavedSearchId =
                        _memberSearchAlertsQuery.GetMemberSearchAlert(i).MemberSearchId,
                    CandidateIds =
                        (from u in unviewedCandidates
                         where u.SavedResumeSearchAlertId == i
                         select u.CandidateId).ToList(),
                }).ToList();

                var model = new SavedSearchResultsResponseModel
                {
                    TotalSearches = results.Count(),
                    Searches      = results,
                };

                return(Json(model, JsonRequestBehavior.AllowGet));
            }
            catch (UserException ex)
            {
                ModelState.AddModelError(ex, new StandardErrorHandler());
            }

            return(Json(new JsonResponseModel()));
        }
Esempio n. 2
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));
                }
            }
        }