diff --git a/Apps.Crowdin/Actions/TaskActions.cs b/Apps.Crowdin/Actions/TaskActions.cs index 79a0319..cee6f73 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 Apps.Crowdin.Models.Request; +using Apps.Crowdin.Models.Request.Users; namespace Apps.Crowdin.Actions; diff --git a/Apps.Crowdin/Actions/TranslationActions.cs b/Apps.Crowdin/Actions/TranslationActions.cs index 2250c1b..dcf9dc6 100644 --- a/Apps.Crowdin/Actions/TranslationActions.cs +++ b/Apps.Crowdin/Actions/TranslationActions.cs @@ -15,7 +15,7 @@ using Crowdin.Api.StringTranslations; using Crowdin.Api.Translations; using RestSharp; -using Apps.Crowdin.Models.Request; +using Apps.Crowdin.Models.Request.Users; namespace Apps.Crowdin.Actions; diff --git a/Apps.Crowdin/Actions/UserActions.cs b/Apps.Crowdin/Actions/UserActions.cs new file mode 100644 index 0000000..c0a6a44 --- /dev/null +++ b/Apps.Crowdin/Actions/UserActions.cs @@ -0,0 +1,59 @@ + + +using Blackbird.Applications.Sdk.Common.Authentication; +using Blackbird.Applications.Sdk.Common.Invocation; +using Blackbird.Applications.Sdk.Common; +using Apps.Crowdin.Api; +using Apps.Crowdin.Models.Entities; +using Apps.Crowdin.Models.Request.Task; +using Apps.Crowdin.Models.Response.Task; +using Apps.Crowdin.Utils; +using Blackbird.Applications.Sdk.Common.Actions; +using Blackbird.Applications.Sdk.Utils.Parsers; +using Apps.Crowdin.Api.RestSharp; +using Apps.Crowdin.Models.Request.Users; +using Apps.Crowdin.Models.Response; +using Crowdin.Api; +using Newtonsoft.Json; +using RestSharp; +using System.Threading; +using Apps.Crowdin.Models.Response.Project; +using System.Linq; + +namespace Apps.Crowdin.Actions +{ + public class UserActions : BaseInvocable + { + private AuthenticationCredentialsProvider[] Creds => + InvocationContext.AuthenticationCredentialsProviders.ToArray(); + + public UserActions(InvocationContext invocationContext) : base(invocationContext) + { + } + + [Action("Search users in project", Description = "Returns all matching project members")] + public async Task SearchProjectUsers([ActionParameter] SearchUsersRequest input) + { + + var client = new CrowdinRestClient(); + var items = await Paginator.Paginate(async (lim, offset) + => + { + var request = + new CrowdinRestRequest( + $"/projects/{input.ProjectId}/members?limit={lim}&offset={offset}", + Method.Get, Creds); + request.AddQueryParameter("role", input.Role); + if (input.LanguageId != null) + { request.AddQueryParameter("languageId", input.LanguageId); } + var response = await client.ExecuteAsync(request); + return JsonConvert.DeserializeObject>>(response.Content); + }); + + + var users = items.Select(x => new AssigneeEntity(x)).ToArray(); + return new(users); + } + + } +} diff --git a/Apps.Crowdin/Apps.Crowdin.csproj b/Apps.Crowdin/Apps.Crowdin.csproj index fb0c302..31b92be 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.10 + 1.0.11 Apps.Crowdin diff --git a/Apps.Crowdin/DataSourceHandlers/AiPromptIdDataHandler.cs b/Apps.Crowdin/DataSourceHandlers/AiPromptIdDataHandler.cs index c97b7e7..2871d5a 100644 --- a/Apps.Crowdin/DataSourceHandlers/AiPromptIdDataHandler.cs +++ b/Apps.Crowdin/DataSourceHandlers/AiPromptIdDataHandler.cs @@ -1,7 +1,7 @@ using Apps.Crowdin.Api.RestSharp; using Apps.Crowdin.Models.Entities; -using Apps.Crowdin.Models.Request; using Apps.Crowdin.Models.Request.Project; +using Apps.Crowdin.Models.Request.Users; using Apps.Crowdin.Models.Response; using Apps.Crowdin.Utils; using Blackbird.Applications.Sdk.Common; diff --git a/Apps.Crowdin/DataSourceHandlers/EnumHandlers/UserRoleHandler.cs b/Apps.Crowdin/DataSourceHandlers/EnumHandlers/UserRoleHandler.cs new file mode 100644 index 0000000..a5abaeb --- /dev/null +++ b/Apps.Crowdin/DataSourceHandlers/EnumHandlers/UserRoleHandler.cs @@ -0,0 +1,18 @@ +using Blackbird.Applications.Sdk.Common.Dictionaries; + +namespace Apps.Crowdin.DataSourceHandlers.EnumHandlers; + +public class UserRoleHandler : IStaticDataSourceHandler +{ + public Dictionary GetData() => new() + { + {"all", "All"}, + {"manager", "Manager"}, + {"developer", "Developer"}, + {"language_coordinator", "Language Coordinator"}, + {"proofreader", "Proofreader"}, + {"translator", "Translator"}, + {"blocked", "Blocked"}, + {"pending", "Pending"} + }; +} \ No newline at end of file diff --git a/Apps.Crowdin/DataSourceHandlers/ProjectMemberDataSourceHandler.cs b/Apps.Crowdin/DataSourceHandlers/ProjectMemberDataSourceHandler.cs index 63eaa3c..155351e 100644 --- a/Apps.Crowdin/DataSourceHandlers/ProjectMemberDataSourceHandler.cs +++ b/Apps.Crowdin/DataSourceHandlers/ProjectMemberDataSourceHandler.cs @@ -1,6 +1,6 @@ using Apps.Crowdin.Api.RestSharp; using Apps.Crowdin.Models.Entities; -using Apps.Crowdin.Models.Request; +using Apps.Crowdin.Models.Request.Users; using Apps.Crowdin.Models.Response; using Apps.Crowdin.Utils; using Blackbird.Applications.Sdk.Common; diff --git a/Apps.Crowdin/Models/Entities/AssigneeEntity.cs b/Apps.Crowdin/Models/Entities/AssigneEntity.cs similarity index 69% rename from Apps.Crowdin/Models/Entities/AssigneeEntity.cs rename to Apps.Crowdin/Models/Entities/AssigneEntity.cs index 83e5bf9..30b8976 100644 --- a/Apps.Crowdin/Models/Entities/AssigneeEntity.cs +++ b/Apps.Crowdin/Models/Entities/AssigneEntity.cs @@ -1,7 +1,16 @@ +using Apps.Crowdin.Models.Response; + namespace Apps.Crowdin.Models.Entities; public class AssigneeEntity { + private DataResponse x; + + public AssigneeEntity(DataResponse x) + { + this.x = x; + } + public string Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } diff --git a/Apps.Crowdin/Models/Request/Task/AddNewTaskRequest.cs b/Apps.Crowdin/Models/Request/Task/AddNewTaskRequest.cs index 0e47895..365eefd 100644 --- a/Apps.Crowdin/Models/Request/Task/AddNewTaskRequest.cs +++ b/Apps.Crowdin/Models/Request/Task/AddNewTaskRequest.cs @@ -10,7 +10,7 @@ public class AddNewTaskRequest { public string Title { get; set; } - [Display("Language")] + [Display("Language ID")] [DataSource(typeof(LanguagesDataHandler))] public string LanguageId { get; set; } diff --git a/Apps.Crowdin/Models/Request/Task/ListTasksRequest.cs b/Apps.Crowdin/Models/Request/Task/ListTasksRequest.cs index c536777..fc7199e 100644 --- a/Apps.Crowdin/Models/Request/Task/ListTasksRequest.cs +++ b/Apps.Crowdin/Models/Request/Task/ListTasksRequest.cs @@ -1,7 +1,9 @@ -using Apps.Crowdin.DataSourceHandlers.EnumHandlers; +using Apps.Crowdin.DataSourceHandlers; +using Apps.Crowdin.DataSourceHandlers.EnumHandlers; using Apps.Crowdin.Models.Request.Project; using Blackbird.Applications.Sdk.Common; using Blackbird.Applications.Sdk.Common.Dictionaries; +using Blackbird.Applications.Sdk.Common.Dynamic; namespace Apps.Crowdin.Models.Request.Task; @@ -9,7 +11,8 @@ public class ListTasksRequest : ProjectRequest { [StaticDataSource(typeof(TaskStatusHandler))] public string? Status { get; set; } - + + [DataSource(typeof(ProjectMemberDataSourceHandler))] [Display("Assignee ID")] public string? AssigneeId { get; set; } } \ No newline at end of file diff --git a/Apps.Crowdin/Models/Request/UserRequest.cs b/Apps.Crowdin/Models/Request/UserRequest.cs deleted file mode 100644 index c458059..0000000 --- a/Apps.Crowdin/Models/Request/UserRequest.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Blackbird.Applications.Sdk.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Apps.Crowdin.Models.Request -{ - public class UserRequest - { - [Display("User ID")] - public string? UserId { get; set; } - } -} diff --git a/Apps.Crowdin/Models/Request/AssigneesRequest.cs b/Apps.Crowdin/Models/Request/Users/AssigneesRequest.cs similarity index 90% rename from Apps.Crowdin/Models/Request/AssigneesRequest.cs rename to Apps.Crowdin/Models/Request/Users/AssigneesRequest.cs index 8b483ea..c5e918f 100644 --- a/Apps.Crowdin/Models/Request/AssigneesRequest.cs +++ b/Apps.Crowdin/Models/Request/Users/AssigneesRequest.cs @@ -2,14 +2,14 @@ using Blackbird.Applications.Sdk.Common; using Blackbird.Applications.Sdk.Common.Dynamic; -namespace Apps.Crowdin.Models.Request; +namespace Apps.Crowdin.Models.Request.Users; 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/Users/SearchUsersRequest.cs b/Apps.Crowdin/Models/Request/Users/SearchUsersRequest.cs new file mode 100644 index 0000000..bb44bc5 --- /dev/null +++ b/Apps.Crowdin/Models/Request/Users/SearchUsersRequest.cs @@ -0,0 +1,23 @@ +using Apps.Crowdin.DataSourceHandlers; +using Apps.Crowdin.DataSourceHandlers.EnumHandlers; +using Blackbird.Applications.Sdk.Common; +using Blackbird.Applications.Sdk.Common.Dictionaries; +using Blackbird.Applications.Sdk.Common.Dynamic; + +namespace Apps.Crowdin.Models.Request.Users +{ + public class SearchUsersRequest + { + [Display("Project")] + [DataSource(typeof(ProjectDataHandler))] + public string ProjectId { get; set; } + + [Display("Language ID")] + [DataSource(typeof(LanguagesDataHandler))] + public string? LanguageId { get; set; } + + [StaticDataSource(typeof(UserRoleHandler))] + public string Role { get; set; } + + } +} diff --git a/Apps.Crowdin/Models/Request/Users/UserRequest.cs b/Apps.Crowdin/Models/Request/Users/UserRequest.cs new file mode 100644 index 0000000..22cb64f --- /dev/null +++ b/Apps.Crowdin/Models/Request/Users/UserRequest.cs @@ -0,0 +1,13 @@ +using Apps.Crowdin.DataSourceHandlers; +using Blackbird.Applications.Sdk.Common; +using Blackbird.Applications.Sdk.Common.Dynamic; + +namespace Apps.Crowdin.Models.Request.Users +{ + public class UserRequest + { + [Display("User ID")] + [DataSource(typeof(ProjectMemberDataSourceHandler))] + public string? UserId { get; set; } + } +} diff --git a/Apps.Crowdin/Models/Response/Users/SearchUsersResponse.cs b/Apps.Crowdin/Models/Response/Users/SearchUsersResponse.cs new file mode 100644 index 0000000..27c32c1 --- /dev/null +++ b/Apps.Crowdin/Models/Response/Users/SearchUsersResponse.cs @@ -0,0 +1,3 @@ +namespace Apps.Crowdin.Models.Response.Project; + +public record SearchUsersResponse(Entities.AssigneeEntity[] Users); \ No newline at end of file