Example #1
0
        public async Task <IActionResult> Daily([FromBody] SchedulePushNotificationViewModel vm)
        {
            if (vm.Name != "DailyScheduledJob")
            {
                return(NotFound());
            }

            var allUsers = _unitOfWork.UserRepository.AsQueryable().ToList();

            foreach (var user in allUsers.Where(x => x.Role.ToLower() == Constants.PLAYER))
            {
                //training today?
                Notification notification = new Notification();
                notification.Id          = Guid.NewGuid();
                notification.Text        = "Training Today?";
                notification.CreatedDate = DateTime.Now;
                notification.UserId      = user.Id;
                //_unitOfWork.NotificationRepository.InsertOne(notification);
                if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                {
                    await AndriodPushNotification(user.DeviceToken, notification);
                }
                else if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                {
                    await ApplePushNotification(user.DeviceToken, notification);
                }
            }

            return(Ok());
        }
Example #2
0
        public async Task <IActionResult> Post([FromBody] SchedulePushNotificationViewModel vm)
        {
            if (vm.Name != Constants.ScheduledPushNotification)
            {
                return(NotFound());
            }

            var now = DateTime.Now;


            var allUsers = _unitOfWork.UserRepository.AsQueryable();
            var players  = allUsers.Where(x => x.Role.ToLower() == Constants.PLAYER).ToList();
            var coaches  = allUsers.Where(x => x.Role.ToLower() == Constants.COACH).ToList();


            //24 hours after register
            var dayBefore = now.AddDays(-1);
            var playersWithAfterRegister    = players.Where(x => x.RegisterDate.Date == dayBefore.Date).ToList();
            var playersWithAfterRegisterIds = playersWithAfterRegister.Select(x => x.Id).ToList();

            var playersWithBooking    = _unitOfWork.BookingRepository.FilterBy(x => playersWithAfterRegisterIds.Contains(x.PlayerID)).Select(x => x.PlayerID).ToList();
            var playersWithoutBooking = playersWithAfterRegister.Where(x => !playersWithBooking.Contains(x.Id)).ToList();

            foreach (var id in playersWithBooking)
            {
                var          user         = players.FirstOrDefault(x => x.Id == id);
                Notification notification = new Notification();
                notification.Id          = Guid.NewGuid();
                notification.Text        = "Time to train ⚽ Book your first 1 on 1 session today 🏆";
                notification.CreatedDate = DateTime.Now;
                notification.UserId      = user.Id;
                //_unitOfWork.NotificationRepository.InsertOne(notification);
                if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                {
                    await AndriodPushNotification(user.DeviceToken, notification);
                }
                else if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                {
                    await ApplePushNotification(user.DeviceToken, notification);
                }
            }


            ///3 days after registration
            dayBefore = now.AddDays(-3);

            playersWithAfterRegister    = players.Where(x => x.RegisterDate.Date == dayBefore.Date).ToList();
            playersWithAfterRegisterIds = playersWithAfterRegister.Select(x => x.Id).ToList();

            playersWithBooking    = _unitOfWork.BookingRepository.FilterBy(x => playersWithAfterRegisterIds.Contains(x.PlayerID)).Select(x => x.PlayerID).ToList();
            playersWithoutBooking = playersWithAfterRegister.Where(x => !playersWithBooking.Contains(x.Id)).ToList();


            foreach (var id in playersWithBooking)
            {
                var          user         = players.FirstOrDefault(x => x.Id == id);
                Notification notification = new Notification();
                notification.Id          = Guid.NewGuid();
                notification.Text        = "Good players practise until they get it right. Great players practise until they never get it wrong  💪";
                notification.CreatedDate = DateTime.Now;
                notification.UserId      = user.Id;
                //_unitOfWork.NotificationRepository.InsertOne(notification);
                if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                {
                    await AndriodPushNotification(user.DeviceToken, notification);
                }
                else if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                {
                    await ApplePushNotification(user.DeviceToken, notification);
                }
            }


            //bi weekly after registration
            dayBefore = now.AddDays(-14);

            playersWithAfterRegister    = players.Where(x => x.RegisterDate.Date == dayBefore.Date).ToList();
            playersWithAfterRegisterIds = playersWithAfterRegister.Select(x => x.Id).ToList();

            playersWithBooking    = _unitOfWork.BookingRepository.FilterBy(x => playersWithAfterRegisterIds.Contains(x.PlayerID)).Select(x => x.PlayerID).ToList();
            playersWithoutBooking = playersWithAfterRegister.Where(x => !playersWithBooking.Contains(x.Id)).ToList();


            foreach (var id in playersWithBooking)
            {
                var          user         = players.FirstOrDefault(x => x.Id == id);
                Notification notification = new Notification();
                notification.Id          = Guid.NewGuid();
                notification.Text        = "Good players practise until they get it right. Great players practise until they never get it wrong  💪";
                notification.CreatedDate = DateTime.Now;
                notification.UserId      = user.Id;
                //_unitOfWork.NotificationRepository.InsertOne(notification);
                if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                {
                    await AndriodPushNotification(user.DeviceToken, notification);
                }
                else if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                {
                    await ApplePushNotification(user.DeviceToken, notification);
                }
            }



            //everyday notifications
            foreach (var user in players)
            {
                Notification notification = new Notification();
                notification.Id          = Guid.NewGuid();
                notification.Text        = "To improve you must train as much as possible. Book a training session today!";
                notification.CreatedDate = DateTime.Now;
                notification.UserId      = user.Id;
                //_unitOfWork.NotificationRepository.InsertOne(notification);
                if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                {
                    await AndriodPushNotification(user.DeviceToken, notification);
                }
                else if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                {
                    await ApplePushNotification(user.DeviceToken, notification);
                }
            }

            //begining of the month
            if (now.Day == 1)
            {
                foreach (var user in players)
                {
                    Notification notification = new Notification();
                    notification.Id          = Guid.NewGuid();
                    notification.Text        = "New month, new goals - Time to smash it 💪";
                    notification.CreatedDate = DateTime.Now;
                    notification.UserId      = user.Id;
                    //_unitOfWork.NotificationRepository.InsertOne(notification);
                    if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                    {
                        await AndriodPushNotification(user.DeviceToken, notification);
                    }
                    else if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                    {
                        await ApplePushNotification(user.DeviceToken, notification);
                    }
                }
            }


            //one day after session
            dayBefore = now.AddDays(-30);

            var lastBookings = _unitOfWork.BookingRepository.FilterBy(x => x.SentDate > dayBefore);

            dayBefore = DateTime.Now.AddDays(-1);
            foreach (var booking in lastBookings)
            {
                var hasEndedSession = false;
                foreach (var session in booking.Sessions)
                {
                    if (session.BookingDate < dayBefore)
                    {
                        hasEndedSession = true;
                        break;
                    }
                }

                if (hasEndedSession)
                {
                    var          user         = _unitOfWork.UserRepository.FindById(booking.PlayerID);
                    Notification notification = new Notification();
                    notification.Id          = Guid.NewGuid();
                    notification.Text        = "How was your Training? Leave your coach a review ⭐";
                    notification.CreatedDate = DateTime.Now;
                    notification.UserId      = user.Id;
                    //_unitOfWork.NotificationRepository.InsertOne(notification);
                    if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                    {
                        await AndriodPushNotification(user.DeviceToken, notification);
                    }
                    else if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                    {
                        await ApplePushNotification(user.DeviceToken, notification);
                    }
                }
            }

            //1 week after training

            dayBefore = now.AddDays(-60);

            lastBookings = _unitOfWork.BookingRepository.FilterBy(x => x.SentDate > dayBefore);
            dayBefore    = now.AddDays(-7);
            foreach (var booking in lastBookings)
            {
                var hasEndedSession = false;
                foreach (var session in booking.Sessions)
                {
                    if (session.BookingDate < dayBefore)
                    {
                        hasEndedSession = true;
                        break;
                    }
                }

                if (hasEndedSession)
                {
                    var          user         = _unitOfWork.UserRepository.FindById(booking.PlayerID);
                    Notification notification = new Notification();
                    notification.Id          = Guid.NewGuid();
                    notification.Text        = "Ready for your next training session? ⚽";
                    notification.CreatedDate = DateTime.Now;
                    notification.UserId      = user.Id;
                    //_unitOfWork.NotificationRepository.InsertOne(notification);
                    if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                    {
                        await AndriodPushNotification(user.DeviceToken, notification);
                    }
                    else if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                    {
                        await ApplePushNotification(user.DeviceToken, notification);
                    }
                }
            }



            //first bookings for coaches
            foreach (var coach in coaches)
            {
                var bookings = _unitOfWork.BookingRepository.FilterBy(x => x.CoachID == coach.Id).ToList();
                if (!bookings.Any() || bookings.Count > 1)
                {
                    continue;
                }
                var hasEndedTraining = false;

                foreach (var session in bookings.FirstOrDefault().Sessions)
                {
                    if (session.BookingDate < DateTime.Now)
                    {
                        hasEndedTraining = true;
                        break;
                    }
                }

                if (hasEndedTraining)
                {
                    Notification notification = new Notification();
                    notification.Id          = Guid.NewGuid();
                    notification.Text        = "How was your first session? Leave us a review on the app store ⭐";
                    notification.CreatedDate = DateTime.Now;
                    notification.UserId      = coach.Id;
                    //_unitOfWork.NotificationRepository.InsertOne(notification);
                    if (coach.DeviceType != null && Convert.ToString(coach.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                    {
                        await AndriodPushNotification(coach.DeviceToken, notification);
                    }
                    else if (coach.DeviceType != null && Convert.ToString(coach.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                    {
                        await ApplePushNotification(coach.DeviceToken, notification);
                    }
                }
            }


            //weekly coachs notifications
            if (now.Day % 7 == 0)
            {
                foreach (var coach in coaches)
                {
                    Notification notification = new Notification();
                    notification.Id          = Guid.NewGuid();
                    notification.Text        = "Set your availability and training locations for the week.Improve your profile";
                    notification.CreatedDate = DateTime.Now;
                    notification.UserId      = coach.Id;
                    //_unitOfWork.NotificationRepository.InsertOne(notification);
                    if (coach.DeviceType != null && Convert.ToString(coach.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                    {
                        await AndriodPushNotification(coach.DeviceToken, notification);
                    }
                    else if (coach.DeviceType != null && Convert.ToString(coach.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                    {
                        await ApplePushNotification(coach.DeviceToken, notification);
                    }
                }
            }

            var signUpLimit   = now.AddDays(-7);
            var weeklyCoaches = coaches.Where(x => x.RegisterDate.Date == signUpLimit.Date).ToList();

            foreach (var coach in weeklyCoaches)
            {
                Notification notification = new Notification();
                notification.Id          = Guid.NewGuid();
                notification.Text        = "Set your availability and training locations for the week.Improve your profile";
                notification.CreatedDate = DateTime.Now;
                notification.UserId      = coach.Id;
                //_unitOfWork.NotificationRepository.InsertOne(notification);
                if (coach.DeviceType != null && Convert.ToString(coach.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                {
                    await AndriodPushNotification(coach.DeviceToken, notification);
                }
                else if (coach.DeviceType != null && Convert.ToString(coach.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                {
                    await ApplePushNotification(coach.DeviceToken, notification);
                }
            }



            if (now.Day % 7 == 0)
            {
                foreach (var user in allUsers)
                {
                    Notification notification = new Notification();
                    notification.Id          = Guid.NewGuid();
                    notification.Text        = "Post about training";
                    notification.CreatedDate = DateTime.Now;
                    notification.UserId      = user.Id;
                    //_unitOfWork.NotificationRepository.InsertOne(notification);
                    if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.ANDRIOD_DEVICE)
                    {
                        await AndriodPushNotification(user.DeviceToken, notification);
                    }
                    else if (user.DeviceType != null && Convert.ToString(user.DeviceType).ToLower() == Constants.APPLE_DEVICE)
                    {
                        await ApplePushNotification(user.DeviceToken, notification);
                    }
                }
            }



            return(Ok());
        }