Exemple #1
0
        public ProjectQuery(IUnitOfWork uow)
        {
            Field <ProjectGraphType>(
                "project",
                arguments: new QueryArguments(
                    new QueryArgument <IntGraphType> {
                Name = "id", Description = "Project Id"
            }
                    ),
                resolve: context =>
            {
                long id = context.GetArgument <long>("id");
                return(uow.GetRepository <ProjectModel>().Get(x => x.Id == id));
            });

            Field <ListGraphType <ProjectGraphType> >(
                "projects",
                arguments: new QueryArguments(
                    new QueryArgument <IntGraphType> {
                Name = "status", Description = "Project Status"
            }
                    ),
                resolve: context =>
            {
                ProjectStatusEnum status = context.GetArgument <ProjectStatusEnum>("status");
                return(uow.GetRepository <ProjectModel>().GetAll(x => x.Status == status));
            });
        }
        public ProjectQuery()
        {
            Field <ProjectGraphType>(
                "project",
                arguments: new QueryArguments(
                    new QueryArgument <IntGraphType> {
                Name = "id", Description = "Project Id"
            }
                    ),
                resolve: context =>
            {
                long id                = context.GetArgument <long>("id");
                var client             = new RestClient($"http://localhost:8022/{id}");
                var request            = new RestRequest(Method.GET);
                IRestResponse response = client.Execute(request);
                return(JsonConvert.DeserializeObject <ProjectModel>(response.Content));
            });

            Field <ListGraphType <ProjectGraphType> >(
                "projects",
                arguments: new QueryArguments(
                    new QueryArgument <IntGraphType> {
                Name = "status", Description = "Project Status"
            }
                    ),
                resolve: context =>
            {
                ProjectStatusEnum status = context.GetArgument <ProjectStatusEnum>("status");
                return(null);
            });
        }
Exemple #3
0
        private static string BuildFetchXMLQuery(string search, ProjectStatusEnum status, bool isAscending)
        {
            var orderDirection = isAscending ? "" : "descending='true'";
            var fetchXml       = new StringBuilder();

            fetchXml.AppendLine("<fetch distinct='true' mapping='logical' output-format='xml-platform' version='1.0'>");
            fetchXml.AppendLine("<entity name='sip_academytransfersproject'>");

            fetchXml.AppendLine("<attribute name='sip_academytransfersprojectid'/>");
            fetchXml.AppendLine("<attribute name='sip_projectname'/>");
            fetchXml.AppendLine("<attribute name='sip_projectinitiatorfullname'/>");
            fetchXml.AppendLine("<attribute name='sip_projectinitiatoruniqueid'/>");
            fetchXml.AppendLine("<attribute name='sip_projectstatus'/>");

            fetchXml.AppendLine(
                "   <link-entity name='sip_academytransfersprojectacademy' from='sip_atprojectid' to='sip_academytransfersprojectid' link-type='outer' alias='projectAcademy'>");
            fetchXml.AppendLine("   <attribute name='sip_academytransfersprojectacademyid'/>");
            fetchXml.AppendLine(
                "       <link-entity name='account' from='accountid' to='sip_academyid' link-type='outer' alias='academy'>");
            fetchXml.AppendLine("       <attribute name='name'/> ");
            fetchXml.AppendLine(
                "           <link-entity name='account' from='accountid' to='parentaccountid' link-type='outer' alias='academyTrust'>");
            fetchXml.AppendLine("               <attribute name='name'/> ");
            fetchXml.AppendLine("               <attribute name='sip_companieshousenumber'/> ");
            fetchXml.AppendLine("           </link-entity>");
            fetchXml.AppendLine("       </link-entity>");
            fetchXml.AppendLine("   </link-entity>");

            if (status != default)
            {
                fetchXml.AppendLine("<filter type='or'>");
                fetchXml.AppendLine(
                    $"   <condition attribute = 'sip_projectstatus' operator='eq' value='{(int) status}' />");
                fetchXml.AppendLine("</filter >");
            }

            if (!string.IsNullOrEmpty(search))
            {
                fetchXml.AppendLine("<filter type='or'>");
                fetchXml.AppendLine(
                    $"   <condition entityname='academy' attribute = 'name' operator='like' value='%{search}%' />");
                fetchXml.AppendLine(
                    $"   <condition entityname='academyTrust' attribute = 'name' operator='like' value='%{search}%' />");
                fetchXml.AppendLine(
                    $"   <condition entityname='academyTrust' attribute = 'sip_companieshousenumber' operator='like' value='%{search}%' />");
                fetchXml.AppendLine(
                    $"   <condition attribute = 'sip_projectname' operator='like' value='%{search}%' />");
                fetchXml.AppendLine("</filter >");
            }

            fetchXml.AppendLine($"<order attribute='sip_projectname' {orderDirection} />");

            fetchXml.AppendLine("</entity>");
            fetchXml.AppendLine("</fetch>");
            return(fetchXml.ToString());
        }
 public ProjectStatus(ProjectStatusEnum id, string description)
 {
     this.Id          = id;
     this.Description = description;
 }
Exemple #5
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
                }
            });
        }
        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
                }
            });
        }