From 8c6f295d669b6a33c065cb51e266a365e15012c8 Mon Sep 17 00:00:00 2001 From: mathijs-bb Date: Thu, 16 May 2024 11:02:36 +0200 Subject: [PATCH] Performance boost --- Apps.BWX/Actions/GlossaryActions.cs | 10 +++--- Apps.BWX/Actions/ProjectActions.cs | 16 +++++----- Apps.BWX/Api/BWXClient.cs | 32 +++++++++++++++++-- Apps.BWX/Api/BWXRequest.cs | 29 ----------------- Apps.BWX/Apps.BWX.csproj | 2 +- Apps.BWX/Connections/ConnectionPingChecker.cs | 4 +-- .../DataSourceHandlers/ClientDataHandler.cs | 10 +++--- .../DataSourceHandlers/GlossaryDataHandler.cs | 10 +++--- .../DataSourceHandlers/LanguageDataHandler.cs | 2 +- .../OrganizationDataHandler.cs | 10 +++--- .../DataSourceHandlers/ProjectDataHandler.cs | 11 +++---- .../ProjectManagerDataHandler.cs | 12 +++---- .../ProjectResourcesDataHandler.cs | 2 +- .../DataSourceHandlers/UserDataHandler.cs | 11 +++---- Apps.BWX/Invocables/BWXInvocable.cs | 2 +- 15 files changed, 76 insertions(+), 87 deletions(-) delete mode 100644 Apps.BWX/Api/BWXRequest.cs diff --git a/Apps.BWX/Actions/GlossaryActions.cs b/Apps.BWX/Actions/GlossaryActions.cs index 8296b19..0072962 100644 --- a/Apps.BWX/Actions/GlossaryActions.cs +++ b/Apps.BWX/Actions/GlossaryActions.cs @@ -29,7 +29,7 @@ public GlossaryActions(InvocationContext invocationContext, IFileManagementClien public async Task CreateGlossary( [ActionParameter] CreateGlossaryRequest input) { - var request = new BWXRequest($"/api/v3/glossary", Method.Post, Creds); + var request = new RestRequest($"/api/v3/glossary", Method.Post); request.AddJsonBody(new { name = input.Name, @@ -49,10 +49,10 @@ public async Task CreateGlossary( [Action("Export glossary", Description = "Export glossary")] public async Task ExportGlossary([ActionParameter] ExportGlossaryRequest input) { - var initExportRequest = new BWXRequest($"/api/v3/glossary/export/{input.GlossaryId}/tbx", Method.Get, Creds); + var initExportRequest = new RestRequest($"/api/v3/glossary/export/{input.GlossaryId}/tbx", Method.Get); var initExportResult = await Client.ExecuteWithErrorHandling(initExportRequest); - var exportStatusRequest = new BWXRequest($"/api/v3/glossary/export/{input.GlossaryId}/tbx/{initExportResult.RequestUuid}/status", Method.Get, Creds); + var exportStatusRequest = new RestRequest($"/api/v3/glossary/export/{input.GlossaryId}/tbx/{initExportResult.RequestUuid}/status", Method.Get); var exportStatusResult = await Client.ExecuteWithErrorHandling(exportStatusRequest); while(exportStatusResult.Status != "COMPLETED") { @@ -76,7 +76,7 @@ public async Task ImportGlossary([ActionParameter] ImportGlossaryRequest input) var fileStream = await _fileManagementClient.DownloadAsync(input.File); var fileTBXV2Stream = await fileStream.ConvertFromTbxV3ToV2(); - var initImportRequest = new BWXRequest($"/api/v3/glossary/{input.GlossaryId}/import-tbx", Method.Post, Creds); + var initImportRequest = new RestRequest($"/api/v3/glossary/{input.GlossaryId}/import-tbx", Method.Post); initImportRequest.AddFile("tbxFile", await fileTBXV2Stream.GetByteData(), input.File.Name); await Client.ExecuteWithErrorHandling(initImportRequest); @@ -84,7 +84,7 @@ public async Task ImportGlossary([ActionParameter] ImportGlossaryRequest input) private async Task GetGlossary([ActionParameter] ExportGlossaryRequest input) { - var request = new BWXRequest($"/api/v3/glossary/{input.GlossaryId}", Method.Get, Creds); + var request = new RestRequest($"/api/v3/glossary/{input.GlossaryId}", Method.Get); return await Client.ExecuteWithErrorHandling(request); } } diff --git a/Apps.BWX/Actions/ProjectActions.cs b/Apps.BWX/Actions/ProjectActions.cs index 558e3ba..06a934b 100644 --- a/Apps.BWX/Actions/ProjectActions.cs +++ b/Apps.BWX/Actions/ProjectActions.cs @@ -33,7 +33,7 @@ public ProjectActions(InvocationContext invocationContext, IFileManagementClient [Action("Search projects", Description = "Search projects")] public async Task> SearchProjects([ActionParameter] SearchProjectRequest searchProjects) { - var request = new BWXRequest($"/api/v3/project", Method.Get, Creds); + var request = new RestRequest($"/api/v3/project", Method.Get); request.AddQueryParameter("name", searchProjects?.ProjectName); request.AddQueryParameter("organizationUuid", searchProjects?.Organization); request.AddQueryParameter("orgUnitUuid", searchProjects?.Client); @@ -59,14 +59,14 @@ public async Task> SearchProjects([ActionParameter] SearchProje [Action("Get project", Description = "Get project")] public async Task GetProject([ActionParameter] GetProjectRequest input) { - var request = new BWXRequest($"/api/v3/project/{input.ProjectId}", Method.Get, Creds); + var request = new RestRequest($"/api/v3/project/{input.ProjectId}", Method.Get); return await Client.ExecuteWithErrorHandling(request); } [Action("Create project", Description = "Create project")] public async Task CreateProject([ActionParameter] CreateProjectRequest input) { - var request = new BWXRequest($"/api/v3/project?inferDefaultSettings={input?.InferDefaultSettings?.ToString().ToLower() ?? "true"}", Method.Post, Creds); + var request = new RestRequest($"/api/v3/project?inferDefaultSettings={input?.InferDefaultSettings?.ToString().ToLower() ?? "true"}", Method.Post); request.AddJsonBody(new { reference = input.Reference, @@ -84,7 +84,7 @@ public async Task UploadFileToProject( [ActionParameter] GetProjectRequest getProjectRequest, [ActionParameter] UploadFileRequest uploadFileRequest) { - var request = new BWXRequest($"/api/v3/project/{getProjectRequest.ProjectId}/resource", Method.Post, Creds); + var request = new RestRequest($"/api/v3/project/{getProjectRequest.ProjectId}/resource", Method.Post); request.AddJsonBody(new { name = uploadFileRequest?.FileName ?? uploadFileRequest.File.Name, @@ -93,13 +93,13 @@ public async Task UploadFileToProject( }); var projectFileInfoDto = await Client.ExecuteWithErrorHandling(request); - var uploadRequest = new BWXRequest($"/api/v3/project/{getProjectRequest.ProjectId}/resource/{projectFileInfoDto.Uuid}/content", Method.Put, Creds); + var uploadRequest = new RestRequest($"/api/v3/project/{getProjectRequest.ProjectId}/resource/{projectFileInfoDto.Uuid}/content", Method.Put); var fileBytes = await (await _fileManagementClient.DownloadAsync(uploadFileRequest.File)).GetByteData(); uploadRequest.AlwaysMultipartFormData = true; uploadRequest.AddFile("file", fileBytes, uploadFileRequest.File.Name); await Client.ExecuteWithErrorHandling(uploadRequest); - var createWorkUnitRequest = new BWXRequest($"/api/v3/project/{getProjectRequest.ProjectId}/work-unit?bulk=true", Method.Post, Creds); + var createWorkUnitRequest = new RestRequest($"/api/v3/project/{getProjectRequest.ProjectId}/work-unit?bulk=true", Method.Post); createWorkUnitRequest.AddJsonBody(JsonConvert.SerializeObject( new List() { new WorkUnitCreateDto() @@ -117,7 +117,7 @@ public async Task ChangeProjectStatus( [ActionParameter] GetProjectRequest getProjectRequest, [ActionParameter] ChangeProjectStatusRequest changeProjectStatusRequest) { - var request = new BWXRequest($"/api/v3/project/{getProjectRequest.ProjectId}/status", Method.Post, Creds); + var request = new RestRequest($"/api/v3/project/{getProjectRequest.ProjectId}/status", Method.Post); request.AddJsonBody(new { newStatus = changeProjectStatusRequest.ProjectStatus, @@ -131,7 +131,7 @@ public async Task DownloadTranslatedFiles( [ActionParameter] GetProjectRequest getProjectRequest, [ActionParameter] DownloadTranslatedFilesRequest downloadTranslatedFilesRequest) { - var request = new BWXRequest($"/api/v3/project/{getProjectRequest.ProjectId}/download", Method.Get, Creds); + var request = new RestRequest($"/api/v3/project/{getProjectRequest.ProjectId}/download", Method.Get); if (downloadTranslatedFilesRequest.Resources != null && downloadTranslatedFilesRequest.Resources.Any()) foreach (var resourceId in downloadTranslatedFilesRequest.Resources) diff --git a/Apps.BWX/Api/BWXClient.cs b/Apps.BWX/Api/BWXClient.cs index e45549d..a8db518 100644 --- a/Apps.BWX/Api/BWXClient.cs +++ b/Apps.BWX/Api/BWXClient.cs @@ -1,18 +1,34 @@ using Apps.BWX.Constants; using Apps.BWX.Models.Project.Responses; +using Blackbird.Applications.Sdk.Common.Authentication; +using DocumentFormat.OpenXml.Spreadsheet; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RestSharp; +using System.Net.Sockets; namespace Apps.BWX.Api; public class BWXClient : RestClient { - public BWXClient() : base(new RestClientOptions() + protected string AuthToken { get; set; } + public BWXClient(IEnumerable creds) : base(new RestClientOptions() { BaseUrl = new(Urls.Api) }) { + var token = creds.First(x => x.KeyName == "accessKey").Value; + var secret = creds.First(x => x.KeyName == "secret").Value; + + var restClient = new RestClient(Urls.Api); + var restRequest = new RestRequest(Urls.TokenUrl, Method.Post); + restRequest.AddBody(new + { + accessKey = token, + secret = secret + }); + var result = restClient.Execute(restRequest); + AuthToken = result.Headers.FirstOrDefault(x => x.Name == "X-AUTH-TOKEN").Value.ToString(); } public async Task ExecuteWithErrorHandling(RestRequest request) @@ -32,19 +48,29 @@ public async Task ExecuteWithErrorHandling(RestRequest request) public async Task ExecuteWithErrorHandling(RestRequest request) { + request.AddHeader("X-AUTH-TOKEN", AuthToken); var response = await ExecuteWithErrorHandling(request); return JsonConvert.DeserializeObject(response.Content!, JsonConfig.Settings)!; } + public async Task> PaginateOnce(RestRequest request) + { + request.AddQueryParameter("sort", "sortingByCreateDate"); + request.AddQueryParameter("size", 20); + request.AddQueryParameter("page", 0); + var response = await ExecuteWithErrorHandling>(request); + return response.Content; + } + public async Task> Paginate(RestRequest request) { var result = new List(); request.AddQueryParameter("sort", "sortingByCreateDate"); + request.AddQueryParameter("size", 50); int page = 0; bool last = false; do - { - request.AddQueryParameter("size", 20); + { request.AddQueryParameter("page", page); var response = await ExecuteWithErrorHandling>(request); result.AddRange(response.Content); diff --git a/Apps.BWX/Api/BWXRequest.cs b/Apps.BWX/Api/BWXRequest.cs deleted file mode 100644 index 2acf53e..0000000 --- a/Apps.BWX/Api/BWXRequest.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Apps.BWX.Constants; -using Blackbird.Applications.Sdk.Common.Authentication; -using RestSharp; - -namespace Apps.BWX.Api; - -public class BWXRequest : RestRequest -{ - public BWXRequest(string endpoint, Method method, IEnumerable creds) : base( - endpoint, method) - { - var token = creds.First(x => x.KeyName == "accessKey").Value; - var secret = creds.First(x => x.KeyName == "secret").Value; - this.AddHeader("X-AUTH-TOKEN", GetXAuthToken(token, secret)); - } - - private string GetXAuthToken(string accessKey, string secret) - { - var restClient = new RestClient(Urls.Api); - var restRequest = new RestRequest(Urls.TokenUrl, Method.Post); - restRequest.AddBody(new - { - accessKey = accessKey, - secret = secret - }); - var result = restClient.Execute(restRequest); - return result.Headers.FirstOrDefault(x => x.Name == "X-AUTH-TOKEN").Value.ToString(); - } -} \ No newline at end of file diff --git a/Apps.BWX/Apps.BWX.csproj b/Apps.BWX/Apps.BWX.csproj index edbf490..0dda11c 100644 --- a/Apps.BWX/Apps.BWX.csproj +++ b/Apps.BWX/Apps.BWX.csproj @@ -5,7 +5,7 @@ enable enable Bureau Works - 1.0.11 + 1.1.0 Bureau Works is cutting edge translation software that helps its users translate at greater speeds and with an increased sense of authorship. Apps.BWX diff --git a/Apps.BWX/Connections/ConnectionPingChecker.cs b/Apps.BWX/Connections/ConnectionPingChecker.cs index 68d2aef..64ee85f 100644 --- a/Apps.BWX/Connections/ConnectionPingChecker.cs +++ b/Apps.BWX/Connections/ConnectionPingChecker.cs @@ -10,8 +10,8 @@ public class ConnectionPingChecker : IConnectionValidator { public ValueTask ValidateConnection(IEnumerable authProviders, CancellationToken cancellationToken) { - var client = new BWXClient(); - var request = new BWXRequest("/api/v3/language", Method.Get, authProviders); + var client = new BWXClient(authProviders); + var request = new RestRequest("/api/v3/language", Method.Get); try { var result = client.ExecuteWithErrorHandling(request).Result; diff --git a/Apps.BWX/DataSourceHandlers/ClientDataHandler.cs b/Apps.BWX/DataSourceHandlers/ClientDataHandler.cs index 8fdccbb..2cc07c0 100644 --- a/Apps.BWX/DataSourceHandlers/ClientDataHandler.cs +++ b/Apps.BWX/DataSourceHandlers/ClientDataHandler.cs @@ -22,12 +22,10 @@ public ClientDataHandler(InvocationContext invocationContext) : base(invocationC public async Task> GetDataAsync(DataSourceContext context, CancellationToken token) { - var request = new BWXRequest($"/api/v3/client", Method.Get, Creds); - var languages = await Client.Paginate(request); + var request = new RestRequest($"/api/v3/client", Method.Get); + request.AddQueryParameter("name", context.SearchString); + var clients = await Client.PaginateOnce(request); - return languages.Where(el => - context.SearchString is null || - el.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase)) - .ToDictionary(k => k.Uuid, v => v.Name); + return clients.ToDictionary(k => k.Uuid, v => v.Name); } } \ No newline at end of file diff --git a/Apps.BWX/DataSourceHandlers/GlossaryDataHandler.cs b/Apps.BWX/DataSourceHandlers/GlossaryDataHandler.cs index 422734c..574a453 100644 --- a/Apps.BWX/DataSourceHandlers/GlossaryDataHandler.cs +++ b/Apps.BWX/DataSourceHandlers/GlossaryDataHandler.cs @@ -21,13 +21,11 @@ public GlossaryDataHandler(InvocationContext invocationContext) : base(invocatio public async Task> GetDataAsync(DataSourceContext context, CancellationToken token) { - var request = new BWXRequest($"/api/v3/glossary?name={context.SearchString}", Method.Get, Creds); - var glossaries = await Client.Paginate(request); + var request = new RestRequest($"/api/v3/glossary", Method.Get); + request.AddQueryParameter("name", context.SearchString); + var glossaries = await Client.PaginateOnce(request); - return glossaries.Where(el => - context.SearchString is null || - el.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase)) - .ToDictionary(k => k.Uuid, v => v.Name); + return glossaries.ToDictionary(k => k.Uuid, v => v.Name); } } } diff --git a/Apps.BWX/DataSourceHandlers/LanguageDataHandler.cs b/Apps.BWX/DataSourceHandlers/LanguageDataHandler.cs index ff72fa3..541a003 100644 --- a/Apps.BWX/DataSourceHandlers/LanguageDataHandler.cs +++ b/Apps.BWX/DataSourceHandlers/LanguageDataHandler.cs @@ -15,7 +15,7 @@ public LanguageDataHandler(InvocationContext invocationContext) : base(invocatio public async Task> GetDataAsync(DataSourceContext context, CancellationToken token) { - var request = new BWXRequest($"/api/v3/language", Method.Get, Creds); + var request = new RestRequest($"/api/v3/language", Method.Get); var languages = await Client.ExecuteWithErrorHandling>(request); return languages.Where(el => diff --git a/Apps.BWX/DataSourceHandlers/OrganizationDataHandler.cs b/Apps.BWX/DataSourceHandlers/OrganizationDataHandler.cs index 70602ae..9b7c951 100644 --- a/Apps.BWX/DataSourceHandlers/OrganizationDataHandler.cs +++ b/Apps.BWX/DataSourceHandlers/OrganizationDataHandler.cs @@ -22,12 +22,10 @@ public OrganizationDataHandler(InvocationContext invocationContext) : base(invoc public async Task> GetDataAsync(DataSourceContext context, CancellationToken token) { - var request = new BWXRequest($"/api/v2/organization", Method.Get, Creds); - var languages = await Client.Paginate(request); + var request = new RestRequest($"/api/v2/organization", Method.Get); + request.AddQueryParameter("name", context.SearchString); + var organizations = await Client.PaginateOnce(request); - return languages.Where(el => - context.SearchString is null || - el.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase)) - .ToDictionary(k => k.Uuid, v => v.Name); + return organizations.ToDictionary(k => k.Uuid, v => v.Name); } } \ No newline at end of file diff --git a/Apps.BWX/DataSourceHandlers/ProjectDataHandler.cs b/Apps.BWX/DataSourceHandlers/ProjectDataHandler.cs index 4b20937..e5b84cd 100644 --- a/Apps.BWX/DataSourceHandlers/ProjectDataHandler.cs +++ b/Apps.BWX/DataSourceHandlers/ProjectDataHandler.cs @@ -1,6 +1,7 @@ using Apps.BWX.Api; using Apps.BWX.Dtos; using Apps.BWX.Invocables; +using Apps.BWX.Models.Project.Responses; using Blackbird.Applications.Sdk.Common.Dynamic; using Blackbird.Applications.Sdk.Common.Invocation; using RestSharp; @@ -15,12 +16,10 @@ public ProjectDataHandler(InvocationContext invocationContext) : base(invocation public async Task> GetDataAsync(DataSourceContext context, CancellationToken token) { - var request = new BWXRequest($"/api/v3/project", Method.Get, Creds); - var projects = await Client.Paginate(request); + var request = new RestRequest($"/api/v3/project", Method.Get); + request.AddQueryParameter("reference", context.SearchString); + var projects = await Client.PaginateOnce(request); - return projects.Where(el => - context.SearchString is null || - el.Reference.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase)) - .ToDictionary(k => k.Uuid, v => $"{v.Reference} ({v.Name})"); + return projects.ToDictionary(k => k.Uuid, v => $"{v.Reference} ({v.Name})"); } } \ No newline at end of file diff --git a/Apps.BWX/DataSourceHandlers/ProjectManagerDataHandler.cs b/Apps.BWX/DataSourceHandlers/ProjectManagerDataHandler.cs index 4ec9142..36041d3 100644 --- a/Apps.BWX/DataSourceHandlers/ProjectManagerDataHandler.cs +++ b/Apps.BWX/DataSourceHandlers/ProjectManagerDataHandler.cs @@ -22,12 +22,12 @@ public ProjectManagerDataHandler(InvocationContext invocationContext) : base(inv public async Task> GetDataAsync(DataSourceContext context, CancellationToken token) { - var request = new BWXRequest($"/api/v3/user?simple=true&roles=PROJECT_MANAGER", Method.Get, Creds); - var projects = await Client.Paginate(request); + var request = new RestRequest($"/api/v3/user", Method.Get); + request.AddQueryParameter("roles", "PROJECT_MANAGER"); + request.AddQueryParameter("simple", "true"); + request.AddQueryParameter("name", context.SearchString); + var users = await Client.PaginateOnce(request); - return projects.Where(el => - context.SearchString is null || - el.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase)) - .ToDictionary(k => k.Uuid, v => v.Name); + return users.ToDictionary(k => k.Uuid, v => v.Name); } } \ No newline at end of file diff --git a/Apps.BWX/DataSourceHandlers/ProjectResourcesDataHandler.cs b/Apps.BWX/DataSourceHandlers/ProjectResourcesDataHandler.cs index 815fbdb..7f53ce5 100644 --- a/Apps.BWX/DataSourceHandlers/ProjectResourcesDataHandler.cs +++ b/Apps.BWX/DataSourceHandlers/ProjectResourcesDataHandler.cs @@ -28,7 +28,7 @@ public async Task> GetDataAsync(DataSourceContext con if (string.IsNullOrEmpty(ProjectRequest?.ProjectId)) throw new ArgumentException("Please select project first!"); - var request = new BWXRequest($"/api/v3/project/{ProjectRequest.ProjectId}/resource/simple", Method.Get, Creds); + var request = new RestRequest($"/api/v3/project/{ProjectRequest.ProjectId}/resource/simple", Method.Get); var projectResources = await Client.ExecuteWithErrorHandling>(request); return projectResources.Where(el => diff --git a/Apps.BWX/DataSourceHandlers/UserDataHandler.cs b/Apps.BWX/DataSourceHandlers/UserDataHandler.cs index 02c4433..33963ea 100644 --- a/Apps.BWX/DataSourceHandlers/UserDataHandler.cs +++ b/Apps.BWX/DataSourceHandlers/UserDataHandler.cs @@ -22,12 +22,11 @@ public UserDataHandler(InvocationContext invocationContext) : base(invocationCon public async Task> GetDataAsync(DataSourceContext context, CancellationToken token) { - var request = new BWXRequest($"/api/v3/user?simple=true", Method.Get, Creds); - var projects = await Client.Paginate(request); + var request = new RestRequest($"/api/v3/user", Method.Get); + request.AddQueryParameter("simple", "true"); + request.AddQueryParameter("name", context.SearchString); + var users = await Client.PaginateOnce(request); - return projects.Where(el => - context.SearchString is null || - el.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase)) - .ToDictionary(k => k.Uuid, v => v.Name); + return users.ToDictionary(k => k.Uuid, v => v.Name); } } \ No newline at end of file diff --git a/Apps.BWX/Invocables/BWXInvocable.cs b/Apps.BWX/Invocables/BWXInvocable.cs index b16fb2e..9ecb1cb 100644 --- a/Apps.BWX/Invocables/BWXInvocable.cs +++ b/Apps.BWX/Invocables/BWXInvocable.cs @@ -14,6 +14,6 @@ public class BWXInvocable : BaseInvocable public BWXInvocable(InvocationContext invocationContext) : base(invocationContext) { - Client = new(); + Client = new(Creds); } } \ No newline at end of file