From d55d1cac03ea1a7ceec055c4fd942865a05f86d0 Mon Sep 17 00:00:00 2001 From: bZverok <137277669+bZverok@users.noreply.github.com> Date: Fri, 13 Sep 2024 15:55:55 +0300 Subject: [PATCH] added assignee dynamic inputs (#12) --- Apps.Crowdin/Actions/TaskActions.cs | 6 +-- Apps.Crowdin/Apps.Crowdin.csproj | 2 +- .../ProjectMemberDataSourceHandler.cs | 51 +++++++++++++++++++ .../Models/Entities/AssigneeEntity.cs | 11 ++++ .../Models/Request/AssigneesRequest.cs | 15 ++++++ .../Models/Request/Task/AddNewTaskRequest.cs | 3 -- Apps.Crowdin/Utils/Paginator.cs | 4 +- 7 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 Apps.Crowdin/DataSourceHandlers/ProjectMemberDataSourceHandler.cs create mode 100644 Apps.Crowdin/Models/Entities/AssigneeEntity.cs create mode 100644 Apps.Crowdin/Models/Request/AssigneesRequest.cs diff --git a/Apps.Crowdin/Actions/TaskActions.cs b/Apps.Crowdin/Actions/TaskActions.cs index ff6eb1a..79a0319 100644 --- a/Apps.Crowdin/Actions/TaskActions.cs +++ b/Apps.Crowdin/Actions/TaskActions.cs @@ -14,7 +14,7 @@ using Blackbird.Applications.Sdk.Utils.Utilities; using Crowdin.Api.Tasks; using TaskStatus = Crowdin.Api.Tasks.TaskStatus; -using System.IO; +using Apps.Crowdin.Models.Request; namespace Apps.Crowdin.Actions; @@ -63,7 +63,7 @@ [ActionParameter] [Display("Task ID")] string taskId) [Action("Add task", Description = "Add new task")] public async Task AddTask( - [ActionParameter] ProjectRequest project, + [ActionParameter] AssigneesRequest project, [ActionParameter] AddNewTaskRequest input) { var vendorTaskTypes = new[] { "TranslateByVendor", "ProofreadByVendor" }; @@ -88,7 +88,7 @@ public async Task AddTask( SkipAssignedStrings = input.SkipAssignedStrings, SkipUntranslatedStrings = input.SkipUntranslatedStrings, LabelIds = input.LabelIds?.Select(labelId => IntParser.Parse(labelId, nameof(labelId))!.Value).ToList(), - Assignees = input.Assignees?.Select(assigneeId => new TaskAssigneeForm { Id = IntParser.Parse(assigneeId, nameof(assigneeId))!.Value }).ToList(), + Assignees = project.Assignees?.Select(assigneeId => new TaskAssigneeForm { Id = IntParser.Parse(assigneeId, nameof(assigneeId))!.Value }).ToList(), DeadLine = input.Deadline, DateFrom = input.DateFrom, DateTo = input.DateTo, diff --git a/Apps.Crowdin/Apps.Crowdin.csproj b/Apps.Crowdin/Apps.Crowdin.csproj index acdee18..0e254d7 100644 --- a/Apps.Crowdin/Apps.Crowdin.csproj +++ b/Apps.Crowdin/Apps.Crowdin.csproj @@ -5,7 +5,7 @@ enable Crowdin Cloud-based solution that streamlines localization management - 1.0.8 + 1.0.9 Apps.Crowdin diff --git a/Apps.Crowdin/DataSourceHandlers/ProjectMemberDataSourceHandler.cs b/Apps.Crowdin/DataSourceHandlers/ProjectMemberDataSourceHandler.cs new file mode 100644 index 0000000..63eaa3c --- /dev/null +++ b/Apps.Crowdin/DataSourceHandlers/ProjectMemberDataSourceHandler.cs @@ -0,0 +1,51 @@ +using Apps.Crowdin.Api.RestSharp; +using Apps.Crowdin.Models.Entities; +using Apps.Crowdin.Models.Request; +using Apps.Crowdin.Models.Response; +using Apps.Crowdin.Utils; +using Blackbird.Applications.Sdk.Common; +using Blackbird.Applications.Sdk.Common.Authentication; +using Blackbird.Applications.Sdk.Common.Dynamic; +using Blackbird.Applications.Sdk.Common.Invocation; +using Crowdin.Api; +using Newtonsoft.Json; +using RestSharp; + +namespace Apps.Crowdin.DataSourceHandlers; + +public class ProjectMemberDataSourceHandler( + InvocationContext invocationContext, + [ActionParameter] AssigneesRequest assigneesRequest) + : BaseInvocable(invocationContext), IAsyncDataSourceHandler +{ + private AuthenticationCredentialsProvider[] Creds => + InvocationContext.AuthenticationCredentialsProviders.ToArray(); + + public async Task> GetDataAsync(DataSourceContext context, + CancellationToken cancellationToken) + { + if (string.IsNullOrEmpty(assigneesRequest.ProjectId)) + throw new("You should input Project ID first"); + + var client = new CrowdinRestClient(); + + var items = await Paginator.Paginate(async (lim, offset) + => + { + var request = + new CrowdinRestRequest( + $"/projects/{assigneesRequest.ProjectId}/members?limit={lim}&offset={offset}", + Method.Get, Creds); + var response = await client.ExecuteAsync(request, cancellationToken: cancellationToken); + return JsonConvert.DeserializeObject>>(response.Content); + }); + + return items + .Select(x => x.Data) + .Where(x => context.SearchString == null || + x.FullName.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase)) + .OrderByDescending(x => x.GivenAccessAt) + .Take(20) + .ToDictionary(x => x.Id.ToString(), x => x.FullName); + } +} \ No newline at end of file diff --git a/Apps.Crowdin/Models/Entities/AssigneeEntity.cs b/Apps.Crowdin/Models/Entities/AssigneeEntity.cs new file mode 100644 index 0000000..83e5bf9 --- /dev/null +++ b/Apps.Crowdin/Models/Entities/AssigneeEntity.cs @@ -0,0 +1,11 @@ +namespace Apps.Crowdin.Models.Entities; + +public class AssigneeEntity +{ + public string Id { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string Username { get; set; } + public DateTime? GivenAccessAt { get; set; } + public string FullName => string.IsNullOrWhiteSpace(FirstName) ? Username : $"{FirstName} {LastName}"; +} \ No newline at end of file diff --git a/Apps.Crowdin/Models/Request/AssigneesRequest.cs b/Apps.Crowdin/Models/Request/AssigneesRequest.cs new file mode 100644 index 0000000..8b483ea --- /dev/null +++ b/Apps.Crowdin/Models/Request/AssigneesRequest.cs @@ -0,0 +1,15 @@ +using Apps.Crowdin.DataSourceHandlers; +using Blackbird.Applications.Sdk.Common; +using Blackbird.Applications.Sdk.Common.Dynamic; + +namespace Apps.Crowdin.Models.Request; + +public class AssigneesRequest +{ + [Display("Project")] + [DataSource(typeof(ProjectDataHandler))] + public string ProjectId { get; set; } + + [Display("Assignee IDs"), DataSource(typeof(ProjectMemberDataSourceHandler))] + public IEnumerable? Assignees { get; set; } +} \ No newline at end of file diff --git a/Apps.Crowdin/Models/Request/Task/AddNewTaskRequest.cs b/Apps.Crowdin/Models/Request/Task/AddNewTaskRequest.cs index ba10655..0e47895 100644 --- a/Apps.Crowdin/Models/Request/Task/AddNewTaskRequest.cs +++ b/Apps.Crowdin/Models/Request/Task/AddNewTaskRequest.cs @@ -43,9 +43,6 @@ public class AddNewTaskRequest [Display("Label IDs")] public IEnumerable? LabelIds { get; set; } - [Display("Assignee IDs")] - public IEnumerable? Assignees { get; set; } - public DateTime? Deadline { get; set; } [Display("Date from")] diff --git a/Apps.Crowdin/Utils/Paginator.cs b/Apps.Crowdin/Utils/Paginator.cs index 627cb39..ea9bad9 100644 --- a/Apps.Crowdin/Utils/Paginator.cs +++ b/Apps.Crowdin/Utils/Paginator.cs @@ -17,8 +17,8 @@ public static async Task> Paginate(Func