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); }); }
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; }
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 } }); }