Exemplo n.º 1
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
            HttpRequest req,
            ILogger log,
            [BindConferenceConfig]
            ConferenceConfig conference,
            [BindFeedbackConfig]
            FeedbackConfig feedbackConfig)
        {
            var(conferenceFeedbackRepo, sessionFeedbackRepo) = await feedbackConfig.GetRepositoryAsync();

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

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

            var prizeDraw = conferenceFeedback.Select(x => x.Name)
                            .Where(name =>
                                   sessionFeedback.Count(s => s.Name.ToLowerInvariant() == name.ToLowerInvariant()) >=
                                   conference.MinNumSessionFeedbackForPrizeDraw)
                            .ToArray();

            var settings = new JsonSerializerSettings();

            settings.ContractResolver = new DefaultContractResolver();

            return(new JsonResult(prizeDraw, settings));
        }
Exemplo n.º 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));
        }
Exemplo n.º 3
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));
        }