Skip to content

Commit

Permalink
Added support assets actions
Browse files Browse the repository at this point in the history
  • Loading branch information
vitaliy-bezugly committed Mar 18, 2024
1 parent 1d557b7 commit 1c11862
Show file tree
Hide file tree
Showing 10 changed files with 273 additions and 33 deletions.
34 changes: 1 addition & 33 deletions Apps.Lionbridge/Actions/RequestActions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@
using Apps.Lionbridge.Models.Requests.Job;
using Apps.Lionbridge.Models.Requests.Request;
using Apps.Lionbridge.Models.Responses.Request;
using Apps.Lionbridge.Models.Responses.SourceFile;
using Apps.Lionbridge.Models.Responses.TranslationContent;
using Blackbird.Applications.Sdk.Common;
using Blackbird.Applications.Sdk.Common.Actions;
using Blackbird.Applications.Sdk.Common.Files;
using Blackbird.Applications.Sdk.Common.Invocation;
using Blackbird.Applications.SDK.Extensions.FileManagement.Interfaces;
using Blackbird.Applications.Sdk.Utils.Extensions.Http;
Expand Down Expand Up @@ -70,7 +68,7 @@ public async Task<RequestDto> CreateSingleRequest([ActionParameter] AddSourceReq
public async Task<RequestDto> CreateFileRequest([ActionParameter] GetJobRequest jobRequest,
[ActionParameter] AddSourceFileRequest sourceFileRequest)
{
var uploadResponse = await UploadFmsFile(jobRequest.JobId, sourceFileRequest);
var uploadResponse = await UploadFmsFile(jobRequest.JobId, sourceFileRequest, fileManagementClient);

var metadata =
EnumerableExtensions.ToDictionary(sourceFileRequest.MetadataKeys, sourceFileRequest.MetadataValues);
Expand Down Expand Up @@ -177,34 +175,4 @@ private async Task<string> CreateTranslationContent(string jobId, IEnumerable<st
var response = await Client.ExecuteWithErrorHandling<TranslationContentResponse>(apiRequest);
return response.SourceContentId;
}

private async Task<UploadSourceFileResponse> UploadFmsFile(string jobId, AddSourceFileRequest fileRequest)
{
string fileName = fileRequest.FileName ?? fileRequest.File.Name;

string endpoint = $"{ApiEndpoints.Jobs}/{jobId}{ApiEndpoints.SourceFiles}?fileName={fileName}";
var apiRequest = new LionbridgeRequest(endpoint, Method.Post);

var response = await Client.ExecuteWithErrorHandling<UploadSourceFileResponse>(apiRequest);

string fmsMultipartUrl = response.FmsPostMultipartUrl;

var fileStream = await fileManagementClient.DownloadAsync(fileRequest.File);
var memoryStream = new MemoryStream();
await fileStream.CopyToAsync(memoryStream);

var bytes = memoryStream.ToArray();

var client = new RestClient(fmsMultipartUrl);
var request = new RestRequest(string.Empty, Method.Post);
request.AddFile("file", bytes, fileName);

var uploadFileResponse = await client.ExecuteAsync(request);
if (!uploadFileResponse.IsSuccessful)
{
throw new Exception("Failed to upload file to FMS on second step");
}

return response;
}
}
63 changes: 63 additions & 0 deletions Apps.Lionbridge/Actions/SupportAssetsActions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using Apps.Lionbridge.Api;
using Apps.Lionbridge.Constants;
using Apps.Lionbridge.Extensions;
using Apps.Lionbridge.Models.Dtos;
using Apps.Lionbridge.Models.Requests.File;
using Apps.Lionbridge.Models.Requests.Job;
using Apps.Lionbridge.Models.Requests.SupportAssets;
using Apps.Lionbridge.Models.Responses.SupportAssets;
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 RestSharp;

namespace Apps.Lionbridge.Actions;

[ActionList]
public class SupportAssetsActions(InvocationContext invocationContext, IFileManagementClient fileManagementClient)
: LionbridgeInvocable(invocationContext)
{
[Action("Get support asset", Description = "Get a support asset.")]
public async Task<SupportAssetResponse> GetSupportAsset([ActionParameter] GetSupportAssetRequest request)
{
string endpoint = $"{ApiEndpoints.Jobs}/{request.JobId}{ApiEndpoints.SupportAssets}/{request.SupportAssetId}";
var apiRequest = new LionbridgeRequest(endpoint);

var dto = await Client.ExecuteWithErrorHandling<SupportAssetDto>(apiRequest);
return new SupportAssetResponse(dto);
}

[Action("Delete support asset", Description = "Delete a support asset.")]
public async Task DeleteSupportAsset([ActionParameter] GetSupportAssetRequest request)
{
string endpoint = $"{ApiEndpoints.Jobs}/{request.JobId}{ApiEndpoints.SupportAssets}/{request.SupportAssetId}";
var apiRequest = new LionbridgeRequest(endpoint, Method.Delete);

await Client.ExecuteWithErrorHandling(apiRequest);
}

[Action("Add support asset", Description = "Add a support asset to a job")]
public async Task<SupportAssetResponse> AddSupportAsset([ActionParameter] GetJobRequest request,
[ActionParameter] AddSupportAssetRequest addSupportAssetRequest,
[ActionParameter] AddSourceFileRequest fileRequest)
{
var uploadResponse = await UploadFmsFile(request.JobId, fileRequest, fileManagementClient);

string endpoint = $"{ApiEndpoints.Jobs}/{request.JobId}{ApiEndpoints.SupportAssets}";
var metadata = EnumerableExtensions.ToDictionary(addSupportAssetRequest.ExtendedMetadataKeys, addSupportAssetRequest.ExtendedMetadataValues);
var apiRequest = new LionbridgeRequest(endpoint, Method.Post)
.AddJsonBody(new
{
fmsFileId = uploadResponse.FmsFileId,
description = addSupportAssetRequest.Description,
sourceNativeIds = addSupportAssetRequest.SourceNativeIds,
sourceNativeLanguageCode = addSupportAssetRequest.SourceNativeLanguageCode,
targetNativeLanguageCodes = addSupportAssetRequest.TargetNativeLanguageCodes ?? [fileRequest.TargetNativeLanguage],
extendedMetadata = metadata
});

var dto = await Client.ExecuteWithErrorHandling<SupportAssetDto>(apiRequest);
return new SupportAssetResponse(dto);
}
}
1 change: 1 addition & 0 deletions Apps.Lionbridge/Constants/ApiEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ public static class ApiEndpoints
public const string SourceContent = "/sourcecontent";
public const string SourceFiles = "/sourcefiles";
public const string RetrieveFile = "/retrievefile";
public const string SupportAssets = "/supportassets";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using Apps.Lionbridge.Api;
using Apps.Lionbridge.Constants;
using Apps.Lionbridge.Models.Requests.SupportAssets;
using Apps.Lionbridge.Models.Responses.SupportAssets;
using Blackbird.Applications.Sdk.Common;
using Blackbird.Applications.Sdk.Common.Dynamic;
using Blackbird.Applications.Sdk.Common.Invocation;

namespace Apps.Lionbridge.DataSourceHandlers;

public class SupportAssetDataSourceHandler : LionbridgeInvocable, IAsyncDataSourceHandler
{
private readonly string _jobId;

public SupportAssetDataSourceHandler(InvocationContext invocationContext, [ActionParameter] GetSupportAssetRequest request) : base(invocationContext)
{
_jobId = request.JobId;
}

public async Task<Dictionary<string, string>> GetDataAsync(DataSourceContext context,
CancellationToken cancellationToken)
{
var endpoint = $"{ApiEndpoints.Jobs}/{_jobId}{ApiEndpoints.SupportAssets}";
var request = new LionbridgeRequest(endpoint);

var response = await Client.ExecuteWithErrorHandling<SupportAssetsResponse>(request);

return response.Embedded.SupportAssets.Where(job =>
context.SearchString == null ||
job.Filename.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase))
.ToDictionary(job => job.SupportAssetId, job => job.Filename);
}
}
34 changes: 34 additions & 0 deletions Apps.Lionbridge/LionbridgeInvocable.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
using Apps.Lionbridge.Api;
using Apps.Lionbridge.Constants;
using Apps.Lionbridge.Models.Dtos;
using Apps.Lionbridge.Models.Requests.File;
using Apps.Lionbridge.Models.Responses.SourceFile;
using Blackbird.Applications.Sdk.Common;
using Blackbird.Applications.Sdk.Common.Invocation;
using Blackbird.Applications.SDK.Extensions.FileManagement.Interfaces;
using RestSharp;

namespace Apps.Lionbridge;

Expand All @@ -21,4 +25,34 @@ protected async Task<RequestDto> GetRequest(string jobId, string requestId)
$"{ApiEndpoints.Requests}/{requestId}");
return await Client.ExecuteWithErrorHandling<RequestDto>(apiRequest);
}

protected async Task<UploadSourceFileResponse> UploadFmsFile(string jobId, AddSourceFileRequest fileRequest, IFileManagementClient fileManagementClient)
{
string fileName = fileRequest.FileName ?? fileRequest.File.Name;

string endpoint = $"{ApiEndpoints.Jobs}/{jobId}{ApiEndpoints.SourceFiles}?fileName={fileName}";
var apiRequest = new LionbridgeRequest(endpoint, Method.Post);

var response = await Client.ExecuteWithErrorHandling<UploadSourceFileResponse>(apiRequest);

string fmsMultipartUrl = response.FmsPostMultipartUrl;

var fileStream = await fileManagementClient.DownloadAsync(fileRequest.File);
var memoryStream = new MemoryStream();
await fileStream.CopyToAsync(memoryStream);

var bytes = memoryStream.ToArray();

var client = new RestClient(fmsMultipartUrl);
var request = new RestRequest(string.Empty, Method.Post);
request.AddFile("file", bytes, fileName);

var uploadFileResponse = await client.ExecuteAsync(request);
if (!uploadFileResponse.IsSuccessful)
{
throw new Exception("Failed to upload file to FMS on second step");
}

return response;
}
}
37 changes: 37 additions & 0 deletions Apps.Lionbridge/Models/Dtos/SupportAssetDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using Blackbird.Applications.Sdk.Common;
using Newtonsoft.Json;

namespace Apps.Lionbridge.Models.Dtos;

public class SupportAssetDto
{
[JsonProperty("supportassetId")]
public string SupportAssetId { get; set; }

[JsonProperty("fileId")]
public string FileId { get; set; }

[JsonProperty("jobId")]
public string JobId { get; set; }

[JsonProperty("filename")]
public string Filename { get; set; }

[JsonProperty("description")]
public string Description { get; set; }

[JsonProperty("sourceNativeIds")]
public string[] SourceNativeIds { get; set; }

[JsonProperty("sourceNativeLanguageCode")]
public string SourceNativeLanguageCode { get; set; }

[JsonProperty("targetNativeLanguageCodes")]
public string[] TargetNativeLanguageCodes { get; set; }

[JsonProperty("createdDate")]
public DateTime CreatedDate { get; set; }

[JsonProperty("extendedMetadata")]
public Dictionary<string, string> ExtendedMetadata { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using Blackbird.Applications.Sdk.Common;
using Blackbird.Applications.Sdk.Common.Files;

namespace Apps.Lionbridge.Models.Requests.SupportAssets;

public class AddSupportAssetRequest
{
public string? Description { get; set; }

[Display("Source native language")]
public IEnumerable<string> SourceNativeIds { get; set; }

[Display("Source native language code")]
public string SourceNativeLanguageCode { get; set; }

[Display("Target native language codes")]
public IEnumerable<string>? TargetNativeLanguageCodes { get; set; }

[Display("Extended metadata keys")]
public IEnumerable<string>? ExtendedMetadataKeys { get; set; }

[Display("Extended metadata values")]
public IEnumerable<string>? ExtendedMetadataValues { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Apps.Lionbridge.DataSourceHandlers;
using Blackbird.Applications.Sdk.Common;
using Blackbird.Applications.Sdk.Common.Dynamic;

namespace Apps.Lionbridge.Models.Requests.SupportAssets;

public class GetSupportAssetRequest
{
[Display("Job ID"), DataSource(typeof(JobDataSourceHandler))]
public string JobId { get; set; }

[Display("Support asset ID"), DataSource(typeof(SupportAssetDataSourceHandler))]
public string SupportAssetId { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using Apps.Lionbridge.Models.Dtos;
using Blackbird.Applications.Sdk.Common;

namespace Apps.Lionbridge.Models.Responses.SupportAssets;

public class SupportAssetResponse
{
[Display("Support asset ID")]
public string SupportAssetId { get; set; }

[Display("File ID")]
public string FileId { get; set; }

[Display("Job ID")]
public string JobId { get; set; }

[Display("Filename")]
public string Filename { get; set; }

[Display("Description")]
public string Description { get; set; }

[Display("Source native IDs")]
public string[] SourceNativeIds { get; set; }

[Display("Source native language code")]
public string SourceNativeLanguageCode { get; set; }

[Display("Target native language codes")]
public string[] TargetNativeLanguageCodes { get; set; }

[Display("Created date")]
public DateTime CreatedDate { get; set; }

[Display("Extended metadata keys")]
public string[] ExtendedMetadataKeys { get; set; }

[Display("Extended metadata values")]
public string[] ExtendedMetadataValues { get; set; }

public SupportAssetResponse(SupportAssetDto supportAssetDto)
{
SupportAssetId = supportAssetDto.SupportAssetId;
FileId = supportAssetDto.FileId;
JobId = supportAssetDto.JobId;
Filename = supportAssetDto.Filename;
Description = supportAssetDto.Description;
SourceNativeIds = supportAssetDto.SourceNativeIds;
SourceNativeLanguageCode = supportAssetDto.SourceNativeLanguageCode;
TargetNativeLanguageCodes = supportAssetDto.TargetNativeLanguageCodes;
CreatedDate = supportAssetDto.CreatedDate;
ExtendedMetadataKeys = supportAssetDto.ExtendedMetadata.Keys.ToArray();
ExtendedMetadataValues = supportAssetDto.ExtendedMetadata.Values.ToArray();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Apps.Lionbridge.Models.Dtos;

namespace Apps.Lionbridge.Models.Responses.SupportAssets;

public class SupportAssetsResponse : EmbeddedItemsWrapper<SupportAssetsWrapper>
{

}

public record SupportAssetsWrapper(IEnumerable<SupportAssetDto> SupportAssets);

0 comments on commit 1c11862

Please sign in to comment.