示例#1
0
        public async Task CreateScheduleFromFileAsync(string name, Stream fileStream, CancellationToken cancellationToken = default(CancellationToken))
        {
            var schedule = new Schedule();

            schedule.ScheduleName  = name;
            schedule.OwningUser    = _httpContextAccessor.HttpContext.User.Identity.Name;
            schedule.ScheduleRules = new List <ScheduleRule>();

            using var reader = new StreamReader(fileStream);
            using var csv    = new CsvReader(reader, CultureInfo.InvariantCulture);

            var records = csv.GetRecords <ScheduleFileRow>();

            foreach (var record in records)
            {
                var rule = new ScheduleRule
                {
                    Name             = record.Name,
                    StartTime        = ScheduleRepresentationHelper.ConvertTimeStringToTimeSpan(record.StartTime),
                    EndTime          = ScheduleRepresentationHelper.ConvertTimeStringToTimeSpan(record.EndTime),
                    StartDate        = DateTime.Parse(record.StartDate).Date,
                    EndDate          = DateTime.Parse(record.EndDate).Date,
                    ScheduleRuleType = record.ScheduleRuleType,
                    DaysOfWeek       = ScheduleRepresentationHelper.ConvertStringToDaysOfWeekFlags(record.DaysOfWeek),
                    Url = record.Url
                };
                schedule.ScheduleRules.Add(rule);
            }

            _appDbContext.Schedules.Add(schedule);
            await _appDbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
        }
        public void ConvertTimeStringToStartEndTimes_WhenValidTimeString_ShouldReturnValidTimeSpans(string input, int expectedStartHour, int expectedStartMinute, int expectedEndHour, int expectedEndMinute)
        {
            var timeSpans = ScheduleRepresentationHelper.ConvertTimeStringToStartEndTimes(input);

            Assert.Equal(expectedStartHour, timeSpans.Item1.Hours);
            Assert.Equal(expectedStartMinute, timeSpans.Item1.Minutes);
            Assert.Equal(expectedEndHour, timeSpans.Item2.Hours);
            Assert.Equal(expectedEndMinute, timeSpans.Item2.Minutes);
        }
示例#3
0
        public async Task <List <ScheduleModel> > GetSchedulesAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            var models = await _appDbContext.Schedules.Where(s => s.OwningUser == _httpContextAccessor.HttpContext.User.Identity.Name)
                         .Select(s => new ScheduleModel()
            {
                ScheduleId       = s.ScheduleId,
                ScheduleName     = s.ScheduleName,
                GoogleCalendarId = s.GoogleCalendarId,
                ScheduleRules    = s.ScheduleRules.Select(sr => new ScheduleRuleModel
                {
                    Name             = sr.Name,
                    ScheduleRuleType = sr.ScheduleRuleType,
                    DaysOfWeek       = sr.DaysOfWeek,
                    StartDate        = sr.StartDate,
                    EndDate          = sr.EndDate,
                    StartTime        = sr.StartTime,
                    EndTime          = sr.EndTime
                }).ToList()
            })
                         .ToListAsync(cancellationToken).ConfigureAwait(false);

            foreach (var model in models)
            {
                model.TodaysEvents = new List <ScheduleEventModel>();
                foreach (var rule in model.ScheduleRules)
                {
                    if (rule.EndDate > DateTime.Now && ScheduleRepresentationHelper.GetListOfDayOfWeekFromFlags(rule.DaysOfWeek).Any(dow => dow == DateTime.Now.DayOfWeek))
                    {
                        if (rule.ScheduleRuleType == ScheduleRuleType.ByDayOfWeek ||
                            (rule.ScheduleRuleType == ScheduleRuleType.ByDayOfWeekEveryOtherWeek && (DateTime.Now - rule.StartDate).TotalDays / 7 % 2 == 0))
                        {
                            model.TodaysEvents.Add(new ScheduleEventModel
                            {
                                EventTime = DateTime.Today + rule.StartTime,
                                EventType = "start",
                                Name      = rule.Name
                            });

                            model.TodaysEvents.Add(new ScheduleEventModel
                            {
                                EventTime = DateTime.Today + rule.EndTime,
                                EventType = "end",
                                Name      = rule.Name
                            });
                        }
                    }
                }
            }

            return(models);
        }
        public void ConvertToRRULE_WhenRecurrenceTypeByDayOfWeekEveryOtherWeek_ProducesValidRRULE(DaysOfWeek daysOfWeek, string expectedResult)
        {
            // Arrange
            var model = new ScheduleRuleModel()
            {
                ScheduleRuleType = ScheduleRuleType.ByDayOfWeekEveryOtherWeek,
                DaysOfWeek       = daysOfWeek
            };

            // Act
            var rrule = ScheduleRepresentationHelper.ConvertToRRULE(model);

            // Assert
            Assert.Equal(expectedResult, rrule);
        }
示例#5
0
        public async Task CreateCalendarForScheduleAsync(Guid scheduleId, CancellationToken cancellationToken = default(CancellationToken))
        {
            var schedule = await _appDbContext.Schedules
                           .Include(s => s.ScheduleRules)
                           .FirstOrDefaultAsync(s => s.ScheduleId == scheduleId, cancellationToken).ConfigureAwait(false);

            if (schedule == null)
            {
                throw new Exception("Unable to find schedule with given ID");
            }

            var token = await flow.LoadTokenAsync(_httpContextAccessor.HttpContext.User.Identity.Name, cancellationToken).ConfigureAwait(false);

            var userCredentials = new UserCredential(flow, _httpContextAccessor.HttpContext.User.Identity.Name, token);

            var service = new CalendarService(new BaseClientService.Initializer
            {
                HttpClientInitializer = userCredentials
            });

            var calendars = await service.CalendarList.List().ExecuteAsync(cancellationToken).ConfigureAwait(false);

            string userCalendarId;

            if (calendars.Items.Count == 0 || !calendars.Items.Any(i => i.Description == schedule.ScheduleId.ToString()))
            {
                var cal = await service.Calendars.Insert(new Google.Apis.Calendar.v3.Data.Calendar
                {
                    Summary     = $"FWTBT - {schedule.ScheduleName}",
                    Description = schedule.ScheduleId.ToString()
                }).ExecuteAsync().ConfigureAwait(false);

                userCalendarId = cal.Id;
            }
            else
            {
                var userCalendar = calendars.Items.First(i => i.Description == schedule.ScheduleId.ToString());
                userCalendarId = userCalendar.Id;

                // Clear existing events
                var result = await service.Calendars.Clear(userCalendarId).ExecuteAsync(cancellationToken).ConfigureAwait(false);
            }

            schedule.GoogleCalendarId = userCalendarId;

            foreach (var rule in schedule.ScheduleRules)
            {
                var rrule = ScheduleRepresentationHelper.GenerateRrule(rule.ScheduleRuleType, rule.DaysOfWeek, rule.EndDate.Date + rule.EndTime);

                await service.Events.Insert(new Event
                {
                    Summary  = rule.Name,
                    Location = rule.Url,
                    Start    = new EventDateTime {
                        DateTime = rule.StartDate.Date + rule.StartTime,
                        TimeZone = TZConvert.WindowsToIana(TimeZoneInfo.Local.StandardName)
                    },
                    End = new EventDateTime
                    {
                        DateTime = rule.StartDate.Date + rule.EndTime,
                        TimeZone = TZConvert.WindowsToIana(TimeZoneInfo.Local.StandardName)
                    },
                    Recurrence = new List <string>
                    {
                        rrule
                    }
                }, userCalendarId).ExecuteAsync(cancellationToken).ConfigureAwait(false);
            }

            await _appDbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
        }