public async Task <IActionResult> Post([FromBody] ScreeningRequest screeningRequest)
        {
            try
            {
                var user = new User(HttpContext.User);

                var ministries = await ScreeningRequest.GetMinistryScreeningTypesAsync(_dynamicsClient);

                var siteMinderMinistry    = ministries.FirstOrDefault(m => m.Name == user.Ministry);
                var siteMinderProgramArea = siteMinderMinistry?.ProgramAreas.FirstOrDefault(a => a.Name == user.ProgramArea);
                var screeningType         = siteMinderProgramArea?.ScreeningTypes.Find(t => t.Value == screeningRequest.ScreeningType);

                // ensure ministry and program area from siteminder match a ministry and program area in our system
                if (siteMinderProgramArea == null)
                {
                    _logger.LogWarning(string.Join(Environment.NewLine, "Cannot find ministry and program area in database matching SiteMinder headers", "{@User}", "{@RetrievedMinistries}"), user, ministries);
                    return(Unauthorized());
                }

                // validate screening request
                try
                {
                    bool validationResult = await screeningRequest.Validate(_dynamicsClient, siteMinderMinistry, siteMinderProgramArea);

                    if (validationResult == false)
                    {
                        _logger.LogWarning("Validation failed for screening request {@ScreeningRequest} {@Ministry} {@ProgramArea}", screeningRequest, siteMinderMinistry, siteMinderProgramArea);
                        return(BadRequest());
                    }
                }
                catch (DynamicsEntityNotFoundException ex)
                {
                    _logger.LogError(ex, "Validation failed for screening request {@ScreeningRequest} {@Ministry} {@ProgramArea}", screeningRequest, siteMinderMinistry, siteMinderProgramArea);
                    return(BadRequest());
                }

                // validate user
                if (string.IsNullOrWhiteSpace(user.Email))
                {
                    _logger.LogWarning("Validation failed for user {@user} submitting screening request {@ScreeningRequest}", user, screeningRequest);
                    return(BadRequest());
                }

                // submit request to dynamics and return its new screeningId
                string screeningId = await screeningRequest.Submit(_dynamicsClient, _logger, user, screeningType, siteMinderProgramArea.Value);

                return(new JsonResult(new { screeningId }));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Failed to submit screening request {@ScreeningRequest}", screeningRequest);
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }
        }
        public async Task <IActionResult> GetMinistryScreeningTypes()
        {
            try
            {
                var data = await ScreeningRequest.GetMinistryScreeningTypesAsync(_dynamicsClient);

                _logger.LogInformation("Successfully retrieved ministry screening types {@Ministries}", data);
                return(new JsonResult(data));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Failed to retrieve ministry screening types");
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }
        }