From 7dd84b6f13d8b21838df7fe9b3db8cf197038bca Mon Sep 17 00:00:00 2001 From: antoineatrhea Date: Thu, 29 Sep 2022 15:43:28 +0200 Subject: [PATCH] Upload from live session implemented : Fix #27 --- .../CometConnectionTestFixture.cs | 145 +++ .../Helpers/JsonSerializerHelper.cs | 85 -- .../ProjectPages/ProjectPageTestFixture.cs | 11 +- .../CometService/CometServiceTestFixture.cs | 128 +++ .../ParticipantServiceTestFixture.cs | 23 +- .../ProjectServiceTestFixture.cs | 19 +- .../RoleService/RoleServiceTestFixture.cs | 21 +- .../UserService/UserServiceTestFixture.cs | 17 +- .../AnnotationServiceTestFixture.cs | 21 +- .../ArtifactServiceTestFixture.cs | 88 ++ .../AuthenticationServiceTestFixture.cs | 11 +- .../ReplyService/ReplyServiceTestFixture.cs | 21 +- .../ReviewObjectiveServiceTestFixture.cs | 20 +- .../ReviewService/ReviewServiceTestFixture.cs | 21 +- .../ReviewTaskServiceTestFixture.cs | 21 +- .../UI_DSM.Client.Tests.csproj | 2 + .../ModelManagement/CometConnection.razor | 58 + .../ModelManagement/CometConnection.razor.cs | 132 +++ .../Enumerator/AuthenticationStatus.cs | 17 +- .../UI_DSM.Client/Enumerator/UploadStatus.cs | 41 + .../ProjectPages/ProjectPage.razor | 10 + .../ProjectPages/ProjectPage.razor.cs | 6 + UI_DSM/UI_DSM.Client/Program.cs | 1 + .../CometService/CometService.cs | 106 ++ .../CometService/ICometService.cs | 58 + .../ParticipantService/ParticipantService.cs | 6 +- .../ProjectService/ProjectService.cs | 6 +- .../Administration/RoleService/RoleService.cs | 4 +- .../Administration/UserService/UserService.cs | 10 +- .../AnnotationService/AnnotationService.cs | 4 +- .../ArtifactService/ArtifactService.cs | 77 ++ .../ArtifactService/IArtifactService.cs | 33 + .../AuthenticationService.cs | 8 +- .../Services/EntityServiceBase.cs | 60 +- ...DeserializerService.cs => IJsonService.cs} | 12 +- ...nDeserializerService.cs => JsonService.cs} | 54 +- .../Services/ReplyService/ReplyService.cs | 4 +- .../ReviewObjectiveService.cs | 4 +- .../Services/ReviewService/ReviewService.cs | 4 +- .../ReviewTaskService/ReviewTaskService.cs | 4 +- UI_DSM/UI_DSM.Client/Services/ServiceBase.cs | 10 +- UI_DSM/UI_DSM.Client/UI_DSM.Client.csproj | 11 +- .../CometConnectionViewModel.cs | 263 +++++ .../ICometConnectionViewModel.cs | 104 ++ .../ProjectPages/IProjectPageViewModel.cs | 21 +- .../ProjectPages/ProjectPageViewModel.cs | 102 +- UI_DSM/UI_DSM.Client/_Imports.razor | 1 + .../Helpers/PropertyReflectionHelper.cs | 6 + .../Templates/dto-class-template.hbs | 6 +- .../Data/sample.json | 8 + .../JsonDeserializerTestFixture.cs | 2 +- .../JsonSerializerTestFixture.cs | 12 +- .../DeserializationProvider.cs | 1 + .../ModelDtoDeserializer.cs | 77 ++ .../ProjectDtoDeserializer.cs | 13 + .../ReviewDtoDeserializer.cs | 13 + .../ModelDtoSerializer.cs | 62 + .../ProjectDtoSerializer.cs | 9 + .../ReviewDtoSerializer.cs | 9 + .../SerializationProvider.cs | 1 + .../UI_DSM.Serializer.Json.csproj | 2 +- .../26699a14-79d0-4f10-bcf1-15979ef3968f.zip | Bin 0 -> 459339 bytes .../Helpers/ModuleTestHelper.cs | 2 +- .../Managers/ArtifactManagerTestFixture.cs | 174 +++ .../Managers/ModelManagerTestFixture.cs | 157 +++ .../Managers/ProjectManagerTestFixture.cs | 6 +- .../Managers/ReviewManagerTestFixture.cs | 7 +- .../Modules/AnnotationModuleTestFixture.cs | 8 +- .../Modules/ArtifactModuleTestFixture.cs | 151 +++ .../Modules/CometModuleTestFixture.cs | 161 +++ .../Modules/ParticipantModuleTestFixture.cs | 10 +- .../Modules/ReplyModuleTestFixture.cs | 5 +- .../Modules/ReviewModuleTestFixture.cs | 8 +- .../ReviewObjectiveModuleTestFixture.cs | 7 +- .../Modules/ReviewTaskModuleTestFixture.cs | 7 +- .../Negotiator/JsonNegotiatorTestFixture.cs | 81 ++ .../Services/CometServiceTestFixture.cs | 66 ++ .../Services/FileServiceTestFixture.cs | 84 ++ .../UI_DSM.Server.Tests.csproj | 6 + .../UI_DSM.Server/Context/DatabaseContext.cs | 19 +- .../ArtifactManager/ArtifactManager.cs | 210 ++++ .../ArtifactManager/IArtifactManager.cs | 24 + .../Managers/ModelManager/IModelManager.cs | 24 + .../Managers/ModelManager/ModelManager.cs | 231 ++++ .../Managers/ProjectManager/ProjectManager.cs | 28 +- .../Managers/ReviewManager/ReviewManager.cs | 14 +- .../20220922150534_ModelMigration.Designer.cs | 1003 +++++++++++++++++ .../20220922150534_ModelMigration.cs | 133 +++ .../DatabaseContextModelSnapshot.cs | 92 +- .../UI_DSM.Server/Modules/ArtifactModule.cs | 188 +++ UI_DSM/UI_DSM.Server/Modules/CometModule.cs | 228 ++++ .../Modules/ContainedEntityModule.cs | 3 +- UI_DSM/UI_DSM.Server/Modules/EntityModule.cs | 71 +- UI_DSM/UI_DSM.Server/Program.cs | 8 +- .../Services/CometService/CometService.cs | 233 ++++ .../Services/CometService/ICometService.cs | 78 ++ .../Services/FileService/FileService.cs | 163 +++ .../Services/FileService/IFileService.cs | 69 ++ .../Validator/ArtifactValidator.cs | 32 + .../CometAuthenticationDataValidator.cs | 35 + .../Validator/ModelUploadDataValidator.cs | 34 + .../Validator/ReviewDtoValidator.cs | 1 + UI_DSM/UI_DSM.Server/appsettings.json | 1 + .../DTO/CometData/CometAuthenticationData.cs | 44 + .../CometData/CometAuthenticationResponse.cs | 28 + .../DTO/CometData/ModelUploadData.cs | 31 + .../DTO/CometData/ModelUploadResponse.cs | 28 + .../DTO/CometData/ModelsDataResponse.cs | 33 + .../UI_DSM.Shared/DTO/Models/ArtifactDto.cs | 32 + .../DTO/Models/AutoGenDto/ArtifactDto.cs | 51 + .../DTO/Models/AutoGenDto/ModelDto.cs | 59 + .../DTO/Models/AutoGenDto/ProjectDto.cs | 7 + .../DTO/Models/AutoGenDto/ReviewDto.cs | 7 + UI_DSM/UI_DSM.Shared/Models/Artifact.cs | 69 ++ UI_DSM/UI_DSM.Shared/Models/Model.cs | 79 ++ UI_DSM/UI_DSM.Shared/Models/Project.cs | 11 +- UI_DSM/UI_DSM.Shared/Models/Review.cs | 11 +- UI_DSM/UI_DSM.sln | 2 +- 118 files changed, 6138 insertions(+), 322 deletions(-) create mode 100644 UI_DSM/UI_DSM.Client.Tests/Components/Administration/ModelManagement/CometConnectionTestFixture.cs delete mode 100644 UI_DSM/UI_DSM.Client.Tests/Helpers/JsonSerializerHelper.cs create mode 100644 UI_DSM/UI_DSM.Client.Tests/Services/Administration/CometService/CometServiceTestFixture.cs create mode 100644 UI_DSM/UI_DSM.Client.Tests/Services/ArtifactService/ArtifactServiceTestFixture.cs create mode 100644 UI_DSM/UI_DSM.Client/Components/Administration/ModelManagement/CometConnection.razor create mode 100644 UI_DSM/UI_DSM.Client/Components/Administration/ModelManagement/CometConnection.razor.cs create mode 100644 UI_DSM/UI_DSM.Client/Enumerator/UploadStatus.cs create mode 100644 UI_DSM/UI_DSM.Client/Services/Administration/CometService/CometService.cs create mode 100644 UI_DSM/UI_DSM.Client/Services/Administration/CometService/ICometService.cs create mode 100644 UI_DSM/UI_DSM.Client/Services/ArtifactService/ArtifactService.cs create mode 100644 UI_DSM/UI_DSM.Client/Services/ArtifactService/IArtifactService.cs rename UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/{IJsonDeserializerService.cs => IJsonService.cs} (72%) rename UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/{JsonDeserializerService.cs => JsonService.cs} (58%) create mode 100644 UI_DSM/UI_DSM.Client/ViewModels/Components/Administration/ModelManagement/CometConnectionViewModel.cs create mode 100644 UI_DSM/UI_DSM.Client/ViewModels/Components/Administration/ModelManagement/ICometConnectionViewModel.cs create mode 100644 UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ModelDtoDeserializer.cs create mode 100644 UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ModelDtoSerializer.cs create mode 100644 UI_DSM/UI_DSM.Server.Tests/Data/26699a14-79d0-4f10-bcf1-15979ef3968f.zip create mode 100644 UI_DSM/UI_DSM.Server.Tests/Managers/ArtifactManagerTestFixture.cs create mode 100644 UI_DSM/UI_DSM.Server.Tests/Managers/ModelManagerTestFixture.cs create mode 100644 UI_DSM/UI_DSM.Server.Tests/Modules/ArtifactModuleTestFixture.cs create mode 100644 UI_DSM/UI_DSM.Server.Tests/Modules/CometModuleTestFixture.cs create mode 100644 UI_DSM/UI_DSM.Server.Tests/Negotiator/JsonNegotiatorTestFixture.cs create mode 100644 UI_DSM/UI_DSM.Server.Tests/Services/CometServiceTestFixture.cs create mode 100644 UI_DSM/UI_DSM.Server.Tests/Services/FileServiceTestFixture.cs create mode 100644 UI_DSM/UI_DSM.Server/Managers/ArtifactManager/ArtifactManager.cs create mode 100644 UI_DSM/UI_DSM.Server/Managers/ArtifactManager/IArtifactManager.cs create mode 100644 UI_DSM/UI_DSM.Server/Managers/ModelManager/IModelManager.cs create mode 100644 UI_DSM/UI_DSM.Server/Managers/ModelManager/ModelManager.cs create mode 100644 UI_DSM/UI_DSM.Server/Migrations/20220922150534_ModelMigration.Designer.cs create mode 100644 UI_DSM/UI_DSM.Server/Migrations/20220922150534_ModelMigration.cs create mode 100644 UI_DSM/UI_DSM.Server/Modules/ArtifactModule.cs create mode 100644 UI_DSM/UI_DSM.Server/Modules/CometModule.cs create mode 100644 UI_DSM/UI_DSM.Server/Services/CometService/CometService.cs create mode 100644 UI_DSM/UI_DSM.Server/Services/CometService/ICometService.cs create mode 100644 UI_DSM/UI_DSM.Server/Services/FileService/FileService.cs create mode 100644 UI_DSM/UI_DSM.Server/Services/FileService/IFileService.cs create mode 100644 UI_DSM/UI_DSM.Server/Validator/ArtifactValidator.cs create mode 100644 UI_DSM/UI_DSM.Server/Validator/CometAuthenticationDataValidator.cs create mode 100644 UI_DSM/UI_DSM.Server/Validator/ModelUploadDataValidator.cs create mode 100644 UI_DSM/UI_DSM.Shared/DTO/CometData/CometAuthenticationData.cs create mode 100644 UI_DSM/UI_DSM.Shared/DTO/CometData/CometAuthenticationResponse.cs create mode 100644 UI_DSM/UI_DSM.Shared/DTO/CometData/ModelUploadData.cs create mode 100644 UI_DSM/UI_DSM.Shared/DTO/CometData/ModelUploadResponse.cs create mode 100644 UI_DSM/UI_DSM.Shared/DTO/CometData/ModelsDataResponse.cs create mode 100644 UI_DSM/UI_DSM.Shared/DTO/Models/ArtifactDto.cs create mode 100644 UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ArtifactDto.cs create mode 100644 UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ModelDto.cs create mode 100644 UI_DSM/UI_DSM.Shared/Models/Artifact.cs create mode 100644 UI_DSM/UI_DSM.Shared/Models/Model.cs diff --git a/UI_DSM/UI_DSM.Client.Tests/Components/Administration/ModelManagement/CometConnectionTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Components/Administration/ModelManagement/CometConnectionTestFixture.cs new file mode 100644 index 00000000..a3f51c8f --- /dev/null +++ b/UI_DSM/UI_DSM.Client.Tests/Components/Administration/ModelManagement/CometConnectionTestFixture.cs @@ -0,0 +1,145 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.Tests.Components.Administration.ModelManagement +{ + using Bunit; + + using Microsoft.AspNetCore.Components; + using Microsoft.AspNetCore.Components.Forms; + + using Moq; + + using NUnit.Framework; + + using UI_DSM.Client.Components.Administration.ModelManagement; + using UI_DSM.Client.Services.Administration.CometService; + using UI_DSM.Client.Tests.Helpers; + using UI_DSM.Client.ViewModels.Components.Administration.ModelManagement; + using UI_DSM.Shared.DTO.CometData; + + using TestContext = Bunit.TestContext; + + [TestFixture] + public class CometConnectionTestFixture + { + private TestContext context; + private ICometConnectionViewModel viewModel; + private Mock cometService; + + [SetUp] + public void Setup() + { + this.context = new TestContext(); + this.context.ConfigureDevExpressBlazor(); + this.cometService = new Mock(); + this.viewModel = new CometConnectionViewModel(this.cometService.Object); + } + + [TearDown] + public void Teardown() + { + this.context.CleanContext(); + this.viewModel.Dispose(); + } + + [Test] + public async Task VerifyComponent() + { + var renderer = this.context.RenderComponent(parameters => + { + parameters.Add(p => p.ViewModel, this.viewModel); + }); + + this.viewModel.InitializeProperties(); + + var editForm = renderer.FindComponent(); + + this.viewModel.AuthenticationData.Url = "http://localhost"; + this.viewModel.AuthenticationData.UserName = "admin"; + this.viewModel.AuthenticationData.Password = "password"; + + this.cometService.Setup(x => x.Login(this.viewModel.AuthenticationData)).ReturnsAsync(new CometAuthenticationResponse() + { + IsRequestSuccessful = false + }); + + await renderer.InvokeAsync(editForm.Instance.OnValidSubmit.InvokeAsync); + Assert.That(renderer.Instance.ConnectButtonText, Is.EqualTo("Retry")); + + var sessionId = Guid.NewGuid(); + + this.cometService.Setup(x => x.Login(this.viewModel.AuthenticationData)).ReturnsAsync(new CometAuthenticationResponse() + { + IsRequestSuccessful = true, + SessionId = sessionId + }); + + var modelGuid = Guid.NewGuid(); + var iterationGuid = Guid.NewGuid(); + + var modelsData = new ModelsDataResponse() + { + ModelNames = new Dictionary(), + AvailableModels = new Dictionary>>() + }; + + modelsData.ModelNames[modelGuid] = "LOFT"; + + modelsData.AvailableModels[modelGuid] = new List> + { + new (iterationGuid, "Iteration 1") + }; + + this.cometService.Setup(x => x.GetAvailableEngineeringModels(It.IsAny())) + .ReturnsAsync(modelsData); + + await renderer.InvokeAsync(editForm.Instance.OnValidSubmit.InvokeAsync); + Assert.That(this.viewModel.AuthenticationData.Password, Is.Empty); + + this.viewModel.OnEventCallback = new EventCallbackFactory().Create(this.viewModel, async () => + { + var upload = await this.cometService.Object.UploadIteration(sessionId, modelGuid, iterationGuid); + + if(!upload.IsRequestSuccessful) + { + this.viewModel.HandleUploadFailure(upload); + } + else + { + await this.viewModel.CometLogout(); + } + }); + + this.viewModel.SelectedEngineeringModelSetup = new Tuple(modelGuid, "LOFT"); + + this.cometService.Setup(x => x.UploadIteration(sessionId, modelGuid, iterationGuid)) + .ReturnsAsync(new ModelUploadResponse() + { + IsRequestSuccessful = false, + Errors = new List{"Error during uploading"} + }); + + await renderer.InvokeAsync(this.viewModel.OnEventCallback.InvokeAsync); + Assert.That(renderer.Instance.UploadText, Is.EqualTo("Retry...")); + + this.cometService.Setup(x => x.UploadIteration(sessionId, modelGuid, iterationGuid)) + .ReturnsAsync(new ModelUploadResponse() + { + IsRequestSuccessful = true + }); + + await renderer.InvokeAsync(this.viewModel.OnEventCallback.InvokeAsync); + } + } +} diff --git a/UI_DSM/UI_DSM.Client.Tests/Helpers/JsonSerializerHelper.cs b/UI_DSM/UI_DSM.Client.Tests/Helpers/JsonSerializerHelper.cs deleted file mode 100644 index 45f4893a..00000000 --- a/UI_DSM/UI_DSM.Client.Tests/Helpers/JsonSerializerHelper.cs +++ /dev/null @@ -1,85 +0,0 @@ -// -------------------------------------------------------------------------------------------------------- -// -// Copyright (c) 2022 RHEA System S.A. -// -// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft -// -// This file is part of UI-DSM. -// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. -// -// The UI-DSM application is provided to the community under the Apache License 2.0. -// -// -------------------------------------------------------------------------------------------------------- - -namespace UI_DSM.Client.Tests.Helpers -{ - using System.Text.Json; - - using UI_DSM.Serializer.Json; - using UI_DSM.Shared.DTO.Common; - using UI_DSM.Shared.DTO.Models; - - using JsonSerializer = UI_DSM.Serializer.Json.JsonSerializer; - - /// - /// Helper class for all call to Json Serialization inside tests - /// - public static class JsonSerializerHelper - { - /// - /// The - /// - private static readonly JsonWriterOptions Settings = new() - { - Indented = true - }; - - private static readonly IJsonSerializer Serializer = new JsonSerializer(); - - /// - /// Serialize the to a Json with the correct settings applied - /// - /// The to serialize - /// The Json output - public static string SerializeObject(object model) - { - var stream = new MemoryStream(); - - if (model is EntityDto dto) - { - Serializer.Serialize(dto, stream, Settings); - return ReadStreamResult(stream); - } - - if (model is IEnumerable dtos) - { - Serializer.Serialize(dtos, stream, Settings); - return ReadStreamResult(stream); - } - - if (model is EntityRequestResponseDto entityRequest) - { - Serializer.SerializeEntityRequestDto(entityRequest, stream, Settings); - return ReadStreamResult(stream); - } - - return System.Text.Json.JsonSerializer.Serialize(model, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = false - }); - } - - /// - /// Reads the content of a - /// - /// The - /// The content of the - private static string ReadStreamResult(Stream stream) - { - using var reader = new StreamReader(stream); - stream.Seek(0, SeekOrigin.Begin); - var serialized = reader.ReadToEnd(); - return serialized; - } - } -} diff --git a/UI_DSM/UI_DSM.Client.Tests/Pages/Administration/ProjectPages/ProjectPageTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Pages/Administration/ProjectPages/ProjectPageTestFixture.cs index dc699495..2cdaf123 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Pages/Administration/ProjectPages/ProjectPageTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Pages/Administration/ProjectPages/ProjectPageTestFixture.cs @@ -26,6 +26,8 @@ namespace UI_DSM.Client.Tests.Pages.Administration.ProjectPages using UI_DSM.Client.Services.Administration.ParticipantService; using UI_DSM.Client.Services.Administration.ProjectService; using UI_DSM.Client.Services.Administration.RoleService; + using UI_DSM.Client.Services.ArtifactService; + using UI_DSM.Client.ViewModels.Components.Administration.ModelManagement; using UI_DSM.Client.ViewModels.Pages.Administration.ProjectPages; using UI_DSM.Shared.Models; using UI_DSM.Shared.Types; @@ -40,6 +42,8 @@ public class ProjectPageTestFixture private Mock projectService; private Mock participantService; private Mock roleService; + private Mock artifactService; + private Mock cometConnexionViewModel; [SetUp] public void Setup() @@ -48,7 +52,12 @@ public void Setup() this.projectService = new Mock(); this.participantService = new Mock(); this.roleService = new Mock(); - this.viewModel = new ProjectPageViewModel(this.projectService.Object, this.participantService.Object, this.roleService.Object); + this.cometConnexionViewModel = new Mock(); + this.artifactService = new Mock(); + + this.viewModel = new ProjectPageViewModel(this.projectService.Object, this.participantService.Object, this.roleService.Object, + this.cometConnexionViewModel.Object, this.artifactService.Object); + this.context.Services.AddSingleton(this.viewModel); } diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/Administration/CometService/CometServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/CometService/CometServiceTestFixture.cs new file mode 100644 index 00000000..63ceec2e --- /dev/null +++ b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/CometService/CometServiceTestFixture.cs @@ -0,0 +1,128 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.Tests.Services.Administration.CometService +{ + using System.Net; + + using NUnit.Framework; + + using RichardSzalay.MockHttp; + + using UI_DSM.Client.Services; + using UI_DSM.Client.Services.Administration.CometService; + using UI_DSM.Client.Services.JsonDeserializerProvider; + using UI_DSM.Serializer.Json; + using UI_DSM.Shared.DTO.CometData; + + [TestFixture] + public class CometServiceTestFixture + { + private CometService service; + private MockHttpMessageHandler httpMessageHandler; + private IJsonService jsonService; + + [SetUp] + public void Setup() + { + this.httpMessageHandler = new MockHttpMessageHandler(); + var httpClient = this.httpMessageHandler.ToHttpClient(); + httpClient.BaseAddress = new Uri("http://localhost/api"); + + ServiceBase.RegisterService(); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new CometService(httpClient, this.jsonService); + } + + [Test] + public async Task VerifyLogin() + { + var httpResponse = new HttpResponseMessage(); + var request = this.httpMessageHandler.When(HttpMethod.Post, "/Comet/Login"); + + var cometAuthentication = new CometAuthenticationData(); + + request.Respond(_ => httpResponse); + Assert.That(async () => await this.service.Login(cometAuthentication), Throws.Exception); + + httpResponse.Content = new StringContent(this.jsonService.Serialize(new CometAuthenticationResponse() + { + IsRequestSuccessful = false + })); + + Assert.That((await this.service.Login(cometAuthentication)).IsRequestSuccessful, Is.False); + + httpResponse.Content = new StringContent(this.jsonService.Serialize(new CometAuthenticationResponse() + { + SessionId = Guid.NewGuid(), + IsRequestSuccessful = true + })); + + Assert.That((await this.service.Login(cometAuthentication)).IsRequestSuccessful, Is.True); + } + + [Test] + public async Task VerifyLogout() + { + var sessionId = Guid.NewGuid(); + var httpResponse = new HttpResponseMessage(); + httpResponse.StatusCode = HttpStatusCode.NotFound; + var request = this.httpMessageHandler.When(HttpMethod.Delete, $"/Comet/{sessionId}"); + request.Respond(_ => httpResponse); + + Assert.That(await this.service.Logout(sessionId), Is.False); + + httpResponse.StatusCode = HttpStatusCode.OK; + Assert.That(await this.service.Logout(sessionId), Is.True); + } + + [Test] + public async Task VerifyGetAvailableEngineeringModels() + { + var sessionId = Guid.NewGuid(); + var httpResponse = new HttpResponseMessage(); + httpResponse.StatusCode = HttpStatusCode.NotFound; + var request = this.httpMessageHandler.When(HttpMethod.Get, $"/Comet/{sessionId}/Models"); + request.Respond(_ => httpResponse); + + Assert.That(async () => await this.service.GetAvailableEngineeringModels(sessionId), Throws.Exception); + + httpResponse.StatusCode = HttpStatusCode.OK; + + var modelDataResponse = new ModelsDataResponse() + { + IsRequestSuccessful = true, + }; + + httpResponse.Content = new StringContent(this.jsonService.Serialize(modelDataResponse)); + Assert.That((await this.service.GetAvailableEngineeringModels(sessionId)).IsRequestSuccessful, Is.True); + } + + [Test] + public async Task VerifyUploadIteration() + { + var sessionId = Guid.NewGuid(); + var httpResponse = new HttpResponseMessage(); + var request = this.httpMessageHandler.When(HttpMethod.Post, $"/Comet/{sessionId}/Models/Upload"); + request.Respond(_ => httpResponse); + + var modelUploadResponse = new ModelUploadResponse() + { + IsRequestSuccessful = true + }; + + httpResponse.Content = new StringContent(this.jsonService.Serialize(modelUploadResponse)); + Assert.That((await this.service.UploadIteration(sessionId, Guid.NewGuid(),Guid.NewGuid())).IsRequestSuccessful, Is.True); + } + } +} diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/Administration/ParticipantService/ParticipantServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/ParticipantService/ParticipantServiceTestFixture.cs index 6bfdf9e6..36e28764 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/Administration/ParticipantService/ParticipantServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/ParticipantService/ParticipantServiceTestFixture.cs @@ -22,7 +22,6 @@ namespace UI_DSM.Client.Tests.Services.Administration.ParticipantService using UI_DSM.Client.Services; using UI_DSM.Client.Services.Administration.ParticipantService; using UI_DSM.Client.Services.JsonDeserializerProvider; - using UI_DSM.Client.Tests.Helpers; using UI_DSM.Serializer.Json; using UI_DSM.Shared.DTO.Common; using UI_DSM.Shared.DTO.Models; @@ -35,7 +34,7 @@ public class ParticipantServiceTestFixture { private ParticipantService service; private MockHttpMessageHandler httpMessageHandler; - private IJsonDeserializerService jsonDeserializerService; + private IJsonService jsonService; [SetUp] public void Setup() @@ -45,8 +44,8 @@ public void Setup() httpClient.BaseAddress = new Uri("http://localhost/api"); ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); - this.service = new ParticipantService(httpClient, this.jsonDeserializerService); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new ParticipantService(httpClient, this.jsonService); } [Test] @@ -110,7 +109,7 @@ public async Task VerifyGetParticipants() } }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entitiesDto)); var participants = await this.service.GetParticipantsOfProject(projectId); Assert.That(participants, Has.Count.EqualTo(2)); @@ -159,7 +158,7 @@ public async Task VerifyGetParticipant() } }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entitiesDto)); participant = await this.service.GetParticipantOfProject(projectId,guid); Assert.That(participant.Id, Is.EqualTo(guid)); @@ -197,7 +196,7 @@ public async Task VerifyCreateParticipant() IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Post, $"/Project/{projectId}/Participant/Create"); request.Respond(_ => httpResponse); @@ -209,7 +208,7 @@ public async Task VerifyCreateParticipant() entityRequestResponse.Entities = participant.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); requestResponse = await this.service.CreateParticipant(projectId, participant); @@ -247,7 +246,7 @@ public async Task VerifyDeleteParticipant() var httpResponse = new HttpResponseMessage(); var requestResponse = new RequestResponseDto() { IsRequestSuccessful = true }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Delete, $"/Project/{project.Id}/Participant/{participant.Id}"); request.Respond(_ => httpResponse); @@ -284,7 +283,7 @@ public async Task VerifyUpdateParticipant() var httpResponse = new HttpResponseMessage(); var requestResponse = new EntityRequestResponseDto() { IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Put, $"/Project/{project.Id}/Participant/{participant.Id}"); request.Respond(_ => httpResponse); @@ -299,7 +298,7 @@ public async Task VerifyUpdateParticipant() requestResponse.Entities = participant.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); requestResult = await this.service.UpdateParticipant(participant); Assert.That(requestResult.IsRequestSuccessful, Is.True); @@ -338,7 +337,7 @@ public async Task VerifyGetAvailableUsersForCreation() } }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(usersEntities.ToDtos())); + httpResponse.Content = new StringContent(this.jsonService.Serialize(usersEntities.ToDtos())); var availableUsers = await this.service.GetAvailableUsersForCreation(projectId); Assert.That(availableUsers, Has.Count.EqualTo(3)); } diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/Administration/ProjectService/ProjectServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/ProjectService/ProjectServiceTestFixture.cs index a8c62592..a1034956 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/Administration/ProjectService/ProjectServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/ProjectService/ProjectServiceTestFixture.cs @@ -23,7 +23,6 @@ namespace UI_DSM.Client.Tests.Services.Administration.ProjectService using UI_DSM.Client.Services; using UI_DSM.Client.Services.Administration.ProjectService; using UI_DSM.Client.Services.JsonDeserializerProvider; - using UI_DSM.Client.Tests.Helpers; using UI_DSM.Serializer.Json; using UI_DSM.Shared.DTO.Common; using UI_DSM.Shared.DTO.Models; @@ -35,7 +34,7 @@ public class ProjectServiceTestFixture { private ProjectService service; private MockHttpMessageHandler httpMessageHandler; - private IJsonDeserializerService jsonDeserializerService; + private IJsonService jsonService; [SetUp] public void Setup() @@ -45,8 +44,8 @@ public void Setup() httpClient.BaseAddress = new Uri("http://localhost/api"); ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); - this.service = new ProjectService(httpClient, this.jsonDeserializerService); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new ProjectService(httpClient, this.jsonService); } [Test] @@ -69,7 +68,7 @@ public void VerifyGetProjects() } }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(projectDtos)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(projectDtos)); var projects = this.service.GetProjects().Result; Assert.That(projects.Count, Is.EqualTo(1)); @@ -92,7 +91,7 @@ public async Task VerifyCreateProject() IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Post, "/Project/Create"); request.Respond(_ => httpResponse); @@ -105,7 +104,7 @@ public async Task VerifyCreateProject() project.ToDto() }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var result = await this.service.CreateProject(project); @@ -125,7 +124,7 @@ public void VerifyDeleteProject() var project = new Project(Guid.NewGuid()); var httpResponse = new HttpResponseMessage(); var requestResponse = new RequestResponseDto() { IsRequestSuccessful = true }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Delete, $"/Project/{project.Id}"); request.Respond(_ => httpResponse); @@ -155,7 +154,7 @@ public async Task VerifyGetProject() ProjectName = "Project" }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(new List(){projectDto})); + httpResponse.Content = new StringContent(this.jsonService.Serialize(new List(){projectDto})); project = await this.service.GetProject(guid); Assert.That(project.Id, Is.EqualTo(guid)); @@ -181,7 +180,7 @@ public async Task VerifyGetUserParticipation() }; httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(projects.ToDtos())); + httpResponse.Content = new StringContent(this.jsonService.Serialize(projects.ToDtos())); var foundProject = await this.service.GetUserParticipation(); Assert.That(foundProject, Has.Count.EqualTo(2)); } diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/Administration/RoleService/RoleServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/RoleService/RoleServiceTestFixture.cs index 8aa0f59c..daf9dc32 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/Administration/RoleService/RoleServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/RoleService/RoleServiceTestFixture.cs @@ -22,7 +22,6 @@ namespace UI_DSM.Client.Tests.Services.Administration.RoleService using UI_DSM.Client.Services; using UI_DSM.Client.Services.Administration.RoleService; using UI_DSM.Client.Services.JsonDeserializerProvider; - using UI_DSM.Client.Tests.Helpers; using UI_DSM.Serializer.Json; using UI_DSM.Shared.DTO.Common; using UI_DSM.Shared.DTO.Models; @@ -34,7 +33,7 @@ public class RoleServiceTestFixture { private RoleService service; private MockHttpMessageHandler httpMessageHandler; - private IJsonDeserializerService jsonDeserializerService; + private IJsonService jsonService; [SetUp] public void Setup() @@ -44,8 +43,8 @@ public void Setup() httpClient.BaseAddress = new Uri("http://localhost/api"); ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); - this.service = new RoleService(httpClient, this.jsonDeserializerService); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new RoleService(httpClient, this.jsonService); } [Test] @@ -72,7 +71,7 @@ public void VerifyGetRoles() } }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(rolesDtos)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(rolesDtos)); var roles = this.service.GetRoles().Result; Assert.That(roles.Count, Is.EqualTo(1)); @@ -104,7 +103,7 @@ public async Task VerifyGetRole() } }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(new List(){ roleDto })); + httpResponse.Content = new StringContent(this.jsonService.Serialize(new List(){ roleDto })); role = await this.service.GetRole(guid); Assert.That(role.Id, Is.EqualTo(guid)); @@ -133,7 +132,7 @@ public async Task VerifyCreateRole() IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Post, "/Role/Create"); request.Respond(_ => httpResponse); @@ -146,7 +145,7 @@ public async Task VerifyCreateRole() role.ToDto() }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var result = await this.service.CreateRole(role); Assert.Multiple(() => @@ -165,7 +164,7 @@ public void VerifyDeleteRole() var role = new Role(Guid.NewGuid()); var httpResponse = new HttpResponseMessage(); var requestResponse = new RequestResponseDto() { IsRequestSuccessful = true }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Delete, $"/Role/{role.Id}"); request.Respond(_ => httpResponse); @@ -189,7 +188,7 @@ public void VerifyUpdateRole() var httpResponse = new HttpResponseMessage(); var requestResponse = new EntityRequestResponseDto() { IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Put, $"/Role/{role.Id}"); request.Respond(_ => httpResponse); @@ -202,7 +201,7 @@ public void VerifyUpdateRole() role.ToDto() }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); Assert.That(this.service.UpdateRole(role).Result.IsRequestSuccessful, Is.True); httpResponse.Content = new StringContent(string.Empty); diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/Administration/UserService/UserServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/UserService/UserServiceTestFixture.cs index 43c5d914..7fc26360 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/Administration/UserService/UserServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/Administration/UserService/UserServiceTestFixture.cs @@ -22,7 +22,6 @@ namespace UI_DSM.Client.Tests.Services.Administration.UserService using UI_DSM.Client.Services; using UI_DSM.Client.Services.Administration.UserService; using UI_DSM.Client.Services.JsonDeserializerProvider; - using UI_DSM.Client.Tests.Helpers; using UI_DSM.Serializer.Json; using UI_DSM.Shared.DTO.Common; using UI_DSM.Shared.DTO.Models; @@ -33,7 +32,7 @@ public class UserServiceTestFixture { private UserService service; private MockHttpMessageHandler httpMessageHandler; - private IJsonDeserializerService jsonDeserializerService; + private IJsonService jsonService; [SetUp] public void Setup() @@ -43,8 +42,8 @@ public void Setup() httpClient.BaseAddress = new Uri("http://localhost/api"); ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); - this.service = new UserService(httpClient, this.jsonDeserializerService); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new UserService(httpClient, this.jsonService); } [Test] @@ -74,7 +73,7 @@ public void VerifyGetUsers() } }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(users)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(users)); var retrievedUsers = this.service.GetUsers().Result; Assert.That(retrievedUsers.Count, Is.EqualTo(users.Count)); @@ -94,7 +93,7 @@ public void VerifyRegisterUser() IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(registrationResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(registrationResponse)); var registrationResult = this.service.RegisterUser(new RegistrationDto()).Result; Assert.That(registrationResult.IsRequestSuccessful, Is.False); @@ -110,7 +109,7 @@ public void VerifyRegisterUser() Id = Guid.NewGuid() }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(registrationResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(registrationResponse)); registrationResult = this.service.RegisterUser(new RegistrationDto()).Result; Assert.That(registrationResult.IsRequestSuccessful, Is.True); Assert.That(registrationResult.CreatedUserEntity.Id, Is.EqualTo(registrationResponse.CreatedUserEntity.Id)); @@ -139,14 +138,14 @@ public void VerifyDeleteUser() httpResponse.StatusCode = HttpStatusCode.BadRequest; var requestResponse = new RequestResponseDto(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); deleteResponse = this.service.DeleteUser(userToDelete).Result; Assert.That(deleteResponse.IsRequestSuccessful, Is.False); requestResponse.IsRequestSuccessful = true; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); deleteResponse = this.service.DeleteUser(userToDelete).Result; Assert.That(deleteResponse.IsRequestSuccessful, Is.True); diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/AnnotationService/AnnotationServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/AnnotationService/AnnotationServiceTestFixture.cs index f956cbe3..c4693bab 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/AnnotationService/AnnotationServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/AnnotationService/AnnotationServiceTestFixture.cs @@ -22,7 +22,6 @@ namespace UI_DSM.Client.Tests.Services.AnnotationService using UI_DSM.Client.Services; using UI_DSM.Client.Services.AnnotationService; using UI_DSM.Client.Services.JsonDeserializerProvider; - using UI_DSM.Client.Tests.Helpers; using UI_DSM.Serializer.Json; using UI_DSM.Shared.DTO.Common; using UI_DSM.Shared.DTO.Models; @@ -36,7 +35,7 @@ public class AnnotationServiceTestFixture private AnnotationService service; private MockHttpMessageHandler httpMessageHandler; private List entitiesDto; - private JsonDeserializerService jsonDeserializerService; + private JsonService jsonService; [SetUp] public void Setup() @@ -115,8 +114,8 @@ public void Setup() ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); - this.service = new AnnotationService(httpClient, this.jsonDeserializerService); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new AnnotationService(httpClient, this.jsonService); } [Test] @@ -132,7 +131,7 @@ public async Task VerifyGetAnnotations() Assert.That(async () => await this.service.GetAnnotationsOfProject(projectId), Throws.Exception); httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); var annotations = await this.service.GetAnnotationsOfProject(projectId); Assert.That(annotations, Has.Count.EqualTo(3)); httpResponse.Content = new StringContent(string.Empty); @@ -155,7 +154,7 @@ public async Task VerifyGetAnnotation() httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); annotation = await this.service.GetAnnotation(projectId, guid); Assert.Multiple(() => @@ -186,7 +185,7 @@ public async Task VerifyCreateAnnotation() IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Post, $"/Project/{projectId}/Annotation/Create"); request.Respond(_ => httpResponse); @@ -197,7 +196,7 @@ public async Task VerifyCreateAnnotation() entityRequestResponse.Entities = annotation.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); requestResponse = await this.service.CreateAnnotation(projectId, annotation); @@ -224,7 +223,7 @@ public async Task VerifyDeleteAnnotation() var httpResponse = new HttpResponseMessage(); var requestResponse = new RequestResponseDto() { IsRequestSuccessful = true }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Delete, $"/Project/{project.Id}/Annotation/{annotation.Id}"); request.Respond(_ => httpResponse); @@ -254,7 +253,7 @@ public async Task VerifyUpdateAnnotation() var httpResponse = new HttpResponseMessage(); var requestResponse = new EntityRequestResponseDto() { IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Put, $"/Project/{project.Id}/Annotation/{annotation.Id}"); request.Respond(_ => httpResponse); @@ -269,7 +268,7 @@ public async Task VerifyUpdateAnnotation() requestResponse.Entities = annotation.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); requestResult = await this.service.UpdateAnnotation(annotation); Assert.That(requestResult.IsRequestSuccessful, Is.True); diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/ArtifactService/ArtifactServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/ArtifactService/ArtifactServiceTestFixture.cs new file mode 100644 index 00000000..cd8f42b8 --- /dev/null +++ b/UI_DSM/UI_DSM.Client.Tests/Services/ArtifactService/ArtifactServiceTestFixture.cs @@ -0,0 +1,88 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.Tests.Services.ArtifactService +{ + using NUnit.Framework; + + using RichardSzalay.MockHttp; + + using UI_DSM.Client.Services; + using UI_DSM.Client.Services.ArtifactService; + using UI_DSM.Client.Services.JsonDeserializerProvider; + using UI_DSM.Serializer.Json; + using UI_DSM.Shared.DTO.Common; + using UI_DSM.Shared.Extensions; + using UI_DSM.Shared.Models; + + [TestFixture] + public class ArtifactServiceTestFixture + { + private ArtifactService service; + private MockHttpMessageHandler httpMessageHandler; + private JsonService jsonService; + + [SetUp] + public void Setup() + { + this.httpMessageHandler = new MockHttpMessageHandler(); + var httpClient = this.httpMessageHandler.ToHttpClient(); + httpClient.BaseAddress = new Uri("http://localhost/api"); + + ServiceBase.RegisterService(); + + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new ArtifactService(httpClient, this.jsonService); + } + + [Test] + public async Task VerifyUploadModel() + { + var projectId = Guid.NewGuid(); + var fileName = $"{Guid.NewGuid()}.zip"; + var modelName = "A Model - Iteration 1"; + + var httpResponse = new HttpResponseMessage(); + + var entityRequestResponse = new EntityRequestResponseDto() + { + IsRequestSuccessful = false + }; + + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); + var request = this.httpMessageHandler.When(HttpMethod.Post, $"/Project/{projectId}/Artifact/Create"); + request.Respond(_ => httpResponse); + + var requestResponse = await this.service.UploadModel(projectId, fileName, modelName); + Assert.That(requestResponse.IsRequestSuccessful, Is.False); + + entityRequestResponse.IsRequestSuccessful = true; + + entityRequestResponse.Entities = new Model().GetAssociatedEntities().ToDtos(); + + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); + + requestResponse = await this.service.UploadModel(projectId, fileName, modelName); + + Assert.Multiple(() => + { + Assert.That(requestResponse.IsRequestSuccessful, Is.True); + Assert.That(requestResponse.Entity, Is.Not.Null); + }); + + httpResponse.Content = new StringContent(string.Empty); + + Assert.That(async () => await this.service.UploadModel(projectId, fileName, modelName), Throws.Exception); + } + } +} diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/AuthenticationService/AuthenticationServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/AuthenticationService/AuthenticationServiceTestFixture.cs index b842c4f1..040c7647 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/AuthenticationService/AuthenticationServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/AuthenticationService/AuthenticationServiceTestFixture.cs @@ -26,7 +26,6 @@ namespace UI_DSM.Client.Tests.Services.AuthenticationService using UI_DSM.Client.Services; using UI_DSM.Client.Services.AuthenticationService; using UI_DSM.Client.Services.JsonDeserializerProvider; - using UI_DSM.Client.Tests.Helpers; using UI_DSM.Serializer.Json; using UI_DSM.Shared.DTO.UserManagement; @@ -37,7 +36,7 @@ public class AuthenticationServiceTestFixture private MockHttpMessageHandler httpMessageHandler; private Mock authenticationProvider; private Mock sessionStorage; - private IJsonDeserializerService jsonDeserializerService; + private IJsonService jsonService; [SetUp] public void Setup() @@ -48,9 +47,9 @@ public void Setup() var httpClient = this.httpMessageHandler.ToHttpClient(); httpClient.BaseAddress = new Uri("http://localhost/api"); ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); - this.service = new AuthenticationService(httpClient, this.jsonDeserializerService, + this.service = new AuthenticationService(httpClient, this.jsonService, this.authenticationProvider.Object, this.sessionStorage.Object); } @@ -62,7 +61,7 @@ public void VerifyLogin() var httpResponseMessage = new HttpResponseMessage() { StatusCode = HttpStatusCode.Unauthorized, - Content = new StringContent(JsonSerializerHelper.SerializeObject(new AuthenticationResponseDto() + Content = new StringContent(this.jsonService.Serialize(new AuthenticationResponseDto() { Errors = new List() { @@ -83,7 +82,7 @@ public void VerifyLogin() httpResponseMessage.StatusCode = HttpStatusCode.OK; - httpResponseMessage.Content = new StringContent(JsonSerializerHelper.SerializeObject(new AuthenticationResponseDto() + httpResponseMessage.Content = new StringContent(this.jsonService.Serialize(new AuthenticationResponseDto() { IsRequestSuccessful = true, Token = Guid.NewGuid().ToString() diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/ReplyService/ReplyServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/ReplyService/ReplyServiceTestFixture.cs index 09952d00..ef1859cd 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/ReplyService/ReplyServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/ReplyService/ReplyServiceTestFixture.cs @@ -22,7 +22,6 @@ namespace UI_DSM.Client.Tests.Services.ReplyService using UI_DSM.Client.Services; using UI_DSM.Client.Services.JsonDeserializerProvider; using UI_DSM.Client.Services.ReplyService; - using UI_DSM.Client.Tests.Helpers; using UI_DSM.Serializer.Json; using UI_DSM.Shared.DTO.Common; using UI_DSM.Shared.DTO.Models; @@ -35,7 +34,7 @@ public class ReplyServiceTestFixture private ReplyService service; private MockHttpMessageHandler httpMessageHandler; private List entitiesDto; - private IJsonDeserializerService jsonDeserializerService; + private IJsonService jsonService; [SetUp] public void Setup() @@ -72,8 +71,8 @@ public void Setup() }; ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); - this.service = new ReplyService(httpClient, this.jsonDeserializerService); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new ReplyService(httpClient, this.jsonService); } [Test] @@ -90,7 +89,7 @@ public async Task VerifyGetReplies() Assert.That(async () => await this.service.GetRepliesOfComment(projectId, annotationId), Throws.Exception); httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); var replies = await this.service.GetRepliesOfComment(projectId, annotationId); Assert.That(replies, Has.Count.EqualTo(1)); httpResponse.Content = new StringContent(string.Empty); @@ -114,7 +113,7 @@ public async Task VerifyGetReply() httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); reply = await this.service.GetReplyOfComment(projectId, annotationId, guid); Assert.That(reply.Id, Is.EqualTo(guid)); @@ -141,7 +140,7 @@ public async Task VerifyCreateReply() IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Post, $"/Project/{projectId}/Annotation/{annotationId}/Reply/Create"); request.Respond(_ => httpResponse); @@ -152,7 +151,7 @@ public async Task VerifyCreateReply() entityRequestResponse.Entities = reply.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); requestResponse = await this.service.CreateReply(projectId, annotationId, reply); @@ -181,7 +180,7 @@ public async Task VerifyDeleteReply() var httpResponse = new HttpResponseMessage(); var requestResponse = new RequestResponseDto() { IsRequestSuccessful = true }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Delete, $"/Project/{projectId}/Annotation/{annotation.Id}/Reply/{reply.Id}"); request.Respond(_ => httpResponse); @@ -213,7 +212,7 @@ public async Task VerifyUpdateReview() var httpResponse = new HttpResponseMessage(); var requestResponse = new EntityRequestResponseDto() { IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Put, $"/Project/{projectId}/Annotation/{comment.Id}/Reply/{reply.Id}"); request.Respond(_ => httpResponse); @@ -228,7 +227,7 @@ public async Task VerifyUpdateReview() requestResponse.Entities = reply.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); requestResult = await this.service.UpdateReply(projectId, reply); Assert.That(requestResult.IsRequestSuccessful, Is.True); diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/ReviewObjectiveService/ReviewObjectiveServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/ReviewObjectiveService/ReviewObjectiveServiceTestFixture.cs index 11b992f0..b84d5a18 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/ReviewObjectiveService/ReviewObjectiveServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/ReviewObjectiveService/ReviewObjectiveServiceTestFixture.cs @@ -36,7 +36,7 @@ public class ReviewObjectiveServiceTestFixture private ReviewObjectiveService service; private MockHttpMessageHandler httpMessageHandler; private List entitiesDto; - private IJsonDeserializerService jsonDeserializerService; + private IJsonService jsonService; [SetUp] public void Setup() @@ -76,8 +76,8 @@ public void Setup() }; ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); - this.service = new ReviewObjectiveService(httpClient, this.jsonDeserializerService); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new ReviewObjectiveService(httpClient, this.jsonService); } [Test] @@ -94,7 +94,7 @@ public async Task VerifyGetReviewObjectives() Assert.That(async () => await this.service.GetReviewsObjectivesOfReview(projectId, reviewId), Throws.Exception); httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); var reviewObjectives = await this.service.GetReviewsObjectivesOfReview(projectId, reviewId); Assert.That(reviewObjectives, Has.Count.EqualTo(1)); httpResponse.Content = new StringContent(string.Empty); @@ -118,7 +118,7 @@ public async Task VerifyGetReviewObjective() httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); reviewObjective = await this.service.GetReviewObjectiveOfReview(projectId, reviewId, guid); Assert.That(reviewObjective.Id, Is.EqualTo(guid)); @@ -146,7 +146,7 @@ public async Task VerifyCreateReviewObjective() IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Post, $"/Project/{projectId}/Review/{reviewId}/ReviewObjective/Create"); request.Respond(_ => httpResponse); @@ -157,7 +157,7 @@ public async Task VerifyCreateReviewObjective() entityRequestResponse.Entities = reviewObjective.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); requestResponse = await this.service.CreateReviewObjective(projectId, reviewId, reviewObjective); @@ -188,7 +188,7 @@ public async Task VerifyDeleteReviewObjective() var httpResponse = new HttpResponseMessage(); var requestResponse = new RequestResponseDto() { IsRequestSuccessful = true }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Delete, $"/Project/{projectId}/Review/{review.Id}/ReviewObjective/{reviewObjective.Id}"); request.Respond(_ => httpResponse); @@ -222,7 +222,7 @@ public async Task VerifyUpdateReview() var httpResponse = new HttpResponseMessage(); var requestResponse = new EntityRequestResponseDto() { IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Put, $"/Project/{projectId}/Review/{review.Id}/ReviewObjective/{reviewObjective.Id}"); request.Respond(_ => httpResponse); @@ -237,7 +237,7 @@ public async Task VerifyUpdateReview() requestResponse.Entities = reviewObjective.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); requestResult = await this.service.UpdateReviewObjective(projectId, reviewObjective); Assert.That(requestResult.IsRequestSuccessful, Is.True); diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/ReviewService/ReviewServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/ReviewService/ReviewServiceTestFixture.cs index 085bc76b..d291e478 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/ReviewService/ReviewServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/ReviewService/ReviewServiceTestFixture.cs @@ -22,7 +22,6 @@ namespace UI_DSM.Client.Tests.Services.ReviewService using UI_DSM.Client.Services; using UI_DSM.Client.Services.JsonDeserializerProvider; using UI_DSM.Client.Services.ReviewService; - using UI_DSM.Client.Tests.Helpers; using UI_DSM.Serializer.Json; using UI_DSM.Shared.DTO.Common; using UI_DSM.Shared.DTO.Models; @@ -35,7 +34,7 @@ public class ReviewServiceTestFixture private ReviewService service; private MockHttpMessageHandler httpMessageHandler; private List entitiesDto; - private IJsonDeserializerService jsonDeserializerService; + private IJsonService jsonService; [SetUp] public void Setup() @@ -74,8 +73,8 @@ public void Setup() }; ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); - this.service = new ReviewService(httpClient, this.jsonDeserializerService); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new ReviewService(httpClient, this.jsonService); } [Test] @@ -91,7 +90,7 @@ public async Task VerifyGetReviews() Assert.That(async () => await this.service.GetReviewsOfProject(projectId), Throws.Exception); httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); var reviews = await this.service.GetReviewsOfProject(projectId); Assert.That(reviews, Has.Count.EqualTo(1)); httpResponse.Content = new StringContent(string.Empty); @@ -114,7 +113,7 @@ public async Task VerifyGetReview() httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); review = await this.service.GetReviewOfProject(projectId, guid); Assert.That(review.Id, Is.EqualTo(guid)); @@ -141,7 +140,7 @@ public async Task VerifyCreateReview() IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Post, $"/Project/{projectId}/Review/Create"); request.Respond(_ => httpResponse); @@ -152,7 +151,7 @@ public async Task VerifyCreateReview() entityRequestResponse.Entities = review.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); requestResponse = await this.service.CreateReview(projectId, review); @@ -182,7 +181,7 @@ public async Task VerifyDeleteReview() var httpResponse = new HttpResponseMessage(); var requestResponse = new RequestResponseDto() { IsRequestSuccessful = true }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Delete, $"/Project/{project.Id}/Review/{review.Id}"); request.Respond(_ => httpResponse); @@ -215,7 +214,7 @@ public async Task VerifyUpdateReview() var httpResponse = new HttpResponseMessage(); var requestResponse = new EntityRequestResponseDto() { IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Put, $"/Project/{project.Id}/Review/{review.Id}"); request.Respond(_ => httpResponse); @@ -230,7 +229,7 @@ public async Task VerifyUpdateReview() requestResponse.Entities = review.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); requestResult = await this.service.UpdateReview(review); Assert.That(requestResult.IsRequestSuccessful, Is.True); diff --git a/UI_DSM/UI_DSM.Client.Tests/Services/ReviewTaskService/ReviewTaskServiceTestFixture.cs b/UI_DSM/UI_DSM.Client.Tests/Services/ReviewTaskService/ReviewTaskServiceTestFixture.cs index 95051bc9..1c9ea58f 100644 --- a/UI_DSM/UI_DSM.Client.Tests/Services/ReviewTaskService/ReviewTaskServiceTestFixture.cs +++ b/UI_DSM/UI_DSM.Client.Tests/Services/ReviewTaskService/ReviewTaskServiceTestFixture.cs @@ -22,7 +22,6 @@ namespace UI_DSM.Client.Tests.Services.ReviewTaskService using UI_DSM.Client.Services; using UI_DSM.Client.Services.JsonDeserializerProvider; using UI_DSM.Client.Services.ReviewTaskService; - using UI_DSM.Client.Tests.Helpers; using UI_DSM.Serializer.Json; using UI_DSM.Shared.DTO.Common; using UI_DSM.Shared.DTO.Models; @@ -39,7 +38,7 @@ public class ReviewTaskServiceTestFixture private Guid projectId; private Guid reviewId; private Guid reviewObjectiveId; - private IJsonDeserializerService jsonDeserializerService; + private IJsonService jsonService; [SetUp] public void Setup() @@ -83,8 +82,8 @@ public void Setup() }; ServiceBase.RegisterService(); - this.jsonDeserializerService = new JsonDeserializerService(new JsonDeserializer()); - this.service = new ReviewTaskService(httpClient, this.jsonDeserializerService); + this.jsonService = new JsonService(new JsonDeserializer(), new JsonSerializer()); + this.service = new ReviewTaskService(httpClient, this.jsonService); } [Test] @@ -99,7 +98,7 @@ public async Task VerifyGetReviewTasks() Assert.That(async () => await this.service.GetTasksOfReviewObjectives(this.projectId, this.reviewId, this.reviewObjectiveId), Throws.Exception); httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); var reviewTasks = await this.service.GetTasksOfReviewObjectives(this.projectId, this.reviewId, this.reviewObjectiveId); Assert.That(reviewTasks, Has.Count.EqualTo(1)); httpResponse.Content = new StringContent(string.Empty); @@ -121,7 +120,7 @@ public async Task VerifyGetReviewTask() httpResponse.StatusCode = HttpStatusCode.OK; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(this.entitiesDto)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(this.entitiesDto)); reviewTask = await this.service.GetTaskOfReviewObjective(this.projectId, this.reviewId, this.reviewObjectiveId, guid); Assert.That(reviewTask.Id, Is.EqualTo(guid)); @@ -147,7 +146,7 @@ public async Task VerifyCreateReviewTask() IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Post, $"/Project/{this.projectId}/Review/{this.reviewId}/ReviewObjective/{this.reviewObjectiveId}/ReviewTask/Create"); request.Respond(_ => httpResponse); @@ -158,7 +157,7 @@ public async Task VerifyCreateReviewTask() entityRequestResponse.Entities = reviewTask.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(entityRequestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(entityRequestResponse)); requestResponse = await this.service.CreateReviewTask(this.projectId, this.reviewId, this.reviewObjectiveId, reviewTask); @@ -187,7 +186,7 @@ public async Task VerifyDeleteReviewTask() var reviewObjective = new ReviewObjective(this.reviewObjectiveId); var httpResponse = new HttpResponseMessage(); var requestResponse = new RequestResponseDto() { IsRequestSuccessful = true }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Delete, $"/Project/{this.projectId}/Review/{this.reviewId}/ReviewObjective/{this.reviewObjectiveId}/ReviewTask/{reviewTask.Id}"); request.Respond(_ => httpResponse); @@ -220,7 +219,7 @@ public async Task VerifyUpdateReview() var httpResponse = new HttpResponseMessage(); var requestResponse = new EntityRequestResponseDto() { IsRequestSuccessful = false }; - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); var request = this.httpMessageHandler.When(HttpMethod.Put, $"/Project/{this.projectId}/Review/{this.reviewId}/ReviewObjective/{this.reviewObjectiveId}/ReviewTask/{reviewTask.Id}"); request.Respond(_ => httpResponse); @@ -235,7 +234,7 @@ public async Task VerifyUpdateReview() requestResponse.Entities = reviewTask.GetAssociatedEntities().ToDtos(); - httpResponse.Content = new StringContent(JsonSerializerHelper.SerializeObject(requestResponse)); + httpResponse.Content = new StringContent(this.jsonService.Serialize(requestResponse)); requestResult = await this.service.UpdateReviewTask(this.projectId, this.reviewId, reviewTask); Assert.That(requestResult.IsRequestSuccessful, Is.True); diff --git a/UI_DSM/UI_DSM.Client.Tests/UI_DSM.Client.Tests.csproj b/UI_DSM/UI_DSM.Client.Tests/UI_DSM.Client.Tests.csproj index bbe20824..6a561567 100644 --- a/UI_DSM/UI_DSM.Client.Tests/UI_DSM.Client.Tests.csproj +++ b/UI_DSM/UI_DSM.Client.Tests/UI_DSM.Client.Tests.csproj @@ -23,6 +23,8 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/UI_DSM/UI_DSM.Client/Components/Administration/ModelManagement/CometConnection.razor b/UI_DSM/UI_DSM.Client/Components/Administration/ModelManagement/CometConnection.razor new file mode 100644 index 00000000..d5f6ff50 --- /dev/null +++ b/UI_DSM/UI_DSM.Client/Components/Administration/ModelManagement/CometConnection.razor @@ -0,0 +1,58 @@ + +@using UI_DSM.Client.Enumerator +@using CDP4Common.SiteDirectoryData + +@if (this.ViewModel.CometConnectionStatus != AuthenticationStatus.Success) +{ + + +

@this.ViewModel.ErrorMessage

+ + + + + + + + + + + + +
+} +else +{ + + +

@this.ViewModel.ErrorMessage

+ + + + + + + + + +
+} + diff --git a/UI_DSM/UI_DSM.Client/Components/Administration/ModelManagement/CometConnection.razor.cs b/UI_DSM/UI_DSM.Client/Components/Administration/ModelManagement/CometConnection.razor.cs new file mode 100644 index 00000000..0a3477af --- /dev/null +++ b/UI_DSM/UI_DSM.Client/Components/Administration/ModelManagement/CometConnection.razor.cs @@ -0,0 +1,132 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.Components.Administration.ModelManagement +{ + using CDP4Common.SiteDirectoryData; + + using Microsoft.AspNetCore.Components; + + using ReactiveUI; + + using UI_DSM.Client.Enumerator; + using UI_DSM.Client.ViewModels.Components.Administration.ModelManagement; + + /// + /// Component that gave the possibility to connect to a COMET instance + /// + public partial class CometConnection : IDisposable + { + /// + /// A collection of + /// + private List disposables = new(); + + /// + /// The + /// + [Parameter] + public ICometConnectionViewModel ViewModel { get; set; } + + /// + /// The text to display inside the connection button + /// + public string ConnectButtonText { get; private set; } + + /// + /// The text to display inside the upload button + /// + public string UploadText { get; set; } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + this.disposables.ForEach(x => x.Dispose()); + this.disposables.Clear(); + } + + /// + /// Method invoked when the component is ready to start, having received its + /// initial parameters from its parent in the render tree. + /// Override this method if you will perform an asynchronous operation and + /// want the component to refresh when that operation is completed. + /// + /// A representing any asynchronous operation. + protected override Task OnInitializedAsync() + { + this.disposables.Add(this.WhenAnyValue(x => x.ViewModel.CometConnectionStatus) + .Subscribe(_ => this.OnCometConnectionStatusChanged())); + + this.disposables.Add(this.WhenAnyValue(x => x.ViewModel.IterationUploadStatus) + .Subscribe(_ => this.OnIterationUploadStatusChanged())); + + this.disposables.Add(this.WhenAnyValue(x => x.ViewModel.ErrorMessage) + .Subscribe(_ => this.InvokeAsync(this.StateHasChanged))); + + return base.OnInitializedAsync(); + } + + /// + /// Sets properties when the has changed + /// + private void OnIterationUploadStatusChanged() + { + switch (this.ViewModel.IterationUploadStatus) + { + case UploadStatus.None: + this.UploadText = "Upload"; + break; + case UploadStatus.Uploading: + this.UploadText = "Uploading"; + break; + case UploadStatus.Fail: + this.UploadText = "Retry..."; + break; + case UploadStatus.Done: + break; + default: + throw new InvalidDataException("Unsupported value"); + } + + this.InvokeAsync(this.StateHasChanged); + } + + /// + /// Sets properties when the has changed + /// + private void OnCometConnectionStatusChanged() + { + switch (this.ViewModel.CometConnectionStatus) + { + case AuthenticationStatus.None: + this.ConnectButtonText = "Login to COMET"; + break; + case AuthenticationStatus.Authenticating: + this.ConnectButtonText = "Authenticating..."; + break; + case AuthenticationStatus.Fail: + case AuthenticationStatus.ServerFailure: + this.ConnectButtonText = "Retry"; + break; + case AuthenticationStatus.Success: + break; + default: + throw new InvalidDataException("Unsupported value"); + } + + this.InvokeAsync(this.StateHasChanged); + } + } +} diff --git a/UI_DSM/UI_DSM.Client/Enumerator/AuthenticationStatus.cs b/UI_DSM/UI_DSM.Client/Enumerator/AuthenticationStatus.cs index 63dbe75c..7e86664d 100644 --- a/UI_DSM/UI_DSM.Client/Enumerator/AuthenticationStatus.cs +++ b/UI_DSM/UI_DSM.Client/Enumerator/AuthenticationStatus.cs @@ -14,28 +14,33 @@ namespace UI_DSM.Client.Enumerator { /// - /// Enumeration that defines possible status for the authentication process + /// Enumeration that defines possible status for the authentication process /// public enum AuthenticationStatus { /// - /// Defaut status, when no authentication process has been performed + /// Defaut status, when no authentication process has been performed /// None, /// - /// Status when the authentication process is in progress + /// Status when the authentication process is in progress /// Authenticating, /// - /// Status when the authentication process ends succesfully + /// Status when the authentication process ends succesfully /// Success, /// - /// Status when the authentication process failed + /// Status when the authentication process failed /// - Fail + Fail, + + /// + /// Status when the server cannot be reached + /// + ServerFailure } } diff --git a/UI_DSM/UI_DSM.Client/Enumerator/UploadStatus.cs b/UI_DSM/UI_DSM.Client/Enumerator/UploadStatus.cs new file mode 100644 index 00000000..2f5fabb0 --- /dev/null +++ b/UI_DSM/UI_DSM.Client/Enumerator/UploadStatus.cs @@ -0,0 +1,41 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.Enumerator +{ + /// + /// Enumerator for the current status of an upload process + /// + public enum UploadStatus + { + /// + /// When the upload is not started + /// + None, + + /// + /// When the upload has been started + /// + Uploading, + + /// + /// When the upload is finished + /// + Done, + + /// + /// When the upload has failed + /// + Fail + } +} diff --git a/UI_DSM/UI_DSM.Client/Pages/Administration/ProjectPages/ProjectPage.razor b/UI_DSM/UI_DSM.Client/Pages/Administration/ProjectPages/ProjectPage.razor index 4b033cca..ae4ef99c 100644 --- a/UI_DSM/UI_DSM.Client/Pages/Administration/ProjectPages/ProjectPage.razor +++ b/UI_DSM/UI_DSM.Client/Pages/Administration/ProjectPages/ProjectPage.razor @@ -33,4 +33,14 @@ else +
+ + Add COMET Model + + + + + + +
} \ No newline at end of file diff --git a/UI_DSM/UI_DSM.Client/Pages/Administration/ProjectPages/ProjectPage.razor.cs b/UI_DSM/UI_DSM.Client/Pages/Administration/ProjectPages/ProjectPage.razor.cs index 59656229..c137cd37 100644 --- a/UI_DSM/UI_DSM.Client/Pages/Administration/ProjectPages/ProjectPage.razor.cs +++ b/UI_DSM/UI_DSM.Client/Pages/Administration/ProjectPages/ProjectPage.razor.cs @@ -48,6 +48,7 @@ public partial class ProjectPage : IDisposable public void Dispose() { this.disposables.ForEach(x => x.Dispose()); + this.disposables.Clear(); } /// @@ -65,6 +66,11 @@ protected override async Task OnInitializedAsync() this.disposables.Add(this.WhenAnyValue(x => x.ViewModel.IsOnCreationMode) .Subscribe(_ => this.InvokeAsync(this.StateHasChanged))); + this.disposables.Add(this.WhenAnyValue(x => x.ViewModel.IsOnCometConnectionMode) + .Subscribe(_ => this.InvokeAsync(this.StateHasChanged))); + + this.disposables.Add(this.ViewModel); + await this.ViewModel.OnInitializedAsync(new Guid(this.ProjectId)); } } diff --git a/UI_DSM/UI_DSM.Client/Program.cs b/UI_DSM/UI_DSM.Client/Program.cs index a5b1b43f..d39816ee 100644 --- a/UI_DSM/UI_DSM.Client/Program.cs +++ b/UI_DSM/UI_DSM.Client/Program.cs @@ -79,6 +79,7 @@ private static void AddViewModels(WebAssemblyHostBuilder builder) private static void AddServices(WebAssemblyHostBuilder builder) { builder.Services.AddScoped(); + builder.Services.AddScoped(); builder.Services.AddScoped(_ => new HttpClient { BaseAddress = new Uri(builder.Configuration["apiUri"]) }); diff --git a/UI_DSM/UI_DSM.Client/Services/Administration/CometService/CometService.cs b/UI_DSM/UI_DSM.Client/Services/Administration/CometService/CometService.cs new file mode 100644 index 00000000..56cd351d --- /dev/null +++ b/UI_DSM/UI_DSM.Client/Services/Administration/CometService/CometService.cs @@ -0,0 +1,106 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.Services.Administration.CometService +{ + using System.Text; + using System.Text.Json; + + using CDP4Common.EngineeringModelData; + using CDP4Common.SiteDirectoryData; + + using CDP4Dal; + + using Microsoft.AspNetCore.Components; + + using UI_DSM.Client.Services.JsonDeserializerProvider; + using UI_DSM.Shared.DTO.CometData; + + /// + /// The provide capabilities to interact with a Comet instance + /// + [Route("Comet")] + public class CometService : ServiceBase, ICometService + { + /// + /// Initializes a new instance of the class. + /// + /// The + /// The + public CometService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) + { + } + + /// + /// Tries to login to a Comet + /// + /// The + /// A with the result of the connection + public async Task Login(CometAuthenticationData authenticationData) + { + var content = JsonSerializer.Serialize(authenticationData); + var bodyContent = new StringContent(content, Encoding.UTF8, "application/json"); + var response = await this.HttpClient.PostAsync(Path.Combine(this.MainRoute, "Login"), bodyContent); + return this.jsonService.Deserialize(await response.Content.ReadAsStreamAsync()); + } + + /// + /// Closes the current + /// + /// The of the session + /// A + public async Task Logout(Guid sessionId) + { + var response = await this.HttpClient.DeleteAsync($"{this.MainRoute}/{sessionId}"); + return response.IsSuccessStatusCode; + } + + /// + /// Gets a collection of available + /// + /// The of the session + /// A with a + public async Task GetAvailableEngineeringModels(Guid sessionId) + { + var response = await this.HttpClient.GetAsync($"{this.MainRoute}/{sessionId}/Models"); + + if (!response.IsSuccessStatusCode) + { + throw new ArgumentException("Invalid session id"); + } + + return this.jsonService.Deserialize(await response.Content.ReadAsStreamAsync()); + } + + /// + /// Upload an to the server + /// + /// The of the session + /// The of the + /// The of the to upload + /// A with the + public async Task UploadIteration(Guid sessionId, Guid modelId, Guid iterationId) + { + var modelUpload = new ModelUploadData() + { + IterationId = iterationId, + ModelId = modelId + }; + + var content = JsonSerializer.Serialize(modelUpload); + var bodyContent = new StringContent(content, Encoding.UTF8, "application/json"); + var response = await this.HttpClient.PostAsync($"{this.MainRoute}/{sessionId}/Models/Upload", bodyContent); + return this.jsonService.Deserialize(await response.Content.ReadAsStreamAsync()); + } + } +} diff --git a/UI_DSM/UI_DSM.Client/Services/Administration/CometService/ICometService.cs b/UI_DSM/UI_DSM.Client/Services/Administration/CometService/ICometService.cs new file mode 100644 index 00000000..8ac82c4e --- /dev/null +++ b/UI_DSM/UI_DSM.Client/Services/Administration/CometService/ICometService.cs @@ -0,0 +1,58 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.Services.Administration.CometService +{ + using CDP4Common.EngineeringModelData; + using CDP4Common.SiteDirectoryData; + + using CDP4Dal; + + using UI_DSM.Shared.DTO.CometData; + + /// + /// Interface definition for + /// + public interface ICometService + { + /// + /// Tries to login to a Comet + /// + /// The + /// A with the result of the connection + Task Login(CometAuthenticationData authenticationData); + + /// + /// Closes the current + /// + /// The of the session + /// A + Task Logout(Guid sessionId); + + /// + /// Gets a collection of available + /// + /// The of the session + /// A with a + Task GetAvailableEngineeringModels(Guid sessionId); + + /// + /// Upload an to the server + /// + /// The of the session + /// The of the + /// The of the to upload + /// A with the + Task UploadIteration(Guid sessionId, Guid modelId, Guid iterationId); + } +} diff --git a/UI_DSM/UI_DSM.Client/Services/Administration/ParticipantService/ParticipantService.cs b/UI_DSM/UI_DSM.Client/Services/Administration/ParticipantService/ParticipantService.cs index 429cfbbd..2a05401f 100644 --- a/UI_DSM/UI_DSM.Client/Services/Administration/ParticipantService/ParticipantService.cs +++ b/UI_DSM/UI_DSM.Client/Services/Administration/ParticipantService/ParticipantService.cs @@ -33,8 +33,8 @@ public class ParticipantService : EntityServiceBase /// Initializes a new instance of the class. /// /// The - /// The - public ParticipantService(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient, deserializer) + /// The + public ParticipantService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) { } @@ -154,7 +154,7 @@ public async Task> GetAvailableUsersForCreation(Guid projectId) throw new HttpRequestException(await getResponse.Content.ReadAsStringAsync()); } - var dtos = this.Deserializer.Deserialize>(await getResponse.Content.ReadAsStreamAsync()); + var dtos = this.jsonService.Deserialize>(await getResponse.Content.ReadAsStreamAsync()); return Assembler.CreateEntities(dtos).ToList(); } catch (Exception exception) diff --git a/UI_DSM/UI_DSM.Client/Services/Administration/ProjectService/ProjectService.cs b/UI_DSM/UI_DSM.Client/Services/Administration/ProjectService/ProjectService.cs index c966b98b..dfa46f3d 100644 --- a/UI_DSM/UI_DSM.Client/Services/Administration/ProjectService/ProjectService.cs +++ b/UI_DSM/UI_DSM.Client/Services/Administration/ProjectService/ProjectService.cs @@ -32,8 +32,8 @@ public class ProjectService : EntityServiceBase, IProjectSe /// Initializes a new instance of the class. /// /// The - /// The - public ProjectService(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient,deserializer) + /// The + public ProjectService(HttpClient httpClient, IJsonService jsonService) : base(httpClient,jsonService) { } @@ -121,7 +121,7 @@ public async Task> GetUserParticipation() throw new HttpRequestException(await response.Content.ReadAsStringAsync()); } - var dtos = this.Deserializer.Deserialize>(await response.Content.ReadAsStreamAsync()); + var dtos = this.jsonService.Deserialize>(await response.Content.ReadAsStreamAsync()); return Assembler.CreateEntities(dtos).ToList(); } catch (Exception exception) diff --git a/UI_DSM/UI_DSM.Client/Services/Administration/RoleService/RoleService.cs b/UI_DSM/UI_DSM.Client/Services/Administration/RoleService/RoleService.cs index d2668a3f..7a875a4e 100644 --- a/UI_DSM/UI_DSM.Client/Services/Administration/RoleService/RoleService.cs +++ b/UI_DSM/UI_DSM.Client/Services/Administration/RoleService/RoleService.cs @@ -31,8 +31,8 @@ public class RoleService : EntityServiceBase, IRoleService /// Initializes a new instance of the class. /// /// The - /// The - public RoleService(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient, deserializer) + /// The + public RoleService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) { } diff --git a/UI_DSM/UI_DSM.Client/Services/Administration/UserService/UserService.cs b/UI_DSM/UI_DSM.Client/Services/Administration/UserService/UserService.cs index 9f428c7d..cc7b8261 100644 --- a/UI_DSM/UI_DSM.Client/Services/Administration/UserService/UserService.cs +++ b/UI_DSM/UI_DSM.Client/Services/Administration/UserService/UserService.cs @@ -34,8 +34,8 @@ public class UserService : ServiceBase, IUserService /// Initializes a new instance of the class. /// /// The - /// The - public UserService(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient, deserializer) + /// The + public UserService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) { } @@ -52,7 +52,7 @@ public async Task> GetUsers() throw new HttpRequestException(await response.Content.ReadAsStringAsync()); } - var entities = this.Deserializer.Deserialize>(await response.Content.ReadAsStreamAsync()); + var entities = this.jsonService.Deserialize>(await response.Content.ReadAsStreamAsync()); return entities.Where(x => x.GetType() == typeof(UserEntityDto)).Cast().ToList(); } @@ -67,7 +67,7 @@ public async Task RegisterUser(RegistrationDto newUser) var bodyContent = new StringContent(content, Encoding.UTF8, "application/json"); var registerResponse = await this.HttpClient.PostAsync(Path.Combine(this.MainRoute, "Register"), bodyContent); - return this.Deserializer.Deserialize(await registerResponse.Content.ReadAsStreamAsync()); + return this.jsonService.Deserialize(await registerResponse.Content.ReadAsStreamAsync()); } /// @@ -82,7 +82,7 @@ public async Task DeleteUser(UserEntityDto userEntityToDelet var url = Path.Combine(this.MainRoute, userEntityToDelete.Id.ToString()); var deleteResponse = await this.HttpClient.DeleteAsync(url); - return this.Deserializer.Deserialize(await deleteResponse.Content.ReadAsStreamAsync()); + return this.jsonService.Deserialize(await deleteResponse.Content.ReadAsStreamAsync()); } return new RequestResponseDto diff --git a/UI_DSM/UI_DSM.Client/Services/AnnotationService/AnnotationService.cs b/UI_DSM/UI_DSM.Client/Services/AnnotationService/AnnotationService.cs index 7fb74b70..ec993991 100644 --- a/UI_DSM/UI_DSM.Client/Services/AnnotationService/AnnotationService.cs +++ b/UI_DSM/UI_DSM.Client/Services/AnnotationService/AnnotationService.cs @@ -32,8 +32,8 @@ public class AnnotationService : EntityServiceBase, I /// Initializes a new instance of the class. /// /// The - /// The - public AnnotationService(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient, deserializer) + /// The + public AnnotationService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) { } diff --git a/UI_DSM/UI_DSM.Client/Services/ArtifactService/ArtifactService.cs b/UI_DSM/UI_DSM.Client/Services/ArtifactService/ArtifactService.cs new file mode 100644 index 00000000..ae99deb5 --- /dev/null +++ b/UI_DSM/UI_DSM.Client/Services/ArtifactService/ArtifactService.cs @@ -0,0 +1,77 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.Services.ArtifactService +{ + using Microsoft.AspNetCore.Components; + + using UI_DSM.Client.Services.JsonDeserializerProvider; + using UI_DSM.Shared.DTO.Models; + using UI_DSM.Shared.Models; + using UI_DSM.Shared.Types; + + /// + /// The provide capability to manage s inside a + /// + /// + [Route("Project/{0}/Artifact")] + public class ArtifactService : EntityServiceBase, IArtifactService + { + /// + /// Initializes a new instance of the class. + /// + /// The + /// The + public ArtifactService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) + { + } + + /// + /// Tries to upload a + /// + /// The of the where the will belongs + /// The file path + /// The name of the model + /// A with the + public Task> UploadModel(Guid projectId, string temporaryFileName, string modelName) + { + var model = new Model + { + FileName = temporaryFileName, + ModelName = modelName + }; + + return this.CreateArtifact(projectId, model); + } + + /// + /// Uploads a File into the server and creates the corresponding + /// + /// The of the where the will belongs to + /// The to create + /// A with the created result + private async Task> CreateArtifact(Guid projectId, TArtifact artifact) + where TArtifact : Artifact + { + this.ComputeMainRoute(projectId); + var createdArtifact = await this.CreateEntity(artifact, 0); + + return new EntityRequestResponse + { + IsRequestSuccessful = createdArtifact.IsRequestSuccessful, + Errors = createdArtifact.Errors, + Entity = (TArtifact)createdArtifact.Entity + }; + } + } +} diff --git a/UI_DSM/UI_DSM.Client/Services/ArtifactService/IArtifactService.cs b/UI_DSM/UI_DSM.Client/Services/ArtifactService/IArtifactService.cs new file mode 100644 index 00000000..de26c7da --- /dev/null +++ b/UI_DSM/UI_DSM.Client/Services/ArtifactService/IArtifactService.cs @@ -0,0 +1,33 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.Services.ArtifactService +{ + using UI_DSM.Shared.Models; + using UI_DSM.Shared.Types; + + /// + /// Interface definition for + /// + public interface IArtifactService + { + /// + /// Tries to upload a + /// + /// The of the where the will belongs + /// The file name + /// The name of the model + /// A with the result + Task> UploadModel(Guid projectId, string temporaryFileName, string modelName); + } +} diff --git a/UI_DSM/UI_DSM.Client/Services/AuthenticationService/AuthenticationService.cs b/UI_DSM/UI_DSM.Client/Services/AuthenticationService/AuthenticationService.cs index 652f5bbf..dc06b8bb 100644 --- a/UI_DSM/UI_DSM.Client/Services/AuthenticationService/AuthenticationService.cs +++ b/UI_DSM/UI_DSM.Client/Services/AuthenticationService/AuthenticationService.cs @@ -44,11 +44,11 @@ public class AuthenticationService : ServiceBase, IAuthenticationService /// Initializes a new instance of the class. /// The - /// The + /// The /// The /// The - public AuthenticationService(HttpClient httpClient, IJsonDeserializerService deserializer, AuthenticationStateProvider stateProvider, ISessionStorageService sessionStorageService) : - base(httpClient, deserializer) + public AuthenticationService(HttpClient httpClient, IJsonService jsonService, AuthenticationStateProvider stateProvider, ISessionStorageService sessionStorageService) : + base(httpClient, jsonService) { this.stateProvider = stateProvider; this.sessionStorageService = sessionStorageService; @@ -67,7 +67,7 @@ public async Task Login(AuthenticationDto authenticat var authenticationResult = await this.HttpClient.PostAsync(Path.Combine(this.MainRoute, "Login"), bodyContent); - var result = this.Deserializer.Deserialize(await authenticationResult.Content.ReadAsStreamAsync()); + var result = this.jsonService.Deserialize(await authenticationResult.Content.ReadAsStreamAsync()); if (!authenticationResult.IsSuccessStatusCode) { diff --git a/UI_DSM/UI_DSM.Client/Services/EntityServiceBase.cs b/UI_DSM/UI_DSM.Client/Services/EntityServiceBase.cs index 25c89152..76eeb10a 100644 --- a/UI_DSM/UI_DSM.Client/Services/EntityServiceBase.cs +++ b/UI_DSM/UI_DSM.Client/Services/EntityServiceBase.cs @@ -17,8 +17,6 @@ namespace UI_DSM.Client.Services using Microsoft.AspNetCore.WebUtilities; - using Newtonsoft.Json; - using UI_DSM.Client.Services.JsonDeserializerProvider; using UI_DSM.Shared.Assembler; using UI_DSM.Shared.DTO.Common; @@ -37,8 +35,8 @@ public abstract class EntityServiceBase : ServiceBase where /// Initializes a new instance of the class. /// /// The - /// The - protected EntityServiceBase(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient, deserializer) + /// The + protected EntityServiceBase(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) { } @@ -54,7 +52,7 @@ protected async Task> GetEntityDto(Guid entityId, int dee return !getResponse.IsSuccessStatusCode ? default - : this.Deserializer.Deserialize>(await getResponse.Content.ReadAsStreamAsync()); + : this.jsonService.Deserialize>(await getResponse.Content.ReadAsStreamAsync()); } /// @@ -91,7 +89,7 @@ protected async Task> GetEntitiesDto(int deepLevel) throw new HttpRequestException(await response.Content.ReadAsStringAsync()); } - return this.Deserializer.Deserialize>(await response.Content.ReadAsStreamAsync()).ToList(); + return this.jsonService.Deserialize>(await response.Content.ReadAsStreamAsync()).ToList(); } /// @@ -114,10 +112,10 @@ protected async Task> GetEntities(int deepLevel) /// A with the protected async Task CreateEntityAndGetResponseDto(TEntity entity, int deepLevel) { - var content = JsonConvert.SerializeObject((TEntityDto)entity.ToDto()); + var content = this.jsonService.Serialize((TEntityDto)entity.ToDto()); var bodyContent = new StringContent(content, Encoding.UTF8, "application/json"); var response = await this.HttpClient.PostAsync(this.CreateUri(Path.Combine(this.MainRoute, "Create"), deepLevel), bodyContent); - return this.Deserializer.Deserialize(await response.Content.ReadAsStreamAsync()); + return this.jsonService.Deserialize(await response.Content.ReadAsStreamAsync()); } /// @@ -130,16 +128,37 @@ protected async Task> CreateEntity(TEntity entity { var entityRequest = await this.CreateEntityAndGetResponseDto(entity, deepLevel); + return HandleEntityRequestResponse(entityRequest); + } + + /// + /// Handles the result of the + /// + /// The + /// The + protected static EntityRequestResponse HandleEntityRequestResponse(EntityRequestResponseDto entityRequest) + { + return HandleEntityRequestResponse(entityRequest); + } + + /// + /// Handles the result of the + /// + /// The + /// An + /// The + protected static EntityRequestResponse HandleEntityRequestResponse(EntityRequestResponseDto entityRequest) where TTEntity : Entity + { if (!entityRequest!.IsRequestSuccessful) { - return EntityRequestResponse.Fail(entityRequest.Errors); + return EntityRequestResponse.Fail(entityRequest.Errors); } - var poco = Assembler.CreateEntities(entityRequest.Entities).FirstOrDefault(); + var poco = Assembler.CreateEntities(entityRequest.Entities).FirstOrDefault(); return poco == null - ? EntityRequestResponse.Fail(new List { "Error during the creation of the entity" }) - : EntityRequestResponse.Success(poco); + ? EntityRequestResponse.Fail(new List { "Error during the creation of the entity" }) + : EntityRequestResponse.Success(poco); } /// @@ -150,11 +169,11 @@ protected async Task> CreateEntity(TEntity entity /// A with the protected async Task UpdateEntityAndGetResponseDto(TEntity entity, int deepLevel) { - var content = JsonConvert.SerializeObject((TEntityDto)entity.ToDto()); + var content = this.jsonService.Serialize((TEntityDto)entity.ToDto()); var bodyContent = new StringContent(content, Encoding.UTF8, "application/json"); var response = await this.HttpClient.PutAsync(this.CreateUri(Path.Combine(this.MainRoute, entity.Id.ToString()), deepLevel), bodyContent); - return this.Deserializer.Deserialize(await response.Content.ReadAsStreamAsync()); + return this.jsonService.Deserialize(await response.Content.ReadAsStreamAsync()); } /// @@ -167,16 +186,7 @@ protected async Task> UpdateEntity(TEntity entity { var entityRequest = await this.UpdateEntityAndGetResponseDto(entity, deepLevel); - if (!entityRequest!.IsRequestSuccessful) - { - return EntityRequestResponse.Fail(entityRequest.Errors); - } - - var poco = Assembler.CreateEntities(entityRequest.Entities).FirstOrDefault(); - - return poco == null - ? EntityRequestResponse.Fail(new List { "Error during the creation of the entity" }) - : EntityRequestResponse.Success(poco); + return HandleEntityRequestResponse(entityRequest); } /// @@ -189,7 +199,7 @@ protected async Task DeleteEntity(TEntity entityToDelete) var url = Path.Combine(this.MainRoute, entityToDelete.Id.ToString()); var deleteResponse = await this.HttpClient.DeleteAsync(url); - var response = this.Deserializer.Deserialize(await deleteResponse.Content.ReadAsStreamAsync()); + var response = this.jsonService.Deserialize(await deleteResponse.Content.ReadAsStreamAsync()); if (response == null) { diff --git a/UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/IJsonDeserializerService.cs b/UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/IJsonService.cs similarity index 72% rename from UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/IJsonDeserializerService.cs rename to UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/IJsonService.cs index 62d2dc70..075d1366 100644 --- a/UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/IJsonDeserializerService.cs +++ b/UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/IJsonService.cs @@ -14,9 +14,9 @@ namespace UI_DSM.Client.Services.JsonDeserializerProvider { /// - /// Interface definition for + /// Interface definition for /// - public interface IJsonDeserializerService + public interface IJsonService { /// /// Deserialize a into a object @@ -25,5 +25,13 @@ public interface IJsonDeserializerService /// The to deserialize /// The object T Deserialize(Stream stream) where T : class; + + /// + /// Serialize a into a + /// + /// An object + /// The object to serialize + /// The serialized value + string Serialize(T value) where T : class; } } diff --git a/UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/JsonDeserializerService.cs b/UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/JsonService.cs similarity index 58% rename from UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/JsonDeserializerService.cs rename to UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/JsonService.cs index 9ea66436..52906b67 100644 --- a/UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/JsonDeserializerService.cs +++ b/UI_DSM/UI_DSM.Client/Services/JsonDeserializerProvider/JsonService.cs @@ -24,7 +24,7 @@ namespace UI_DSM.Client.Services.JsonDeserializerProvider /// /// This service provides capabilities to detects the correct JSON deserializer depending on the type of the object /// - public class JsonDeserializerService : IJsonDeserializerService + public class JsonService : IJsonService { /// /// The to deserialize @@ -37,17 +37,34 @@ public class JsonDeserializerService : IJsonDeserializerService private readonly JsonSerializerOptions options; /// - /// Initializes a new instance of the class. + /// The + /// + private readonly IJsonSerializer serializer; + + /// + /// The + /// + private readonly JsonWriterOptions writerOptions; + + /// + /// Initializes a new instance of the class. /// /// The - public JsonDeserializerService(IJsonDeserializer deserializer) + /// The + public JsonService(IJsonDeserializer deserializer, IJsonSerializer serializer) { this.deserializer = deserializer; + this.serializer = serializer; this.options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + + this.writerOptions = new JsonWriterOptions + { + Indented = true + }; } /// @@ -70,5 +87,36 @@ public T Deserialize(Stream stream) where T : class return JsonSerializer.Deserialize(stream, this.options); } + + /// + /// Serialize a into a + /// + /// An object + /// The object to serialize + /// The serialized value + public string Serialize(T value) where T : class + { + using var stream = new MemoryStream(); + + switch (value) + { + case EntityDto dto: + this.serializer.Serialize(dto, stream, this.writerOptions); + break; + case IEnumerable dtos: + this.serializer.Serialize(dtos, stream, this.writerOptions); + break; + case EntityRequestResponseDto requestDto: + this.serializer.SerializeEntityRequestDto(requestDto, stream, this.writerOptions); + break; + default: + JsonSerializer.Serialize(stream, value); + break; + } + + stream.Position = 0; + using var streamReader = new StreamReader(stream); + return streamReader.ReadToEnd(); + } } } diff --git a/UI_DSM/UI_DSM.Client/Services/ReplyService/ReplyService.cs b/UI_DSM/UI_DSM.Client/Services/ReplyService/ReplyService.cs index dea17b36..a6747285 100644 --- a/UI_DSM/UI_DSM.Client/Services/ReplyService/ReplyService.cs +++ b/UI_DSM/UI_DSM.Client/Services/ReplyService/ReplyService.cs @@ -32,8 +32,8 @@ public class ReplyService : EntityServiceBase, IReplyService /// Initializes a new instance of the class. /// /// The - /// The - public ReplyService(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient, deserializer) + /// The + public ReplyService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) { } diff --git a/UI_DSM/UI_DSM.Client/Services/ReviewObjectiveService/ReviewObjectiveService.cs b/UI_DSM/UI_DSM.Client/Services/ReviewObjectiveService/ReviewObjectiveService.cs index 2b7f0e53..e6d5dad7 100644 --- a/UI_DSM/UI_DSM.Client/Services/ReviewObjectiveService/ReviewObjectiveService.cs +++ b/UI_DSM/UI_DSM.Client/Services/ReviewObjectiveService/ReviewObjectiveService.cs @@ -31,8 +31,8 @@ public class ReviewObjectiveService : EntityServiceBase class. /// /// The - /// The - public ReviewObjectiveService(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient, deserializer) + /// The + public ReviewObjectiveService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) { } diff --git a/UI_DSM/UI_DSM.Client/Services/ReviewService/ReviewService.cs b/UI_DSM/UI_DSM.Client/Services/ReviewService/ReviewService.cs index d198021d..0aeab185 100644 --- a/UI_DSM/UI_DSM.Client/Services/ReviewService/ReviewService.cs +++ b/UI_DSM/UI_DSM.Client/Services/ReviewService/ReviewService.cs @@ -32,8 +32,8 @@ public class ReviewService : EntityServiceBase, IReviewServic /// Initializes a new instance of the class. /// /// The - /// The - public ReviewService(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient, deserializer) + /// The + public ReviewService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) { } diff --git a/UI_DSM/UI_DSM.Client/Services/ReviewTaskService/ReviewTaskService.cs b/UI_DSM/UI_DSM.Client/Services/ReviewTaskService/ReviewTaskService.cs index df72cb79..630d5379 100644 --- a/UI_DSM/UI_DSM.Client/Services/ReviewTaskService/ReviewTaskService.cs +++ b/UI_DSM/UI_DSM.Client/Services/ReviewTaskService/ReviewTaskService.cs @@ -31,8 +31,8 @@ public class ReviewTaskService : EntityServiceBase, I /// Initializes a new instance of the class. /// /// The - /// The - public ReviewTaskService(HttpClient httpClient, IJsonDeserializerService deserializer) : base(httpClient, deserializer) + /// The + public ReviewTaskService(HttpClient httpClient, IJsonService jsonService) : base(httpClient, jsonService) { } diff --git a/UI_DSM/UI_DSM.Client/Services/ServiceBase.cs b/UI_DSM/UI_DSM.Client/Services/ServiceBase.cs index bbb9f4b6..84d41ccf 100644 --- a/UI_DSM/UI_DSM.Client/Services/ServiceBase.cs +++ b/UI_DSM/UI_DSM.Client/Services/ServiceBase.cs @@ -28,20 +28,20 @@ public abstract class ServiceBase protected HttpClient HttpClient; /// - /// The + /// The /// - protected IJsonDeserializerService Deserializer { get; private set; } + protected IJsonService jsonService { get; private set; } /// /// Initializes a new instance of the class. /// /// The - /// The - protected ServiceBase(HttpClient httpClient, IJsonDeserializerService deserializer) + /// The + protected ServiceBase(HttpClient httpClient, IJsonService jsonService) { this.HttpClient = httpClient; this.MainRoute = this.GetRoute(); - this.Deserializer = deserializer; + this.jsonService = jsonService; } /// diff --git a/UI_DSM/UI_DSM.Client/UI_DSM.Client.csproj b/UI_DSM/UI_DSM.Client/UI_DSM.Client.csproj index 2b67d0ac..85888736 100644 --- a/UI_DSM/UI_DSM.Client/UI_DSM.Client.csproj +++ b/UI_DSM/UI_DSM.Client/UI_DSM.Client.csproj @@ -1,14 +1,13 @@  - net6.0 enable - 1.0.0 + 1.0.0 - - + + @@ -18,10 +17,8 @@ - - - + \ No newline at end of file diff --git a/UI_DSM/UI_DSM.Client/ViewModels/Components/Administration/ModelManagement/CometConnectionViewModel.cs b/UI_DSM/UI_DSM.Client/ViewModels/Components/Administration/ModelManagement/CometConnectionViewModel.cs new file mode 100644 index 00000000..cb3e1190 --- /dev/null +++ b/UI_DSM/UI_DSM.Client/ViewModels/Components/Administration/ModelManagement/CometConnectionViewModel.cs @@ -0,0 +1,263 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.ViewModels.Components.Administration.ModelManagement +{ + using System.ComponentModel.DataAnnotations; + + using CDP4Common.EngineeringModelData; + + using Microsoft.AspNetCore.Components; + + using ReactiveUI; + + using UI_DSM.Client.Components.Administration.ModelManagement; + using UI_DSM.Client.Enumerator; + using UI_DSM.Client.Services.Administration.CometService; + using UI_DSM.Shared.DTO.CometData; + using UI_DSM.Shared.DTO.Common; + + /// + /// View model for the component + /// + public class CometConnectionViewModel : ReactiveObject, ICometConnectionViewModel + { + /// + /// The + /// + private readonly ICometService cometService; + + /// + /// A collection of + /// + private readonly List disposables = new(); + + /// + /// that stores available models with frozen Iteration + /// + private Dictionary>> availableModels; + + /// + /// Backing field for + /// + private AuthenticationStatus cometConnectionStatus; + + /// + /// Backing field for + /// + private string errorMessage; + + /// + /// Backing field for + /// + private UploadStatus iterationUploadStatus; + + /// + /// Backing field for + /// + private Tuple selectedEngineeringModelSetup; + + /// + /// Backing field for + /// + private Tuple selectedIterationSetup; + + /// + /// The of the session with the API + /// + private Guid sessionId; + + /// + /// Initializes a new instance of the class. + /// + /// The + public CometConnectionViewModel(ICometService cometService) + { + this.cometService = cometService; + } + + /// + /// A collection of available + /// + public IEnumerable> AvailableEngineeringModels { get; set; } = new List>(); + + /// + /// A collection of available + /// + public IEnumerable> AvailableIterationsSetup { get; set; } = new List>(); + + /// + /// The currently selected + /// + public Tuple SelectedEngineeringModelSetup + { + get => this.selectedEngineeringModelSetup; + set => this.RaiseAndSetIfChanged(ref this.selectedEngineeringModelSetup, value); + } + + /// + /// The currently selected + /// + [Required] + public Tuple SelectedIterationSetup + { + get => this.selectedIterationSetup; + set => this.RaiseAndSetIfChanged(ref this.selectedIterationSetup, value); + } + + /// + /// Value indicating the current status of the COMET connection + /// + public AuthenticationStatus CometConnectionStatus + { + get => this.cometConnectionStatus; + set => this.RaiseAndSetIfChanged(ref this.cometConnectionStatus, value); + } + + /// + /// Value indicating the current status of the upload + /// + public UploadStatus IterationUploadStatus + { + get => this.iterationUploadStatus; + private set => this.RaiseAndSetIfChanged(ref this.iterationUploadStatus, value); + } + + /// + /// The error message + /// + public string ErrorMessage + { + get => this.errorMessage; + private set => this.RaiseAndSetIfChanged(ref this.errorMessage, value); + } + + /// + /// Gets the + /// + public CometAuthenticationData AuthenticationData { get; } = new(); + + /// + /// to be called after the has been set + /// + public EventCallback OnEventCallback { get; set; } + + /// + /// Tries to establish a connection to a Comet instance + /// + /// A + public async Task CometLogin() + { + this.CometConnectionStatus = AuthenticationStatus.Authenticating; + var response = await this.cometService.Login(this.AuthenticationData); + + if (response.IsRequestSuccessful) + { + this.sessionId = response.SessionId; + this.CometConnectionStatus = AuthenticationStatus.Success; + this.AuthenticationData.Password = string.Empty; + this.ErrorMessage = string.Empty; + var models = await this.cometService.GetAvailableEngineeringModels(this.sessionId); + this.availableModels = models.AvailableModels; + + this.AvailableEngineeringModels = models.ModelNames.Keys + .Select(modelName => new Tuple(modelName, models.ModelNames[modelName])).ToList(); + } + else + { + this.ErrorMessage = response.Errors.FirstOrDefault(); + this.CometConnectionStatus = AuthenticationStatus.Fail; + } + } + + /// + /// Closes the connection to the Comet Session + /// + /// A + public async Task CometLogout() + { + if (this.sessionId != Guid.Empty) + { + await this.cometService.Logout(this.sessionId); + } + + this.CometConnectionStatus = AuthenticationStatus.None; + } + + /// + /// Initializes the view model properties + /// + public void InitializeProperties() + { + this.CometConnectionStatus = AuthenticationStatus.None; + this.AuthenticationData.UserName = string.Empty; + this.AuthenticationData.Password = string.Empty; + this.ErrorMessage = string.Empty; + this.AuthenticationData.Url = string.Empty; + this.AvailableEngineeringModels = new List>(); + this.SelectedEngineeringModelSetup = null; + this.SelectedIterationSetup = null; + this.IterationUploadStatus = UploadStatus.None; + this.availableModels = new Dictionary>>(); + + this.disposables.Add(this.WhenAnyValue(x => x.SelectedEngineeringModelSetup) + .Subscribe(_ => this.UpdateAvailableIterationsSetup())); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + this.disposables.ForEach(x => x.Dispose()); + this.disposables.Clear(); + } + + /// + /// Uploads the selected + /// + /// A with the + public Task UploadSelectedIteration() + { + this.IterationUploadStatus = UploadStatus.Uploading; + return this.cometService.UploadIteration(this.sessionId, this.SelectedEngineeringModelSetup.Item1, this.SelectedIterationSetup.Item1); + } + + /// + /// Handle an upload failure + /// + /// The that contains information about the failure + public void HandleUploadFailure(RequestResponseDto response) + { + this.IterationUploadStatus = UploadStatus.Fail; + this.ErrorMessage = response.Errors.FirstOrDefault(); + } + + /// + /// Fills the collection + /// + private void UpdateAvailableIterationsSetup() + { + if (this.SelectedEngineeringModelSetup == null) + { + return; + } + + this.AvailableIterationsSetup = this.availableModels.TryGetValue(this.SelectedEngineeringModelSetup.Item1, out var iterations) + ? iterations + : new List>(); + + this.SelectedIterationSetup = this.AvailableIterationsSetup?.FirstOrDefault(); + } + } +} diff --git a/UI_DSM/UI_DSM.Client/ViewModels/Components/Administration/ModelManagement/ICometConnectionViewModel.cs b/UI_DSM/UI_DSM.Client/ViewModels/Components/Administration/ModelManagement/ICometConnectionViewModel.cs new file mode 100644 index 00000000..c7c5e004 --- /dev/null +++ b/UI_DSM/UI_DSM.Client/ViewModels/Components/Administration/ModelManagement/ICometConnectionViewModel.cs @@ -0,0 +1,104 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Client.ViewModels.Components.Administration.ModelManagement +{ + using CDP4Common.EngineeringModelData; + using CDP4Common.SiteDirectoryData; + + using Microsoft.AspNetCore.Components; + + using UI_DSM.Client.Enumerator; + using UI_DSM.Shared.DTO.CometData; + using UI_DSM.Shared.DTO.Common; + + /// + /// Interface definition for + /// + public interface ICometConnectionViewModel : IDisposable + { + /// + /// A collection of available + /// + IEnumerable> AvailableEngineeringModels { get; set; } + + /// + /// A collection of available + /// + IEnumerable> AvailableIterationsSetup { get; set; } + + /// + /// The currently selected + /// + Tuple SelectedEngineeringModelSetup { get; set; } + + /// + /// The currently selected + /// + Tuple SelectedIterationSetup { get; set; } + + /// + /// to invoke after selecting the + /// + EventCallback OnEventCallback { get; set; } + + /// + /// Value indicating the current status of the COMET connection + /// + AuthenticationStatus CometConnectionStatus { get; set; } + + /// + /// Value indicating the current status of the upload + /// + UploadStatus IterationUploadStatus { get; } + + /// + /// Gets the + /// + CometAuthenticationData AuthenticationData { get; } + + /// + /// The error message + /// + string ErrorMessage { get; } + + /// + /// Tries to establish a connection to a Comet instance + /// + /// A + Task CometLogin(); + + /// + /// Closes the connection to the Comet Session + /// + /// A + Task CometLogout(); + + /// + /// Initializes the view model properties + /// + void InitializeProperties(); + + /// + /// Creates an Annex C file for the provided iteration + /// + /// A with the + Task UploadSelectedIteration(); + + /// + /// Handle an upload failure + /// + /// The that contains information about the failure + void HandleUploadFailure(RequestResponseDto response); + } +} diff --git a/UI_DSM/UI_DSM.Client/ViewModels/Pages/Administration/ProjectPages/IProjectPageViewModel.cs b/UI_DSM/UI_DSM.Client/ViewModels/Pages/Administration/ProjectPages/IProjectPageViewModel.cs index 7148a01e..5977e273 100644 --- a/UI_DSM/UI_DSM.Client/ViewModels/Pages/Administration/ProjectPages/IProjectPageViewModel.cs +++ b/UI_DSM/UI_DSM.Client/ViewModels/Pages/Administration/ProjectPages/IProjectPageViewModel.cs @@ -13,9 +13,11 @@ namespace UI_DSM.Client.ViewModels.Pages.Administration.ProjectPages { + using UI_DSM.Client.Components.Administration.ModelManagement; using UI_DSM.Client.Components.Administration.ParticipantManagement; using UI_DSM.Client.Components.Administration.ProjectManagement; using UI_DSM.Client.ViewModels.Components; + using UI_DSM.Client.ViewModels.Components.Administration.ModelManagement; using UI_DSM.Client.ViewModels.Components.Administration.ParticipantManagement; using UI_DSM.Client.ViewModels.Components.Administration.ProjectManagement; using UI_DSM.Shared.Models; @@ -23,7 +25,7 @@ namespace UI_DSM.Client.ViewModels.Pages.Administration.ProjectPages /// /// Interface definition for /// - public interface IProjectPageViewModel + public interface IProjectPageViewModel : IDisposable { /// /// The for the component @@ -31,10 +33,15 @@ public interface IProjectPageViewModel IProjectDetailsViewModel ProjectDetailsViewModel { get; } /// - /// Value indicating the user is currently creating a new + /// Value indicating the user is currently creating a new /// bool IsOnCreationMode { get; set; } + /// + /// Value indicating whether the user is currently trying to establish a connection to COMET + /// + bool IsOnCometConnectionMode { get; set; } + /// /// Gets the /// @@ -45,6 +52,11 @@ public interface IProjectPageViewModel /// IParticipantCreationViewModel ParticipantCreationViewModel { get; } + /// + /// The for the component + /// + ICometConnectionViewModel CometConnectionViewModel { get; } + /// /// Method invoked when the component is ready to start, having received its /// initial parameters from its parent in the render tree. @@ -59,5 +71,10 @@ public interface IProjectPageViewModel /// Opens the popup /// Task OpenCreateParticipantPopup(); + + /// + /// Opens the popup + /// + void OpenCometConnectionPopup(); } } diff --git a/UI_DSM/UI_DSM.Client/ViewModels/Pages/Administration/ProjectPages/ProjectPageViewModel.cs b/UI_DSM/UI_DSM.Client/ViewModels/Pages/Administration/ProjectPages/ProjectPageViewModel.cs index 6b747517..b9efbf0e 100644 --- a/UI_DSM/UI_DSM.Client/ViewModels/Pages/Administration/ProjectPages/ProjectPageViewModel.cs +++ b/UI_DSM/UI_DSM.Client/ViewModels/Pages/Administration/ProjectPages/ProjectPageViewModel.cs @@ -13,7 +13,9 @@ namespace UI_DSM.Client.ViewModels.Pages.Administration.ProjectPages { - using DevExpress.Blazor; + using System.Reactive.Linq; + + using CDP4Common.EngineeringModelData; using DynamicData; @@ -21,13 +23,17 @@ namespace UI_DSM.Client.ViewModels.Pages.Administration.ProjectPages using ReactiveUI; + using UI_DSM.Client.Components.Administration.ModelManagement; using UI_DSM.Client.Components.Administration.ParticipantManagement; using UI_DSM.Client.Components.Administration.ProjectManagement; + using UI_DSM.Client.Enumerator; using UI_DSM.Client.Pages.Administration.ProjectPages; using UI_DSM.Client.Services.Administration.ParticipantService; using UI_DSM.Client.Services.Administration.ProjectService; using UI_DSM.Client.Services.Administration.RoleService; + using UI_DSM.Client.Services.ArtifactService; using UI_DSM.Client.ViewModels.Components; + using UI_DSM.Client.ViewModels.Components.Administration.ModelManagement; using UI_DSM.Client.ViewModels.Components.Administration.ParticipantManagement; using UI_DSM.Client.ViewModels.Components.Administration.ProjectManagement; using UI_DSM.Shared.Models; @@ -37,6 +43,16 @@ namespace UI_DSM.Client.ViewModels.Pages.Administration.ProjectPages /// public class ProjectPageViewModel : ReactiveObject, IProjectPageViewModel { + /// + /// The + /// + private readonly IArtifactService artifactService; + + /// + /// A collection of + /// + private readonly List disposables = new(); + /// /// The /// @@ -47,6 +63,11 @@ public class ProjectPageViewModel : ReactiveObject, IProjectPageViewModel /// private readonly IProjectService projectService; + /// + /// Backing field for + /// + private bool isOnCometConnectionMode; + /// /// Backing field for /// @@ -58,24 +79,42 @@ public class ProjectPageViewModel : ReactiveObject, IProjectPageViewModel /// The /// The /// The - public ProjectPageViewModel(IProjectService projectService, IParticipantService participantService, IRoleService roleService) + /// The + /// The + public ProjectPageViewModel(IProjectService projectService, IParticipantService participantService, IRoleService roleService, + ICometConnectionViewModel cometConnectionViewModel, IArtifactService artifactService) { this.projectService = projectService; this.participantService = participantService; + this.artifactService = artifactService; this.ParticipantCreationViewModel = new ParticipantCreationViewModel(this.participantService, roleService) { OnValidSubmit = new EventCallbackFactory().Create(this, this.CreateParticipant) }; + + this.CometConnectionViewModel = cometConnectionViewModel; + this.CometConnectionViewModel.OnEventCallback = new EventCallbackFactory().Create(this, _ => this.UploadIteration()); + + this.disposables.Add(this.WhenAnyValue(x => x.IsOnCometConnectionMode) + .Where(x => !x).Subscribe(async _ => await this.CometConnectionViewModel.CometLogout())); + + this.disposables.Add(this.WhenAnyValue(x => x.IsOnCometConnectionMode) + .Where(x => x).Subscribe(_ => this.CometConnectionViewModel.InitializeProperties())); } + /// + /// The for the component + /// + public ICometConnectionViewModel CometConnectionViewModel { get; } + /// /// The for the component /// public IProjectDetailsViewModel ProjectDetailsViewModel { get; } = new ProjectDetailsViewModel(); /// - /// Value indicating the user is currently creating a new + /// Value indicating the user is currently creating a new /// public bool IsOnCreationMode { @@ -83,6 +122,15 @@ public bool IsOnCreationMode set => this.RaiseAndSetIfChanged(ref this.isOnCreationMode, value); } + /// + /// Value indicating whether the user is currently trying to establish a connection to COMET + /// + public bool IsOnCometConnectionMode + { + get => this.isOnCometConnectionMode; + set => this.RaiseAndSetIfChanged(ref this.isOnCometConnectionMode, value); + } + /// /// Gets the /// @@ -117,7 +165,53 @@ public async Task OpenCreateParticipantPopup() } /// - /// Create a new with the provided data + /// Opens the popup + /// + public void OpenCometConnectionPopup() + { + this.IsOnCometConnectionMode = true; + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + this.disposables.ForEach(x => x.Dispose()); + this.disposables.Clear(); + } + + /// + /// Uploads an to the server + /// + /// A + private async Task UploadIteration() + { + var uploadResponse = await this.CometConnectionViewModel.UploadSelectedIteration(); + + if (uploadResponse.IsRequestSuccessful) + { + var uploadModelResponse = await this.artifactService.UploadModel(this.ProjectDetailsViewModel.Project.Id, uploadResponse.UploadedFilePath, + $"{this.CometConnectionViewModel.SelectedEngineeringModelSetup.Item2} - {this.CometConnectionViewModel.SelectedIterationSetup.Item2}"); + + if (uploadModelResponse.IsRequestSuccessful) + { + this.ProjectDetailsViewModel.Project.Artifacts.Add(uploadModelResponse.Entity); + this.IsOnCometConnectionMode = false; + } + else + { + this.CometConnectionViewModel.HandleUploadFailure(uploadModelResponse); + } + } + else + { + this.CometConnectionViewModel.HandleUploadFailure(uploadResponse); + } + } + + /// + /// Create a new with the provided data /// /// A private async Task CreateParticipant() diff --git a/UI_DSM/UI_DSM.Client/_Imports.razor b/UI_DSM/UI_DSM.Client/_Imports.razor index 0afe514a..bda39225 100644 --- a/UI_DSM/UI_DSM.Client/_Imports.razor +++ b/UI_DSM/UI_DSM.Client/_Imports.razor @@ -13,6 +13,7 @@ @using UI_DSM.Client.Components.Administration.ProjectManagement @using UI_DSM.Client.Components.Administration.RoleManagement @using UI_DSM.Client.Components.Administration.ParticipantManagement +@using UI_DSM.Client.Components.Administration.ModelManagement @using DevExpress.Blazor @using Microsoft.AspNetCore.Authorization @using AppComponents diff --git a/UI_DSM/UI_DSM.CodeGenerator/Helpers/PropertyReflectionHelper.cs b/UI_DSM/UI_DSM.CodeGenerator/Helpers/PropertyReflectionHelper.cs index 870fc7b6..720365d2 100644 --- a/UI_DSM/UI_DSM.CodeGenerator/Helpers/PropertyReflectionHelper.cs +++ b/UI_DSM/UI_DSM.CodeGenerator/Helpers/PropertyReflectionHelper.cs @@ -21,6 +21,7 @@ namespace UI_DSM.CodeGenerator.Helpers using HandlebarsDotNet; using UI_DSM.CodeGenerator.Extensions; + using UI_DSM.Shared.Annotations; using UI_DSM.Shared.Models; /// @@ -113,6 +114,11 @@ public static void RegisterPropertyReflectionHelper(this IHandlebars handlebars) return propertyInfo.Name != nameof(UserEntity.UserId); } + if (propertyInfo.PropertyType.GetCorrectTypeToCheck().IsAssignableTo(typeof(Entity))) + { + return propertyInfo.GetCustomAttributes().Any(); + } + return true; }); diff --git a/UI_DSM/UI_DSM.CodeGenerator/Templates/dto-class-template.hbs b/UI_DSM/UI_DSM.CodeGenerator/Templates/dto-class-template.hbs index 6a03f755..c0780e1e 100644 --- a/UI_DSM/UI_DSM.CodeGenerator/Templates/dto-class-template.hbs +++ b/UI_DSM/UI_DSM.CodeGenerator/Templates/dto-class-template.hbs @@ -30,7 +30,9 @@ namespace UI_DSM.Shared.DTO.Models { {{#each (PropertyReflection.GetProperties this) as | property |}} {{#if (PropertyReflection.IsEnumerable property)}} + {{#if (PropertyReflection.IsSerialized property)}} this.{{ property.Name }} = new {{#PropertyReflection.GetPropertyType property}}(); + {{/if}} {{/if}} {{/each}} } @@ -40,7 +42,9 @@ namespace UI_DSM.Shared.DTO.Models { {{#each (PropertyReflection.GetProperties this) as | property |}} {{#if (PropertyReflection.IsEnumerable property)}} - this.{{ property.Name }} = new {{#PropertyReflection.GetPropertyType property}}(); + {{#if (PropertyReflection.IsSerialized property)}} + this.{{ property.Name }} = new {{#PropertyReflection.GetPropertyType property}}(); + {{/if}} {{/if}} {{/each}} } diff --git a/UI_DSM/UI_DSM.Serializer.Json.Tests/Data/sample.json b/UI_DSM/UI_DSM.Serializer.Json.Tests/Data/sample.json index 3f7da7e2..66860644 100644 --- a/UI_DSM/UI_DSM.Serializer.Json.Tests/Data/sample.json +++ b/UI_DSM/UI_DSM.Serializer.Json.Tests/Data/sample.json @@ -13,6 +13,9 @@ "bb5a4d0b-ee35-4d8a-8cb9-d471e6326abb", "a8b86b4f-3b2e-441f-a607-3090cfbb5359" ], + "artifacts": [ + "5aac9fe3-2659-47ba-88ba-d642b8d0c94b" + ], "id": "9417d7ea-ce53-4187-897f-f1a1cc2d104e" }, { @@ -117,5 +120,10 @@ "author": "3542293d-cdcd-4143-a546-436bc9d9a118", "isAssignedTo": "3542293d-cdcd-4143-a546-436bc9d9a118", "id": "d6fde0cd-fa4c-4897-a9ea-b81d90396595" + }, { + "@type": "ModelDto", + "modelName": "Envision - Iteration 1", + "fileName": "161A0A63-DFFE-4DFA-8A33-D80B31DEC9FE.zip", + "id": "5aac9fe3-2659-47ba-88ba-d642b8d0c94b" } ] diff --git a/UI_DSM/UI_DSM.Serializer.Json.Tests/JsonDeserializerTestFixture.cs b/UI_DSM/UI_DSM.Serializer.Json.Tests/JsonDeserializerTestFixture.cs index ff02b2d4..3ef6ab8f 100644 --- a/UI_DSM/UI_DSM.Serializer.Json.Tests/JsonDeserializerTestFixture.cs +++ b/UI_DSM/UI_DSM.Serializer.Json.Tests/JsonDeserializerTestFixture.cs @@ -38,7 +38,7 @@ public void VerifyDeserialize() Assert.Multiple(() => { - Assert.That(data, Has.Count.EqualTo(11)); + Assert.That(data, Has.Count.EqualTo(12)); Assert.That(data.OfType(), Is.Not.Empty); Assert.That(data.OfType().First().Id, Is.EqualTo(Guid.Parse("9417d7ea-ce53-4187-897f-f1a1cc2d104e"))); Assert.That(data.OfType().FirstOrDefault(x => x.Id == Guid.Parse("3542293d-cdcd-4143-a546-436bc9d9a118")), Is.Not.Null); diff --git a/UI_DSM/UI_DSM.Serializer.Json.Tests/JsonSerializerTestFixture.cs b/UI_DSM/UI_DSM.Serializer.Json.Tests/JsonSerializerTestFixture.cs index 8ea13397..1d7e96a8 100644 --- a/UI_DSM/UI_DSM.Serializer.Json.Tests/JsonSerializerTestFixture.cs +++ b/UI_DSM/UI_DSM.Serializer.Json.Tests/JsonSerializerTestFixture.cs @@ -130,17 +130,25 @@ public void VerifyCollectionSerialization() ReviewObjectives = new List{reviewObjective.Id} }; + var model = new ModelDto(Guid.NewGuid()) + { + FileName = "161A0A63-DFFE-4DFA-8A33-D80B31DEC9FE.zip", + ModelName = "Envision - Iteration 1" + }; + var project = new ProjectDto(Guid.NewGuid()) { ProjectName = "Project", Participants = new List{participant.Id}, Reviews = new List{review.Id}, - Annotations = new List{commentGuid, noteGuid, feedbackGuid} + Annotations = new List{commentGuid, noteGuid, feedbackGuid}, + Artifacts = new List{model.Id} }; var dtos = new List { - project, participant, user, role, reply, comment, feedback, note, review, reviewObjective, reviewTask + project, participant, user, role, reply, comment, feedback, note, review, reviewObjective, reviewTask, + model }; var stream = new MemoryStream(); diff --git a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/DeserializationProvider.cs b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/DeserializationProvider.cs index 9d3e0e98..24108bb5 100644 --- a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/DeserializationProvider.cs +++ b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/DeserializationProvider.cs @@ -32,6 +32,7 @@ internal static class DeserializationProvider { { "CommentDto", CommentDtoDeserializer.Deserialize }, { "FeedbackDto", FeedbackDtoDeserializer.Deserialize }, + { "ModelDto", ModelDtoDeserializer.Deserialize }, { "NoteDto", NoteDtoDeserializer.Deserialize }, { "ParticipantDto", ParticipantDtoDeserializer.Deserialize }, { "ProjectDto", ProjectDtoDeserializer.Deserialize }, diff --git a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ModelDtoDeserializer.cs b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ModelDtoDeserializer.cs new file mode 100644 index 00000000..ced84815 --- /dev/null +++ b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ModelDtoDeserializer.cs @@ -0,0 +1,77 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------------------------------- +// ------------THIS IS AN AUTOMATICALLY GENERATED FILE. ANY MANUAL CHANGES WILL BE OVERWRITTEN!------------ +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Serializer.Json +{ + using System.Text.Json; + + using UI_DSM.Shared.DTO.Models; + + /// + /// The purpose of the is to provide deserialization capabilities + /// + internal static class ModelDtoDeserializer + { + /// + /// Deserializes an instance of using an + /// + /// The that contains the json object + /// An instance of + internal static ModelDto Deserialize(JsonElement jsonElement) + { + if (!jsonElement.TryGetProperty("@type", out var type)) + { + throw new InvalidOperationException("The @type property is not available, the ModelDtoDeSerializer cannot be used to deserialize this JsonElement"); + } + + if (type.GetString() != "ModelDto") + { + throw new InvalidOperationException($"The ModelDtoDeserializer can only be used to deserialize objects of type ModelDto, a {type.GetString()} was provided"); + } + + var dto = new ModelDto(); + + if (jsonElement.TryGetProperty("id", out var idProperty)) + { + var propertyValue = idProperty.GetString(); + + if (propertyValue == null) + { + throw new JsonException("The id property is not present, the ModelDto cannot be deserialized"); + } + + dto.Id = Guid.Parse(propertyValue); + } + + if (jsonElement.TryGetProperty("modelName", out var modelNameProperty)) + { + dto.ModelName = modelNameProperty.GetString(); + } + + if (jsonElement.TryGetProperty("fileName", out var fileNameProperty)) + { + dto.FileName = fileNameProperty.GetString(); + } + + return dto; + } + } +} + +// ------------------------------------------------------------------------------------------------ +// --------THIS IS AN AUTOMATICALLY GENERATED FILE. ANY MANUAL CHANGES WILL BE OVERWRITTEN!-------- +// ------------------------------------------------------------------------------------------------ \ No newline at end of file diff --git a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ProjectDtoDeserializer.cs b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ProjectDtoDeserializer.cs index d0b575ae..b2b2096c 100644 --- a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ProjectDtoDeserializer.cs +++ b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ProjectDtoDeserializer.cs @@ -101,6 +101,19 @@ internal static ProjectDto Deserialize(JsonElement jsonElement) } } + if (jsonElement.TryGetProperty("artifacts", out var artifactsProperty)) + { + foreach (var item in artifactsProperty.EnumerateArray()) + { + var propertyValue = item.GetString(); + + if (propertyValue != null) + { + dto.Artifacts.Add(Guid.Parse(propertyValue)); + } + } + } + return dto; } } diff --git a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ReviewDtoDeserializer.cs b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ReviewDtoDeserializer.cs index 6b9b22b8..0dfaffe8 100644 --- a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ReviewDtoDeserializer.cs +++ b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoDeserializer/ReviewDtoDeserializer.cs @@ -115,6 +115,19 @@ internal static ReviewDto Deserialize(JsonElement jsonElement) } } + if (jsonElement.TryGetProperty("artifacts", out var artifactsProperty)) + { + foreach (var item in artifactsProperty.EnumerateArray()) + { + var propertyValue = item.GetString(); + + if (propertyValue != null) + { + dto.Artifacts.Add(Guid.Parse(propertyValue)); + } + } + } + return dto; } } diff --git a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ModelDtoSerializer.cs b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ModelDtoSerializer.cs new file mode 100644 index 00000000..b53e54b5 --- /dev/null +++ b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ModelDtoSerializer.cs @@ -0,0 +1,62 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------------------------------- +// ------------THIS IS AN AUTOMATICALLY GENERATED FILE. ANY MANUAL CHANGES WILL BE OVERWRITTEN!------------ +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Serializer.Json +{ + using System.Text.Json; + + using UI_DSM.Shared.DTO.Models; + + /// + /// The purpose of the is to provide serialization capabilities + /// + internal static class ModelDtoSerializer + { + /// + /// Serializes an instance of using an + /// + /// The to serialize + /// The target + internal static void Serialize(object obj, Utf8JsonWriter writer) + { + if (obj is not ModelDto dto) + { + throw new ArgumentException("The object shall be an ModelDto", nameof(obj)); + } + + writer.WriteStartObject(); + + writer.WritePropertyName("@type"); + writer.WriteStringValue("ModelDto"); + + writer.WritePropertyName("modelName"); + writer.WriteStringValue(dto.ModelName); + + writer.WritePropertyName("fileName"); + writer.WriteStringValue(dto.FileName); + + writer.WritePropertyName("id"); + writer.WriteStringValue(dto.Id); + + writer.WriteEndObject(); + } + } +} + +// ------------------------------------------------------------------------------------------------ +// --------THIS IS AN AUTOMATICALLY GENERATED FILE. ANY MANUAL CHANGES WILL BE OVERWRITTEN!-------- +// ------------------------------------------------------------------------------------------------ \ No newline at end of file diff --git a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ProjectDtoSerializer.cs b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ProjectDtoSerializer.cs index 32b81dbb..efc2c530 100644 --- a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ProjectDtoSerializer.cs +++ b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ProjectDtoSerializer.cs @@ -73,6 +73,15 @@ internal static void Serialize(object obj, Utf8JsonWriter writer) writer.WriteEndArray(); + writer.WriteStartArray("artifacts"); + + foreach (var item in dto.Artifacts) + { + writer.WriteStringValue(item); + } + + writer.WriteEndArray(); + writer.WritePropertyName("id"); writer.WriteStringValue(dto.Id); diff --git a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ReviewDtoSerializer.cs b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ReviewDtoSerializer.cs index b8335f6a..6c883c07 100644 --- a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ReviewDtoSerializer.cs +++ b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/ReviewDtoSerializer.cs @@ -70,6 +70,15 @@ internal static void Serialize(object obj, Utf8JsonWriter writer) writer.WriteEndArray(); + writer.WriteStartArray("artifacts"); + + foreach (var item in dto.Artifacts) + { + writer.WriteStringValue(item); + } + + writer.WriteEndArray(); + writer.WritePropertyName("id"); writer.WriteStringValue(dto.Id); diff --git a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/SerializationProvider.cs b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/SerializationProvider.cs index 6b4b88ea..22cbb28b 100644 --- a/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/SerializationProvider.cs +++ b/UI_DSM/UI_DSM.Serializer.Json/AutoGenDtoSerializer/SerializationProvider.cs @@ -32,6 +32,7 @@ internal static class SerializationProvider { { typeof(CommentDto), CommentDtoSerializer.Serialize }, { typeof(FeedbackDto), FeedbackDtoSerializer.Serialize }, + { typeof(ModelDto), ModelDtoSerializer.Serialize }, { typeof(NoteDto), NoteDtoSerializer.Serialize }, { typeof(ParticipantDto), ParticipantDtoSerializer.Serialize }, { typeof(ProjectDto), ProjectDtoSerializer.Serialize }, diff --git a/UI_DSM/UI_DSM.Serializer.Json/UI_DSM.Serializer.Json.csproj b/UI_DSM/UI_DSM.Serializer.Json/UI_DSM.Serializer.Json.csproj index affe0cb9..2d0bda45 100644 --- a/UI_DSM/UI_DSM.Serializer.Json/UI_DSM.Serializer.Json.csproj +++ b/UI_DSM/UI_DSM.Serializer.Json/UI_DSM.Serializer.Json.csproj @@ -1,4 +1,4 @@ - + net6.0 diff --git a/UI_DSM/UI_DSM.Server.Tests/Data/26699a14-79d0-4f10-bcf1-15979ef3968f.zip b/UI_DSM/UI_DSM.Server.Tests/Data/26699a14-79d0-4f10-bcf1-15979ef3968f.zip new file mode 100644 index 0000000000000000000000000000000000000000..daa2a6a6a5649d0afc0f41e80b8311f00af4378a GIT binary patch literal 459339 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�@#J+M<9%}f13;u#St3l7L!)p$B4 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%0Dh1*Y9`~hGJEzLJ*r4MC9>qw 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

mH@HF(o2Uw}X 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 /// The public static void Setup(AbstractValidator validator, out Mock context, - out Mock response, out Mock request, out Mock serviceProvider) where TModule : ModuleBase, new() where TDto : EntityDto + out Mock response, out Mock request, out Mock serviceProvider) where TModule : ModuleBase where TDto : class { response = new Mock(); response.SetupSet(response => response.StatusCode = It.IsAny()).Verifiable(); diff --git a/UI_DSM/UI_DSM.Server.Tests/Managers/ArtifactManagerTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Managers/ArtifactManagerTestFixture.cs new file mode 100644 index 00000000..7a305f95 --- /dev/null +++ b/UI_DSM/UI_DSM.Server.Tests/Managers/ArtifactManagerTestFixture.cs @@ -0,0 +1,174 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Tests.Managers +{ + using System.Diagnostics.CodeAnalysis; + + using Moq; + + using NUnit.Framework; + + using UI_DSM.Server.Managers.ArtifactManager; + using UI_DSM.Server.Managers.ModelManager; + using UI_DSM.Server.Types; + using UI_DSM.Shared.DTO.Models; + using UI_DSM.Shared.Models; + + [TestFixture] + public class ArtifactManagerTestFixture + { + private ArtifactManager manager; + private Mock modelManager; + + [SetUp] + public void Setup() + { + this.modelManager = new Mock(); + this.manager = new ArtifactManager(this.modelManager.Object); + } + + [Test] + public async Task VerifyGetEntities() + { + var models = new List + { + new(Guid.NewGuid()) + { + FileName = "AFileName.zip", + ModelName = "Envision - Iteration 1" + }, + new(Guid.NewGuid()) + { + FileName = "AFileName2.zip", + ModelName = "Envision - Iteration 2" + } + }; + + var project = new Project(Guid.NewGuid()); + project.Artifacts.Add(models.First()); + + var project2 = new Project(Guid.NewGuid()); + project2.Artifacts.Add(models.Last()); + + this.modelManager.Setup(x => x.GetEntities(0)) + .ReturnsAsync(models.SelectMany(x => x.GetAssociatedEntities()).DistinctBy(x => x.Id)); + + var entities = await this.manager.GetEntities(); + Assert.That(entities.ToList(), Has.Count.EqualTo(2)); + + foreach (var model in models) + { + this.modelManager.Setup(x => x.FindEntity(model.Id)).ReturnsAsync(model); + this.modelManager.Setup(x => x.FindEntityWithContainer(model.Id)).ReturnsAsync(model); + } + + entities = await this.manager.GetEntity(Guid.NewGuid()); + Assert.That(entities, Is.Empty); + + var foundEntities = await this.manager.FindEntities(new List + { + models.First().Id, + Guid.NewGuid() + }); + + Assert.That(foundEntities.ToList(), Has.Count.EqualTo(1)); + + var entity = await this.manager.FindEntityWithContainer(models.First().Id); + + Assert.Multiple(async () => + { + Assert.That(entity, Is.Not.Null); + Assert.That(await this.manager.EntityIsContainedBy(models.First().Id, Guid.NewGuid()), Is.False); + Assert.That(await this.manager.EntityIsContainedBy(models.Last().Id, Guid.NewGuid()), Is.False); + Assert.That(await this.manager.EntityIsContainedBy(models.First().Id, project.Id), Is.True); + }); + + this.modelManager.Setup(x => x.GetContainedEntities(project.Id,0)) + .ReturnsAsync(new List + { + models.First() + }); + + Assert.That(await this.manager.GetContainedEntities(project.Id), Is.Not.Empty); + } + + [Test] + public async Task VerifyCreateEntity() + { + var artifact = new Model(); + this.modelManager.Setup(x => x.CreateEntity(artifact)).ReturnsAsync(EntityOperationResult.Failed()); + Assert.That((await this.manager.CreateEntity(artifact)).Succeeded, Is.False); + + this.modelManager.Setup(x => x.CreateEntity(artifact)).ReturnsAsync(EntityOperationResult.Success(artifact)); + Assert.That((await this.manager.CreateEntity(artifact)).Succeeded, Is.True); + + var invalidArtifact = new InvalidArtifact(); + Assert.That((await this.manager.CreateEntity(invalidArtifact)).Succeeded, Is.False); + } + + [Test] + public async Task VerifyUpdateEntity() + { + var artifact = new Model(); + this.modelManager.Setup(x => x.UpdateEntity(artifact)).ReturnsAsync(EntityOperationResult.Failed()); + Assert.That((await this.manager.UpdateEntity(artifact)).Succeeded, Is.False); + + this.modelManager.Setup(x => x.UpdateEntity(artifact)).ReturnsAsync(EntityOperationResult.Success(artifact)); + Assert.That((await this.manager.UpdateEntity(artifact)).Succeeded, Is.True); + + var invalidArtifact = new InvalidArtifact(); + Assert.That((await this.manager.UpdateEntity(invalidArtifact)).Succeeded, Is.False); + } + + [Test] + public async Task VerifyDeleteEntity() + { + var artifact = new Model(); + this.modelManager.Setup(x => x.DeleteEntity(artifact)).ReturnsAsync(EntityOperationResult.Failed()); + Assert.That((await this.manager.DeleteEntity(artifact)).Succeeded, Is.False); + + this.modelManager.Setup(x => x.DeleteEntity(artifact)).ReturnsAsync(EntityOperationResult.Success(artifact)); + Assert.That((await this.manager.DeleteEntity(artifact)).Succeeded, Is.True); + + var invalidArtifact = new InvalidArtifact(); + Assert.That((await this.manager.DeleteEntity(invalidArtifact)).Succeeded, Is.False); + } + + [Test] + public async Task VerifyResolveProperties() + { + var artifact = new Model(); + var dto = new ModelDto(); + var invalidArtifact = new InvalidArtifact(); + + await this.manager.ResolveProperties(artifact, dto); + await this.manager.ResolveProperties(invalidArtifact, dto); + + this.modelManager.Verify(x => x.ResolveProperties(artifact, dto), Times.Once); + } + } + + [ExcludeFromCodeCoverage] + internal class InvalidArtifact : Artifact + { + ///

+ /// Instantiate a from a + /// + /// A new + public override EntityDto ToDto() + { + return null; + } + } +} diff --git a/UI_DSM/UI_DSM.Server.Tests/Managers/ModelManagerTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Managers/ModelManagerTestFixture.cs new file mode 100644 index 00000000..65ce6b46 --- /dev/null +++ b/UI_DSM/UI_DSM.Server.Tests/Managers/ModelManagerTestFixture.cs @@ -0,0 +1,157 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Tests.Managers +{ + using Moq; + + using NUnit.Framework; + + using UI_DSM.Server.Context; + using UI_DSM.Server.Managers.ModelManager; + using UI_DSM.Server.Tests.Helpers; + using UI_DSM.Shared.DTO.Models; + using UI_DSM.Shared.Models; + + [TestFixture] + public class ModelManagerTestFixture + { + private ModelManager manager; + private Mock context; + + [SetUp] + public void Setup() + { + this.context = new Mock(); + + this.manager = new ModelManager(this.context.Object); + } + + [Test] + public async Task VerifyGetEntities() + { + var models = new List + { + new(Guid.NewGuid()) + { + FileName = "AFileName.zip", + ModelName = "Envision - Iteration 1" + }, + new(Guid.NewGuid()) + { + FileName = "AFileName2.zip", + ModelName = "Envision - Iteration 2" + } + }; + + var dbSet = DbSetMockHelper.CreateMock(models); + this.context.Setup(x => x.Models).Returns(dbSet.Object); + + foreach (var model in models) + { + dbSet.Setup(x => x.FindAsync(model.Id)).ReturnsAsync(model); + } + + var allEntities = await this.manager.GetEntities(1); + Assert.That(allEntities.ToList(), Has.Count.EqualTo(2)); + + var invalidGuid = Guid.NewGuid(); + dbSet.Setup(x => x.FindAsync(invalidGuid)).ReturnsAsync((Model)null); + var foundReview = await this.manager.FindEntity(invalidGuid); + Assert.That(foundReview, Is.Null); + + var foundEntities = await this.manager.FindEntities(models.Select(x => x.Id)); + Assert.That(foundEntities.ToList(), Has.Count.EqualTo(2)); + + var deepEntity = await this.manager.GetEntity(models.First().Id, 1); + Assert.That(deepEntity.ToList(), Has.Count.EqualTo(1)); + + var project = new Project(Guid.NewGuid()) + { + Artifacts = { models.First() } + }; + + var containedEntities = await this.manager.GetContainedEntities(project.Id); + Assert.That(containedEntities.ToList(), Has.Count.EqualTo(1)); + } + + [Test] + public async Task VerifyCreateEntity() + { + var model = new Model() + { + FileName = "filename.zip", + ModelName = "Envision - Iteration 1" + }; + + var operationResult = await this.manager.CreateEntity(model); + Assert.That(operationResult.Succeeded, Is.False); + + var projects = new List() + { + new(Guid.NewGuid()) + { + Artifacts = + { + model + } + } + }; + + var projectDbSet = DbSetMockHelper.CreateMock(projects); + this.context.Setup(x => x.Projects).Returns(projectDbSet.Object); + projectDbSet.Setup(x => x.FindAsync(projects.First().Id)).ReturnsAsync(projects.First()); + + await this.manager.CreateEntity(model); + this.context.Verify(x => x.Add(model), Times.Once); + + this.context.Setup(x => x.SaveChangesAsync(default)).ThrowsAsync(new InvalidOperationException()); + operationResult = await this.manager.CreateEntity(model); + Assert.That(operationResult.Succeeded, Is.False); + } + + [Test] + public async Task VerifyUpdateAndDelete() + { + var model = new Model(Guid.NewGuid()) + { + FileName = "filename.zip", + ModelName = "Envision - Iteration 1" + }; + + var operationResult = await this.manager.DeleteEntity(model); + Assert.That(operationResult.Succeeded, Is.False); + + operationResult = await this.manager.UpdateEntity(model); + Assert.That(operationResult.Succeeded, Is.False); + } + + [Test] + public async Task VerifyUpdateProperties() + { + var model = new Model(); + var dto = new ReviewDto() as EntityDto; + + Assert.That(async () => await this.manager.ResolveProperties(model, dto), Throws.Nothing); + + dto = new ModelDto() + { + FileName = "file.zip", + ModelName = "model name" + }; + + await this.manager.ResolveProperties(model, dto); + Assert.That(model.ModelName, Is.EqualTo(((ModelDto)dto).ModelName)); + } + } +} diff --git a/UI_DSM/UI_DSM.Server.Tests/Managers/ProjectManagerTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Managers/ProjectManagerTestFixture.cs index c2a620c5..fe7288bc 100644 --- a/UI_DSM/UI_DSM.Server.Tests/Managers/ProjectManagerTestFixture.cs +++ b/UI_DSM/UI_DSM.Server.Tests/Managers/ProjectManagerTestFixture.cs @@ -21,6 +21,7 @@ namespace UI_DSM.Server.Tests.Managers using UI_DSM.Server.Context; using UI_DSM.Server.Managers.AnnotationManager; + using UI_DSM.Server.Managers.ArtifactManager; using UI_DSM.Server.Managers.ParticipantManager; using UI_DSM.Server.Managers.ProjectManager; using UI_DSM.Server.Managers.ReviewManager; @@ -35,6 +36,7 @@ public class ProjectManagerTestFixture private Mock participantManager; private Mock reviewManager; private Mock annotationManager; + private Mock artifactManager; [SetUp] public void Setup() @@ -43,7 +45,9 @@ public void Setup() this.participantManager = new Mock(); this.reviewManager = new Mock(); this.annotationManager = new Mock(); - this.manager = new ProjectManager(this.context.Object, this.participantManager.Object, this.reviewManager.Object, this.annotationManager.Object); + this.artifactManager = new Mock(); + this.manager = new ProjectManager(this.context.Object, this.participantManager.Object, this.reviewManager.Object, + this.annotationManager.Object, this.artifactManager.Object); } [Test] diff --git a/UI_DSM/UI_DSM.Server.Tests/Managers/ReviewManagerTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Managers/ReviewManagerTestFixture.cs index d340174d..20f64a59 100644 --- a/UI_DSM/UI_DSM.Server.Tests/Managers/ReviewManagerTestFixture.cs +++ b/UI_DSM/UI_DSM.Server.Tests/Managers/ReviewManagerTestFixture.cs @@ -18,6 +18,7 @@ namespace UI_DSM.Server.Tests.Managers using NUnit.Framework; using UI_DSM.Server.Context; + using UI_DSM.Server.Managers.ArtifactManager; using UI_DSM.Server.Managers.ParticipantManager; using UI_DSM.Server.Managers.ReviewManager; using UI_DSM.Server.Managers.ReviewObjectiveManager; @@ -33,6 +34,7 @@ public class ReviewManagerTestFixture private Mock context; private Mock participantManager; private Mock reviewObjectiveManager; + private Mock artifactManager; [SetUp] public void Setup() @@ -40,7 +42,10 @@ public void Setup() this.context = new Mock(); this.participantManager = new Mock(); this.reviewObjectiveManager = new Mock(); - this.manager = new ReviewManager(this.context.Object, this.participantManager.Object, this.reviewObjectiveManager.Object); + this.artifactManager = new Mock(); + + this.manager = new ReviewManager(this.context.Object, this.participantManager.Object, this.reviewObjectiveManager.Object, + this.artifactManager.Object); } [Test] diff --git a/UI_DSM/UI_DSM.Server.Tests/Modules/AnnotationModuleTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Modules/AnnotationModuleTestFixture.cs index acbcbdce..fb07ddd2 100644 --- a/UI_DSM/UI_DSM.Server.Tests/Modules/AnnotationModuleTestFixture.cs +++ b/UI_DSM/UI_DSM.Server.Tests/Modules/AnnotationModuleTestFixture.cs @@ -135,11 +135,15 @@ public async Task VerifyGetEntity() this.participantManager.Setup(x => x.GetParticipantForProject(It.IsAny(), "user")).ReturnsAsync(this.participant); - this.annotationManager.Setup(x => x.FindEntity(annotation.Id)).ReturnsAsync((Annotation)null); + this.annotationManager.As>() + .Setup(x => x.FindEntityWithContainer(annotation.Id)).ReturnsAsync((Annotation)null); + await this.module.GetEntity(this.annotationManager.Object, annotation.Id, this.context.Object); this.response.VerifySet(x => x.StatusCode = 404, Times.Once); - this.annotationManager.Setup(x => x.FindEntity(annotation.Id)).ReturnsAsync(annotation); + this.annotationManager.As>() + .Setup(x => x.FindEntityWithContainer(annotation.Id)).ReturnsAsync(annotation); + await this.module.GetEntity(this.annotationManager.Object, annotation.Id, this.context.Object); this.response.VerifySet(x => x.StatusCode = 400, Times.Once); diff --git a/UI_DSM/UI_DSM.Server.Tests/Modules/ArtifactModuleTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Modules/ArtifactModuleTestFixture.cs new file mode 100644 index 00000000..84a970b2 --- /dev/null +++ b/UI_DSM/UI_DSM.Server.Tests/Modules/ArtifactModuleTestFixture.cs @@ -0,0 +1,151 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Tests.Modules +{ + using Microsoft.AspNetCore.Http; + using Microsoft.AspNetCore.Routing; + + using Moq; + + using NUnit.Framework; + + using UI_DSM.Server.Managers; + using UI_DSM.Server.Managers.ArtifactManager; + using UI_DSM.Server.Modules; + using UI_DSM.Server.Services.FileService; + using UI_DSM.Server.Tests.Helpers; + using UI_DSM.Server.Validator; + using UI_DSM.Shared.DTO.Models; + using UI_DSM.Shared.Models; + + [TestFixture] + public class ArtifactModuleTestFixture + { + private ArtifactModule module; + private Mock> artifactManager; + private Mock context; + private Mock response; + private Mock request; + private Mock serviceProvider; + private Mock> projectManager; + private RouteValueDictionary routeValues; + private Guid projectId; + private Mock fileService; + + [SetUp] + public void Setup() + { + this.projectManager = new Mock>(); + this.artifactManager = new Mock>(); + this.artifactManager.As(); + this.artifactManager.As>(); + + ModuleTestHelper.Setup(new ArtifactValidator(), out this.context, + out this.response, out this.request, out this.serviceProvider); + + this.projectId = Guid.NewGuid(); + + this.routeValues = new RouteValueDictionary + { + ["projectId"] = this.projectId.ToString() + }; + + this.request.Setup(x => x.RouteValues).Returns(this.routeValues); + this.serviceProvider.Setup(x => x.GetService(typeof(IEntityManager))).Returns(this.projectManager.Object); + this.fileService = new Mock(); + this.module = new ArtifactModule(this.fileService.Object); + } + + [Test] + public async Task VerifyGetEntities() + { + var artifacts = new List + { + new Model(Guid.NewGuid()) + }; + + this.artifactManager.As().Setup(x => x.GetContainedEntities(this.projectId, 0)) + .ReturnsAsync(artifacts); + + await this.module.GetEntities(this.artifactManager.Object, this.context.Object); + this.artifactManager.As().Verify(x => x.GetContainedEntities(this.projectId, 0), Times.Once); + } + + [Test] + public async Task VerifyGetEntity() + { + var project = new Project(Guid.NewGuid()); + + var artifact = new Model(Guid.NewGuid()); + + this.artifactManager.As>() + .Setup(x => x.FindEntityWithContainer(artifact.Id)).ReturnsAsync((Artifact)null); + + await this.module.GetEntity(this.artifactManager.Object, artifact.Id, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 404, Times.Once); + + this.artifactManager.As>() + .Setup(x => x.FindEntityWithContainer(artifact.Id)).ReturnsAsync(artifact); + + await this.module.GetEntity(this.artifactManager.Object, artifact.Id, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 400, Times.Once); + + project.Artifacts.Add(artifact); + await this.module.GetEntity(this.artifactManager.Object, artifact.Id, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 400, Times.Exactly(2)); + + this.routeValues["projectId"] = project.Id.ToString(); + await this.module.GetEntity(this.artifactManager.Object, artifact.Id, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 400, Times.Exactly(2)); + } + + [Test] + public async Task VerifyCreateEntity() + { + var modelDto = new ModelDto() + { + FileName = "filename.zip", + ModelName = "Model" + }; + + this.fileService.Setup(x => x.TempFileExists(modelDto.FileName)).Returns(false); + await this.module.CreateEntity(this.artifactManager.Object, modelDto, this.context.Object); + this.response.VerifySet(x => x.StatusCode=404, Times.Once); + + this.fileService.Setup(x => x.TempFileExists(modelDto.FileName)).Returns(true); + this.fileService.Setup(x => x.Exists(this.projectId.ToString(), modelDto.FileName)).Returns(true); + await this.module.CreateEntity(this.artifactManager.Object, modelDto, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 400, Times.Once); + + this.fileService.Setup(x => x.Exists(this.projectId.ToString(), modelDto.FileName)).Returns(false); + this.fileService.Setup(x => x.IsAnnexC3File(modelDto.FileName)).ReturnsAsync(false); + await this.module.CreateEntity(this.artifactManager.Object, modelDto, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 400, Times.Exactly(2)); + + this.fileService.Setup(x => x.IsAnnexC3File(modelDto.FileName)).ReturnsAsync(true); + await this.module.CreateEntity(this.artifactManager.Object, modelDto, this.context.Object); + this.fileService.Verify(x => x.MoveFile(It.IsAny(), It.IsAny()), Times.Once()); + } + + [Test] + public async Task VerifyUpdateAndDeleteEntity() + { + var dto = new ModelDto(Guid.NewGuid()); + + await this.module.UpdateEntity(this.artifactManager.Object, dto.Id, dto, this.context.Object); + await this.module.DeleteEntity(this.artifactManager.Object, dto.Id, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 403, Times.Exactly(2)); + } + } +} diff --git a/UI_DSM/UI_DSM.Server.Tests/Modules/CometModuleTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Modules/CometModuleTestFixture.cs new file mode 100644 index 00000000..7ba4849d --- /dev/null +++ b/UI_DSM/UI_DSM.Server.Tests/Modules/CometModuleTestFixture.cs @@ -0,0 +1,161 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Tests.Modules +{ + using Carter; + + using CDP4Common.EngineeringModelData; + using CDP4Common.SiteDirectoryData; + + using Microsoft.AspNetCore.Http; + using Moq; + + using NUnit.Framework; + + using UI_DSM.Client.Enumerator; + using UI_DSM.Server.Modules; + using UI_DSM.Server.Services.CometService; + using UI_DSM.Server.Tests.Helpers; + using UI_DSM.Server.Validator; + using UI_DSM.Shared.DTO.CometData; + + [TestFixture] + public class CometModuleTestFixture + { + private CometModule module; + private Mock cometService; + private Mock context; + private Mock response; + private Mock serviceProvider; + + [SetUp] + public void Setup() + { + this.cometService = new Mock(); + + ModuleTestHelper.Setup(new CometAuthenticationDataValidator(), out this.context, + out this.response, out _, out this.serviceProvider); + + this.module = new CometModule(this.cometService.Object); + } + + [Test] + public async Task VerifyLogin() + { + var authenticationData = new CometAuthenticationData(); + await this.module.Login(authenticationData, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 400,Times.Once); + + authenticationData.UserName = "user"; + authenticationData.Password = "pass"; + authenticationData.Url = "http://localhost"; + var authenticationReply = new Tuple(AuthenticationStatus.Fail, Guid.Empty); + this.cometService.Setup(x => x.Login(authenticationData)).ReturnsAsync(authenticationReply); + await this.module.Login(authenticationData, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 401, Times.Once); + + authenticationReply = new Tuple(AuthenticationStatus.ServerFailure, Guid.Empty); + this.cometService.Setup(x => x.Login(authenticationData)).ReturnsAsync(authenticationReply); + await this.module.Login(authenticationData, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 500, Times.Once); + + authenticationReply = new Tuple(AuthenticationStatus.Success, Guid.NewGuid()); + this.cometService.Setup(x => x.Login(authenticationData)).ReturnsAsync(authenticationReply); + await this.module.Login(authenticationData, this.context.Object); + } + + [Test] + public async Task VerifyGetAvailableEngineeringModels() + { + var sessionId = Guid.NewGuid(); + + this.cometService.Setup(x => x.GetAvailableEngineeringModel(sessionId)).Throws(); + await this.module.GetAvailableEngineeringModels(sessionId,this.context.Object); + this.response.VerifySet(x => x.StatusCode = 404, Times.Once); + + var engineeringModels = new List + { + new () + { + Iid = Guid.NewGuid(), + Name = "Model", + IterationSetup = + { + new IterationSetup() + { + IsDeleted = true + }, + new IterationSetup(), + new IterationSetup() + { + FrozenOn = DateTime.UtcNow, + IterationNumber = 1, + IterationIid = Guid.NewGuid() + } + } + } + }; + + this.cometService.Setup(x => x.GetAvailableEngineeringModel(sessionId)).Returns(engineeringModels); + await this.module.GetAvailableEngineeringModels(sessionId, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 404, Times.Once); + } + + [Test] + public async Task VerifyLogout() + { + var sessionId = Guid.NewGuid(); + await this.module.Logout(sessionId, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 404, Times.Never); + + this.cometService.Setup(x => x.Close(sessionId)).Throws(); + await this.module.Logout(sessionId, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 404, Times.Once); + } + + [Test] + public async Task VerifyUploadIteration() + { + var validatorService = new Mock(); + validatorService.Setup(x => x.GetValidator()).Returns(new ModelUploadDataValidator()); + this.serviceProvider.Setup(x => x.GetService(typeof(IValidatorLocator))).Returns(validatorService.Object); + + var sessionId = Guid.NewGuid(); + var modelUpload = new ModelUploadData(); + await this.module.UploadIteration(sessionId, modelUpload, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 400, Times.Once); + + modelUpload.ModelId = Guid.NewGuid(); + modelUpload.IterationId = Guid.NewGuid(); + + var iterationSetup = new IterationSetup(); + + this.cometService.Setup(x => x.GetIterationSetup(sessionId, modelUpload.ModelId, modelUpload.IterationId)) + .Returns(iterationSetup); + + var iteration = new Iteration(); + this.cometService.Setup(x => x.ReadIteration(sessionId, iterationSetup)).ReturnsAsync(iteration); + this.cometService.Setup(x => x.CreateAnnexC3File(iteration)).ReturnsAsync("filename.zip"); + + await this.module.UploadIteration(sessionId, modelUpload, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 400, Times.Once); + + this.cometService.Setup(x => x.GetIterationSetup(sessionId, modelUpload.ModelId, modelUpload.IterationId)) + .Throws(); + + await this.module.UploadIteration(sessionId, modelUpload, this.context.Object); + this.response.VerifySet(x => x.StatusCode = 400, Times.Exactly(2)); + } + } +} diff --git a/UI_DSM/UI_DSM.Server.Tests/Modules/ParticipantModuleTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Modules/ParticipantModuleTestFixture.cs index 74cc13f8..9d59b69d 100644 --- a/UI_DSM/UI_DSM.Server.Tests/Modules/ParticipantModuleTestFixture.cs +++ b/UI_DSM/UI_DSM.Server.Tests/Modules/ParticipantModuleTestFixture.cs @@ -47,6 +47,7 @@ public void Setup() this.projectManager = new Mock>(); this.participantManager = new Mock>(); this.participantManager.As(); + this.participantManager.As>(); ModuleTestHelper.Setup(new ParticipantDtoValidator(), out this.context, out this.response, out this.request, out this.serviceProvider); @@ -99,11 +100,16 @@ public async Task VerifyGetEntity() }; this.routeValues["projectId"] = Guid.NewGuid().ToString(); - this.participantManager.Setup(x => x.FindEntity(participant.Id)).ReturnsAsync((Participant)null); + + this.participantManager.As>() + .Setup(x => x.FindEntityWithContainer(participant.Id)).ReturnsAsync((Participant)null); + await this.module.GetEntity(this.participantManager.Object, participant.Id, this.context.Object); this.response.VerifySet(x => x.StatusCode = 404, Times.Once); - this.participantManager.Setup(x => x.FindEntity(participant.Id)).ReturnsAsync(participant); + this.participantManager.As>() + .Setup(x => x.FindEntityWithContainer(participant.Id)).ReturnsAsync(participant); + await this.module.GetEntity(this.participantManager.Object, participant.Id, this.context.Object); this.response.VerifySet(x => x.StatusCode = 400, Times.Once); diff --git a/UI_DSM/UI_DSM.Server.Tests/Modules/ReplyModuleTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Modules/ReplyModuleTestFixture.cs index 1a4eb6ad..ca47a2ab 100644 --- a/UI_DSM/UI_DSM.Server.Tests/Modules/ReplyModuleTestFixture.cs +++ b/UI_DSM/UI_DSM.Server.Tests/Modules/ReplyModuleTestFixture.cs @@ -173,7 +173,8 @@ public async Task VerifyGetEntity() this.annotationManager.As>() .Setup(x => x.EntityIsContainedBy(this.commentId, this.projectId)).ReturnsAsync(false); - this.replyManager.Setup(x => x.FindEntity(reply.Id)).ReturnsAsync(reply); + this.replyManager.As>() + .Setup(x => x.FindEntityWithContainer(reply.Id)).ReturnsAsync(reply); await this.module.GetEntity(this.replyManager.Object, reply.Id, this.context.Object); this.response.VerifySet(x => x.StatusCode = 400, Times.Exactly(2)); @@ -182,7 +183,7 @@ public async Task VerifyGetEntity() .Setup(x => x.EntityIsContainedBy(this.commentId, this.projectId)).ReturnsAsync(true); await this.module.GetEntity(this.replyManager.Object, reply.Id, this.context.Object); - this.replyManager.Verify(x => x.FindEntity(reply.Id), Times.Once); + this.replyManager.As>().Verify(x => x.FindEntityWithContainer(reply.Id), Times.Once); } [Test] diff --git a/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewModuleTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewModuleTestFixture.cs index 28568adb..cea9eb2a 100644 --- a/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewModuleTestFixture.cs +++ b/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewModuleTestFixture.cs @@ -139,11 +139,15 @@ public async Task VerifyGetEntity() this.participantManager.Setup(x => x.GetParticipantForProject(It.IsAny(), "user")).ReturnsAsync(review.Author); - this.reviewManager.Setup(x => x.FindEntity(review.Id)).ReturnsAsync((Review)null); + this.reviewManager.As>() + .Setup(x => x.FindEntityWithContainer(review.Id)).ReturnsAsync((Review)null); + await this.module.GetEntity(this.reviewManager.Object, review.Id, this.context.Object); this.response.VerifySet(x => x.StatusCode = 404, Times.Once); - this.reviewManager.Setup(x => x.FindEntity(review.Id)).ReturnsAsync(review); + this.reviewManager.As>() + .Setup(x => x.FindEntityWithContainer(review.Id)).ReturnsAsync(review); + await this.module.GetEntity(this.reviewManager.Object, review.Id, this.context.Object); this.response.VerifySet(x => x.StatusCode = 400, Times.Once); diff --git a/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewObjectiveModuleTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewObjectiveModuleTestFixture.cs index 3bea5b7f..c9abfa12 100644 --- a/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewObjectiveModuleTestFixture.cs +++ b/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewObjectiveModuleTestFixture.cs @@ -171,7 +171,8 @@ public async Task VerifyGetEntity() this.reviewManager.As>() .Setup(x => x.EntityIsContainedBy(this.reviewId, this.projectId)).ReturnsAsync(false); - this.reviewObjectiveManager.Setup(x => x.FindEntity(reviewObjective.Id)).ReturnsAsync(reviewObjective); + this.reviewObjectiveManager.As>() + .Setup(x => x.FindEntityWithContainer(reviewObjective.Id)).ReturnsAsync(reviewObjective); await this.module.GetEntity(this.reviewObjectiveManager.Object, reviewObjective.Id, this.context.Object); this.response.VerifySet(x => x.StatusCode = 400, Times.Once); @@ -180,7 +181,9 @@ public async Task VerifyGetEntity() .Setup(x => x.EntityIsContainedBy(this.reviewId, this.projectId)).ReturnsAsync(true); await this.module.GetEntity(this.reviewObjectiveManager.Object, reviewObjective.Id, this.context.Object); - this.reviewObjectiveManager.Verify(x => x.FindEntity(reviewObjective.Id), Times.Once); + + this.reviewObjectiveManager.As>() + .Verify(x => x.FindEntityWithContainer(reviewObjective.Id), Times.Once); } [Test] diff --git a/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewTaskModuleTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewTaskModuleTestFixture.cs index 49111cea..dc39801f 100644 --- a/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewTaskModuleTestFixture.cs +++ b/UI_DSM/UI_DSM.Server.Tests/Modules/ReviewTaskModuleTestFixture.cs @@ -187,7 +187,8 @@ public async Task VerifyGetEntity() this.reviewObjectiveManager.As>() .Setup(x => x.EntityIsContainedBy(this.reviewObjectiveId, this.reviewId)).ReturnsAsync(false); - this.reviewTaskManager.Setup(x => x.FindEntity(reviewTask.Id)).ReturnsAsync(reviewTask); + this.reviewTaskManager.As>().Setup(x => + x.FindEntityWithContainer(reviewTask.Id)).ReturnsAsync(reviewTask); await this.module.GetEntity(this.reviewTaskManager.Object, reviewTask.Id, this.context.Object); this.response.VerifySet(x => x.StatusCode = 400, Times.Once); @@ -205,7 +206,9 @@ public async Task VerifyGetEntity() .Setup(x => x.EntityIsContainedBy(this.reviewId, this.projectId)).ReturnsAsync(true); await this.module.GetEntity(this.reviewTaskManager.Object, reviewTask.Id, this.context.Object); - this.reviewTaskManager.Verify(x => x.FindEntity(reviewTask.Id), Times.Once); + + this.reviewTaskManager.As>().Verify(x => + x.FindEntityWithContainer(reviewTask.Id), Times.Once); } [Test] diff --git a/UI_DSM/UI_DSM.Server.Tests/Negotiator/JsonNegotiatorTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Negotiator/JsonNegotiatorTestFixture.cs new file mode 100644 index 00000000..85f53af0 --- /dev/null +++ b/UI_DSM/UI_DSM.Server.Tests/Negotiator/JsonNegotiatorTestFixture.cs @@ -0,0 +1,81 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Tests.Negotiator +{ + using System.Text.Json; + + using Microsoft.AspNetCore.Http; + using Microsoft.Net.Http.Headers; + + using Moq; + + using NUnit.Framework; + + using UI_DSM.Serializer.Json; + using UI_DSM.Server.ResponseNegotiator; + using UI_DSM.Shared.DTO.Common; + using UI_DSM.Shared.DTO.Models; + + [TestFixture] + public class JsonNegotiatorTestFixture + { + private JsonNegotiator negotiator; + private Mock serializer; + + [SetUp] + public void Setup() + { + this.serializer = new Mock(); + this.negotiator = new JsonNegotiator(this.serializer.Object); + } + + [Test] + public void VerifyCanHandle() + { + Assert.Multiple(() => + { + Assert.That(this.negotiator.CanHandle(new MediaTypeHeaderValue("application/json")), Is.True); + Assert.That(this.negotiator.CanHandle(new MediaTypeHeaderValue("application/xml")), Is.False); + }); + } + + [Test] + public async Task VerifyHandle() + { + var request = new Mock(); + var response = new Mock(); + var cancellationToken = new CancellationToken(); + + await this.negotiator.Handle(request.Object, response.Object, new ProjectDto(), cancellationToken); + + this.serializer.Verify(x => + x.SerializeAsync(It.IsAny(), It.IsAny(), It.IsAny()), + Times.Once); + + await this.negotiator.Handle(request.Object, response.Object, new List(), cancellationToken); + + this.serializer.Verify(x => + x.SerializeAsync(It.IsAny>(), It.IsAny(), It.IsAny()), + Times.Once); + + await this.negotiator.Handle(request.Object, response.Object, new EntityRequestResponseDto(), cancellationToken); + + this.serializer.Verify(x => + x.SerializeEntityRequestDtoAsync(It.IsAny(), It.IsAny(), It.IsAny()), + Times.Once); + + Assert.That(async ()=> await this.negotiator.Handle(request.Object, response.Object, "45", cancellationToken), Throws.Exception); + } + } +} diff --git a/UI_DSM/UI_DSM.Server.Tests/Services/CometServiceTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Services/CometServiceTestFixture.cs new file mode 100644 index 00000000..cda3e796 --- /dev/null +++ b/UI_DSM/UI_DSM.Server.Tests/Services/CometServiceTestFixture.cs @@ -0,0 +1,66 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Tests.Services +{ + using CDP4Common.SiteDirectoryData; + + using Moq; + + using NUnit.Framework; + + using UI_DSM.Server.Services.CometService; + using UI_DSM.Server.Services.FileService; + using UI_DSM.Shared.DTO.CometData; + + [TestFixture] + public class CometServiceTestFixture + { + private CometService cometService; + private Mock fileService; + + [SetUp] + public void Setup() + { + this.fileService = new Mock(); + this.cometService = new CometService(this.fileService.Object); + } + + [Test] + public void VerifyLogin() + { + var authenticationData = new CometAuthenticationData() + { + Url = "http://test.abc:5000", + UserName = "admin", + Password = "pass" + }; + + Assert.That(async () => await this.cometService.Login(authenticationData), Throws.Nothing); + } + + [Test] + public void VerifyThatOtherMethodsThrows() + { + var sessionId = Guid.NewGuid(); + + Assert.Multiple( () => + { + Assert.That(async () => await this.cometService.Close(sessionId), Throws.Exception); + Assert.That(async () => await this.cometService.ReadIteration(sessionId, new IterationSetup()), Throws.Exception); + Assert.That(() => this.cometService.GetIterationSetup(sessionId, Guid.NewGuid(), Guid.NewGuid()), Throws.Exception); + Assert.That(() => this.cometService.GetAvailableEngineeringModel(sessionId), Throws.Exception); + }); + } + } +} diff --git a/UI_DSM/UI_DSM.Server.Tests/Services/FileServiceTestFixture.cs b/UI_DSM/UI_DSM.Server.Tests/Services/FileServiceTestFixture.cs new file mode 100644 index 00000000..2e7383f9 --- /dev/null +++ b/UI_DSM/UI_DSM.Server.Tests/Services/FileServiceTestFixture.cs @@ -0,0 +1,84 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Tests.Services +{ + using NUnit.Framework; + + using UI_DSM.Server.Services.FileService; + + [TestFixture] + public class FileServiceTestFixture + { + private FileService fileService; + private Guid projectId; + + [SetUp] + public void Setup() + { + this.fileService= new FileService(TestContext.CurrentContext.TestDirectory); + this.projectId = Guid.NewGuid(); + } + + [TearDown] + public void TearDown() + { + Directory.Delete(this.fileService.GetTempFolder(), true); + Directory.Delete(Path.Combine(TestContext.CurrentContext.TestDirectory, this.projectId.ToString()), true); + } + + [Test] + public void VerifyService() + { + const string fileName = "26699a14-79d0-4f10-bcf1-15979ef3968f.zip"; + + Assert.Multiple(async () => + { + Assert.That(this.fileService.Exists("Data", fileName), Is.True); + Assert.That(this.fileService.TempFileExists(fileName), Is.False); + Assert.That(await this.fileService.IsAnnexC3File(fileName), Is.False); + }); + + File.Copy(Path.Combine("Data", fileName), + Path.Combine(this.fileService.GetTempFolder(), fileName)); + + Assert.Multiple(async () => + { + Assert.That(this.fileService.TempFileExists(fileName), Is.True); + Assert.That(await this.fileService.IsAnnexC3File(fileName), Is.True); + }); + + Assert.That(this.fileService.Exists(this.projectId.ToString(), fileName), Is.False); + this.fileService.MoveFile(fileName, this.projectId.ToString()); + + Assert.Multiple(() => + { + Assert.That(this.fileService.Exists(this.projectId.ToString(), fileName), Is.True); + Assert.That(() => this.fileService.DeleteFile(Path.Combine(this.projectId.ToString(), fileName)), Throws.Nothing); + Assert.That(this.fileService.Exists(this.projectId.ToString(), fileName), Is.False); + Assert.That(() => this.fileService.DeleteFile(Path.Combine(this.projectId.ToString(), fileName)), Throws.Nothing); + }); + + File.Copy(Path.Combine("Data", fileName), + Path.Combine(this.fileService.GetTempFolder(), fileName)); + + Assert.Multiple(() => + { + Assert.That(this.fileService.TempFileExists(fileName), Is.True); + Assert.That(() => this.fileService.DeleteTemporaryFile(fileName), Throws.Nothing); + Assert.That(this.fileService.TempFileExists(fileName), Is.False); + Assert.That(() => this.fileService.DeleteTemporaryFile(fileName), Throws.Nothing); + }); + } + } +} diff --git a/UI_DSM/UI_DSM.Server.Tests/UI_DSM.Server.Tests.csproj b/UI_DSM/UI_DSM.Server.Tests/UI_DSM.Server.Tests.csproj index 269c5317..f066401d 100644 --- a/UI_DSM/UI_DSM.Server.Tests/UI_DSM.Server.Tests.csproj +++ b/UI_DSM/UI_DSM.Server.Tests/UI_DSM.Server.Tests.csproj @@ -27,4 +27,10 @@ + + + PreserveNewest + + + diff --git a/UI_DSM/UI_DSM.Server/Context/DatabaseContext.cs b/UI_DSM/UI_DSM.Server/Context/DatabaseContext.cs index baf948a5..3d437185 100644 --- a/UI_DSM/UI_DSM.Server/Context/DatabaseContext.cs +++ b/UI_DSM/UI_DSM.Server/Context/DatabaseContext.cs @@ -98,6 +98,11 @@ protected DatabaseContext() ///
public virtual DbSet Notes { get; set; } + /// + /// A of + /// + public virtual DbSet Models { get; set; } + /// /// Tries to validate an object /// @@ -124,6 +129,7 @@ protected override void OnModelCreating(ModelBuilder builder) builder.Entity().HasIndex(x => x.ProjectName).IsUnique(); builder.Entity().HasIndex(x => x.RoleName).IsUnique(); + builder.Entity().HasIndex(x => x.FileName).IsUnique(); builder.Entity().HasMany(p => p.Participants) .WithOne(p => (Project)p.EntityContainer) @@ -140,15 +146,26 @@ protected override void OnModelCreating(ModelBuilder builder) .HasForeignKey("EntityContainerId") .OnDelete(DeleteBehavior.Cascade); + builder.Entity().HasMany(p => p.Artifacts) + .WithOne(p => (Project)p.EntityContainer) + .HasForeignKey("EntityContainerId") + .OnDelete(DeleteBehavior.Cascade); + builder.Entity().Navigation(x => x.Participants).AutoInclude(); builder.Entity().Navigation(x => x.Reviews).AutoInclude(); builder.Entity().Navigation(x => x.Annotations).AutoInclude(); + builder.Entity().Navigation(x => x.Artifacts).AutoInclude(); builder.Entity().Navigation(x => x.Role).AutoInclude(); builder.Entity().Navigation(x => x.User).AutoInclude(); builder.Entity().Navigation(x => x.Author).AutoInclude(); builder.Entity().Navigation(x => x.ReviewObjectives).AutoInclude(); + + builder.Entity().HasMany(x => x.Artifacts) + .WithMany(x => x.Reviews); + + builder.Entity().Navigation(x => x.Artifacts).AutoInclude(); builder.Entity().HasMany(x => x.ReviewObjectives) .WithOne(ro => (Review)ro.EntityContainer) @@ -168,7 +185,7 @@ protected override void OnModelCreating(ModelBuilder builder) builder.Entity().HasMany(x => x.Annotations); builder.Entity().Navigation(x => x.Annotations).AutoInclude(); - + builder.Entity().HasMany(a => a.AnnotatableItems); builder.Entity().Navigation(x => x.Author).AutoInclude(); diff --git a/UI_DSM/UI_DSM.Server/Managers/ArtifactManager/ArtifactManager.cs b/UI_DSM/UI_DSM.Server/Managers/ArtifactManager/ArtifactManager.cs new file mode 100644 index 00000000..35308cb5 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Managers/ArtifactManager/ArtifactManager.cs @@ -0,0 +1,210 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Managers.ArtifactManager +{ + using UI_DSM.Server.Context; + using UI_DSM.Server.Managers.ModelManager; + using UI_DSM.Server.Types; + using UI_DSM.Shared.DTO.Models; + using UI_DSM.Shared.Models; + + /// + /// This manager handles operation to the Database for s + /// + public class ArtifactManager : IArtifactManager + { + /// + /// The + /// + private readonly IModelManager modelManager; + + /// + /// Initializes a new instance of the class. + /// + /// The + public ArtifactManager(IModelManager modelManager) + { + this.modelManager = modelManager; + } + + /// + /// Gets a collection of all s and associated + /// + /// The level of deepnest that we need to retrieve associated + /// A with a collection of as result + public async Task> GetEntities(int deepLevel = 0) + { + var annotatableItems = new List(); + annotatableItems.AddRange(await this.modelManager.GetEntities(deepLevel)); + return annotatableItems.DistinctBy(x => x.Id); + } + + /// + /// Tries to get a based on its and its associated + /// + /// The + /// The level of deepnest that we need to retrieve associated + /// A with a collection of if found + public async Task> GetEntity(Guid entityId, int deepLevel = 0) + { + var artifact = await this.FindEntity(entityId); + + return artifact == null ? Enumerable.Empty() : artifact.GetAssociatedEntities(deepLevel); + } + + /// + /// Tries to get a based on its + /// + /// The + /// A with the if found + public async Task FindEntity(Guid entityId) + { + return await this.modelManager.FindEntity(entityId); + } + + /// + /// Tries to get all based on their + /// + /// A collection of + /// A collection of + public async Task> FindEntities(IEnumerable entitiesId) + { + var entities = new List(); + + foreach (var id in entitiesId) + { + var entity = await this.FindEntity(id); + + if (entity != null) + { + entities.Add(entity); + } + } + + return entities; + } + + /// + /// Creates a new and store it into the + /// + /// The to create + /// A with the result of the creation + public async Task> CreateEntity(Artifact entity) + { + switch (entity) + { + case Model model: + var modelResult = await this.modelManager.CreateEntity(model); + + return modelResult.Succeeded + ? EntityOperationResult.Success(modelResult.Entity) + : EntityOperationResult.Failed(modelResult.Errors.ToArray()); + } + + return EntityOperationResult.Failed("Unknowned Annotation subclass"); + } + + /// + /// Updates a + /// + /// The to update + /// A with the result of the update + public async Task> UpdateEntity(Artifact entity) + { + switch (entity) + { + case Model model: + var modelResult = await this.modelManager.UpdateEntity(model); + + return modelResult.Succeeded + ? EntityOperationResult.Success(modelResult.Entity) + : EntityOperationResult.Failed(modelResult.Errors.ToArray()); + } + + return EntityOperationResult.Failed("Unknowned Annotation subclass"); + } + + /// + /// Deletes a + /// + /// The to delete + /// A with the result of the deletion + public async Task> DeleteEntity(Artifact entity) + { + switch (entity) + { + case Model model: + var modelResult = await this.modelManager.DeleteEntity(model); + + return modelResult.Succeeded + ? EntityOperationResult.Success(modelResult.Entity) + : EntityOperationResult.Failed(modelResult.Errors.ToArray()); + } + + return EntityOperationResult.Failed("Unknowned Annotation subclass"); + } + + /// + /// Resolve all properties for the + /// + /// The + /// The + /// A + public async Task ResolveProperties(Artifact entity, EntityDto dto) + { + switch (entity) + { + case Model model: + await this.modelManager.ResolveProperties(model, dto); + break; + } + } + + /// + /// Finds an and includes his container + /// + /// The id + /// A with the + public async Task FindEntityWithContainer(Guid entityId) + { + return await this.modelManager.FindEntityWithContainer(entityId); + } + + /// + /// Gets all that are contained by the with the Id + /// and associated + /// + /// The of the container + /// The deep level + /// A with a collection of + public async Task> GetContainedEntities(Guid containerId, int deepLevel = 0) + { + var artifacts = new List(); + artifacts.AddRange(await this.modelManager.GetContainedEntities(containerId, deepLevel)); + return artifacts.DistinctBy(x => x.Id); + } + + /// + /// Verifies if the container of the has the given + /// + /// The of the + /// The of the container + /// A with the value of the check + public async Task EntityIsContainedBy(Guid entityId, Guid containerId) + { + var artifact = await this.FindEntityWithContainer(entityId); + return artifact != null && artifact.EntityContainer.Id == containerId; + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Managers/ArtifactManager/IArtifactManager.cs b/UI_DSM/UI_DSM.Server/Managers/ArtifactManager/IArtifactManager.cs new file mode 100644 index 00000000..eb052ca3 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Managers/ArtifactManager/IArtifactManager.cs @@ -0,0 +1,24 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Managers.ArtifactManager +{ + using UI_DSM.Shared.Models; + + /// + /// Interface definition for + /// + public interface IArtifactManager : IContainedEntityManager + { + } +} diff --git a/UI_DSM/UI_DSM.Server/Managers/ModelManager/IModelManager.cs b/UI_DSM/UI_DSM.Server/Managers/ModelManager/IModelManager.cs new file mode 100644 index 00000000..36fb3ae4 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Managers/ModelManager/IModelManager.cs @@ -0,0 +1,24 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Managers.ModelManager +{ + using UI_DSM.Shared.Models; + + /// + /// Interface definition for + /// + public interface IModelManager : IContainedEntityManager + { + } +} diff --git a/UI_DSM/UI_DSM.Server/Managers/ModelManager/ModelManager.cs b/UI_DSM/UI_DSM.Server/Managers/ModelManager/ModelManager.cs new file mode 100644 index 00000000..664c3d49 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Managers/ModelManager/ModelManager.cs @@ -0,0 +1,231 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Managers.ModelManager +{ + using Microsoft.EntityFrameworkCore; + + using NLog; + + using UI_DSM.Server.Context; + using UI_DSM.Server.Extensions; + using UI_DSM.Server.Types; + using UI_DSM.Shared.DTO.Models; + using UI_DSM.Shared.Models; + + /// + /// This manager handles operation to the Database for s + /// + public class ModelManager : IModelManager + { + /// + /// The + /// + private readonly DatabaseContext context; + + /// + /// The logger + /// + private readonly Logger logger = LogManager.GetCurrentClassLogger(); + + /// + /// Initializes a new instance of the class. + /// + /// The + public ModelManager(DatabaseContext context) + { + this.context = context; + } + + /// + /// Gets a collection of all s and associated + /// + /// The level of deepnest that we need to retrieve associated + /// A with a collection of as result + public async Task> GetEntities(int deepLevel = 0) + { + var models = await this.context.Models.ToListAsync(); + return models.SelectMany(x => x.GetAssociatedEntities(deepLevel)).DistinctBy(x => x.Id); + } + + /// + /// Tries to get a based on its and its associated + /// + /// The + /// The level of deepnest that we need to retrieve associated + /// A with a collection of if found + public async Task> GetEntity(Guid entityId, int deepLevel = 0) + { + var model = await this.FindEntity(entityId); + return model == null ? Enumerable.Empty() : model.GetAssociatedEntities(deepLevel); + } + + /// + /// Tries to get a based on its + /// + /// The + /// A with the if found + public async Task FindEntity(Guid entityId) + { + return await this.context.Models.FindAsync(entityId); + } + + /// + /// Tries to get all based on their + /// + /// A collection of + /// A collection of + public async Task> FindEntities(IEnumerable entitiesId) + { + var entities = new List(); + + foreach (var id in entitiesId) + { + var entity = await this.FindEntity(id); + + if (entity != null) + { + entities.Add(entity); + } + } + + return entities; + } + + /// + /// Creates a new and store it into the + /// + /// The to create + /// A with the result of the creation + public async Task> CreateEntity(Model entity) + { + var validations = this.context.ValidateModel(entity); + + if (validations.Any()) + { + return EntityOperationResult.Failed(validations.ToArray()); + } + + if (!await this.VerifyContainer(entity)) + { + return EntityOperationResult.Failed($"Unable to compute the container the current entity with the id {entity.Id}"); + } + + var operationResult = new EntityOperationResult(this.context.Add(entity), EntityState.Added); + + try + { + await this.context.SaveChangesAsync(); + } + catch (Exception exception) + { + if (ExceptionHelper.IsUniqueConstraintViolation(exception)) + { + operationResult.HandleExpection($"The Model {entity.FileName} is already exist"); + } + else + { + operationResult.HandleExpection(exception); + this.logger.Error(exception.Message); + } + } + + return operationResult; + } + + /// + /// Updates a + /// + /// The to update + /// A with the result of the update + public async Task> UpdateEntity(Model entity) + { + await Task.CompletedTask; + return EntityOperationResult.Failed("A Model cannot be updated"); + } + + /// + /// Deletes a + /// + /// The to delete + /// A with the result of the deletion + public async Task> DeleteEntity(Model entity) + { + await Task.CompletedTask; + return EntityOperationResult.Failed("A Model cannot be deleted"); + } + + /// + /// Resolve all properties for the + /// + /// The + /// The + /// A + public Task ResolveProperties(Model entity, EntityDto dto) + { + if (dto is not ModelDto modelDto) + { + return Task.CompletedTask; + } + + entity.ResolveProperties(modelDto, new Dictionary()); + return Task.CompletedTask; + } + + /// + /// Finds an and includes his container + /// + /// The id + /// A with the + public async Task FindEntityWithContainer(Guid entityId) + { + return await this.context.Models.Where(x => x.Id == entityId) + .Include(x => x.EntityContainer).FirstOrDefaultAsync(); + } + + /// + /// Gets all that are contained by the with the Id + /// and associated + /// + /// The of the container + /// The deep level + /// A with a collection of + public async Task> GetContainedEntities(Guid containerId, int deepLevel = 0) + { + var models = await this.context.Models.Where(x => x.EntityContainer != null && x.EntityContainer.Id == containerId).ToListAsync(); + return models.SelectMany(x => x.GetAssociatedEntities(deepLevel)).DistinctBy(x => x.Id); + } + + /// + /// Verifies if the container of the has the given + /// + /// The of the + /// The of the container + /// A with the value of the check + public async Task EntityIsContainedBy(Guid entityId, Guid containerId) + { + var model = await this.FindEntityWithContainer(entityId); + return model != null && model.EntityContainer.Id == containerId; + } + + /// + /// Check if the container of the exists inside the database + /// + /// The + /// A with the result of the check + private async Task VerifyContainer(Entity entity) + { + return entity.EntityContainer != null && await this.context.Projects.FindAsync(entity.EntityContainer.Id) != null; + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Managers/ProjectManager/ProjectManager.cs b/UI_DSM/UI_DSM.Server/Managers/ProjectManager/ProjectManager.cs index 44cc8193..0e381ca7 100644 --- a/UI_DSM/UI_DSM.Server/Managers/ProjectManager/ProjectManager.cs +++ b/UI_DSM/UI_DSM.Server/Managers/ProjectManager/ProjectManager.cs @@ -20,6 +20,7 @@ namespace UI_DSM.Server.Managers.ProjectManager using UI_DSM.Server.Context; using UI_DSM.Server.Extensions; using UI_DSM.Server.Managers.AnnotationManager; + using UI_DSM.Server.Managers.ArtifactManager; using UI_DSM.Server.Managers.ParticipantManager; using UI_DSM.Server.Managers.ReviewManager; using UI_DSM.Server.Types; @@ -31,6 +32,16 @@ namespace UI_DSM.Server.Managers.ProjectManager ///
public class ProjectManager : IProjectManager { + /// + /// The + /// + private readonly IAnnotationManager annotationManager; + + /// + /// The + /// + private readonly IArtifactManager artifactManager; + /// /// The /// @@ -51,24 +62,22 @@ public class ProjectManager : IProjectManager ///
private readonly IReviewManager reviewManager; - /// - /// The - /// - private readonly IAnnotationManager annotationManager; - /// /// Initializes a new instance of the class. /// /// The /// The - /// The - /// The - public ProjectManager(DatabaseContext context, IParticipantManager participantManager, IReviewManager reviewManager, IAnnotationManager annotationManager) + /// The + /// The + /// The + public ProjectManager(DatabaseContext context, IParticipantManager participantManager, IReviewManager reviewManager, + IAnnotationManager annotationManager, IArtifactManager artifactManager) { this.context = context; this.participantManager = participantManager; this.reviewManager = reviewManager; this.annotationManager = annotationManager; + this.artifactManager = artifactManager; } /// @@ -229,13 +238,14 @@ public async Task ResolveProperties(Project entity, EntityDto dto) relatedEntities.InsertEntityCollection(await this.participantManager.FindEntities(projectDto.Participants)); relatedEntities.InsertEntityCollection(await this.reviewManager.FindEntities(projectDto.Reviews)); relatedEntities.InsertEntityCollection(await this.annotationManager.FindEntities(projectDto.Annotations)); + relatedEntities.InsertEntityCollection(await this.artifactManager.FindEntities(projectDto.Artifacts)); entity.ResolveProperties(projectDto, relatedEntities); } /// /// Get a collection of where a is a /// - /// The name of the + /// The name of the /// A with a collection of public async Task> GetAvailableProjectsForUser(string userName) { diff --git a/UI_DSM/UI_DSM.Server/Managers/ReviewManager/ReviewManager.cs b/UI_DSM/UI_DSM.Server/Managers/ReviewManager/ReviewManager.cs index 495d7c6b..22775be5 100644 --- a/UI_DSM/UI_DSM.Server/Managers/ReviewManager/ReviewManager.cs +++ b/UI_DSM/UI_DSM.Server/Managers/ReviewManager/ReviewManager.cs @@ -19,6 +19,7 @@ namespace UI_DSM.Server.Managers.ReviewManager using UI_DSM.Server.Context; using UI_DSM.Server.Extensions; + using UI_DSM.Server.Managers.ArtifactManager; using UI_DSM.Server.Managers.ParticipantManager; using UI_DSM.Server.Managers.ReviewObjectiveManager; using UI_DSM.Server.Types; @@ -31,6 +32,11 @@ namespace UI_DSM.Server.Managers.ReviewManager /// public class ReviewManager : IReviewManager { + /// + /// The + /// + private readonly IArtifactManager artifactManager; + /// /// The /// @@ -56,12 +62,15 @@ public class ReviewManager : IReviewManager ///
/// The /// The - /// The - public ReviewManager(DatabaseContext context, IParticipantManager participantManager, IReviewObjectiveManager reviewObjectiveManager) + /// The + /// The + public ReviewManager(DatabaseContext context, IParticipantManager participantManager, IReviewObjectiveManager reviewObjectiveManager, + IArtifactManager artifactManager) { this.context = context; this.participantManager = participantManager; this.reviewObjectiveManager = reviewObjectiveManager; + this.artifactManager = artifactManager; } /// @@ -232,6 +241,7 @@ public async Task ResolveProperties(Review entity, EntityDto dto) var relatedEntities = new Dictionary(); relatedEntities.InsertEntity(await this.participantManager.FindEntity(reviewDto.Author)); relatedEntities.InsertEntityCollection(await this.reviewObjectiveManager.FindEntities(reviewDto.ReviewObjectives)); + relatedEntities.InsertEntityCollection(await this.artifactManager.FindEntities(reviewDto.Artifacts)); entity.ResolveProperties(reviewDto, relatedEntities); } diff --git a/UI_DSM/UI_DSM.Server/Migrations/20220922150534_ModelMigration.Designer.cs b/UI_DSM/UI_DSM.Server/Migrations/20220922150534_ModelMigration.Designer.cs new file mode 100644 index 00000000..0d00e96b --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Migrations/20220922150534_ModelMigration.Designer.cs @@ -0,0 +1,1003 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using UI_DSM.Server.Context; + +#nullable disable + +namespace UI_DSM.Server.Migrations +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20220922150534_ModelMigration")] + partial class ModelMigration + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AnnotatableItemAnnotation", b => + { + b.Property("AnnotatableItemsId") + .HasColumnType("uuid"); + + b.Property("AnnotationsId") + .HasColumnType("uuid"); + + b.HasKey("AnnotatableItemsId", "AnnotationsId"); + + b.HasIndex("AnnotationsId"); + + b.ToTable("AnnotatableItemAnnotation"); + }); + + modelBuilder.Entity("ArtifactReview", b => + { + b.Property("ArtifactsId") + .HasColumnType("uuid"); + + b.Property("ReviewsId") + .HasColumnType("uuid"); + + b.HasKey("ArtifactsId", "ReviewsId"); + + b.HasIndex("ReviewsId"); + + b.ToTable("ArtifactReview"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + + b.HasData( + new + { + Id = "AF8956F8-CA85-4DF2-8CB6-C46D0845B987", + ConcurrencyStamp = "bdaed18c-5e74-46bd-8536-c1255071fd03", + Name = "Administrator", + NormalizedName = "ADMINISTRATOR" + }); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("text"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + + b.HasData( + new + { + UserId = "F3E3BACF-5F7C-4657-88E9-FA904EFB64D7", + RoleId = "AF8956F8-CA85-4DF2-8CB6-C46D0845B987" + }); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("text"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Entity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.ToTable("Entity"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.User", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + + b.HasData( + new + { + Id = "F3E3BACF-5F7C-4657-88E9-FA904EFB64D7", + AccessFailedCount = 0, + ConcurrencyStamp = "3f1e53a3-5e68-4514-b53a-5f2afba551f1", + EmailConfirmed = false, + IsAdmin = true, + LockoutEnabled = false, + NormalizedUserName = "ADMIN", + PasswordHash = "AQAAAAEAACcQAAAAEDr2GVdqM38+1tymdhti7jnMdCMq/DgMJicqe7P1sRgZ50asePWsDN40KjHaC59odw==", + PhoneNumberConfirmed = false, + SecurityStamp = "facbc854-1ec0-4c4d-8a08-0551243724d4", + TwoFactorEnabled = false, + UserName = "admin" + }); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.AnnotatableItem", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("AuthorId") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone"); + + b.HasIndex("AuthorId"); + + b.ToTable("AnnotatableItem"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Annotation", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("AuthorId") + .HasColumnType("uuid"); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.HasIndex("AuthorId"); + + b.HasIndex("EntityContainerId"); + + b.ToTable("Annotation"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Artifact", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.Property("FileName") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.HasIndex("EntityContainerId"); + + b.ToTable("Artifact"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Participant", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasIndex("EntityContainerId"); + + b.HasIndex("RoleId"); + + b.HasIndex("UserId"); + + b.ToTable("Participant"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Project", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .IsRequired() + .HasColumnType("text"); + + b.HasIndex("EntityContainerId"); + + b.HasIndex("ProjectName") + .IsUnique(); + + b.ToTable("Project"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Reply", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("AuthorId") + .HasColumnType("uuid"); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.HasIndex("AuthorId"); + + b.HasIndex("EntityContainerId"); + + b.ToTable("Reply"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Review", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("AuthorId") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.Property("ReviewNumber") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("ReviewNumber")); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasIndex("AuthorId"); + + b.HasIndex("EntityContainerId"); + + b.ToTable("Review"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.ReviewTask", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("AuthorId") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.Property("IsAssignedToId") + .HasColumnType("uuid"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TaskNumber") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("TaskNumber")); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasIndex("AuthorId"); + + b.HasIndex("EntityContainerId"); + + b.HasIndex("IsAssignedToId"); + + b.ToTable("ReviewTask"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Role", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("AccessRights") + .IsRequired() + .HasColumnType("integer[]"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.Property("RoleName") + .IsRequired() + .HasColumnType("text"); + + b.HasIndex("EntityContainerId"); + + b.HasIndex("RoleName") + .IsUnique(); + + b.ToTable("Role"); + + b.HasData( + new + { + Id = new Guid("fd580a55-9666-4abe-a02b-3a99478996f7"), + AccessRights = new[] { 0, 1, 2, 3 }, + RoleName = "Project Administrator" + }, + new + { + Id = new Guid("28b83519-fb7c-4a9a-8279-194140bfcfbe"), + AccessRights = new[] { 4 }, + RoleName = "Reviewer" + }); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.UserEntity", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("text"); + + b.Property("UserName") + .HasColumnType("text"); + + b.HasIndex("EntityContainerId"); + + b.HasIndex("UserId"); + + b.ToTable("UserEntity"); + + b.HasData( + new + { + Id = new Guid("3503bf4c-1211-41eb-b369-aaa6bbdf5ff8"), + IsAdmin = true, + UserId = "F3E3BACF-5F7C-4657-88E9-FA904EFB64D7", + UserName = "admin" + }); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Comment", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Annotation"); + + b.ToTable("Comment"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Feedback", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Annotation"); + + b.ToTable("Feedback"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Model", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Artifact"); + + b.Property("ModelName") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.ToTable("Model"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Note", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Annotation"); + + b.ToTable("Note"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.ReviewObjective", b => + { + b.HasBaseType("UI_DSM.Shared.Models.AnnotatableItem"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.Property("ReviewObjectiveNumber") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("ReviewObjectiveNumber")); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasIndex("EntityContainerId"); + + b.ToTable("ReviewObjective"); + }); + + modelBuilder.Entity("AnnotatableItemAnnotation", b => + { + b.HasOne("UI_DSM.Shared.Models.AnnotatableItem", null) + .WithMany() + .HasForeignKey("AnnotatableItemsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("UI_DSM.Shared.Models.Annotation", null) + .WithMany() + .HasForeignKey("AnnotationsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ArtifactReview", b => + { + b.HasOne("UI_DSM.Shared.Models.Artifact", null) + .WithMany() + .HasForeignKey("ArtifactsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("UI_DSM.Shared.Models.Review", null) + .WithMany() + .HasForeignKey("ReviewsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("UI_DSM.Shared.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("UI_DSM.Shared.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("UI_DSM.Shared.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("UI_DSM.Shared.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.AnnotatableItem", b => + { + b.HasOne("UI_DSM.Shared.Models.Participant", "Author") + .WithMany() + .HasForeignKey("AuthorId"); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.AnnotatableItem", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Annotation", b => + { + b.HasOne("UI_DSM.Shared.Models.Participant", "Author") + .WithMany() + .HasForeignKey("AuthorId"); + + b.HasOne("UI_DSM.Shared.Models.Project", "EntityContainer") + .WithMany("Annotations") + .HasForeignKey("EntityContainerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Annotation", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("EntityContainer"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Artifact", b => + { + b.HasOne("UI_DSM.Shared.Models.Project", "EntityContainer") + .WithMany("Artifacts") + .HasForeignKey("EntityContainerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Artifact", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityContainer"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Participant", b => + { + b.HasOne("UI_DSM.Shared.Models.Project", "EntityContainer") + .WithMany("Participants") + .HasForeignKey("EntityContainerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Participant", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("UI_DSM.Shared.Models.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("UI_DSM.Shared.Models.UserEntity", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityContainer"); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Project", b => + { + b.HasOne("UI_DSM.Shared.Models.Entity", "EntityContainer") + .WithMany() + .HasForeignKey("EntityContainerId"); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Project", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityContainer"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Reply", b => + { + b.HasOne("UI_DSM.Shared.Models.Participant", "Author") + .WithMany() + .HasForeignKey("AuthorId"); + + b.HasOne("UI_DSM.Shared.Models.Comment", "EntityContainer") + .WithMany("Replies") + .HasForeignKey("EntityContainerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Reply", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("EntityContainer"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Review", b => + { + b.HasOne("UI_DSM.Shared.Models.Participant", "Author") + .WithMany() + .HasForeignKey("AuthorId"); + + b.HasOne("UI_DSM.Shared.Models.Project", "EntityContainer") + .WithMany("Reviews") + .HasForeignKey("EntityContainerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Review", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("EntityContainer"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.ReviewTask", b => + { + b.HasOne("UI_DSM.Shared.Models.Participant", "Author") + .WithMany() + .HasForeignKey("AuthorId"); + + b.HasOne("UI_DSM.Shared.Models.ReviewObjective", "EntityContainer") + .WithMany("ReviewTasks") + .HasForeignKey("EntityContainerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.ReviewTask", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("UI_DSM.Shared.Models.Participant", "IsAssignedTo") + .WithMany() + .HasForeignKey("IsAssignedToId"); + + b.Navigation("Author"); + + b.Navigation("EntityContainer"); + + b.Navigation("IsAssignedTo"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Role", b => + { + b.HasOne("UI_DSM.Shared.Models.Entity", "EntityContainer") + .WithMany() + .HasForeignKey("EntityContainerId"); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Role", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityContainer"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.UserEntity", b => + { + b.HasOne("UI_DSM.Shared.Models.Entity", "EntityContainer") + .WithMany() + .HasForeignKey("EntityContainerId"); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.UserEntity", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("UI_DSM.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("EntityContainer"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Comment", b => + { + b.HasOne("UI_DSM.Shared.Models.Annotation", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Comment", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Feedback", b => + { + b.HasOne("UI_DSM.Shared.Models.Annotation", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Feedback", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Model", b => + { + b.HasOne("UI_DSM.Shared.Models.Artifact", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Model", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Note", b => + { + b.HasOne("UI_DSM.Shared.Models.Annotation", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Note", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.ReviewObjective", b => + { + b.HasOne("UI_DSM.Shared.Models.Review", "EntityContainer") + .WithMany("ReviewObjectives") + .HasForeignKey("EntityContainerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("UI_DSM.Shared.Models.AnnotatableItem", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.ReviewObjective", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityContainer"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Project", b => + { + b.Navigation("Annotations"); + + b.Navigation("Artifacts"); + + b.Navigation("Participants"); + + b.Navigation("Reviews"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Review", b => + { + b.Navigation("ReviewObjectives"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.Comment", b => + { + b.Navigation("Replies"); + }); + + modelBuilder.Entity("UI_DSM.Shared.Models.ReviewObjective", b => + { + b.Navigation("ReviewTasks"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Migrations/20220922150534_ModelMigration.cs b/UI_DSM/UI_DSM.Server/Migrations/20220922150534_ModelMigration.cs new file mode 100644 index 00000000..fe705f0a --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Migrations/20220922150534_ModelMigration.cs @@ -0,0 +1,133 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace UI_DSM.Server.Migrations +{ + using System.Diagnostics.CodeAnalysis; + + [ExcludeFromCodeCoverage] + public partial class ModelMigration : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Artifact", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + FileName = table.Column(type: "text", nullable: true), + EntityContainerId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Artifact", x => x.Id); + table.ForeignKey( + name: "FK_Artifact_Entity_Id", + column: x => x.Id, + principalTable: "Entity", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Artifact_Project_EntityContainerId", + column: x => x.EntityContainerId, + principalTable: "Project", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ArtifactReview", + columns: table => new + { + ArtifactsId = table.Column(type: "uuid", nullable: false), + ReviewsId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ArtifactReview", x => new { x.ArtifactsId, x.ReviewsId }); + table.ForeignKey( + name: "FK_ArtifactReview_Artifact_ArtifactsId", + column: x => x.ArtifactsId, + principalTable: "Artifact", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ArtifactReview_Review_ReviewsId", + column: x => x.ReviewsId, + principalTable: "Review", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Model", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ModelName = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Model", x => x.Id); + table.ForeignKey( + name: "FK_Model_Artifact_Id", + column: x => x.Id, + principalTable: "Artifact", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.UpdateData( + table: "AspNetRoles", + keyColumn: "Id", + keyValue: "AF8956F8-CA85-4DF2-8CB6-C46D0845B987", + column: "ConcurrencyStamp", + value: "bdaed18c-5e74-46bd-8536-c1255071fd03"); + + migrationBuilder.UpdateData( + table: "AspNetUsers", + keyColumn: "Id", + keyValue: "F3E3BACF-5F7C-4657-88E9-FA904EFB64D7", + columns: new[] { "ConcurrencyStamp", "PasswordHash", "SecurityStamp" }, + values: new object[] { "3f1e53a3-5e68-4514-b53a-5f2afba551f1", "AQAAAAEAACcQAAAAEDr2GVdqM38+1tymdhti7jnMdCMq/DgMJicqe7P1sRgZ50asePWsDN40KjHaC59odw==", "facbc854-1ec0-4c4d-8a08-0551243724d4" }); + + migrationBuilder.CreateIndex( + name: "IX_Artifact_EntityContainerId", + table: "Artifact", + column: "EntityContainerId"); + + migrationBuilder.CreateIndex( + name: "IX_ArtifactReview_ReviewsId", + table: "ArtifactReview", + column: "ReviewsId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ArtifactReview"); + + migrationBuilder.DropTable( + name: "Model"); + + migrationBuilder.DropTable( + name: "Artifact"); + + migrationBuilder.UpdateData( + table: "AspNetRoles", + keyColumn: "Id", + keyValue: "AF8956F8-CA85-4DF2-8CB6-C46D0845B987", + column: "ConcurrencyStamp", + value: "9a2b04bc-fbf1-4bbb-aef3-214084843ecd"); + + migrationBuilder.UpdateData( + table: "AspNetUsers", + keyColumn: "Id", + keyValue: "F3E3BACF-5F7C-4657-88E9-FA904EFB64D7", + columns: new[] { "ConcurrencyStamp", "PasswordHash", "SecurityStamp" }, + values: new object[] { "4a038e0b-f742-4b04-95fd-2de6f7895f23", "AQAAAAEAACcQAAAAEDQkHLx6aVgzvBDau1UCK8kmQ9nCCLdpmx/7Daop5C5Oo5ntq+2S7l3+WTFjSp0rug==", "ef330ed2-78fa-47d2-b15d-f94b6e75a9c1" }); + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Migrations/DatabaseContextModelSnapshot.cs b/UI_DSM/UI_DSM.Server/Migrations/DatabaseContextModelSnapshot.cs index d33e759a..c0b2ca5b 100644 --- a/UI_DSM/UI_DSM.Server/Migrations/DatabaseContextModelSnapshot.cs +++ b/UI_DSM/UI_DSM.Server/Migrations/DatabaseContextModelSnapshot.cs @@ -40,6 +40,21 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AnnotatableItemAnnotation"); }); + modelBuilder.Entity("ArtifactReview", b => + { + b.Property("ArtifactsId") + .HasColumnType("uuid"); + + b.Property("ReviewsId") + .HasColumnType("uuid"); + + b.HasKey("ArtifactsId", "ReviewsId"); + + b.HasIndex("ReviewsId"); + + b.ToTable("ArtifactReview"); + }); + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => { b.Property("Id") @@ -69,7 +84,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) new { Id = "AF8956F8-CA85-4DF2-8CB6-C46D0845B987", - ConcurrencyStamp = "9a2b04bc-fbf1-4bbb-aef3-214084843ecd", + ConcurrencyStamp = "bdaed18c-5e74-46bd-8536-c1255071fd03", Name = "Administrator", NormalizedName = "ADMINISTRATOR" }); @@ -270,14 +285,14 @@ protected override void BuildModel(ModelBuilder modelBuilder) { Id = "F3E3BACF-5F7C-4657-88E9-FA904EFB64D7", AccessFailedCount = 0, - ConcurrencyStamp = "4a038e0b-f742-4b04-95fd-2de6f7895f23", + ConcurrencyStamp = "3f1e53a3-5e68-4514-b53a-5f2afba551f1", EmailConfirmed = false, IsAdmin = true, LockoutEnabled = false, NormalizedUserName = "ADMIN", - PasswordHash = "AQAAAAEAACcQAAAAEDQkHLx6aVgzvBDau1UCK8kmQ9nCCLdpmx/7Daop5C5Oo5ntq+2S7l3+WTFjSp0rug==", + PasswordHash = "AQAAAAEAACcQAAAAEDr2GVdqM38+1tymdhti7jnMdCMq/DgMJicqe7P1sRgZ50asePWsDN40KjHaC59odw==", PhoneNumberConfirmed = false, - SecurityStamp = "ef330ed2-78fa-47d2-b15d-f94b6e75a9c1", + SecurityStamp = "facbc854-1ec0-4c4d-8a08-0551243724d4", TwoFactorEnabled = false, UserName = "admin" }); @@ -324,6 +339,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("Annotation"); }); + modelBuilder.Entity("UI_DSM.Shared.Models.Artifact", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Entity"); + + b.Property("EntityContainerId") + .HasColumnType("uuid"); + + b.Property("FileName") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.HasIndex("EntityContainerId"); + + b.ToTable("Artifact"); + }); + modelBuilder.Entity("UI_DSM.Shared.Models.Participant", b => { b.HasBaseType("UI_DSM.Shared.Models.Entity"); @@ -554,6 +585,17 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("Feedback"); }); + modelBuilder.Entity("UI_DSM.Shared.Models.Model", b => + { + b.HasBaseType("UI_DSM.Shared.Models.Artifact"); + + b.Property("ModelName") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.ToTable("Model"); + }); + modelBuilder.Entity("UI_DSM.Shared.Models.Note", b => { b.HasBaseType("UI_DSM.Shared.Models.Annotation"); @@ -605,6 +647,21 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired(); }); + modelBuilder.Entity("ArtifactReview", b => + { + b.HasOne("UI_DSM.Shared.Models.Artifact", null) + .WithMany() + .HasForeignKey("ArtifactsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("UI_DSM.Shared.Models.Review", null) + .WithMany() + .HasForeignKey("ReviewsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) @@ -693,6 +750,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("EntityContainer"); }); + modelBuilder.Entity("UI_DSM.Shared.Models.Artifact", b => + { + b.HasOne("UI_DSM.Shared.Models.Project", "EntityContainer") + .WithMany("Artifacts") + .HasForeignKey("EntityContainerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("UI_DSM.Shared.Models.Entity", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Artifact", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityContainer"); + }); + modelBuilder.Entity("UI_DSM.Shared.Models.Participant", b => { b.HasOne("UI_DSM.Shared.Models.Project", "EntityContainer") @@ -866,6 +939,15 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired(); }); + modelBuilder.Entity("UI_DSM.Shared.Models.Model", b => + { + b.HasOne("UI_DSM.Shared.Models.Artifact", null) + .WithOne() + .HasForeignKey("UI_DSM.Shared.Models.Model", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("UI_DSM.Shared.Models.Note", b => { b.HasOne("UI_DSM.Shared.Models.Annotation", null) @@ -895,6 +977,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Navigation("Annotations"); + b.Navigation("Artifacts"); + b.Navigation("Participants"); b.Navigation("Reviews"); diff --git a/UI_DSM/UI_DSM.Server/Modules/ArtifactModule.cs b/UI_DSM/UI_DSM.Server/Modules/ArtifactModule.cs new file mode 100644 index 00000000..267e502f --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Modules/ArtifactModule.cs @@ -0,0 +1,188 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Modules +{ + using Carter.Response; + + using Microsoft.AspNetCore.Authorization; + using Microsoft.AspNetCore.Components; + + using UI_DSM.Server.Managers; + using UI_DSM.Server.Services.FileService; + using UI_DSM.Shared.DTO.Common; + using UI_DSM.Shared.DTO.Models; + using UI_DSM.Shared.Models; + + /// + /// The is a + /// to manage + /// related to a + /// + [Route("api/Project/{projectId:guid}/Artifact")] + public class ArtifactModule : ContainedEntityModule + { + /// + /// The + /// + private readonly IFileService fileService; + + /// + /// Initializes a new instance of the class. + /// + /// The + public ArtifactModule(IFileService fileService) + { + this.fileService = fileService; + } + + /// + /// Gets a collection of all + /// + /// The + /// The + /// An optional parameters for the deep level + /// A + [Authorize] + public override Task GetEntities(IEntityManager manager, HttpContext context, int deepLevel = 0) + { + return base.GetEntities(manager, context, deepLevel); + } + + /// + /// Get a based on its with all associated entities + /// + /// The + /// The + /// The + /// An optional parameters for the deep level + /// A + [Authorize] + public override Task GetEntity(IEntityManager manager, Guid entityId, HttpContext context, int deepLevel = 0) + { + return base.GetEntity(manager, entityId, context, deepLevel); + } + + /// + /// Tries to create a new based on its + /// + /// The + /// The + /// The + /// An optional parameters for the deep level + /// A + [Authorize] + public override async Task CreateEntity(IEntityManager manager, ArtifactDto dto, HttpContext context, int deepLevel = 0) + { + var requestResponse = new EntityRequestResponseDto(); + + if (!this.fileService.TempFileExists(dto.FileName)) + { + context.Response.StatusCode = 404; + + requestResponse.Errors = new List + { + "Invalid artifact fileName" + }; + + await context.Response.Negotiate(requestResponse); + return; + } + + var projectId = this.GetAdditionalRouteId(context.Request, this.ContainerRouteKey); + + if (this.fileService.Exists(projectId.ToString(), dto.FileName)) + { + context.Response.StatusCode = 400; + + requestResponse.Errors = new List + { + "The artifact already exists !" + }; + + this.fileService.DeleteTemporaryFile(dto.FileName); + await context.Response.Negotiate(requestResponse); + return; + } + + if (dto is ModelDto && !await this.fileService.IsAnnexC3File(dto.FileName)) + { + context.Response.StatusCode = 400; + + requestResponse.Errors = new List + { + "The artifact is not a valid Annex C3 file" + }; + + this.fileService.DeleteTemporaryFile(dto.FileName); + await context.Response.Negotiate(requestResponse); + return; + } + + dto.FileName = this.fileService.MoveFile(dto.FileName, projectId.ToString()); + await base.CreateEntity(manager, dto, context, deepLevel); + } + + /// + /// Tries to delete an defined by the given + /// + /// The + /// The of the to delete + /// The + /// A with the as result + [Authorize] + public override async Task DeleteEntity(IEntityManager manager, Guid entityId, HttpContext context) + { + context.Response.StatusCode = 403; + await Task.CompletedTask; + return new RequestResponseDto { Errors = { "Forbidden to delete an artifact" } }; + } + + /// + /// Tries to update an existing + /// + /// The + /// The of the + /// The + /// The + /// An optional parameters for the deep level + /// A as result + [Authorize] + public override Task UpdateEntity(IEntityManager manager, Guid entityId, ArtifactDto dto, HttpContext context, int deepLevel = 0) + { + context.Response.StatusCode = 403; + return Task.CompletedTask; + } + + /// + /// Adds the into the corresponding collection of the + /// + /// The + /// The + protected override void AddEntityIntoContainerCollection(Artifact entity, Project container) + { + container.Artifacts.Add(entity); + } + + /// + /// Verifies if the provided routes is correctly formatted with all containment + /// + /// The + /// A with the result of the check + protected override async Task AdditionalRouteValidation(HttpContext context) + { + await Task.CompletedTask; + return true; + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Modules/CometModule.cs b/UI_DSM/UI_DSM.Server/Modules/CometModule.cs new file mode 100644 index 00000000..fb5f8f75 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Modules/CometModule.cs @@ -0,0 +1,228 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Modules +{ + using System.Diagnostics.CodeAnalysis; + + using Carter.ModelBinding; + using Carter.Response; + + using CDP4Common.EngineeringModelData; + + using Microsoft.AspNetCore.Authorization; + using Microsoft.AspNetCore.Mvc; + + using UI_DSM.Client.Enumerator; + using UI_DSM.Server.Services.CometService; + using UI_DSM.Shared.DTO.CometData; + using UI_DSM.Shared.DTO.Common; + + /// + /// The is a module that handles a connection to a Comet server + /// to be able to download an + /// + [Microsoft.AspNetCore.Components.Route("api/Comet")] + public class CometModule : ModuleBase + { + /// + /// The + /// + private readonly ICometService cometService; + + /// + /// Initializes a new instance of the class. + /// + /// The + public CometModule(ICometService cometService) + { + this.cometService = cometService; + } + + /// + /// Adds routes to the + /// + /// The + [ExcludeFromCodeCoverage] + public override void AddRoutes(IEndpointRouteBuilder app) + { + app.MapPost($"{this.MainRoute}/Login", this.Login) + .Accepts("application/json") + .Produces() + .Produces(400) + .Produces(401) + .Produces(500) + .WithTags("Comet") + .WithName("Comet/Login"); + + app.MapGet(this.MainRoute + "/{sessionId:guid}/Models", this.GetAvailableEngineeringModels) + .Produces() + .Produces(404) + .WithTags("Comet") + .WithName("Comet/Models"); + + app.MapPost(this.MainRoute + "/{sessionId:guid}/Models/Upload", this.UploadIteration) + .Accepts("application/json") + .Produces() + .Produces(400) + .WithTags("Comet") + .WithName("Comet/Upload"); + + app.MapDelete(this.MainRoute + "/{sessionId:guid}", this.Logout) + .Produces() + .Produces(404) + .WithTags("Comet") + .WithName("Comet/Logout"); + } + + /// + /// Close the at the given + /// + /// The of the + /// The + /// A + [Authorize(Roles = "Administrator")] + public async Task Logout(Guid sessionId, HttpContext context) + { + var response = new RequestResponseDto(); + + try + { + await this.cometService.Close(sessionId); + response.IsRequestSuccessful = true; + } + catch (Exception exception) + { + response.Errors = new List { exception.Message }; + context.Response.StatusCode = 404; + } + + await context.Response.Negotiate(response); + } + + /// + /// Gets all available inside a that contains frozen + /// + /// + /// The of the + /// The + /// A + [Authorize(Roles = "Administrator")] + public async Task GetAvailableEngineeringModels(Guid sessionId, HttpContext context) + { + var response = new ModelsDataResponse(); + + try + { + var models = this.cometService.GetAvailableEngineeringModel(sessionId); + + foreach (var model in models) + { + var frozenIteration = model.IterationSetup.Where(iteration => !iteration.IsDeleted && iteration.FrozenOn != null); + + response.AvailableModels[model.Iid] = frozenIteration.Select(x => + new Tuple(x.IterationIid, $"Iteration {x.IterationNumber}")).ToList(); + + response.ModelNames[model.Iid] = model.Name; + } + } + catch (Exception exception) + { + context.Response.StatusCode = 404; + response.Errors = new List { exception.Message }; + } + + await context.Response.Negotiate(response); + } + + /// + /// Tries to log to a Comet session + /// + /// The to use to establish the connection + /// The + /// A + [Authorize(Roles = "Administrator")] + public async Task Login([FromBody] CometAuthenticationData authenticationData, HttpContext context) + { + var cometResponse = new CometAuthenticationResponse(); + var validationResult = context.Request.Validate(authenticationData); + + if (!validationResult.IsValid) + { + cometResponse.Errors = validationResult.Errors.Select(x => x.ErrorMessage).ToList(); + context.Response.StatusCode = 400; + await context.Response.Negotiate(cometResponse); + return; + } + + var result = await this.cometService.Login(authenticationData); + + switch (result.Item1) + { + case AuthenticationStatus.Success: + cometResponse.SessionId = result.Item2; + cometResponse.IsRequestSuccessful = true; + break; + case AuthenticationStatus.Fail: + cometResponse.Errors = new List { "Invalid username/password" }; + context.Response.StatusCode = 401; + break; + case AuthenticationStatus.ServerFailure: + cometResponse.Errors = new List { $"Comet server not reachable at the folling url {authenticationData.Url}" }; + context.Response.StatusCode = 500; + break; + } + + await context.Response.Negotiate(cometResponse); + } + + /// + /// Saves the selected into an Annex C3 file + /// + /// The of the + /// The + /// The + /// A + [Authorize(Roles = "Administrator")] + public async Task UploadIteration(Guid sessionId, [FromBody] ModelUploadData modelUpload, HttpContext context) + { + var response = new ModelUploadResponse(); + + var validationResult = context.Request.Validate(modelUpload); + + if (!validationResult.IsValid) + { + response.Errors = validationResult.Errors.Select(x => x.ErrorMessage).ToList(); + context.Response.StatusCode = 400; + await context.Response.Negotiate(response); + return; + } + + try + { + var iterationSetup = this.cometService.GetIterationSetup(sessionId, modelUpload.ModelId, modelUpload.IterationId); + var iteration = await this.cometService.ReadIteration(sessionId, iterationSetup); + var annexC3File = await this.cometService.CreateAnnexC3File(iteration); + response.UploadedFilePath = annexC3File; + response.IsRequestSuccessful = true; + } + catch (Exception exception) + { + context.Response.StatusCode = 400; + response.Errors = new List { exception.Message }; + } + + await context.Response.Negotiate(response); + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Modules/ContainedEntityModule.cs b/UI_DSM/UI_DSM.Server/Modules/ContainedEntityModule.cs index 2051840d..ae91892f 100644 --- a/UI_DSM/UI_DSM.Server/Modules/ContainedEntityModule.cs +++ b/UI_DSM/UI_DSM.Server/Modules/ContainedEntityModule.cs @@ -84,7 +84,8 @@ public override async Task GetEntity(IEntityManager manager, Guid entit return; } - var entity = await manager.FindEntity(entityId); + var containedManager = manager as IContainedEntityManager; + var entity = await containedManager!.FindEntityWithContainer(entityId); if (entity == null) { diff --git a/UI_DSM/UI_DSM.Server/Modules/EntityModule.cs b/UI_DSM/UI_DSM.Server/Modules/EntityModule.cs index 607ecf98..b4c24069 100644 --- a/UI_DSM/UI_DSM.Server/Modules/EntityModule.cs +++ b/UI_DSM/UI_DSM.Server/Modules/EntityModule.cs @@ -20,6 +20,7 @@ namespace UI_DSM.Server.Modules using Microsoft.AspNetCore.Mvc; + using UI_DSM.Serializer.Json; using UI_DSM.Server.Managers; using UI_DSM.Server.Types; using UI_DSM.Shared.DTO.Common; @@ -65,7 +66,7 @@ public override void AddRoutes(IEndpointRouteBuilder app) .WithTags(this.EntityName) .WithName($"{this.EntityName}/GetEntity"); - app.MapPost($"{this.MainRoute}/Create", this.CreateEntity) + app.MapPost($"{this.MainRoute}/Create", this.ConvertEntityAndCreate) .Accepts("application/json") .Produces(201) .Produces(422) @@ -80,7 +81,7 @@ public override void AddRoutes(IEndpointRouteBuilder app) .WithTags(this.EntityName) .WithName($"{this.EntityName}/DeleteEntity"); - app.MapPut(this.MainRoute + "/{entityId:guid}", this.UpdateEntity) + app.MapPut(this.MainRoute + "/{entityId:guid}", this.ConvertEntityAndUpdate) .Produces() .Produces(404) .Produces(422) @@ -139,8 +140,8 @@ public virtual async Task CreateEntity(IEntityManager manager, TEntityD if (entity == null) { - await context.Response.Negotiate(requestReponse); - return; + await context.Response.Negotiate(requestReponse); + return; } await manager.ResolveProperties(entity, dto); @@ -214,16 +215,33 @@ public virtual async Task UpdateEntity(IEntityManager manager, Guid ent } /// - /// Validates the found and tries to update the + /// Deserialize the body of the request as an + /// + /// The + /// The + /// The deserialized + protected TEntityDto DeserializeBodyRequest(IJsonDeserializer deserializer, HttpContext context) + { + if (!context.Request.HasJsonContentType()) + { + return null; + } + + var dto = deserializer.Deserialize(context.Request.BodyReader.AsStream()).FirstOrDefault() as TEntityDto; + return dto; + } + + /// + /// Validates the found and tries to update the /// - /// The - /// The - /// The - /// The - /// The + /// The + /// The + /// The + /// The + /// The /// The deep level - /// A - protected async Task ValidateAndUpdateEntity(IEntityManager manager, TEntity entity, TEntityDto dto, HttpContext context, EntityRequestResponseDto requestResponse, int deepLevel) + /// A + protected async Task ValidateAndUpdateEntity(IEntityManager manager, TEntity entity, TEntityDto dto, HttpContext context, EntityRequestResponseDto requestResponse, int deepLevel) { var validationResult = context.Request.Validate(dto); @@ -333,5 +351,34 @@ protected bool ValidateEntityAndContainer(Entity entity, string keyId, HttpConte return true; } + + /// + /// Deserialize the and tries to create the corresponding POCO + /// + /// The + /// The + /// The + /// The deepLevel + /// A + private Task ConvertEntityAndCreate(IEntityManager manager, IJsonDeserializer deserializer, HttpContext context, [FromQuery] int deepLevel = 0) + { + var dto = this.DeserializeBodyRequest(deserializer, context); + return this.CreateEntity(manager, dto, context, deepLevel); + } + + /// + /// Deserialize the and tries to update the corresponding POCO + /// + /// The + /// The + /// The of the + /// The + /// The deepLevel + /// A + private Task ConvertEntityAndUpdate(IEntityManager manager, IJsonDeserializer deserializer, Guid entityId, HttpContext context, [FromQuery] int deepLevel = 0) + { + var dto = this.DeserializeBodyRequest(deserializer, context); + return this.UpdateEntity(manager, entityId, dto, context, deepLevel); + } } } diff --git a/UI_DSM/UI_DSM.Server/Program.cs b/UI_DSM/UI_DSM.Server/Program.cs index ec47b6fd..d72293e2 100644 --- a/UI_DSM/UI_DSM.Server/Program.cs +++ b/UI_DSM/UI_DSM.Server/Program.cs @@ -29,6 +29,8 @@ namespace UI_DSM.Server using UI_DSM.Serializer.Json; using UI_DSM.Server.Context; using UI_DSM.Server.Modules; + using UI_DSM.Server.Services.CometService; + using UI_DSM.Server.Services.FileService; using UI_DSM.Shared.Models; /// @@ -47,10 +49,11 @@ public class Program /// /// A collection of public static void Main(string[] args) - { + { var builder = WebApplication.CreateBuilder(args); // Add services to the container. + builder.Services.AddCarter(); builder.Services.AddAuthorization(); @@ -69,6 +72,9 @@ public static void Main(string[] args) builder.Services.AddIdentity().AddEntityFrameworkStores(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(_ => new FileService(builder.Configuration["StoragePath"])); RegisterManagers(builder); RegisterModules(); diff --git a/UI_DSM/UI_DSM.Server/Services/CometService/CometService.cs b/UI_DSM/UI_DSM.Server/Services/CometService/CometService.cs new file mode 100644 index 00000000..205c0b36 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Services/CometService/CometService.cs @@ -0,0 +1,233 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Services.CometService +{ + using CDP4Common.EngineeringModelData; + using CDP4Common.SiteDirectoryData; + + using CDP4Dal; + using CDP4Dal.DAL; + using CDP4Dal.Exceptions; + using CDP4Dal.Operations; + + using CDP4JsonFileDal; + + using CDP4ServicesDal; + + using UI_DSM.Client.Enumerator; + using UI_DSM.Server.Services.FileService; + using UI_DSM.Shared.DTO.CometData; + + /// + /// Service that provides helper methods related to Comet + /// + public class CometService : ICometService + { + /// + /// A to keep track of current + /// + private readonly Dictionary currentSessions = new(); + + /// + /// The + /// + private readonly IFileService fileService; + + /// + /// Initializes a new instance of the class. + /// + /// The + public CometService(IFileService fileService) + { + this.fileService = fileService; + } + + /// + /// Tries to login to a Comet + /// + /// The + /// A with the result of the login process + public async Task> Login(CometAuthenticationData authenticationData) + { + var sessionId = Guid.NewGuid(); + var uri = new Uri(authenticationData.Url); + var dal = new CdpServicesDal(); + var credentials = new Credentials(authenticationData.UserName, authenticationData.Password, uri); + var session = new Session(dal, credentials); + + try + { + await session.Open(); + + if (session.RetrieveSiteDirectory() == null) + { + return Tuple.Create(AuthenticationStatus.Fail, Guid.Empty); + } + + this.currentSessions[sessionId] = session; + return Tuple.Create(AuthenticationStatus.Success, sessionId); + } + catch (DalReadException) + { + return Tuple.Create(AuthenticationStatus.Fail, Guid.Empty); + } + catch (HttpRequestException) + { + return Tuple.Create(AuthenticationStatus.ServerFailure, Guid.Empty); + } + } + + /// + /// Closes a + /// + /// The of the to close + /// A + public async Task Close(Guid sessionId) + { + var session = this.GetSession(sessionId); + + foreach (var iteration in session.OpenIterations.Select(x => x.Key)) + { + await session.CloseIterationSetup(iteration.IterationSetup); + } + + await session.Close(); + this.currentSessions.Remove(sessionId); + } + + /// + /// Gets a collection of available + /// + /// + /// The of the to get + /// + /// + /// A collection of + public IEnumerable GetAvailableEngineeringModel(Guid sessionId) + { + var session = this.GetSession(sessionId); + + var siteDirectory = session.RetrieveSiteDirectory(); + + return siteDirectory.Model + .Where(x => x.Participant.Any(p => p.IsActive && p.Person.Iid == session.ActivePerson.Iid) + && x.IterationSetup.Any(iteration => !iteration.IsDeleted && iteration.FrozenOn != null)); + } + + /// + /// Reads an to get the corresponding + /// + /// + /// The of the + /// The + /// A with the + public async Task ReadIteration(Guid sessionId, IterationSetup iterationSetup) + { + var session = this.GetSession(sessionId); + + var modelSetup = (EngineeringModelSetup)iterationSetup.Container; + var participant = modelSetup.Participant.FirstOrDefault(x => x.IsActive && x.Person.Iid == session.ActivePerson.Iid); + + if (participant == null) + { + throw new InvalidOperationException("The logged in Person is not part of the provided IterationSetup"); + } + + var model = new EngineeringModel(modelSetup.EngineeringModelIid, session.Assembler.Cache, session.Credentials.Uri); + var iteration = new Iteration(iterationSetup.IterationIid, session.Assembler.Cache, session.Credentials.Uri); + model.Iteration.Add(iteration); + + await session.Read(iteration, participant.SelectedDomain); + + if (session.OpenIterations.All(x => x.Key.Iid != iteration.Iid)) + { + throw new InvalidOperationException("An error occured during opening the iteration"); + } + + return session.OpenIterations.First(x => x.Key.Iid == iteration.Iid).Key; + } + + /// + /// Creates an Annex C3 file for the provided iteration + /// + /// The + /// A with the name of the created file + public async Task CreateAnnexC3File(Iteration iteration) + { + var fileName = $"{iteration.Iid}.zip"; + var path = Path.Combine(this.fileService.GetTempFolder(),fileName); + var credentials = new Credentials("admin", "pass", new Uri(path)); + var dal = new JsonFileDal(); + _ = new Session(dal, credentials); + + var operationContainers = new List(); + var transactionContext = TransactionContextResolver.ResolveContext(iteration); + var operationContainer = new OperationContainer(transactionContext.ContextRoute()); + var dto = iteration.ToDto(); + + var operation = new Operation(null, dto, OperationKind.Create); + operationContainer.AddOperation(operation); + operationContainers.Add(operationContainer); + await dal.Write(operationContainers); + return fileName; + } + + /// + /// Gets an based on provided s + /// + /// The of the + /// The of the + /// The of the + /// The + public IterationSetup GetIterationSetup(Guid sessionId, Guid modelId, Guid iterationId) + { + var session = this.GetSession(sessionId); + var siteDirectory = session.RetrieveSiteDirectory(); + var model = siteDirectory.Model.FirstOrDefault(x => x.Iid == modelId); + + if (model == null) + { + throw new ArgumentException("Invalid model id"); + } + + var iteration = model.IterationSetup.FirstOrDefault(x => x.IterationIid == iterationId); + + if (iteration == null) + { + throw new ArgumentException("Invalid iteration id"); + } + + return iteration; + } + + /// + /// Gets the correct . + /// + /// The of the + /// The + /// + /// If the provided does not correspond to any + /// + /// + private ISession GetSession(Guid sessionId) + { + if (!this.currentSessions.TryGetValue(sessionId, out var session)) + { + throw new ArgumentException("Invalid session id"); + } + + return session; + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Services/CometService/ICometService.cs b/UI_DSM/UI_DSM.Server/Services/CometService/ICometService.cs new file mode 100644 index 00000000..37dcc5ec --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Services/CometService/ICometService.cs @@ -0,0 +1,78 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Services.CometService +{ + using CDP4Common.EngineeringModelData; + using CDP4Common.SiteDirectoryData; + + using CDP4Dal; + + using UI_DSM.Client.Enumerator; + using UI_DSM.Shared.DTO.CometData; + + /// + /// Interface definition for + /// + public interface ICometService + { + /// + /// Tries to login to a Comet + /// + /// The + /// A with the result of the login process + Task> Login(CometAuthenticationData authenticationData); + + /// + /// Closes a + /// + /// The of the to close + /// A + Task Close(Guid sessionId); + + /// + /// Gets a collection of available + /// + /// + /// The of the to get + /// + /// + /// A collection of + IEnumerable GetAvailableEngineeringModel(Guid sessionId); + + /// + /// Reads an to get the corresponding + /// + /// + /// The of the + /// The + /// A with the + Task ReadIteration(Guid sessionId, IterationSetup iterationSetup); + + /// + /// Creates an Annex C3 file for the provided iteration + /// + /// The + /// A with the name of the created file + Task CreateAnnexC3File(Iteration iteration); + + /// + /// Gets an based on provided s + /// + /// The of the + /// The of the + /// The of the + /// The + IterationSetup GetIterationSetup(Guid sessionId, Guid modelId, Guid iterationId); + } +} diff --git a/UI_DSM/UI_DSM.Server/Services/FileService/FileService.cs b/UI_DSM/UI_DSM.Server/Services/FileService/FileService.cs new file mode 100644 index 00000000..19acd539 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Services/FileService/FileService.cs @@ -0,0 +1,163 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Services.FileService +{ + using CDP4Dal; + using CDP4Dal.DAL; + + using CDP4JsonFileDal; + + /// + /// This service provides capabilities to write and read that represents Annex C files or Budget Templates + /// + public class FileService : IFileService + { + /// + /// The name of the temporary folder + /// + private const string TempFolderName = "tmp"; + + /// + /// The main path to store files + /// + private readonly string mainPath; + + /// + /// Initializes a new + /// + /// The path where the should store files + public FileService(string storagePath) + { + if (storagePath == null) + { + throw new ArgumentNullException(nameof(storagePath)); + } + + if (!Directory.Exists(storagePath)) + { + Directory.CreateDirectory(storagePath); + } + + this.mainPath = storagePath; + } + + /// + /// Verifies if the at the provided correspond to a valid Annex C file + /// + /// The path of the file + /// A with the result of the verification + public async Task IsAnnexC3File(string fileName) + { + try + { + var credentials = new Credentials("admin", "pass", new Uri(Path.Combine(this.GetTempFolder(), fileName))); + var dal = new JsonFileDal(); + var session = new Session(dal, credentials); + await session.Open(); + var isSessionOpen = session.RetrieveSiteDirectory() != null; + await session.Close(); + return isSessionOpen; + } + catch + { + return false; + } + } + + /// + /// Deletes the at the provided if it exists + /// + /// The path of the + public void DeleteFile(string filePath) + { + var fullPath = Path.Combine(this.mainPath, filePath); + + if (File.Exists(fullPath)) + { + File.Delete(fullPath); + } + } + + /// + /// Deletes a temporary + /// + /// The name of the + public void DeleteTemporaryFile(string fileName) + { + var fullPath = Path.Combine(this.GetTempFolder(), fileName); + + if (File.Exists(fullPath)) + { + File.Delete(fullPath); + } + } + + /// + /// Verifies if a already exists + /// + /// The path of the folder + /// The name + /// A value indicating if the exists + public bool Exists(string folderPath, string fileName) + { + return File.Exists(Path.Combine(this.mainPath, folderPath, fileName)); + } + + /// + /// Gets the path of the Temporary folder + /// + /// The path of the folder + public string GetTempFolder() + { + var path = Path.Combine(this.mainPath, TempFolderName); + + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + + return path; + } + + /// + /// Verifies if a temporary exists + /// + /// The name of the temporary + /// True if exists + public bool TempFileExists(string tempFileName) + { + return File.Exists(Path.Combine(this.GetTempFolder(), tempFileName)); + } + + /// + /// Moves a temporary to its final destination + /// + /// The name of the temporary + /// The folder destination + /// The new location + public string MoveFile(string tempFileName, string newFolderPath) + { + var destinationDirectory = Path.Combine(this.mainPath, newFolderPath); + + if (!Directory.Exists(destinationDirectory)) + { + Directory.CreateDirectory(destinationDirectory); + } + + File.Move(Path.Combine(this.GetTempFolder(), tempFileName), Path.Combine(this.mainPath, newFolderPath, tempFileName)); + + return Path.Combine(newFolderPath, tempFileName); + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Services/FileService/IFileService.cs b/UI_DSM/UI_DSM.Server/Services/FileService/IFileService.cs new file mode 100644 index 00000000..f6dc420f --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Services/FileService/IFileService.cs @@ -0,0 +1,69 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Services.FileService +{ + /// + /// Interface definition for + /// + public interface IFileService + { + /// + /// Verifies if the at the provided correspond to a valid Annex C file + /// + /// The path of the file + /// A with the result of the verification + Task IsAnnexC3File(string fileName); + + /// + /// Deletes the at the provided if it exists + /// + /// The path of the + void DeleteFile(string filePath); + + /// + /// Gets the path of the Temporary folder + /// + /// The path of the folder + string GetTempFolder(); + + /// + /// Verifies if a temporary exists + /// + /// The name of the temporary + /// True if exists + bool TempFileExists(string tempFileName); + + /// + /// Moves a temporary to its final destination + /// + /// The name of the temporary + /// The folder destination + /// The new location + string MoveFile(string tempFileName, string newFolderPath); + + /// + /// Deletes a temporary + /// + /// The name of the + void DeleteTemporaryFile(string fileName); + + /// + /// Verifies if a already exists + /// + /// The path of the folder + /// The name + /// A value indicating if the exists + bool Exists(string folderPath, string fileName); + } +} diff --git a/UI_DSM/UI_DSM.Server/Validator/ArtifactValidator.cs b/UI_DSM/UI_DSM.Server/Validator/ArtifactValidator.cs new file mode 100644 index 00000000..bcddc667 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Validator/ArtifactValidator.cs @@ -0,0 +1,32 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Validator +{ + using FluentValidation; + + using UI_DSM.Shared.DTO.Models; + + /// + /// for the + /// + public class ArtifactValidator : AbstractValidator + { + /// + /// Initializes a new + /// + public ArtifactValidator() + { + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Validator/CometAuthenticationDataValidator.cs b/UI_DSM/UI_DSM.Server/Validator/CometAuthenticationDataValidator.cs new file mode 100644 index 00000000..b139a038 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Validator/CometAuthenticationDataValidator.cs @@ -0,0 +1,35 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Validator +{ + using FluentValidation; + + using UI_DSM.Shared.DTO.CometData; + + /// + /// for + /// + public class CometAuthenticationDataValidator : AbstractValidator + { + /// + /// Initializes a new + /// + public CometAuthenticationDataValidator() + { + this.RuleFor(x => x.Url).NotEmpty(); + this.RuleFor(x => x.UserName).NotEmpty(); + this.RuleFor(x => x.Password).NotEmpty(); + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Validator/ModelUploadDataValidator.cs b/UI_DSM/UI_DSM.Server/Validator/ModelUploadDataValidator.cs new file mode 100644 index 00000000..21913419 --- /dev/null +++ b/UI_DSM/UI_DSM.Server/Validator/ModelUploadDataValidator.cs @@ -0,0 +1,34 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Server.Validator +{ + using FluentValidation; + + using UI_DSM.Shared.DTO.CometData; + + /// + /// for + /// + public class ModelUploadDataValidator : AbstractValidator + { + /// + /// Initialize a new + /// + public ModelUploadDataValidator() + { + this.RuleFor(x => x.ModelId).NotEqual(Guid.Empty); + this.RuleFor(x => x.IterationId).NotEqual(Guid.Empty); + } + } +} diff --git a/UI_DSM/UI_DSM.Server/Validator/ReviewDtoValidator.cs b/UI_DSM/UI_DSM.Server/Validator/ReviewDtoValidator.cs index efd157ea..438fa2b0 100644 --- a/UI_DSM/UI_DSM.Server/Validator/ReviewDtoValidator.cs +++ b/UI_DSM/UI_DSM.Server/Validator/ReviewDtoValidator.cs @@ -30,6 +30,7 @@ public ReviewDtoValidator() this.RuleFor(x => x.Description).NotEmpty(); this.RuleFor(x => x.Title).NotEmpty(); this.RuleFor(x => x.Author).NotEqual(Guid.Empty); + this.RuleFor(x => x.Artifacts.Count).LessThanOrEqualTo(1); } } } diff --git a/UI_DSM/UI_DSM.Server/appsettings.json b/UI_DSM/UI_DSM.Server/appsettings.json index 01ae4fba..5094e5bc 100644 --- a/UI_DSM/UI_DSM.Server/appsettings.json +++ b/UI_DSM/UI_DSM.Server/appsettings.json @@ -6,6 +6,7 @@ } }, "DataBaseConnection": "Server=localhost;Port=5433;Database=ui-dsm;Password=pass;User ID=postgres", + "StoragePath": "C:\\CODE\\DSM\\Storage", "JWTSettings": { "securityKey": "UI-DSM-SecretKey", "validIssuer": "UI-DSM-Api", diff --git a/UI_DSM/UI_DSM.Shared/DTO/CometData/CometAuthenticationData.cs b/UI_DSM/UI_DSM.Shared/DTO/CometData/CometAuthenticationData.cs new file mode 100644 index 00000000..96313f48 --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/DTO/CometData/CometAuthenticationData.cs @@ -0,0 +1,44 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Shared.DTO.CometData +{ + using System.ComponentModel; + using System.ComponentModel.DataAnnotations; + + /// + /// Data used to establish a connection to a Comet session + /// + public class CometAuthenticationData + { + /// + /// Gets or sets the Url where the Comet instance can be reached + /// + [Required] + [Url] + public string Url { get; set; } + + /// + /// Gets or sets the Username for the Comet login + /// + [Required] + public string UserName { get; set; } + + /// + /// Gets or sets the Password for the Comet login + /// + [Required] + [PasswordPropertyText] + public string Password { get; set; } + } +} diff --git a/UI_DSM/UI_DSM.Shared/DTO/CometData/CometAuthenticationResponse.cs b/UI_DSM/UI_DSM.Shared/DTO/CometData/CometAuthenticationResponse.cs new file mode 100644 index 00000000..b9c56971 --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/DTO/CometData/CometAuthenticationResponse.cs @@ -0,0 +1,28 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +using UI_DSM.Shared.DTO.Common; + +namespace UI_DSM.Shared.DTO.CometData +{ + /// + /// A for a to use after tries to log to Comet + /// + public class CometAuthenticationResponse : RequestResponseDto + { + /// + /// The of the current session to Comet + /// + public Guid SessionId { get; set; } + } +} diff --git a/UI_DSM/UI_DSM.Shared/DTO/CometData/ModelUploadData.cs b/UI_DSM/UI_DSM.Shared/DTO/CometData/ModelUploadData.cs new file mode 100644 index 00000000..204d2c25 --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/DTO/CometData/ModelUploadData.cs @@ -0,0 +1,31 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Shared.DTO.CometData +{ + /// + /// Data used to upload a specific iteration from a specific Engineering model + /// + public class ModelUploadData + { + /// + /// The of the Engineering Model + /// + public Guid ModelId { get; set; } + + /// + /// The of the frozen Iteration + /// + public Guid IterationId { get; set; } + } +} diff --git a/UI_DSM/UI_DSM.Shared/DTO/CometData/ModelUploadResponse.cs b/UI_DSM/UI_DSM.Shared/DTO/CometData/ModelUploadResponse.cs new file mode 100644 index 00000000..52a8adea --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/DTO/CometData/ModelUploadResponse.cs @@ -0,0 +1,28 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Shared.DTO.CometData +{ + using UI_DSM.Shared.DTO.Common; + + /// + /// Data used to has response to an upload of a Comet model + /// + public class ModelUploadResponse : RequestResponseDto + { + /// + /// The Path of the uploaded file + /// + public string UploadedFilePath { get; set; } + } +} diff --git a/UI_DSM/UI_DSM.Shared/DTO/CometData/ModelsDataResponse.cs b/UI_DSM/UI_DSM.Shared/DTO/CometData/ModelsDataResponse.cs new file mode 100644 index 00000000..adb8740e --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/DTO/CometData/ModelsDataResponse.cs @@ -0,0 +1,33 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw, Nabil Abbar +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Shared.DTO.CometData +{ + using UI_DSM.Shared.DTO.Common; + + /// + /// Data used to reply to the get query for getting available EngineeringModel + /// + public class ModelsDataResponse : RequestResponseDto + { + /// + /// A that represents available models with the Frozen Iteration + /// + public Dictionary>> AvailableModels { get; set; } = new(); + + /// + /// A that contains the correspondance between the Model id and the Model name + /// + public Dictionary ModelNames { get; set; } = new(); + } +} diff --git a/UI_DSM/UI_DSM.Shared/DTO/Models/ArtifactDto.cs b/UI_DSM/UI_DSM.Shared/DTO/Models/ArtifactDto.cs new file mode 100644 index 00000000..296926a5 --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/DTO/Models/ArtifactDto.cs @@ -0,0 +1,32 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Shared.DTO.Models +{ + using UI_DSM.Shared.Models; + + /// + /// The Data Transfer Object representing the class. + /// + public partial class ArtifactDto + { + /// + /// Includes common properties for from an + /// + /// The + public void IncludeCommonProperties(Artifact artifact) + { + this.FileName = artifact.FileName; + } + } +} diff --git a/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ArtifactDto.cs b/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ArtifactDto.cs new file mode 100644 index 00000000..df363d4b --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ArtifactDto.cs @@ -0,0 +1,51 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------------------------------- +// ------------THIS IS AN AUTOMATICALLY GENERATED FILE. ANY MANUAL CHANGES WILL BE OVERWRITTEN!------------ +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Shared.DTO.Models +{ + using UI_DSM.Shared.Models; + + /// + /// The Data Transfer Object representing the class. + /// + public abstract partial class ArtifactDto : EntityDto + { + /// + /// Initializes a new class. + /// + protected ArtifactDto() + { + } + + /// + /// Initializes a new class. + /// + /// The of the represented + protected ArtifactDto(Guid id) : base(id) + { + } + + /// + /// Gets or sets the FileName of the Artifact + /// + public string FileName { get; set; } + } +} + +// ------------------------------------------------------------------------------------------------ +// --------THIS IS AN AUTOMATICALLY GENERATED FILE. ANY MANUAL CHANGES WILL BE OVERWRITTEN!-------- +// ------------------------------------------------------------------------------------------------ \ No newline at end of file diff --git a/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ModelDto.cs b/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ModelDto.cs new file mode 100644 index 00000000..bfee968c --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ModelDto.cs @@ -0,0 +1,59 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------------------------------- +// ------------THIS IS AN AUTOMATICALLY GENERATED FILE. ANY MANUAL CHANGES WILL BE OVERWRITTEN!------------ +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Shared.DTO.Models +{ + using UI_DSM.Shared.Models; + + /// + /// The Data Transfer Object representing the class. + /// + public partial class ModelDto : ArtifactDto + { + /// + /// Initializes a new class. + /// + public ModelDto() + { + } + + /// + /// Initializes a new class. + /// + /// The of the represented + public ModelDto(Guid id) : base(id) + { + } + + /// + /// Gets or sets the ModelName of the Model + /// + public string ModelName { get; set; } + + /// + /// Instantiate a from a + /// + public override Entity InstantiatePoco() + { + return new Model(this.Id); + } + } +} + +// ------------------------------------------------------------------------------------------------ +// --------THIS IS AN AUTOMATICALLY GENERATED FILE. ANY MANUAL CHANGES WILL BE OVERWRITTEN!-------- +// ------------------------------------------------------------------------------------------------ \ No newline at end of file diff --git a/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ProjectDto.cs b/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ProjectDto.cs index 7919460e..f46333fe 100644 --- a/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ProjectDto.cs +++ b/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ProjectDto.cs @@ -32,6 +32,7 @@ public ProjectDto() this.Participants = new List(); this.Reviews = new List(); this.Annotations = new List(); + this.Artifacts = new List(); } /// @@ -43,6 +44,7 @@ public ProjectDto(Guid id) : base(id) this.Participants = new List(); this.Reviews = new List(); this.Annotations = new List(); + this.Artifacts = new List(); } /// @@ -65,6 +67,11 @@ public ProjectDto(Guid id) : base(id) /// public List Annotations { get; set; } + /// + /// Gets or sets the Artifacts of the Project + /// + public List Artifacts { get; set; } + /// /// Instantiate a from a /// diff --git a/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ReviewDto.cs b/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ReviewDto.cs index 3ca86013..9133661c 100644 --- a/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ReviewDto.cs +++ b/UI_DSM/UI_DSM.Shared/DTO/Models/AutoGenDto/ReviewDto.cs @@ -31,6 +31,7 @@ public partial class ReviewDto : EntityDto public ReviewDto() { this.ReviewObjectives = new List(); + this.Artifacts = new List(); } /// @@ -40,6 +41,7 @@ public ReviewDto() public ReviewDto(Guid id) : base(id) { this.ReviewObjectives = new List(); + this.Artifacts = new List(); } /// @@ -77,6 +79,11 @@ public ReviewDto(Guid id) : base(id) /// public List ReviewObjectives { get; set; } + /// + /// Gets or sets the Artifacts of the Review + /// + public List Artifacts { get; set; } + /// /// Instantiate a from a /// diff --git a/UI_DSM/UI_DSM.Shared/Models/Artifact.cs b/UI_DSM/UI_DSM.Shared/Models/Artifact.cs new file mode 100644 index 00000000..ac3094a1 --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/Models/Artifact.cs @@ -0,0 +1,69 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Shared.Models +{ + using System.ComponentModel.DataAnnotations.Schema; + + using UI_DSM.Shared.DTO.Models; + + /// + /// Represents a file artifact that is uploaded to the system and linked to a project. + /// + [Table(nameof(Artifact))] + public abstract class Artifact : Entity + { + /// + /// Initializes a new + /// + protected Artifact() + { + this.Reviews = new List(); + } + + /// + /// Inilializes a new + /// + /// The of the + protected Artifact(Guid id) : base(id) + { + this.Reviews = new List(); + } + + /// + /// The name of the represented file + /// + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public string FileName { get; set; } + + /// + /// A collection of where this is used + /// + public List Reviews { get; set; } + + /// + /// Resolve the properties of the current from its counter-part + /// + /// The source + /// A of all others + public override void ResolveProperties(EntityDto entityDto, Dictionary resolvedEntity) + { + if (entityDto is not ArtifactDto annotationDto) + { + throw new InvalidOperationException($"The DTO {entityDto.GetType()} does not match with the current Artifact POCO"); + } + + this.FileName = annotationDto.FileName; + } + } +} diff --git a/UI_DSM/UI_DSM.Shared/Models/Model.cs b/UI_DSM/UI_DSM.Shared/Models/Model.cs new file mode 100644 index 00000000..7f4d51a3 --- /dev/null +++ b/UI_DSM/UI_DSM.Shared/Models/Model.cs @@ -0,0 +1,79 @@ +// -------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 RHEA System S.A. +// +// Author: Antoine Théate, Sam Gerené, Alex Vorobiev, Alexander van Delft, Martin Risseeuw +// +// This file is part of UI-DSM. +// The UI-DSM web application is used to review an ECSS-E-TM-10-25 model. +// +// The UI-DSM application is provided to the community under the Apache License 2.0. +// +// -------------------------------------------------------------------------------------------------------- + +namespace UI_DSM.Shared.Models +{ + using System.ComponentModel.DataAnnotations.Schema; + + using UI_DSM.Shared.DTO.Models; + + /// + /// Represents a E-TM-10-25 model uploaded and linked to the project. + /// + [Table(nameof(Model))] + public class Model : Artifact + { + /// + /// Initializes a new + /// + public Model() + { + } + + /// + /// Inilializes a new + /// + /// The of the + public Model(Guid id) : base(id) + { + } + + /// + /// The name of the + /// + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public string ModelName { get; set; } + + /// + /// Resolve the properties of the current from its counter-part + /// + /// The source + /// A of all others + public override void ResolveProperties(EntityDto entityDto, Dictionary resolvedEntity) + { + base.ResolveProperties(entityDto, resolvedEntity); + + if (entityDto is not ModelDto modelDto) + { + throw new InvalidOperationException($"The DTO {entityDto.GetType()} does not match with the current Model POCO"); + } + + this.ModelName = modelDto.ModelName; + } + + /// + /// Instantiate a from a + /// + /// A new + public override EntityDto ToDto() + { + var dto = new ModelDto(this.Id) + { + ModelName = this.ModelName + }; + + dto.IncludeCommonProperties(this); + return dto; + } + } +} diff --git a/UI_DSM/UI_DSM.Shared/Models/Project.cs b/UI_DSM/UI_DSM.Shared/Models/Project.cs index a31ff393..e5ef16c9 100644 --- a/UI_DSM/UI_DSM.Shared/Models/Project.cs +++ b/UI_DSM/UI_DSM.Shared/Models/Project.cs @@ -68,6 +68,12 @@ public Project(Guid id) : base(id) [DeepLevel(1)] public EntityContainerList Annotations { get; set; } + /// + /// A collection of contained + /// + [DeepLevel(1)] + public EntityContainerList Artifacts { get; set; } + /// /// Instantiate a from a /// @@ -79,7 +85,8 @@ public override EntityDto ToDto() ProjectName = this.ProjectName, Participants = new List(this.Participants.Select(x => x.Id)), Reviews = new List(this.Reviews.Select(x => x.Id)), - Annotations = new List(this.Annotations.Select(x => x.Id)) + Annotations = new List(this.Annotations.Select(x => x.Id)), + Artifacts = new List(this.Artifacts.Select(x => x.Id)) }; return dto; @@ -101,6 +108,7 @@ public override void ResolveProperties(EntityDto entityDto, Dictionary @@ -111,6 +119,7 @@ private void InitializeCollections() this.Participants = new EntityContainerList(this); this.Reviews = new EntityContainerList(this); this.Annotations = new EntityContainerList(this); + this.Artifacts = new EntityContainerList(this); } } } diff --git a/UI_DSM/UI_DSM.Shared/Models/Review.cs b/UI_DSM/UI_DSM.Shared/Models/Review.cs index 67f26fe2..fcf77a63 100644 --- a/UI_DSM/UI_DSM.Shared/Models/Review.cs +++ b/UI_DSM/UI_DSM.Shared/Models/Review.cs @@ -87,6 +87,12 @@ public Review(Guid id) : base(id) [DeepLevel(1)] public EntityContainerList ReviewObjectives { get; protected set; } + /// + /// A collection of + /// + [DeepLevel(1)] + public List Artifacts { get; protected set; } + /// /// Instantiate a from a /// @@ -101,7 +107,8 @@ public override EntityDto ToDto() Title = this.Title, Description = this.Description, Status = this.Status, - ReviewObjectives = this.ReviewObjectives.Select(x => x.Id).ToList() + ReviewObjectives = this.ReviewObjectives.Select(x => x.Id).ToList(), + Artifacts = this.Artifacts.Select(x => x.Id).ToList() }; } @@ -124,6 +131,7 @@ public override void ResolveProperties(EntityDto entityDto, Dictionary @@ -132,6 +140,7 @@ public override void ResolveProperties(EntityDto entityDto, Dictionary(this); + this.Artifacts = new List(); } } } diff --git a/UI_DSM/UI_DSM.sln b/UI_DSM/UI_DSM.sln index 869c239f..5cdf539a 100644 --- a/UI_DSM/UI_DSM.sln +++ b/UI_DSM/UI_DSM.sln @@ -19,7 +19,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UI_DSM.CodeGenerator.Tests" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UI_DSM.Serializer.Json", "UI_DSM.Serializer.Json\UI_DSM.Serializer.Json.csproj", "{26FCB51E-B8BF-429C-861E-B4BFD1B84908}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UI_DSM.Serializer.Json.Tests", "UI_DSM.Serializer.Json.Tests\UI_DSM.Serializer.Json.Tests.csproj", "{F7AE939B-C8C2-40B9-9BD4-7104A3AE46F2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UI_DSM.Serializer.Json.Tests", "UI_DSM.Serializer.Json.Tests\UI_DSM.Serializer.Json.Tests.csproj", "{F7AE939B-C8C2-40B9-9BD4-7104A3AE46F2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution