diff --git a/src/Application/Common/Services/ConversionCreditService.cs b/src/Application/Common/Services/ConversionCreditService.cs new file mode 100644 index 0000000..ae2bd42 --- /dev/null +++ b/src/Application/Common/Services/ConversionCreditService.cs @@ -0,0 +1,97 @@ +using Application.Common.Exceptions; +using Domain.Entities; +using Microsoft.Extensions.Options; +using Microsoft.Graph; +using Microsoft.Graph.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; + +namespace Application.Common.Services +{ + internal class ConversionCreditService : IConversionCreditService + { + private readonly GraphServiceClient _graphServiceClient; + private readonly AzureB2CSettings _azureB2CSettings; + private readonly string _conversionCreditsAttributeName; + + public ConversionCreditService(GraphServiceClient graphServiceClient, IOptions azureB2CSettings) + { + _graphServiceClient = graphServiceClient; + _azureB2CSettings = azureB2CSettings.Value; + _conversionCreditsAttributeName = AdditionalParameterRetriever.GetConversionCreditsAttributeName(_azureB2CSettings.B2cExtensionAppClientId); + } + + public async Task EditConversionCredits(string userId, int quantity) + { + User? user = await GetUser(userId); + + if (user == null) + { + throw new NotFoundException($"The user {userId} was not found.", userId); + } + + decimal credits = 0; + if (user.AdditionalData.ContainsKey(_conversionCreditsAttributeName)) + { + credits = (decimal)user.AdditionalData[_conversionCreditsAttributeName]; + } + + credits = credits + quantity; + + user.AdditionalData[_conversionCreditsAttributeName] = credits; + + var requestBody = new User + { + AdditionalData = new Dictionary + { + { + _conversionCreditsAttributeName , credits.ToString() + } + }, + }; + + User? updatedUser = await _graphServiceClient.Users[user.Id].PatchAsync(requestBody); + + if (updatedUser == null) + { + updatedUser = await GetUser(userId); + } + + return decimal.ToInt16((decimal)updatedUser.AdditionalData[_conversionCreditsAttributeName]); + } + + public async Task GetConversionCredits(string userId) + { + User? user = await GetUser(userId); + + if (user == null) + { + throw new NotFoundException($"The user {userId} was not found.", userId); + } + + decimal credits = 0; + if (user.AdditionalData.ContainsKey(_conversionCreditsAttributeName)) + { + credits = (decimal)user.AdditionalData[_conversionCreditsAttributeName]; + } + + return decimal.ToInt16(credits); + } + + public async Task GetUser(string userId) + { + string selects = $"displayName,id,mail,mobilePhone,{_conversionCreditsAttributeName}"; + + User? user = await _graphServiceClient.Users[userId].GetAsync((requestConfiguration) => + { + requestConfiguration.QueryParameters.Select = new string[] { "Id", "displayName", _conversionCreditsAttributeName }; + }); + + return user; + } + } +} diff --git a/src/Application/Common/Services/IConversionCreditService.cs b/src/Application/Common/Services/IConversionCreditService.cs new file mode 100644 index 0000000..ab1aed1 --- /dev/null +++ b/src/Application/Common/Services/IConversionCreditService.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Application.Common.Services +{ + public interface IConversionCreditService + { + Task GetUser(string userId); + Task GetConversionCredits(string userId); + Task EditConversionCredits(string userId, int quantity); + } +} diff --git a/src/Application/Common/Services/ISavedWorkItemService.cs b/src/Application/Common/Services/ISavedWorkItemService.cs index e0275a9..839ce47 100644 --- a/src/Application/Common/Services/ISavedWorkItemService.cs +++ b/src/Application/Common/Services/ISavedWorkItemService.cs @@ -5,8 +5,11 @@ namespace Application.Common.Services { public interface ISavedWorkItemService { + Task GetSavedWorkItemStatus(string workItemId); Task CreateSavedWorkItemStatus(WorkItemStatus workItemStatus, string userId, string revitVersion, string objectKey, string fileName); List GetSavedWorkItems(string userId); Task UpdateSavedWorkItemStatus(WorkItemStatus workItemStatus); + Task GetSavedWorkItem(string workItemId); + Task MarkSavedWorkItemAsCredited(string workItemId); } } \ No newline at end of file diff --git a/src/Application/Common/Services/SavedWorkItemService.cs b/src/Application/Common/Services/SavedWorkItemService.cs index a8d8b33..5b5e489 100644 --- a/src/Application/Common/Services/SavedWorkItemService.cs +++ b/src/Application/Common/Services/SavedWorkItemService.cs @@ -1,4 +1,5 @@ -using Autodesk.Forge.DesignAutomation.Model; +using Application.WorkItems.Commands.UpdateWorkItemStatus; +using Autodesk.Forge.DesignAutomation.Model; using Azure; using Azure.Data.Tables; using Domain.Entities; @@ -6,6 +7,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; @@ -55,7 +57,7 @@ public async Task UpdateSavedWorkItemStatus(WorkItemStatus workItemStatus) savedWorkItem.UpdateStatus(workItemStatus); savedWorkItem.LastModified = DateTime.UtcNow; - Azure.Response response = await tableClient.UpdateEntityAsync(savedWorkItem, Azure.ETag.All ); + Azure.Response response = await tableClient.UpdateEntityAsync(savedWorkItem, Azure.ETag.All); if (response.IsError) { @@ -68,7 +70,7 @@ public List GetSavedWorkItems(string userId) TableClient tableClient = _tableServiceClient.GetTableClient(_partitionKey); tableClient.CreateIfNotExists(); - Pageable queryResults = tableClient.Query(ent => + Pageable queryResults = tableClient.Query(ent => ent.UserId == userId && ent.Created >= DateTime.Now.AddDays(-30)); List savedWorkItems = new List(); @@ -80,5 +82,50 @@ public List GetSavedWorkItems(string userId) return savedWorkItems; } + + public async Task GetSavedWorkItem(string workItemId) + { + TableClient tableClient = _tableServiceClient.GetTableClient(_partitionKey); + tableClient.CreateIfNotExists(); + + SavedWorkItem savedWorkItem = await tableClient.GetEntityAsync(_partitionKey, workItemId); + + return savedWorkItem; + } + + public async Task MarkSavedWorkItemAsCredited(string workItemId) + { + TableClient tableClient = _tableServiceClient.GetTableClient(_partitionKey); + tableClient.CreateIfNotExists(); + + SavedWorkItem savedWorkItem = await tableClient.GetEntityAsync(_partitionKey, workItemId); + savedWorkItem.Credited = true; + + Azure.Response response = await tableClient.UpdateEntityAsync(savedWorkItem, Azure.ETag.All); + + if (response.IsError) + { + throw new Exception(response.ReasonPhrase); + } + } + + public async Task GetSavedWorkItemStatus(string workItemId) + { + TableClient tableClient = _tableServiceClient.GetTableClient(_partitionKey); + tableClient.CreateIfNotExists(); + + SavedWorkItem savedWorkItem = await tableClient.GetEntityAsync(_partitionKey, workItemId); + + string statusName = System.Text.Json.JsonNamingPolicy.CamelCase.ConvertName(savedWorkItem.Status); + WorkItemStatus status = new WorkItemStatus() + { + Status = WorkItemStatusDTO.ToEnum(statusName), + Progress = savedWorkItem.Progress, + ReportUrl = savedWorkItem.ReportUrl, + Id = savedWorkItem.WorkItemId, + }; + + return status; + } } } diff --git a/src/Application/ConfigureServices.cs b/src/Application/ConfigureServices.cs index 3e6f91f..8aebbfd 100644 --- a/src/Application/ConfigureServices.cs +++ b/src/Application/ConfigureServices.cs @@ -31,6 +31,7 @@ public static IServiceCollection AddApplicationServices(this IServiceCollection services.AddOss(configuration); services.AddTransient(); services.AddSingleton(); + services.AddSingleton(); services.Configure(configuration.GetSection("Forge")); services.Configure(configuration.GetSection("Stripe")); diff --git a/src/Application/Users/Commands/EditConversionCredits/EditConversionCreditsCommand.cs b/src/Application/Users/Commands/EditConversionCredits/EditConversionCreditsCommand.cs new file mode 100644 index 0000000..b33c2bb --- /dev/null +++ b/src/Application/Users/Commands/EditConversionCredits/EditConversionCreditsCommand.cs @@ -0,0 +1,21 @@ +using MediatR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Application.Users.Commands.EditConversionCredits +{ + public class EditConversionCreditsCommand : IRequest + { + public EditConversionCreditsCommand(string userId, int quantity) + { + UserId = userId; + Quantity = quantity; + } + + public readonly string UserId; + public readonly int Quantity; + } +} diff --git a/src/Application/Users/Commands/EditConversionCredits/EditConversionCreditsCommandHandler.cs b/src/Application/Users/Commands/EditConversionCredits/EditConversionCreditsCommandHandler.cs new file mode 100644 index 0000000..99512bf --- /dev/null +++ b/src/Application/Users/Commands/EditConversionCredits/EditConversionCreditsCommandHandler.cs @@ -0,0 +1,33 @@ +using Application.ForgeApplications.Commands.CreateForgeApplication; +using Autodesk.Forge.DesignAutomation.Model; +using Autodesk.Forge.DesignAutomation; +using MediatR; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Domain.Entities; +using Application.Common.Services; + +namespace Application.Users.Commands.EditConversionCredits +{ + public class EditConversionCreditsCommandHandler : IRequestHandler + { + private readonly IConversionCreditService _conversionCreditService; + + public EditConversionCreditsCommandHandler(IConversionCreditService conversionCreditService) + { + _conversionCreditService = conversionCreditService; + } + + public async Task Handle(EditConversionCreditsCommand request, CancellationToken cancellationToken) + { + int updated = await _conversionCreditService.EditConversionCredits(request.UserId, request.Quantity); + + return updated; + } + } + + } diff --git a/src/Application/Users/Queries/GetUser/GetUserQueryHandler.cs b/src/Application/Users/Queries/GetUser/GetUserQueryHandler.cs index 57da666..e3a7850 100644 --- a/src/Application/Users/Queries/GetUser/GetUserQueryHandler.cs +++ b/src/Application/Users/Queries/GetUser/GetUserQueryHandler.cs @@ -15,46 +15,26 @@ namespace Application.Users.Queries.GetUser { public class GetUserQueryHandler : IRequestHandler { - private readonly GraphServiceClient _graphServiceClient; - private readonly AzureB2CSettings _azureB2CSettings; + private readonly IConversionCreditService _conversionCreditService; - public GetUserQueryHandler(GraphServiceClient graphServiceClient, IOptions azureB2CSettings) + public GetUserQueryHandler(IConversionCreditService conversionCreditService) { - _graphServiceClient = graphServiceClient; - _azureB2CSettings = azureB2CSettings.Value; + _conversionCreditService = conversionCreditService; } public async Task Handle(GetUserQuery request, CancellationToken cancellationToken) { - string conversionCreditsAttributeName = AdditionalParameterRetriever.GetConversionCreditsAttributeName(_azureB2CSettings.B2cExtensionAppClientId); - - string selects = $"displayName,id,mail,mobilePhone,{conversionCreditsAttributeName}"; - - Microsoft.Graph.Models.User? user = await _graphServiceClient.Users[request.UserId].GetAsync((requestConfiguration) => - { - requestConfiguration.QueryParameters.Select = new string[] {"Id", "displayName",conversionCreditsAttributeName }; - }); - - if (user == null) - { - throw new NotFoundException($"The user {request.UserId} was not found.", request.UserId); - } - - decimal credis = 0; - if (user.AdditionalData.ContainsKey(conversionCreditsAttributeName)) - { - credis = (decimal)user.AdditionalData[conversionCreditsAttributeName]; - } + Microsoft.Graph.Models.User? user = await _conversionCreditService.GetUser(request.UserId); + int credits = await _conversionCreditService.GetConversionCredits(request.UserId); UserDTO userDTO = new UserDTO() { Id = user.Id, Name = user.DisplayName, - ConversionCredits = decimal.ToInt16(credis) - }; + ConversionCredits = decimal.ToInt16(credits) + }; + return userDTO; } - - } } diff --git a/src/Application/WorkItems/Commands/CreateWorkItem/CreateWorkItemCommandHandler.cs b/src/Application/WorkItems/Commands/CreateWorkItem/CreateWorkItemCommandHandler.cs index 591bd5f..13601d5 100644 --- a/src/Application/WorkItems/Commands/CreateWorkItem/CreateWorkItemCommandHandler.cs +++ b/src/Application/WorkItems/Commands/CreateWorkItem/CreateWorkItemCommandHandler.cs @@ -12,6 +12,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Microsoft.Graph.Models; +using System; using System.Runtime.Serialization; using System.Text.Json; @@ -21,13 +22,15 @@ public class CreateWorkItemCommandHandler : IRequestHandler _logger; private readonly AuthenticationClient _authenticationClient; private readonly ForgeConfiguration _forgeConfiguration; public CreateWorkItemCommandHandler(DesignAutomationClient designAutomationClient,ILogger logger, AuthenticationClient authenticationClient, - IOptions forgeConfiguration, OssClient ossClient, ISavedWorkItemService savedWorkItemService) + IOptions forgeConfiguration, OssClient ossClient, + ISavedWorkItemService savedWorkItemService, IConversionCreditService conversionCreditService) { _ossClient = ossClient; _logger = logger; @@ -35,10 +38,22 @@ public CreateWorkItemCommandHandler(DesignAutomationClient designAutomationClien _forgeConfiguration = forgeConfiguration.Value; _designAutomationClient = designAutomationClient; _savedWorkItemService = savedWorkItemService; + _conversionCreditService = conversionCreditService; } public async Task Handle(CreateWorkItemCommand request, CancellationToken cancellationToken) { + int credits = await _conversionCreditService.GetConversionCredits(request.UserId); + + if (credits == 0) + { + return new WorkItemStatus() + { + Status = Autodesk.Forge.DesignAutomation.Model.Status.FailedInstructions, + Progress = "You don't have enought credits to convert this file." + }; + } + TwoLeggedToken twoLeggedToken = await _authenticationClient.GetTwoLeggedTokenAsync(_forgeConfiguration.ClientId, _forgeConfiguration.ClientSecret, new List { Scopes.DataWrite, Scopes.DataRead }); string inputBucketKey = _forgeConfiguration.InputBucketKey; diff --git a/src/Application/WorkItems/Commands/UpdateWorkItemStatus/UpdateWorkItemStatusCommandHandler.cs b/src/Application/WorkItems/Commands/UpdateWorkItemStatus/UpdateWorkItemStatusCommandHandler.cs index a47f0e0..9294b71 100644 --- a/src/Application/WorkItems/Commands/UpdateWorkItemStatus/UpdateWorkItemStatusCommandHandler.cs +++ b/src/Application/WorkItems/Commands/UpdateWorkItemStatus/UpdateWorkItemStatusCommandHandler.cs @@ -16,18 +16,28 @@ namespace Application.WorkItems.Commands.UpdateWorkItemStatus { - public class UpdateWorkItemStatusCommandHandler : IRequestHandler { private readonly ISavedWorkItemService _savedWorkItemService; + private readonly IConversionCreditService _conversionCreditService; - public UpdateWorkItemStatusCommandHandler(ISavedWorkItemService savedWorkItemService) + public UpdateWorkItemStatusCommandHandler(ISavedWorkItemService savedWorkItemService, IConversionCreditService conversionCreditService) { _savedWorkItemService = savedWorkItemService; + _conversionCreditService = conversionCreditService; } + public async Task Handle(UpdateWorkItemStatusCommand request, CancellationToken cancellationToken) { + Domain.Entities.SavedWorkItem savedWorkItem = await _savedWorkItemService.GetSavedWorkItem(request.Status.Id); + await _savedWorkItemService.UpdateSavedWorkItemStatus(request.Status); + + if (request.Status.Status == Status.Success && !savedWorkItem.Credited) + { + await _conversionCreditService.EditConversionCredits(savedWorkItem.UserId, -1); + await _savedWorkItemService.MarkSavedWorkItemAsCredited(request.Status.Id); + } } } } diff --git a/src/Application/WorkItems/Commands/UpdateWorkItemStatus/WorkItemStatusDTO.cs b/src/Application/WorkItems/Commands/UpdateWorkItemStatus/WorkItemStatusDTO.cs index 23fcb38..a7421cf 100644 --- a/src/Application/WorkItems/Commands/UpdateWorkItemStatus/WorkItemStatusDTO.cs +++ b/src/Application/WorkItems/Commands/UpdateWorkItemStatus/WorkItemStatusDTO.cs @@ -45,11 +45,11 @@ public class WorkItemStatusDTO public static T ToEnum(string str) { - var enumType = typeof(T); - foreach (var name in Enum.GetNames(enumType)) + Type enumType = typeof(T); + foreach (string enumName in Enum.GetNames(enumType)) { - var enumMemberAttribute = ((EnumMemberAttribute[])enumType.GetField(name).GetCustomAttributes(typeof(EnumMemberAttribute), true)).Single(); - if (enumMemberAttribute.Value == str) return (T)Enum.Parse(enumType, name); + EnumMemberAttribute enumMemberAttribute = ((EnumMemberAttribute[])enumType.GetField(enumName).GetCustomAttributes(typeof(EnumMemberAttribute), true)).Single(); + if (enumMemberAttribute.Value == str) return (T)Enum.Parse(enumType, enumName); } //throw exception or whatever handling you want or return default(T); diff --git a/src/Application/WorkItems/Queries/GetWorkItemStatus/GetWorkItemStatusQueryHandler.cs b/src/Application/WorkItems/Queries/GetWorkItemStatus/GetWorkItemStatusQueryHandler.cs index 4f8faae..12e1802 100644 --- a/src/Application/WorkItems/Queries/GetWorkItemStatus/GetWorkItemStatusQueryHandler.cs +++ b/src/Application/WorkItems/Queries/GetWorkItemStatus/GetWorkItemStatusQueryHandler.cs @@ -30,16 +30,13 @@ public GetWorkItemStatusQueryHandler(DesignAutomationClient designAutomationClie _forgeConfiguration = forgeConfiguration.Value; _designAutomationClient = designAutomationClient; _savedWorkItemService = savedWorkItemService; - - } + public async Task Handle(GetWorkItemStatusQuery request, CancellationToken cancellationToken) { string id = request.WorkItemId; - WorkItemStatus workItemStatus = await _designAutomationClient.GetWorkitemStatusAsync(id); - - await _savedWorkItemService.UpdateSavedWorkItemStatus(workItemStatus); + WorkItemStatus workItemStatus = await _savedWorkItemService.GetSavedWorkItemStatus(id); return workItemStatus; diff --git a/src/Domain/Entities/SavedWorkItem.cs b/src/Domain/Entities/SavedWorkItem.cs index 77881a1..d0de9d8 100644 --- a/src/Domain/Entities/SavedWorkItem.cs +++ b/src/Domain/Entities/SavedWorkItem.cs @@ -20,6 +20,7 @@ public class SavedWorkItem : ITableEntity public string? Version { get; set; } public string? FileName { get; set; } public string? ObjectKey { get; set; } + public bool Credited { get; set; } public DateTime? TimeDownloadStarted { get; set; } public DateTime? TimeInstructionsStarted { get; set; } public DateTime? TimeInstructionsEnded { get; set; } diff --git a/src/WebClient/Components/Convert/Upload.razor b/src/WebClient/Components/Convert/Upload.razor index 614de0b..7ad6460 100644 --- a/src/WebClient/Components/Convert/Upload.razor +++ b/src/WebClient/Components/Convert/Upload.razor @@ -14,7 +14,7 @@ @ondragleave="@ClearDragClass" @ondragend="@ClearDragClass"> - @@ -30,6 +30,12 @@ +
+ @foreach (RevitFile revitFile in RevitFiles) + { + + } +
-
- @foreach (RevitFile revitFile in RevitFiles) - { - - } -
- - diff --git a/src/WebClient/Components/Convert/Upload.razor.cs b/src/WebClient/Components/Convert/Upload.razor.cs index 5998dff..6b6f52e 100644 --- a/src/WebClient/Components/Convert/Upload.razor.cs +++ b/src/WebClient/Components/Convert/Upload.razor.cs @@ -62,6 +62,8 @@ private async Task UploadAll() } await Task.WhenAll(uploadTasks); + + await InvokeAsync(StateHasChanged); } private void SetDragClass() diff --git a/src/WebClient/Models/RevitFile.cs b/src/WebClient/Models/RevitFile.cs index 327cb6a..1c6291a 100644 --- a/src/WebClient/Models/RevitFile.cs +++ b/src/WebClient/Models/RevitFile.cs @@ -1,4 +1,6 @@ -using Microsoft.AspNetCore.Components.Forms; +using Autodesk.Forge.DesignAutomation.Model; +using Microsoft.AspNetCore.Components.Forms; +using System.Timers; using WebClient.Models; using WebClient.Services; @@ -7,12 +9,18 @@ namespace WebClient.Models public class RevitFile : IBrowserFile { private readonly IBrowserFile _browserFile; - + private readonly System.Timers.Timer _updateStatusTimer; + private IDataService _dataService; + private string? _objectKey; + private string? _workItemId; public RevitFile(IBrowserFile browserFile) { _browserFile = browserFile; Status = FileStatus.GetVersion; + _updateStatusTimer = new System.Timers.Timer(); + _updateStatusTimer.Elapsed += new ElapsedEventHandler(OnUpdateEvent); + _updateStatusTimer.Interval = 5000; // ~ 5 seconds } public string Name @@ -79,11 +87,11 @@ public void RaiseFileRemoved() public async Task UploadFile(IDataService dataService, IUploadService uploadService) { + _dataService = dataService; Status = FileStatus.Uploading; // Upload the files here - string objectName = System.Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Replace("==", ""); - string objectKey = objectName; // + Path.GetExtension(revitFile.Name); + string objectKey = System.Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Replace("/", "-").Replace("+", "_").Replace("=", ""); int chunksNumber = CalculateNumberOfChunks((ulong)Size); @@ -129,64 +137,84 @@ public async Task UploadFile(IDataService dataService, IUploadService uploadServ Status = FileStatus.Converting; - //5 Create a workItem WorkItemStatus createdWorkItemStatus = await dataService.CreateWorkItem(objectKey, Version, Name); - - string workItemId = createdWorkItemStatus.Id; - - while (true) + + if (createdWorkItemStatus.Status == Models.Status.FailedInstructions) { - // 6 Get workitem status - WorkItemStatus status = await dataService.GetWorkItemStatus(workItemId); - - switch (status.Status) - { - case Models.Status.Pending: - break; - case Models.Status.Inprogress: - break; - case Models.Status.Cancelled: - break; - case Models.Status.FailedLimitDataSize: - Status = FileStatus.Error("FailedLimitDataSize"); - return; - case Models.Status.FailedLimitProcessingTime: - Status = FileStatus.Error("FailedLimitProcessingTime"); - return; - case Models.Status.FailedDownload: - Status = FileStatus.Error("FailedDownload"); - return; - case Models.Status.FailedInstructions: - Status = FileStatus.Error("FailedInstructions"); - return; - case Models.Status.FailedUpload: - Status = FileStatus.Error("FailedUpload"); - return; - case Models.Status.FailedUploadOptional: - Status = FileStatus.Error("FailedUploadOptional"); - return; - case Models.Status.Success: - Signeds3downloadResponse signedDownload = await dataService.GetDownloadUrl(objectKey, Name); - DownloadUrl = signedDownload?.Url; - Status = FileStatus.Converted; - return; - default: - Status = FileStatus.Error("Unknonw error"); - return; - } - - await Task.Delay(5000); + Status = FileStatus.Error(createdWorkItemStatus.Progress); } + + _workItemId = createdWorkItemStatus.Id; + _objectKey = objectKey; + _updateStatusTimer.Enabled = true; } else { - Console.WriteLine("[some chunks stream uploading] failed "); + Status = FileStatus.Error("The upload to the service failed. Please try again."); } - - Status = FileStatus.Converted; } + private async void OnUpdateEvent(object? sender, ElapsedEventArgs e) + { + if (_dataService == null) return; + if (_workItemId == null) return; + if (_objectKey == null) return; + + // 6 Get workitem status + WorkItemStatus status = await _dataService.GetWorkItemStatus(_workItemId); + + switch (status.Status) + { + case Models.Status.Pending: + Status = FileStatus.Converting; + break; + case Models.Status.Inprogress: + Status = FileStatus.Converting; + break; + case Models.Status.Cancelled: + Status = FileStatus.Error("Cancelled"); + _updateStatusTimer.Enabled = false; + break; + case Models.Status.FailedLimitDataSize: + Status = FileStatus.Error("FailedLimitDataSize"); + _updateStatusTimer.Enabled = false; + break; + case Models.Status.FailedLimitProcessingTime: + Status = FileStatus.Error("FailedLimitProcessingTime"); + _updateStatusTimer.Enabled = false; + break; + case Models.Status.FailedDownload: + Status = FileStatus.Error("FailedDownload"); + _updateStatusTimer.Enabled = false; + break; + case Models.Status.FailedInstructions: + Status = FileStatus.Error("FailedInstructions"); + _updateStatusTimer.Enabled = false; + break; + case Models.Status.FailedUpload: + Status = FileStatus.Error("FailedUpload"); + _updateStatusTimer.Enabled = false; + break; + case Models.Status.FailedUploadOptional: + Status = FileStatus.Error("FailedUploadOptional"); + _updateStatusTimer.Enabled = false; + break; + case Models.Status.Success: + Signeds3downloadResponse signedDownload = await _dataService.GetDownloadUrl(_objectKey, Name); + DownloadUrl = signedDownload?.Url; + Status = FileStatus.Converted; + _updateStatusTimer.Enabled = false; + break; + default: + Status = FileStatus.Error("Unknonw error"); + _updateStatusTimer.Enabled = false; + break; + } + + RaiseStatusChanged(); + + } private int CalculateNumberOfChunks(ulong fileSize) { diff --git a/src/WebClient/Pages/Admin.razor b/src/WebClient/Pages/Admin.razor index 3d7825f..d2181f4 100644 --- a/src/WebClient/Pages/Admin.razor +++ b/src/WebClient/Pages/Admin.razor @@ -5,8 +5,6 @@ @attribute [Authorize] @page "/admin" -Admin -

Admin

@if (User == null) diff --git a/src/WebClient/Pages/Checkout.razor b/src/WebClient/Pages/Checkout.razor index 3220143..ec9db0b 100644 --- a/src/WebClient/Pages/Checkout.razor +++ b/src/WebClient/Pages/Checkout.razor @@ -1,8 +1,6 @@ @using WebClient.Components.Checkout @page "/checkout" -Buy - RVT To IFC A price for every use diff --git a/src/WebClient/Pages/Convert.razor b/src/WebClient/Pages/Convert.razor index 7b009c9..f98f335 100644 --- a/src/WebClient/Pages/Convert.razor +++ b/src/WebClient/Pages/Convert.razor @@ -3,7 +3,7 @@ @attribute [Authorize] @page "/convert" -Convert +

Convert

@if (User == null) { @@ -16,4 +16,8 @@ else - +
+

History

+ +
+ diff --git a/src/WebClient/Pages/Home.razor b/src/WebClient/Pages/Home.razor index 04f0da5..4fba6f2 100644 --- a/src/WebClient/Pages/Home.razor +++ b/src/WebClient/Pages/Home.razor @@ -1,7 +1,5 @@ @page "/" -Home - RVT To IFC Convert your design online diff --git a/src/WebClient/wwwroot/index.html b/src/WebClient/wwwroot/index.html index abb4c1e..7a9fc43 100644 --- a/src/WebClient/wwwroot/index.html +++ b/src/WebClient/wwwroot/index.html @@ -4,7 +4,7 @@ - WebClient + RVT To IFC