public static async Task Run(
            [TimerTrigger("%SessionizeReadModelSyncSchedule%")]
            TimerInfo timer,
            ILogger log,
            [BindConferenceConfig]
            ConferenceConfig conference,
            [BindKeyDatesConfig]
            KeyDatesConfig keyDates,
            [BindSessionsConfig]
            SessionsConfig sessions,
            [BindSessionizeSyncConfig]
            SessionizeSyncConfig sessionize
            )
        {
            if (keyDates.Before(x => x.StopSyncingSessionsFromDate) || keyDates.After(x => x.StopSyncingAgendaFromDate))
            {
                log.LogInformation("SessionizeAgendaSync sync not active");
                return;
            }

            using (var httpClient = new HttpClient())
            {
                var apiClient = new SessionizeApiClient(httpClient, sessionize.AgendaApiKey);
                var(sessionsRepo, presentersRepo) = await sessions.GetRepositoryAsync();

                await SyncService.Sync(apiClient, sessionsRepo, presentersRepo, log, new DateTimeProvider(), conference.ConferenceInstance);
            }
        }
Example #2
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
            HttpRequest req,
            ILogger log,
            [BindConferenceConfig]
            ConferenceConfig conference,
            [BindFeedbackConfig]
            FeedbackConfig feedbackConfig,
            [BindSessionsConfig]
            SessionsConfig sessionsConfig)
        {
            var(conferenceFeedbackRepo, sessionFeedbackRepo) = await feedbackConfig.GetRepositoryAsync();

            var conferenceFeedback = await conferenceFeedbackRepo.GetAllAsync(conference.ConferenceInstance);

            var sessionFeedback = await sessionFeedbackRepo.GetAllAsync(conference.ConferenceInstance);

            var(sessionsRepo, presentersRepo) = await sessionsConfig.GetRepositoryAsync();

            var sessions = await sessionsRepo.GetAllAsync(conference.ConferenceInstance);

            var presenters = await presentersRepo.GetAllAsync(conference.ConferenceInstance);

            var feedback = new
            {
                Conference = conferenceFeedback.OrderBy(x => x.Timestamp).Select(x => new
                {
                    x.Timestamp,
                    x.Rating,
                    x.Liked,
                    x.ImprovementIdeas
                }),
                Sessions = sessions.Select(x => x.GetSession())
                           .Select(s => new
                {
                    s.Id,
                    s.Title,
                    Presenters = string.Join(", ", s.PresenterIds.Select(pId => presenters.Single(p => p.Id == pId)).Select(x => x.Name)),
                    Feedback   = sessionFeedback.OrderBy(x => x.Timestamp).Where(x => x.SessionName.ToLowerInvariant().Contains(s.Title.ToLowerInvariant())).Select(x => new
                    {
                        x.Timestamp,
                        x.Rating,
                        x.Liked,
                        x.ImprovementIdeas
                    })
                })
            };

            var settings = new JsonSerializerSettings();

            settings.ContractResolver = new DefaultContractResolver();

            return(new JsonResult(feedback, settings));
        }
Example #3
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
            HttpRequest req,
            ILogger log,
            [BindConferenceConfig]
            ConferenceConfig conference,
            [BindKeyDatesConfig]
            KeyDatesConfig keyDates,
            [BindSessionsConfig]
            SessionsConfig sessionsConfig)
        {
            if (keyDates.Before(x => x.SubmissionsAvailableToDate))
            {
                log.LogWarning("Attempt to access GetAgenda endpoint before they are available at {availableDate}.", keyDates.SubmissionsAvailableToDate);
                return(new StatusCodeResult(404));
            }

            var(sessionsRepo, presentersRepo) = await sessionsConfig.GetRepositoryAsync();

            var sessions = await sessionsRepo.GetAllAsync(conference.ConferenceInstance);

            var presenters = await presentersRepo.GetAllAsync(conference.ConferenceInstance);

            var agenda = sessions.Select(x => x.GetSession())
                         .Select(s => new Session
            {
                Id         = s.Id.ToString(),
                Title      = s.Title,
                Abstract   = s.Abstract,
                Format     = s.Format,
                Level      = s.Level,
                Tags       = s.Tags,
                Presenters = s.PresenterIds.Select(pId => presenters.Where(p => p.Id == pId).Select(p => p.GetPresenter()).Select(p => new Presenter
                {
                    Id              = p.Id.ToString(),
                    Name            = p.Name,
                    Tagline         = p.Tagline,
                    Bio             = p.Bio,
                    ProfilePhotoUrl = p.ProfilePhotoUrl,
                    TwitterHandle   = p.TwitterHandle,
                    WebsiteUrl      = p.WebsiteUrl
                }).Single()).ToArray()
            })
                         .OrderBy(x => x.Title)
                         .ToArray();

            var settings = new JsonSerializerSettings();

            settings.ContractResolver = new DefaultContractResolver();

            return(new JsonResult(agenda, settings));
        }
Example #4
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]
            HttpRequestMessage req,
            ILogger log,
            [BindConferenceConfig]
            ConferenceConfig conference,
            [BindKeyDatesConfig]
            KeyDatesConfig keyDates,
            [BindFeedbackConfig]
            FeedbackConfig feedbackConfig,
            [BindSessionsConfig]
            SessionsConfig sessionsConfig
            )
        {
            var feedback = await req.Content.ReadAsAsync <FeedbackRequest>();

            // Within feedback window
            if (keyDates.Before(x => x.FeedbackAvailableFromDate) || keyDates.After(x => x.FeedbackAvailableToDate))
            {
                log.LogWarning("Attempt to access SubmitFeedback endpoint outside of allowed window of {start} -> {end}.", keyDates.FeedbackAvailableFromDate, keyDates.FeedbackAvailableToDate);
                return(new StatusCodeResult((int)HttpStatusCode.NotFound));
            }

            // Valid feedback
            if (string.IsNullOrWhiteSpace(feedback.Likes) && string.IsNullOrWhiteSpace(feedback.ImprovementIdeas))
            {
                log.LogWarning("Attempt to access SubmitFeedback endpoint with invalid feedback details from {DeviceId}", feedback.DeviceId);
                return(new StatusCodeResult((int)HttpStatusCode.BadRequest));
            }

            var(conferenceFeedbackRepo, sessionFeedbackRepo) = await feedbackConfig.GetRepositoryAsync();

            if (feedback.IsConferenceFeedback)
            {
                // Save conference feedback
                log.LogInformation("Successfully received conference feedback for from DeviceId {DeviceId}; persisting...", feedback.DeviceId);
                var feedbackToPersist = new ConferenceFeedbackEntity(
                    conference.ConferenceInstance,
                    feedback.Name,
                    feedback.Rating.ToString(),
                    feedback.Likes,
                    feedback.ImprovementIdeas,
                    feedback.DeviceId.ToString());

                await conferenceFeedbackRepo.CreateAsync(feedbackToPersist);
            }
            else
            {
                // valid Session existed
                var(sessionsRepo, presentersRepo) = await sessionsConfig.GetRepositoryAsync();

                var allSessions = await sessionsRepo.GetAllAsync(conference.ConferenceInstance);

                var allPresenters = await presentersRepo.GetAllAsync(conference.ConferenceInstance);

                var sessionRow = allSessions.First(s => s != null && feedback.SessionId == s.Id.ToString());
                if (sessionRow == null && !feedback.IsConferenceFeedback)
                {
                    log.LogWarning("Attempt to submit to SubmitFeedback endpoint with invalid SessionId {SessionId} from {DeviceId}", feedback.SessionId, feedback.DeviceId);
                    return(new StatusCodeResult((int)HttpStatusCode.BadRequest));
                }

                var session        = sessionRow.GetSession();
                var presenterNames = string.Join(", ", session.PresenterIds.Select(pId => allPresenters.Single(p => p.Id == pId)).Select(x => x.Name));

                // Save feedback
                log.LogInformation("Successfully received feedback for {SessionId} from DeviceId {DeviceId}; persisting...", feedback.SessionId, feedback.DeviceId);
                var feedbackToPersist = new SessionFeedbackEntity(
                    session.Id.ToString(),
                    conference.ConferenceInstance,
                    feedback.Name,
                    feedback.Rating.ToString(),
                    feedback.Likes,
                    feedback.ImprovementIdeas,
                    $"{session.Title} - {presenterNames}",
                    feedback.DeviceId.ToString());

                await sessionFeedbackRepo.CreateAsync(feedbackToPersist);
            }
            return(new StatusCodeResult((int)HttpStatusCode.NoContent));
        }