private async Task ProcessUser( UserOption user, DateTimeOffset date, IEnumerable <DateTimeOffset> lessonTimes, ILogger log, CancellationToken cancellationToken = default) { var lessonRequest = new GetLessonsRequest(user, date, date.AddDays(1), _options.LocationId); GetLessonsResponse lessonResponse = await _client.GetLessons(lessonRequest, cancellationToken); List <Lesson> lessonsToJoin = lessonResponse.Lessons // Use OrdinalIgnoreCase and keyword "vrij" since the descriptions aren't consistent .Where(l => l.Description.Contains("vrij", StringComparison.OrdinalIgnoreCase) && lessonTimes.Contains(l.LessonStartTime)) .ToList(); if (lessonsToJoin.Count > 0) { var success = new List <Lesson>(); var failed = new List <Lesson>(); foreach (Lesson lesson in lessonsToJoin) { try { var joinRequest = new JoinLessonRequest(user, lesson.Id); JoinLessonResponse joinResponse = await _client.JoinLesson(joinRequest, cancellationToken); if (!joinResponse.Warning) { success.Add(lesson); } else { failed.Add(lesson); } } catch (Exception ex) { log.LogError(ex, "Something went wrong while joining a lesson. {User} {LessonId}", user.User, lesson.Id); failed.Add(lesson); } } if (success.Count > 0) { var mailRequest = new SendJoinMailRequest(user, success, failed); await _emailClient.SendJoinMail(mailRequest, cancellationToken); return; } } else { log.LogWarning("LessonsToJoin is empty for {User}", user.User); } await _emailClient.SendFailedMail(user); }
public async Task <GetLessonsResponse> GetLessons(GetLessonsRequest request, CancellationToken cancellationToken = default) => await PostAsync <GetLessonsRequest, GetLessonsResponse>("getLessonsId_V2", request, cancellationToken);