public async Task <RepositoryResult <SearchProjectsD365PageModel> > SearchProject(string search,
                                                                                          ProjectStatusEnum status,
                                                                                          bool isAscending = true,
                                                                                          uint pageSize    = 10,
                                                                                          uint pageNumber  = 1)
        {
            var sanitizedSearch = _fetchXmlSanitizer.Sanitize(search);

            var fetchXml        = BuildFetchXMLQuery(sanitizedSearch, status, isAscending);
            var encodedFetchXml = WebUtility.UrlEncode(fetchXml);

            var url = $"{_route}?fetchXml={encodedFetchXml}";

            var response = await _client.GetAsync(url);

            var responseContent = await response.Content?.ReadAsStringAsync();

            var responseStatusCode = response.StatusCode;

            if (response.IsSuccessStatusCode)
            {
                var results = await response.Content.ReadAsStringAsync();

                var castedResults = JsonConvert.DeserializeObject <ResultSet <SearchProjectsD365Model> >(results);

                var distinctResults = castedResults.Items.Distinct().ToList();
                var totalPages      = distinctResults.Count == 0 ? 0 : (distinctResults.Count / (int)pageSize) + 1;
                var pageResults     = distinctResults
                                      .Skip(((int)pageNumber - 1) * (int)pageSize)
                                      .Take((int)pageSize)
                                      .ToList();

                var pageResult = new SearchProjectsD365PageModel
                {
                    CurrentPage = (int)pageNumber,
                    TotalPages  = totalPages,
                    Projects    = pageResults
                };

                return(new RepositoryResult <SearchProjectsD365PageModel> {
                    Result = pageResult
                });
            }

            //At this point, log the error and configure the repository result to inform the caller that the repo failed
            _logger.LogError(RepositoryErrorMessages.RepositoryErrorLogFormat, responseStatusCode, responseContent);

            return(new RepositoryResult <SearchProjectsD365PageModel>
            {
                Error = new RepositoryResultBase.RepositoryError
                {
                    StatusCode = responseStatusCode,
                    ErrorMessage = responseContent
                }
            });
        }
        public async Task <RepositoryResult <GetTrustsModel> > GetTrustById(Guid id)
        {
            var url = _urlBuilder.BuildRetrieveOneUrl(Route, id);

            var response = await _client.GetAsync(url);

            var responseContent = await response.Content?.ReadAsStringAsync();

            var responseStatusCode = response.StatusCode;

            if (responseStatusCode == System.Net.HttpStatusCode.NotFound)
            {
                return(new RepositoryResult <GetTrustsModel> {
                    Result = null
                });
            }

            if (response.IsSuccessStatusCode)
            {
                var castedResult = JsonConvert.DeserializeObject <GetTrustsD365Model>(responseContent);

                //If this establishment is not a trust, return null. The controller will return a Not Found response
                var allowedEstablishementTypeIds = new List <string>()
                {
                    EstablishmentType.MultiAcademyTrustGuid,
                    EstablishmentType.SingleAcademyTrustGuid,
                    EstablishmentType.TrustGuid
                };

                if (!allowedEstablishementTypeIds.Contains(castedResult.EstablishmentTypeId.ToString()
                                                           .ToUpperInvariant()))
                {
                    return(new RepositoryResult <GetTrustsModel> {
                        Result = null
                    });
                }

                var mappedResult = _getTrustMapper.Map(castedResult);
                return(new RepositoryResult <GetTrustsModel> {
                    Result = mappedResult
                });
            }

            //At this point, log the error and configure the repository result to inform the caller that the repo failed
            _logger.LogError(RepositoryErrorMessages.RepositoryErrorLogFormat, responseStatusCode, responseContent);

            return(new RepositoryResult <GetTrustsModel>
            {
                Error = new RepositoryResultBase.RepositoryError
                {
                    StatusCode = responseStatusCode,
                    ErrorMessage = responseContent
                }
            });
        }
Example #3
0
        public async Task <RepositoryResult <GetAcademiesModel> > GetAcademyById(Guid id)
        {
            var url = _urlBuilder.BuildRetrieveOneUrl(Route, id);

            var response = await _client.GetAsync(url);

            var responseContent = await response.Content?.ReadAsStringAsync();

            var responseStatusCode = response.StatusCode;

            if (responseStatusCode == System.Net.HttpStatusCode.NotFound)
            {
                return(new RepositoryResult <GetAcademiesModel> {
                    Result = null
                });
            }

            if (response.IsSuccessStatusCode)
            {
                var castedResult = JsonConvert.DeserializeObject <GetAcademiesD365Model>(responseContent);

                if (castedResult?.ParentTrustId == null)
                {
                    return(new RepositoryResult <GetAcademiesModel> {
                        Result = null
                    });
                }

                var mappedResult = _getAcademies365Mapper.Map(castedResult);
                return(new RepositoryResult <GetAcademiesModel> {
                    Result = mappedResult
                });
            }

            //At this point, log the error and configure the repository result to inform the caller that the repo failed
            _logger.LogError(RepositoryErrorMessages.RepositoryErrorLogFormat, responseStatusCode, responseContent);

            return(new RepositoryResult <GetAcademiesModel>
            {
                Error = new RepositoryResultBase.RepositoryError
                {
                    StatusCode = responseStatusCode,
                    ErrorMessage = responseContent
                }
            });
        }
Example #4
0
        public async Task <RepositoryResult <SearchProjectsPageModel> > SearchProject(string search,
                                                                                      Models.Upstream.Enums.ProjectStatusEnum?status,
                                                                                      bool isAscending = true,
                                                                                      uint pageSize    = 10,
                                                                                      uint pageNumber  = 1)
        {
            var sanitizedSearch = _fetchXmlSanitizer.Sanitize(search);

            ProjectStatusEnum projectStatus = default;

            if (status.HasValue)
            {
                if (MappingDictionaries.ProjecStatusEnumMap.TryGetValue(status.Value, out var internalStatus))
                {
                    projectStatus = internalStatus;
                }
                else
                {
                    //If project status cannot be mapped to D365 Project Status, return an error
                    return(new RepositoryResult <SearchProjectsPageModel>()
                    {
                        Error = new RepositoryResultBase.RepositoryError()
                        {
                            ErrorMessage = "Project Status not recognised",
                            StatusCode = HttpStatusCode.BadRequest
                        }
                    });
                }
            }

            var fetchXml        = BuildFetchXMLQuery(sanitizedSearch, projectStatus, isAscending);
            var encodedFetchXml = WebUtility.UrlEncode(fetchXml);

            var url = $"{Route}?fetchXml={encodedFetchXml}";

            var response = await _client.GetAsync(url);

            var responseContent = await response.Content?.ReadAsStringAsync();

            var responseStatusCode = response.StatusCode;

            if (response.IsSuccessStatusCode)
            {
                var results = await response.Content.ReadAsStringAsync();

                var castedResults = JsonConvert.DeserializeObject <ResultSet <SearchProjectsD365Model> >(results);

                var distinctResults = castedResults.Items.Distinct().ToList();
                var totalPages      = distinctResults.Count == 0 ? 0 : (distinctResults.Count / (int)pageSize) + 1;
                var pageResults     = distinctResults
                                      .Skip(((int)pageNumber - 1) * (int)pageSize)
                                      .Take((int)pageSize)
                                      .ToList();

                var pageResult = new SearchProjectsD365PageModel
                {
                    CurrentPage = (int)pageNumber,
                    TotalPages  = totalPages,
                    Projects    = pageResults
                };

                var mappedPageResult = _searchProjectsMapper.Map(pageResult);
                return(new RepositoryResult <SearchProjectsPageModel> {
                    Result = mappedPageResult
                });
            }

            //At this point, log the error and configure the repository result to inform the caller that the repo failed
            _logger.LogError(RepositoryErrorMessages.RepositoryErrorLogFormat, responseStatusCode, responseContent);

            return(new RepositoryResult <SearchProjectsPageModel>
            {
                Error = new RepositoryResultBase.RepositoryError
                {
                    StatusCode = responseStatusCode,
                    ErrorMessage = responseContent
                }
            });
        }