Beispiel #1
0
        public async Task FindTrips(RailwayMonitoring monitoring)
        {
            var monitoringResult =
                dataContext.RailwayMonitoring.Include(m => m.Trips).FirstOrDefault(m => m.Id == monitoring.Id);

            if (monitoringResult == null)
            {
                RecurringJob.RemoveIfExists(monitoring.Guid);
                return;
            }

            if (monitoringResult.DepartureDate <= DateTime.Now)
            {
                RecurringJob.RemoveIfExists(monitoring.Guid);
                monitoringResult.IsSuccessful             = false;
                monitoringResult.IsInProcess              = false;
                dataContext.Entry(monitoringResult).State = EntityState.Modified;
                await dataContext.SaveChangesAsync();

                return;
            }

            var trips = (await tripFinder.FindTripsAsync(monitoringResult.From, monitoringResult.To,
                                                         monitoringResult.DepartureDate)).ToList().ConvertAll(t => (Train)t)
                        .FindAll(t => t.Types.Any(p => p.Places >= monitoring.MinPlaces));

            if (trips.Any())
            {
                if (!string.IsNullOrEmpty(monitoring.PlacesType))
                {
                    trips = trips.FindAll(t =>
                                          t.Types.Any(p => p.Letter == monitoring.PlacesType));
                }
                if (trips.Any())
                {
                    monitoringResult.IsSuccessful             = true;
                    monitoringResult.IsInProcess              = false;
                    monitoringResult.Trips                    = trips;
                    dataContext.Entry(monitoringResult).State = EntityState.Modified;
                    await dataContext.SaveChangesAsync();

                    var user = await dataContext.Users.FindAsync(monitoringResult.UserId);

                    if (user.EmailNotificationEnabled)
                    {
                        smtpService.SendRailwayNotification(monitoringResult, user.Email);
                    }

                    if (user.SmsNotificationEnabled)
                    {
                        smsService.SendRailwayNotification(monitoringResult, user.PhoneNumber);
                    }

                    RecurringJob.RemoveIfExists(monitoring.Guid);
                }
            }
        }
        public async Task SendRailwayNotification(RailwayMonitoring railwayMonitoring, string email)
        {
            var to   = new MailAddress(email);
            var body = await renderer.RenderViewToStringAsync("Templates/RailwayNotificationTemplate.cshtml", railwayMonitoring);

            var message = new MailMessage(from, to)
            {
                Subject    = $"{railwayMonitoring.From} - {railwayMonitoring.To}. Поїздки знайдено!",
                Body       = body,
                IsBodyHtml = true
            };

            SendEmail(message);
        }
Beispiel #3
0
        public void SendRailwayNotification(RailwayMonitoring railwayMonitoring, string phoneNumber)
        {
            var stringBuilder = new StringBuilder();

            stringBuilder.AppendLine($"{railwayMonitoring.From} - {railwayMonitoring.To}. Поїздки знайдено!");
            stringBuilder.AppendLine("Потяги");
            foreach (var railwayMonitoringTrip in railwayMonitoring.Trips)
            {
                stringBuilder.AppendLine(
                    $"{railwayMonitoringTrip.From.StationTrain} - {railwayMonitoringTrip.To.StationTrain}: {railwayMonitoringTrip.DepartureDate}");
            }
            MessageResource.Create(
                from: new PhoneNumber(smsConfig.Number),
                to: new PhoneNumber(phoneNumber),
                body: stringBuilder.ToString(),
                client: twilioRestClient);
        }
Beispiel #4
0
        public async Task StartMonitoring(string from, string to, DateTime departureDate, string placesType, int minPlaces, string userId)
        {
            var user = await dataContext.Users.Include(u => u.RailwayMonitoring)
                       .FirstOrDefaultAsync(u => u.Id == userId);

            var monitoring = new RailwayMonitoring
            {
                Guid          = Guid.NewGuid().ToString(),
                DepartureDate = departureDate,
                From          = from,
                To            = to,
                PlacesType    = placesType,
                MinPlaces     = minPlaces,
                IsInProcess   = true
            };

            user.RailwayMonitoring.Add(monitoring);
            dataContext.Entry(user).State = EntityState.Modified;
            dataContext.SaveChanges();
            RecurringJob.AddOrUpdate <RailwayJob>(monitoring.Guid, j => j.FindTrips(monitoring),
                                                  hangFireConfig.MonitoringCron);
        }