Skip to content

Commit

Permalink
Files upload logic
Browse files Browse the repository at this point in the history
  • Loading branch information
bohdanm-bb committed Mar 21, 2024
1 parent 72a4900 commit 7ab4f25
Show file tree
Hide file tree
Showing 15 changed files with 389 additions and 23 deletions.
72 changes: 66 additions & 6 deletions Apps.BWX/Actions/ProjectActions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,57 @@
using Apps.BWX.Dtos;
using Apps.BWX.Extensions;
using Apps.BWX.Invocables;
using Apps.BWX.Models.Requests.Channel;
using Apps.BWX.Models.Requests.Project;
using Blackbird.Applications.Sdk.Common;
using Blackbird.Applications.Sdk.Common.Actions;
using Blackbird.Applications.Sdk.Common.Invocation;
using Blackbird.Applications.SDK.Extensions.FileManagement.Interfaces;
using Blackbird.Applications.Sdk.Utils.Extensions.Files;
using RestSharp;
using System.IO.Compression;

namespace Apps.BWX.Actions;

[ActionList]
public class ProjectActions : BWXInvocable
{
public ProjectActions(InvocationContext invocationContext) : base(invocationContext)
private readonly IFileManagementClient _fileManagementClient;

public ProjectActions(InvocationContext invocationContext, IFileManagementClient fileManagementClient) : base(invocationContext)
{
_fileManagementClient = fileManagementClient;
}

/**
* !!!Warning!!!
* Since BWX API is the same API their web platform uses
* and many endpoints are not described or irrelevant in BWX API documentation -
* some parts of code are based on the endpoints which are used by BWX web platform. (It could be both v3 or v2 endpoints)
* Next method is based on web platform calls
* **/
[Action("Search projects", Description = "Search projects")]
public async Task<List<ProjectDto>> SearchProjects()
{
public async Task<List<ProjectDto>> SearchProjects([ActionParameter] SearchProjectRequest searchProjects)
{
var request = new BWXRequest($"/api/v3/project", Method.Get, Creds);
request.AddQueryParameter("name", searchProjects?.ProjectName);
request.AddQueryParameter("organizationUuid", searchProjects?.Organization);
request.AddQueryParameter("orgUnitUuid", searchProjects?.Client);
request.AddQueryParameter("projectManagerUuid", searchProjects?.ProjectManager);
request.AddQueryParameter("contactPersonUuid", searchProjects?.ContactPerson);
request.AddQueryParameter("reference", searchProjects?.Reference);

request.AddQueryParameter("startCreateDate", searchProjects.CreationDateStart?.ToString("yyyy-MM-dd"));
request.AddQueryParameter("endCreateDate", searchProjects.CreationDateEnd?.ToString("yyyy-MM-dd"));
request.AddQueryParameter("startDueDate", searchProjects.DueDateStart?.ToString("yyyy-MM-dd"));
request.AddQueryParameter("endDueDate", searchProjects.DueDateEnd?.ToString("yyyy-MM-dd"));

if (searchProjects.ProjectStatuses != null && searchProjects.ProjectStatuses.Any())
foreach(var status in searchProjects.ProjectStatuses)
request.AddQueryParameter("status", status);
if (searchProjects.Tags != null && searchProjects.Tags.Any())
foreach (var tag in searchProjects.Tags)
request.AddQueryParameter("tags", tag);

return await Client.Paginate<ProjectDto>(request);
}

Expand All @@ -36,8 +67,37 @@ public Task<ProjectDto> GetProject([ActionParameter] GetProjectRequest input)
[Action("Create project", Description = "Create project")]
public Task<ProjectDto> CreateProject([ActionParameter] CreateProjectRequest input)
{
var inferSettingParameter = input.InferDefaultSettings.HasValue ? $"?inferDefaultSettings={input.InferDefaultSettings.Value}" : "";
var request = new BWXRequest($"/api/v3/project{inferSettingParameter}", Method.Get, Creds);
var request = new BWXRequest($"/api/v3/project?inferDefaultSettings={input?.InferDefaultSettings?.ToString().ToLower() ?? "true"}", Method.Post, Creds);
request.AddJsonBody(new
{
reference = input.Reference,
orgUnitUUID = input.OrgUnitUUID,
contactUUID = input.ContactUUID,
sourceLocale = input.SourceLocale,
notes = input.Notes,
tags = input.Tags,
});
return Client.ExecuteWithErrorHandling<ProjectDto>(request);
}

[Action("Upload file to project", Description = "Upload file to project")]
public async Task<ProjectFileInfoDto> UploadFileToProject(
[ActionParameter] GetProjectRequest getProjectRequest,
[ActionParameter] UploadFileRequest uploadFileRequest)
{
var request = new BWXRequest($"/api/v3/project/{getProjectRequest.ProjectId}/resource", Method.Post, Creds);
request.AddJsonBody(new
{
name = uploadFileRequest?.FileName ?? uploadFileRequest.File.Name,
path = uploadFileRequest?.FilePath ?? uploadFileRequest.File.Name,
notes = uploadFileRequest?.Notes ?? string.Empty
});
var projectFileInfoDto = await Client.ExecuteWithErrorHandling<ProjectFileInfoDto>(request);

var uploadRequest = new BWXRequest($"/api/v3/project/{getProjectRequest.ProjectId}/resource/{projectFileInfoDto.Uuid}/content", Method.Post, Creds);
var fileBytes = await (await _fileManagementClient.DownloadAsync(uploadFileRequest.File)).GetByteData();
uploadRequest.AddFile("file", fileBytes, uploadFileRequest.File.Name);
await Client.ExecuteWithErrorHandling(uploadRequest);
return projectFileInfoDto;
}
}
4 changes: 0 additions & 4 deletions Apps.BWX/Apps.BWX.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,4 @@
<PackageReference Include="Blackbird.Applications.SDK.Extensions.FileManagement" Version="1.0.2-alpha1" />
<PackageReference Include="Blackbird.Applications.Sdk.Utils" Version="1.0.25" />
</ItemGroup>

<ItemGroup>
<Folder Include="DataSourceHandlers\EnumDataHandlers\" />
</ItemGroup>
</Project>
32 changes: 32 additions & 0 deletions Apps.BWX/DataSourceHandlers/ClientDataHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Apps.BWX.Api;
using Apps.BWX.Dtos;
using Apps.BWX.Invocables;
using Blackbird.Applications.Sdk.Common.Dynamic;
using Blackbird.Applications.Sdk.Common.Invocation;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Apps.BWX.DataSourceHandlers
{
public class ClientDataHandler : BWXInvocable, IAsyncDataSourceHandler
{
public ClientDataHandler(InvocationContext invocationContext) : base(invocationContext)
{
}

public async Task<Dictionary<string, string>> GetDataAsync(DataSourceContext context, CancellationToken token)
{
var request = new BWXRequest($"/api/v3/client", Method.Get, Creds);
var languages = await Client.Paginate<ClientDto>(request);

return languages.Where(el =>
context.SearchString is null ||
el.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase))
.ToDictionary(k => k.Uuid, v => v.Name);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using Blackbird.Applications.Sdk.Utils.Sdk.DataSourceHandlers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Apps.BWX.DataSourceHandlers.EnumDataHandlers
{
public class ProjectStatusDataHandler : EnumDataHandler
{
protected override Dictionary<string, string> EnumValues => new()
{
{"Draft", "Draft"},
{"Pending", "Pending"},
{"Approved", "Approved"},
{"Delivered", "Delivered"},
{"Invoiced", "Invoiced"},
};
}
}
32 changes: 32 additions & 0 deletions Apps.BWX/DataSourceHandlers/OrganizationDataHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Apps.BWX.Api;
using Apps.BWX.Dtos;
using Apps.BWX.Invocables;
using Blackbird.Applications.Sdk.Common.Dynamic;
using Blackbird.Applications.Sdk.Common.Invocation;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Apps.BWX.DataSourceHandlers
{
public class OrganizationDataHandler : BWXInvocable, IAsyncDataSourceHandler
{
public OrganizationDataHandler(InvocationContext invocationContext) : base(invocationContext)
{
}

public async Task<Dictionary<string, string>> GetDataAsync(DataSourceContext context, CancellationToken token)
{
var request = new BWXRequest($"/api/v2/organization", Method.Get, Creds);
var languages = await Client.Paginate<OrganizationDto>(request);

return languages.Where(el =>
context.SearchString is null ||
el.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase))
.ToDictionary(k => k.Uuid, v => v.Name);
}
}
}
32 changes: 32 additions & 0 deletions Apps.BWX/DataSourceHandlers/ProjectManagerDataHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Apps.BWX.Api;
using Apps.BWX.Dtos;
using Apps.BWX.Invocables;
using Blackbird.Applications.Sdk.Common.Dynamic;
using Blackbird.Applications.Sdk.Common.Invocation;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Apps.BWX.DataSourceHandlers
{
public class ProjectManagerDataHandler : BWXInvocable, IAsyncDataSourceHandler
{
public ProjectManagerDataHandler(InvocationContext invocationContext) : base(invocationContext)
{
}

public async Task<Dictionary<string, string>> 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<UserDto>(request);

return projects.Where(el =>
context.SearchString is null ||
el.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase))
.ToDictionary(k => k.Uuid, v => v.Name);
}
}
}
32 changes: 32 additions & 0 deletions Apps.BWX/DataSourceHandlers/UserDataHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Apps.BWX.Api;
using Apps.BWX.Dtos;
using Apps.BWX.Invocables;
using Blackbird.Applications.Sdk.Common.Dynamic;
using Blackbird.Applications.Sdk.Common.Invocation;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Apps.BWX.DataSourceHandlers
{
public class UserDataHandler : BWXInvocable, IAsyncDataSourceHandler
{
public UserDataHandler(InvocationContext invocationContext) : base(invocationContext)
{
}

public async Task<Dictionary<string, string>> GetDataAsync(DataSourceContext context, CancellationToken token)
{
var request = new BWXRequest($"/api/v3/user?simple=true", Method.Get, Creds);
var projects = await Client.Paginate<UserDto>(request);

return projects.Where(el =>
context.SearchString is null ||
el.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase))
.ToDictionary(k => k.Uuid, v => v.Name);
}
}
}
17 changes: 17 additions & 0 deletions Apps.BWX/Dtos/ClientDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Apps.BWX.Dtos
{
public class ClientDto
{
public int Id { get; set; }
public string Uuid { get; set; }
public OrganizationDto Organization { get; set; }
public string Name { get; set; }
public string Country { get; set; }
}
}
16 changes: 16 additions & 0 deletions Apps.BWX/Dtos/OrganizationDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Apps.BWX.Dtos
{
public class OrganizationDto
{
public int Id { get; set; }
public string Uuid { get; set; }
public string Name { get; set; }
public string Country { get; set; }
}
}
10 changes: 1 addition & 9 deletions Apps.BWX/Dtos/ProjectDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class ProjectDto
public class Client
{
public string Uuid { get; set; }
public Organization Organization { get; set; }
public OrganizationDto Organization { get; set; }
public string Name { get; set; }
public string SourceLanguage { get; set; }
public List<string> TargetLanguages { get; set; }
Expand Down Expand Up @@ -83,12 +83,4 @@ public class Creator
public int TasksCompletedCount { get; set; }
public string Uuid { get; set; }
}

public class Organization
{
public int Id { get; set; }
public string Uuid { get; set; }
public string Name { get; set; }
public string Country { get; set; }
}
}
34 changes: 34 additions & 0 deletions Apps.BWX/Dtos/ProjectFileInfoDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Apps.BWX.Dtos
{
public class ProjectFileInfoDto
{
public string Uuid { get; set; }
public string Type { get; set; }
public string Name { get; set; }
public string Path { get; set; }
public string Hash { get; set; }
public string Notes { get; set; }
public string SourceLocale { get; set; }
public int Creation { get; set; }
public string ProjectUuid { get; set; }
public Params Params { get; set; }
public List<string> Workflows { get; set; }
public List<string> TargetLocales { get; set; }
}

public class Params
{
public string ProjectResourceId { get; set; }
public string ApplySourceSegmentation { get; set; }
public string Parameters { get; set; }
public string ParserFilter { get; set; }
public string TagRegex { get; set; }
}

}
17 changes: 17 additions & 0 deletions Apps.BWX/Dtos/UserDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Apps.BWX.Dtos
{
public class UserDto
{
public string Email { get; set; }
public string Name { get; set; }
public string Status { get; set; }
public int TasksCompletedCount { get; set; }
public string Uuid { get; set; }
}
}
Loading

0 comments on commit 7ab4f25

Please sign in to comment.