Add project files.
This commit is contained in:
		
							
								
								
									
										30
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | **/.classpath | ||||||
|  | **/.dockerignore | ||||||
|  | **/.env | ||||||
|  | **/.git | ||||||
|  | **/.gitignore | ||||||
|  | **/.project | ||||||
|  | **/.settings | ||||||
|  | **/.toolstarget | ||||||
|  | **/.vs | ||||||
|  | **/.vscode | ||||||
|  | **/*.*proj.user | ||||||
|  | **/*.dbmdl | ||||||
|  | **/*.jfm | ||||||
|  | **/azds.yaml | ||||||
|  | **/bin | ||||||
|  | **/charts | ||||||
|  | **/docker-compose* | ||||||
|  | **/Dockerfile* | ||||||
|  | **/node_modules | ||||||
|  | **/npm-debug.log | ||||||
|  | **/obj | ||||||
|  | **/secrets.dev.yaml | ||||||
|  | **/values.dev.yaml | ||||||
|  | LICENSE | ||||||
|  | README.md | ||||||
|  | !**/.gitignore | ||||||
|  | !.git/HEAD | ||||||
|  | !.git/config | ||||||
|  | !.git/packed-refs | ||||||
|  | !.git/refs/heads/** | ||||||
							
								
								
									
										23
									
								
								Core.Blueprint.Application/Core.Blueprint.Application.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Core.Blueprint.Application/Core.Blueprint.Application.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net8.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Compile Remove="UsesCases\BlobStorage\Storage.cs" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="Azure.Storage.Blobs" Version="12.23.0" /> | ||||||
|  |     <PackageReference Include="Core.Blueprint.KeyVault" Version="0.3.0-alpha0037" /> | ||||||
|  |     <PackageReference Include="MongoDB.Bson" Version="3.1.0" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\Core.Blueprint.Service.External\Core.Blueprint.Service.External.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,25 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.BlobStorage.Ports; | ||||||
|  | using Core.Blueprint.Storage; | ||||||
|  | using Core.Blueprint.Storage.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.BlobStorage.Adapter | ||||||
|  | { | ||||||
|  |     public class StoragePort : BasePresenter, IStoragePort | ||||||
|  |     { | ||||||
|  |         public void Success(List<BlobFileAdapter> output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |         public void Success(BlobFileAdapter output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public void Success(BlobDownloadUriAdapter output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.KeyVault.Input | ||||||
|  | { | ||||||
|  |     public class DeleteBlobRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string BlobName { get; set; } | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return !string.IsNullOrEmpty(BlobName); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.KeyVault.Input | ||||||
|  | { | ||||||
|  |     public class DownloadBlobRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string BlobName { get; set; } = null!; | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return !string.IsNullOrEmpty(BlobName); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.KeyVault.Input | ||||||
|  | { | ||||||
|  |     public class GetBlobListRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string? Prefix { get; set; } | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.KeyVault.Input | ||||||
|  | { | ||||||
|  |     public class UploadBlobRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string BlobName { get; set; } = null!; | ||||||
|  |  | ||||||
|  |         public byte[] File { get; set; } = null!; | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return !string.IsNullOrEmpty(BlobName); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | using Core.Blueprint.Storage; | ||||||
|  | using Core.Blueprint.Storage.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.BlobStorage.Ports | ||||||
|  | { | ||||||
|  |     public interface IStoragePort : IBasePort, | ||||||
|  |         ICommandSuccessPort<List<BlobFileAdapter>>, | ||||||
|  |         ICommandSuccessPort<BlobFileAdapter>, | ||||||
|  |         ICommandSuccessPort<BlobDownloadUriAdapter>, | ||||||
|  |         INoContentPort, IBusinessErrorPort, ITimeoutPort, IValidationErrorPort, | ||||||
|  |         INotFoundPort, IForbiddenPort, IUnauthorizedPort, IInternalServerErrorPort, | ||||||
|  |         IBadRequestPort | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										160
									
								
								Core.Blueprint.Application/UsesCases/BlobStorage/Storage.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								Core.Blueprint.Application/UsesCases/BlobStorage/Storage.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Ports; | ||||||
|  | using Core.Blueprint.KeyVault; | ||||||
|  | using Core.Blueprint.Service.External.Clients; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Lib.Architecture.BuildingBlocks.Helpers; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault | ||||||
|  | { | ||||||
|  |     public class Storage : | ||||||
|  |         IComponentHandler<CreateBlobRequest>, | ||||||
|  |         IComponentHandler<GetBlobListRequest>, | ||||||
|  |         IComponentHandler<UpdateBlobRequest>, | ||||||
|  |         IComponentHandler<DeleteBlobRequest> | ||||||
|  |     { | ||||||
|  |         private readonly IKeyVaultPort _port; | ||||||
|  |         private readonly IValidator<CreateBlobRequest> _createKeyVaultValidator; | ||||||
|  |         private readonly IValidator<GetBlobListRequest> _getKeyVaultValidator; | ||||||
|  |         private readonly IValidator<UpdateBlobRequest> _updateKeyVaultValidator; | ||||||
|  |         private readonly IValidator<DeleteBlobRequest> _deleteKeyVaultValidator; | ||||||
|  |         private readonly IBlueprintServiceClient _keyVaultDALService; | ||||||
|  |  | ||||||
|  |         public Storage( | ||||||
|  |             IKeyVaultPort port, | ||||||
|  |             IValidator<CreateBlobRequest> createKeyVaultValidator, | ||||||
|  |             IValidator<GetBlobListRequest> getKeyVaultValidator, | ||||||
|  |             IValidator<UpdateBlobRequest> updateKeyVaultValidator, | ||||||
|  |             IValidator<DeleteBlobRequest> deleteKeyVaultValidator, | ||||||
|  |             IBlueprintServiceClient keyVaultDALService) | ||||||
|  |         { | ||||||
|  |             _port = port ?? throw new ArgumentNullException(nameof(port)); | ||||||
|  |             _createKeyVaultValidator = createKeyVaultValidator ?? throw new ArgumentNullException(nameof(createKeyVaultValidator)); | ||||||
|  |             _getKeyVaultValidator = getKeyVaultValidator ?? throw new ArgumentNullException(nameof(getKeyVaultValidator)); | ||||||
|  |             _updateKeyVaultValidator = updateKeyVaultValidator ?? throw new ArgumentNullException(nameof(updateKeyVaultValidator)); | ||||||
|  |             _deleteKeyVaultValidator = deleteKeyVaultValidator ?? throw new ArgumentNullException(nameof(deleteKeyVaultValidator)); | ||||||
|  |             _keyVaultDALService = keyVaultDALService ?? throw new ArgumentNullException(nameof(keyVaultDALService)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(CreateBlobRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_createKeyVaultValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var request = new KeyVaultRequest | ||||||
|  |                 { | ||||||
|  |                     Name = command.Name, | ||||||
|  |                     Value = command.Value, | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 var result = await _keyVaultDALService.CreateSecretAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(GetBlobListRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 var result = await _keyVaultDALService.GetSecretByNameAsync("", cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(UpdateBlobRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_updateKeyVaultValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var request = new KeyVaultRequest | ||||||
|  |                 { | ||||||
|  |                     Name = command.Name, | ||||||
|  |                     Value = command.Value, | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 var result = await _keyVaultDALService.UpdateSecretAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(DeleteBlobRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_deleteKeyVaultValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var result = await _keyVaultDALService.DeleteSecretAsync(command.Name, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,151 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.BlobStorage.Ports; | ||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using Core.Blueprint.Service.External.Clients; | ||||||
|  | using Core.Blueprint.Storage; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Lib.Architecture.BuildingBlocks.Helpers; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault | ||||||
|  | { | ||||||
|  |     public class StorageHandler : | ||||||
|  |         IComponentHandler<UploadBlobRequest>, | ||||||
|  |         IComponentHandler<GetBlobListRequest>, | ||||||
|  |         IComponentHandler<DownloadBlobRequest>, | ||||||
|  |         IComponentHandler<DeleteBlobRequest> | ||||||
|  |     { | ||||||
|  |         private readonly IStoragePort _port; | ||||||
|  |         private readonly IValidator<UploadBlobRequest> _uploadBlobValidator; | ||||||
|  |         private readonly IValidator<DownloadBlobRequest> _downloadBlobValidator; | ||||||
|  |         private readonly IValidator<DeleteBlobRequest> _deleteBlobValidator; | ||||||
|  |         private readonly IBlueprintServiceClient _storageDALService; | ||||||
|  |  | ||||||
|  |         public StorageHandler( | ||||||
|  |             IStoragePort port, | ||||||
|  |             IValidator<UploadBlobRequest> uploadBlobValidator, | ||||||
|  |             IValidator<DownloadBlobRequest> downloadBlobValidator, | ||||||
|  |             IValidator<DeleteBlobRequest> deleteBlobValidator, | ||||||
|  |             IBlueprintServiceClient storageDALService) | ||||||
|  |         { | ||||||
|  |             _port = port ?? throw new ArgumentNullException(nameof(port)); | ||||||
|  |             _uploadBlobValidator = uploadBlobValidator ?? throw new ArgumentNullException(nameof(uploadBlobValidator)); | ||||||
|  |             _downloadBlobValidator = downloadBlobValidator ?? throw new ArgumentNullException(nameof(downloadBlobValidator)); | ||||||
|  |             _deleteBlobValidator = deleteBlobValidator ?? throw new ArgumentNullException(nameof(deleteBlobValidator)); | ||||||
|  |             _storageDALService = storageDALService ?? throw new ArgumentNullException(nameof(storageDALService)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(UploadBlobRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_uploadBlobValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var request = new BlobAddDto | ||||||
|  |                 { | ||||||
|  |                     FileName = command.BlobName, | ||||||
|  |                     FileContent = command.File | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 var result = await _storageDALService.UploadBlobAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(GetBlobListRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 var result = await _storageDALService.GetBlobListAsync(command.Prefix, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(DownloadBlobRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_downloadBlobValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var result = await _storageDALService.DownloadBlobAsync(command.BlobName, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(DeleteBlobRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_deleteBlobValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var result = await _storageDALService.DeleteBlobAsync(command.BlobName, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault.Validator | ||||||
|  | { | ||||||
|  |     public class DeleteBlobValidator : AbstractValidator<DeleteBlobRequest> | ||||||
|  |     { | ||||||
|  |         public DeleteBlobValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.BlobName).NotEmpty().NotNull().OverridePropertyName(x => x.BlobName).WithName("Blob Name").WithMessage("Blob Name is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault.Validator | ||||||
|  | { | ||||||
|  |     public class DownloadBlobValidator : AbstractValidator<DownloadBlobRequest> | ||||||
|  |     { | ||||||
|  |         public DownloadBlobValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.BlobName).NotEmpty().NotNull().OverridePropertyName(x => x.BlobName).WithName("Blob Name").WithMessage("Blob Name is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault.Validator | ||||||
|  | { | ||||||
|  |     public class UploadBlobValidator : AbstractValidator<UploadBlobRequest> | ||||||
|  |     { | ||||||
|  |         public UploadBlobValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.BlobName).NotEmpty().NotNull().OverridePropertyName(x => x.BlobName).WithName("Blob Name").WithMessage("Blob Name is Obligatory."); | ||||||
|  |             RuleFor(i => i.File).NotNull().OverridePropertyName(x => x.File).WithName("Blob File").WithMessage("Blob File is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,20 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Ports; | ||||||
|  | using Core.Blueprint.KeyVault; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.MongoStorage.Adapter | ||||||
|  | { | ||||||
|  |     public class KeyVaultPort : BasePresenter, IKeyVaultPort | ||||||
|  |     { | ||||||
|  |         public void Success(KeyVaultResponse output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |         public void Success(KeyVaultAdapter output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.KeyVault.Input | ||||||
|  | { | ||||||
|  |     public class CreateSecretRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |  | ||||||
|  |         public string Value { get; set; } = null!; | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return !string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Value); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.KeyVault.Input | ||||||
|  | { | ||||||
|  |     public class DeleteSecretRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return !string.IsNullOrEmpty(Name); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.KeyVault.Input | ||||||
|  | { | ||||||
|  |     public class GetSecretRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return string.IsNullOrEmpty(Name); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.KeyVault.Input | ||||||
|  | { | ||||||
|  |     public class UpdateSecretRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |         public string Value { get; set; } = null!; | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return !string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Value); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										160
									
								
								Core.Blueprint.Application/UsesCases/KeyVault/KeyVaultHandler.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								Core.Blueprint.Application/UsesCases/KeyVault/KeyVaultHandler.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Ports; | ||||||
|  | using Core.Blueprint.KeyVault; | ||||||
|  | using Core.Blueprint.Service.External.Clients; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Lib.Architecture.BuildingBlocks.Helpers; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault | ||||||
|  | { | ||||||
|  |     public class KeyVaultHandler : | ||||||
|  |         IComponentHandler<CreateSecretRequest>, | ||||||
|  |         IComponentHandler<GetSecretRequest>, | ||||||
|  |         IComponentHandler<UpdateSecretRequest>, | ||||||
|  |         IComponentHandler<DeleteSecretRequest> | ||||||
|  |     { | ||||||
|  |         private readonly IKeyVaultPort _port; | ||||||
|  |         private readonly IValidator<CreateSecretRequest> _createSecretValidator; | ||||||
|  |         private readonly IValidator<GetSecretRequest> _getSecretValidator; | ||||||
|  |         private readonly IValidator<UpdateSecretRequest> _updateSecretValidator; | ||||||
|  |         private readonly IValidator<DeleteSecretRequest> _deleteSecretValidator; | ||||||
|  |         private readonly IBlueprintServiceClient _keyVaultDALService; | ||||||
|  |  | ||||||
|  |         public KeyVaultHandler( | ||||||
|  |             IKeyVaultPort port, | ||||||
|  |             IValidator<CreateSecretRequest> createSecretValidator, | ||||||
|  |             IValidator<GetSecretRequest> getSecretValidator, | ||||||
|  |             IValidator<UpdateSecretRequest> updateSecretValidator, | ||||||
|  |             IValidator<DeleteSecretRequest> deleteSecretValidator, | ||||||
|  |             IBlueprintServiceClient keyVaultDALService) | ||||||
|  |         { | ||||||
|  |             _port = port ?? throw new ArgumentNullException(nameof(port)); | ||||||
|  |             _createSecretValidator = createSecretValidator ?? throw new ArgumentNullException(nameof(createSecretValidator)); | ||||||
|  |             _getSecretValidator = getSecretValidator ?? throw new ArgumentNullException(nameof(getSecretValidator)); | ||||||
|  |             _updateSecretValidator = updateSecretValidator ?? throw new ArgumentNullException(nameof(updateSecretValidator)); | ||||||
|  |             _deleteSecretValidator = deleteSecretValidator ?? throw new ArgumentNullException(nameof(deleteSecretValidator)); | ||||||
|  |             _keyVaultDALService = keyVaultDALService ?? throw new ArgumentNullException(nameof(keyVaultDALService)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(CreateSecretRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_createSecretValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var request = new KeyVaultRequest | ||||||
|  |                 { | ||||||
|  |                     Name = command.Name, | ||||||
|  |                     Value = command.Value, | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 var result = await _keyVaultDALService.CreateSecretAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(GetSecretRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 var result = await _keyVaultDALService.GetSecretByNameAsync(command.Name, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(UpdateSecretRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_updateSecretValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var request = new KeyVaultRequest | ||||||
|  |                 { | ||||||
|  |                     Name = command.Name, | ||||||
|  |                     Value = command.Value, | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 var result = await _keyVaultDALService.UpdateSecretAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(DeleteSecretRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_deleteSecretValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var result = await _keyVaultDALService.DeleteSecretAsync(command.Name, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | using Core.Blueprint.KeyVault; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.KeyVault.Ports | ||||||
|  | { | ||||||
|  |     public interface IKeyVaultPort : IBasePort, | ||||||
|  |         ICommandSuccessPort<KeyVaultResponse>, | ||||||
|  |         ICommandSuccessPort<KeyVaultAdapter>, | ||||||
|  |         INoContentPort, IBusinessErrorPort, ITimeoutPort, IValidationErrorPort, | ||||||
|  |         INotFoundPort, IForbiddenPort, IUnauthorizedPort, IInternalServerErrorPort, | ||||||
|  |         IBadRequestPort | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault.Validator | ||||||
|  | { | ||||||
|  |     public class CreateSecretValidator : AbstractValidator<CreateSecretRequest> | ||||||
|  |     { | ||||||
|  |         public CreateSecretValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.Name).NotEmpty().NotNull().OverridePropertyName(x => x.Name).WithName("Secret Name").WithMessage("Secret Name is Obligatory."); | ||||||
|  |             RuleFor(i => i.Value).NotEmpty().NotNull().OverridePropertyName(x => x.Value).WithName("Secret Name").WithMessage("Secret Value is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault.Validator | ||||||
|  | { | ||||||
|  |     public class DeleteSecretValidator : AbstractValidator<DeleteSecretRequest> | ||||||
|  |     { | ||||||
|  |         public DeleteSecretValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.Name).NotEmpty().NotNull().OverridePropertyName(x => x.Name).WithName("Secret Name").WithMessage("Secret Name is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault.Validator | ||||||
|  | { | ||||||
|  |     public class GetSecretValidator : AbstractValidator<GetSecretRequest> | ||||||
|  |     { | ||||||
|  |         public GetSecretValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.Name).NotEmpty().NotNull().OverridePropertyName(x => x.Name).WithName("Secret Name").WithMessage("Secret Name is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.KeyVault.Validator | ||||||
|  | { | ||||||
|  |     public class UpdateSecretValidator : AbstractValidator<UpdateSecretRequest> | ||||||
|  |     { | ||||||
|  |         public UpdateSecretValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.Name).NotEmpty().NotNull().OverridePropertyName(x => x.Name).WithName("Secret Name").WithMessage("Secret Name is Obligatory."); | ||||||
|  |             RuleFor(i => i.Value).NotEmpty().NotNull().OverridePropertyName(x => x.Value).WithName("Secret Value").WithMessage("Secret Value is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,19 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Ports; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.MongoStorage.Adapter | ||||||
|  | { | ||||||
|  |     public class MongoPort : BasePresenter, IMongoPort | ||||||
|  |     { | ||||||
|  |         public void Success(BlueprintAdapter output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |         public void Success(List<BlueprintAdapter> output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.Mongo.Input | ||||||
|  | { | ||||||
|  |     public class CreateBlueprintRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |  | ||||||
|  |         public string? Description { get; set; } | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return Name != null && Name != string.Empty; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.Mongo.Input | ||||||
|  | { | ||||||
|  |     public class DeleteBlueprintRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string _Id { get; set; } | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return _Id != null && _Id != string.Empty; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,12 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.Mongo.Input | ||||||
|  | { | ||||||
|  |     public class GetAllBlueprintsRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.Mongo.Input | ||||||
|  | { | ||||||
|  |     public class GetBlueprintRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string _Id { get; set; } | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return _Id != null && _Id != string.Empty; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,22 @@ | |||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.Mongo.Input | ||||||
|  | { | ||||||
|  |     public class UpdateBlueprintRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |         public string? Description { get; set; } | ||||||
|  |         public string _Id { get; set; } = null!; | ||||||
|  |         public string Id { get; init; } = null!; | ||||||
|  |         public DateTime CreatedAt { get; set; } | ||||||
|  |         public string? CreatedBy { get; set; } | ||||||
|  |         public DateTime? UpdatedAt { get; set; } | ||||||
|  |         public string? UpdatedBy { get; set; } | ||||||
|  |         public StatusEnum Status { get; set; } | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return _Id != null && _Id != string.Empty; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										197
									
								
								Core.Blueprint.Application/UsesCases/Mongo/MongoHandler.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								Core.Blueprint.Application/UsesCases/Mongo/MongoHandler.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,197 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Ports; | ||||||
|  | using Core.Blueprint.Service.External.Clients; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Requests; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Lib.Architecture.BuildingBlocks.Helpers; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.Blueprints | ||||||
|  | { | ||||||
|  |     public class MongoHandler : | ||||||
|  |         IComponentHandler<CreateBlueprintRequest>, | ||||||
|  |         IComponentHandler<GetBlueprintRequest>, | ||||||
|  |         IComponentHandler<GetAllBlueprintsRequest>, | ||||||
|  |         IComponentHandler<UpdateBlueprintRequest>, | ||||||
|  |         IComponentHandler<DeleteBlueprintRequest> | ||||||
|  |     { | ||||||
|  |         private readonly IMongoPort _port; | ||||||
|  |         private readonly IValidator<CreateBlueprintRequest> _createBlueprintValidator; | ||||||
|  |         private readonly IValidator<GetBlueprintRequest> _getBlueprintValidator; | ||||||
|  |         private readonly IValidator<UpdateBlueprintRequest> _updateBlueprintValidator; | ||||||
|  |         private readonly IValidator<DeleteBlueprintRequest> _deleteBlueprintValidator; | ||||||
|  |         private readonly IBlueprintServiceClient _mongoDALService; | ||||||
|  |  | ||||||
|  |         public MongoHandler( | ||||||
|  |             IMongoPort port, | ||||||
|  |             IValidator<CreateBlueprintRequest> createBlueprintValidator, | ||||||
|  |             IValidator<GetBlueprintRequest> getBlueprintValidator, | ||||||
|  |             IValidator<UpdateBlueprintRequest> updateBlueprintValidator, | ||||||
|  |             IValidator<DeleteBlueprintRequest> deleteBlueprintValidator, | ||||||
|  |             IBlueprintServiceClient mongoDALService) | ||||||
|  |         { | ||||||
|  |             _port = port ?? throw new ArgumentNullException(nameof(port)); | ||||||
|  |             _createBlueprintValidator = createBlueprintValidator ?? throw new ArgumentNullException(nameof(createBlueprintValidator)); | ||||||
|  |             _getBlueprintValidator = getBlueprintValidator ?? throw new ArgumentNullException(nameof(getBlueprintValidator)); | ||||||
|  |             _updateBlueprintValidator = updateBlueprintValidator ?? throw new ArgumentNullException(nameof(updateBlueprintValidator)); | ||||||
|  |             _deleteBlueprintValidator = deleteBlueprintValidator ?? throw new ArgumentNullException(nameof(deleteBlueprintValidator)); | ||||||
|  |             _mongoDALService = mongoDALService ?? throw new ArgumentNullException(nameof(mongoDALService)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(CreateBlueprintRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_createBlueprintValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var request = new BlueprintRequest | ||||||
|  |                 { | ||||||
|  |                     Name = command.Name, | ||||||
|  |                     Description = command.Description, | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 var result = await _mongoDALService.CreateBlueprintAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(GetAllBlueprintsRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 var _result = await _mongoDALService.GetAllBlueprintsAsync().ConfigureAwait(false); | ||||||
|  |                 if (!_result.Any()) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 _port.Success(_result.ToList()); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(GetBlueprintRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_getBlueprintValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var result = await _mongoDALService.GetBlueprintByIdAsync(command._Id, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(UpdateBlueprintRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_updateBlueprintValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var request = new BlueprintAdapter | ||||||
|  |                 { | ||||||
|  |                     Id = command.Id, | ||||||
|  |                     _Id = command._Id, | ||||||
|  |                     Name = command.Name, | ||||||
|  |                     Description = command.Description, | ||||||
|  |                     CreatedAt = command.CreatedAt, | ||||||
|  |                     CreatedBy = command.CreatedBy, | ||||||
|  |                     UpdatedAt = command.UpdatedAt, | ||||||
|  |                     UpdatedBy = command.UpdatedBy, | ||||||
|  |                     Status = command.Status | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 string _id = command._Id; | ||||||
|  |  | ||||||
|  |                 var result = await _mongoDALService.UpdateBlueprintAsync(_id, request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(DeleteBlueprintRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_deleteBlueprintValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var result = await _mongoDALService.DeleteBlueprintAsync(command._Id, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.Mongo.Ports | ||||||
|  | { | ||||||
|  |     public interface IMongoPort : IBasePort, | ||||||
|  |         ICommandSuccessPort<BlueprintAdapter>, | ||||||
|  |         ICommandSuccessPort<List<BlueprintAdapter>>, | ||||||
|  |         INoContentPort, IBusinessErrorPort, ITimeoutPort, IValidationErrorPort, | ||||||
|  |         INotFoundPort, IForbiddenPort, IUnauthorizedPort, IInternalServerErrorPort, | ||||||
|  |         IBadRequestPort | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.Blueprints.Validator | ||||||
|  | { | ||||||
|  |     public class CreateBlueprintValidator : AbstractValidator<CreateBlueprintRequest> | ||||||
|  |     { | ||||||
|  |         public CreateBlueprintValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.Name).NotEmpty().NotNull().OverridePropertyName(x => x.Name).WithName("Blueprint Name").WithMessage("Blueprint Name is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.Blueprints.Validator | ||||||
|  | { | ||||||
|  |     public class DeleteBlueprintValidator : AbstractValidator<DeleteBlueprintRequest> | ||||||
|  |     { | ||||||
|  |         public DeleteBlueprintValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i._Id).NotEmpty().NotNull().OverridePropertyName(x => x._Id).WithName("Blueprint Mongo Identifier").WithMessage("Blueprint Mongo Identifier is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.Blueprints.Validator | ||||||
|  | { | ||||||
|  |     public class GetBlueprintValidator : AbstractValidator<GetBlueprintRequest> | ||||||
|  |     { | ||||||
|  |         public GetBlueprintValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i._Id).NotEmpty().NotNull().OverridePropertyName(x => x._Id).WithName("Blueprint Mongo Identifier").WithMessage("Blueprint Mongo Identifier is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,17 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.Blueprints.Validator | ||||||
|  | { | ||||||
|  |     public class UpdateBlueprintValidator : AbstractValidator<UpdateBlueprintRequest> | ||||||
|  |     { | ||||||
|  |         public UpdateBlueprintValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i._Id).NotEmpty().NotNull().OverridePropertyName(x => x._Id).WithName("Blueprint Mongo Identifier").WithMessage("Blueprint Mongo Identifier is Obligatory."); | ||||||
|  |             RuleFor(i => i._Id).NotEmpty().NotNull().OverridePropertyName(x => x.Id).WithName("Blueprint GUID").WithMessage("Blueprint GUID is Obligatory."); | ||||||
|  |             RuleFor(i => i.Name).NotEmpty().NotNull().OverridePropertyName(x => x.Name).WithName("Blueprint Name").WithMessage("Blueprint Name is Obligatory."); | ||||||
|  |             RuleFor(i => i.Status).NotNull().OverridePropertyName(x => x.Status).WithName("Blueprint Status").WithMessage("Blueprint Status is Obligatory."); | ||||||
|  |             RuleFor(i => i.CreatedAt).NotNull().OverridePropertyName(x => x.CreatedAt).WithName("Blueprint CreatedAt").WithMessage("Blueprint CreatedAt is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								Core.Blueprint.Application/UsesCases/SQL/Adapter/SQLPort.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								Core.Blueprint.Application/UsesCases/SQL/Adapter/SQLPort.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Ports; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.SQL.Adapter | ||||||
|  | { | ||||||
|  |     public class SQLPort : BasePresenter, ISQLPort | ||||||
|  |     { | ||||||
|  |         public void Success(UserProjectAdapter output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |         public void Success(List<UserProjectAdapter> output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.SQL.Input | ||||||
|  | { | ||||||
|  |     public class CreateUserProjectRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string ProjectCode { get; set; } = null!; | ||||||
|  |         public string ProjectDescription { get; set; } = null!; | ||||||
|  |         public string UserId { get; set; } = null!; | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return ProjectCode != null && ProjectCode != string.Empty; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.SQL.Input | ||||||
|  | { | ||||||
|  |     public class DeleteUserProjectRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public int Id { get; set; } | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,12 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.SQL.Input | ||||||
|  | { | ||||||
|  |     public class GetAllUserProjectsRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.SQL.Input | ||||||
|  | { | ||||||
|  |     public class GetUserProjectRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public int Id { get; set; } | ||||||
|  |  | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,23 @@ | |||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.SQL.Input | ||||||
|  | { | ||||||
|  |     public class UpdateUserProjectRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string ProjectCode { get; set; } = null!; | ||||||
|  |         public string ProjectDescription { get; set; } = null!; | ||||||
|  |         public string UserId { get; set; } = null!; | ||||||
|  |         public int Id { get; set; } | ||||||
|  |         public string Guid { get; set; } = null!; | ||||||
|  |         public DateTime CreatedAt { get; set; } | ||||||
|  |         public string? CreatedBy { get; set; } | ||||||
|  |         public DateTime? UpdatedAt { get; set; } | ||||||
|  |         public string? UpdatedBy { get; set; } | ||||||
|  |         public StatusEnum Status { get; set; } | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return Guid != null && Guid != string.Empty; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								Core.Blueprint.Application/UsesCases/SQL/Ports/ISQLPort.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Core.Blueprint.Application/UsesCases/SQL/Ports/ISQLPort.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Application.UsesCases.SQL.Ports | ||||||
|  | { | ||||||
|  |     public interface ISQLPort : IBasePort, | ||||||
|  |         ICommandSuccessPort<UserProjectAdapter>, | ||||||
|  |         ICommandSuccessPort<List<UserProjectAdapter>>, | ||||||
|  |         INoContentPort, IBusinessErrorPort, ITimeoutPort, IValidationErrorPort, | ||||||
|  |         INotFoundPort, IForbiddenPort, IUnauthorizedPort, IInternalServerErrorPort, | ||||||
|  |         IBadRequestPort | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										193
									
								
								Core.Blueprint.Application/UsesCases/SQL/SQLHandler.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								Core.Blueprint.Application/UsesCases/SQL/SQLHandler.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Ports; | ||||||
|  | using Core.Blueprint.Service.External.Clients; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Requests; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Lib.Architecture.BuildingBlocks.Helpers; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.UserProjects | ||||||
|  | { | ||||||
|  |     public class SQLHandler : | ||||||
|  |         IComponentHandler<CreateUserProjectRequest>, | ||||||
|  |         IComponentHandler<GetUserProjectRequest>, | ||||||
|  |         IComponentHandler<GetAllUserProjectsRequest>, | ||||||
|  |         IComponentHandler<UpdateUserProjectRequest>, | ||||||
|  |         IComponentHandler<DeleteUserProjectRequest> | ||||||
|  |     { | ||||||
|  |         private readonly ISQLPort _port; | ||||||
|  |         private readonly IValidator<CreateUserProjectRequest> _createUserProjectValidator; | ||||||
|  |         private readonly IValidator<GetUserProjectRequest> _getUserProjectValidator; | ||||||
|  |         private readonly IValidator<UpdateUserProjectRequest> _updateUserProjectValidator; | ||||||
|  |         private readonly IValidator<DeleteUserProjectRequest> _deleteUserProjectValidator; | ||||||
|  |         private readonly IBlueprintServiceClient _SQLDALService; | ||||||
|  |  | ||||||
|  |         public SQLHandler( | ||||||
|  |             ISQLPort port, | ||||||
|  |             IValidator<CreateUserProjectRequest> createUserProjectValidator, | ||||||
|  |             IValidator<GetUserProjectRequest> getUserProjectValidator, | ||||||
|  |             IValidator<UpdateUserProjectRequest> updateUserProjectValidator, | ||||||
|  |             IValidator<DeleteUserProjectRequest> deleteUserProjectValidator, | ||||||
|  |             IBlueprintServiceClient SQLDALService) | ||||||
|  |         { | ||||||
|  |             _port = port ?? throw new ArgumentNullException(nameof(port)); | ||||||
|  |             _createUserProjectValidator = createUserProjectValidator ?? throw new ArgumentNullException(nameof(createUserProjectValidator)); | ||||||
|  |             _getUserProjectValidator = getUserProjectValidator ?? throw new ArgumentNullException(nameof(getUserProjectValidator)); | ||||||
|  |             _updateUserProjectValidator = updateUserProjectValidator ?? throw new ArgumentNullException(nameof(updateUserProjectValidator)); | ||||||
|  |             _deleteUserProjectValidator = deleteUserProjectValidator ?? throw new ArgumentNullException(nameof(deleteUserProjectValidator)); | ||||||
|  |             _SQLDALService = SQLDALService ?? throw new ArgumentNullException(nameof(SQLDALService)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(CreateUserProjectRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_createUserProjectValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var request = new UserProjectRequest | ||||||
|  |                 { | ||||||
|  |                     ProjectCode = command.ProjectCode, | ||||||
|  |                     ProjectDescription = command.ProjectDescription, | ||||||
|  |                     UserId = command.UserId, | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 var result = await _SQLDALService.CreateUserProjectAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(GetAllUserProjectsRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 var _result = await _SQLDALService.GetAllUserProjectsAsync().ConfigureAwait(false); | ||||||
|  |                 if (!_result.Any()) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 _port.Success(_result.ToList()); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(GetUserProjectRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 var result = await _SQLDALService.GetUserProjectByIdAsync(command.Id, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(UpdateUserProjectRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_updateUserProjectValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var request = new UserProjectAdapter | ||||||
|  |                 { | ||||||
|  |                     Id = command.Id, | ||||||
|  |                     Guid = command.Guid, | ||||||
|  |                     UserId = command.UserId, | ||||||
|  |                     ProjectCode = command.ProjectCode, | ||||||
|  |                     ProjectDescription = command.ProjectDescription, | ||||||
|  |                     CreatedAt = command.CreatedAt, | ||||||
|  |                     CreatedBy = command.CreatedBy, | ||||||
|  |                     UpdatedAt = command.UpdatedAt, | ||||||
|  |                     UpdatedBy = command.UpdatedBy, | ||||||
|  |                     Status = command.Status | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 int id = command.Id; | ||||||
|  |  | ||||||
|  |                 var result = await _SQLDALService.UpdateUserProjectAsync(id, request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(DeleteUserProjectRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 ArgumentNullException.ThrowIfNull(command); | ||||||
|  |  | ||||||
|  |                 if (!command.IsValid(_deleteUserProjectValidator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var result = await _SQLDALService.DeleteUserProjectAsync(command.Id, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 ApiResponseHelper.EvaluatePort(ex, _port); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.SQL.Validator | ||||||
|  | { | ||||||
|  |     public class CreateUserProjectValidator : AbstractValidator<CreateUserProjectRequest> | ||||||
|  |     { | ||||||
|  |         public CreateUserProjectValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.ProjectCode).NotEmpty().NotNull().OverridePropertyName(x => x.ProjectCode).WithName("Project Code").WithMessage("Project Code is Obligatory."); | ||||||
|  |             RuleFor(i => i.ProjectDescription).NotEmpty().NotNull().OverridePropertyName(x => x.ProjectDescription).WithName("Project Description").WithMessage("Project Description is Obligatory."); | ||||||
|  |             RuleFor(i => i.UserId).NotEmpty().NotNull().OverridePropertyName(x => x.UserId).WithName("User Identifier").WithMessage("User Identifier is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.SQL.Validator | ||||||
|  | { | ||||||
|  |     public class DeleteUserProjectValidator : AbstractValidator<DeleteUserProjectRequest> | ||||||
|  |     { | ||||||
|  |         public DeleteUserProjectValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.Id).NotEmpty().NotNull().OverridePropertyName(x => x.Id).WithName("User Project Identifier").WithMessage("User Project Identifier is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.SQL.Validator | ||||||
|  | { | ||||||
|  |     public class GetUserProjectValidator : AbstractValidator<GetUserProjectRequest> | ||||||
|  |     { | ||||||
|  |         public GetUserProjectValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.Id).NotEmpty().NotNull().OverridePropertyName(x => x.Id).WithName("User Project Identifier").WithMessage("User Project Identifier is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,19 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Input; | ||||||
|  | using FluentValidation; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Application.UseCases.SQL.Validator | ||||||
|  | { | ||||||
|  |     public class UpdateUserProjectValidator : AbstractValidator<UpdateUserProjectRequest> | ||||||
|  |     { | ||||||
|  |         public UpdateUserProjectValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.Id).NotEmpty().NotNull().OverridePropertyName(x => x.Id).WithName("UserProject Identifier").WithMessage("UserPoject Identifier is Obligatory."); | ||||||
|  |             RuleFor(i => i.Guid).NotEmpty().NotNull().OverridePropertyName(x => x.Guid).WithName("UserProject GUID").WithMessage("UserProject GUID is Obligatory."); | ||||||
|  |             RuleFor(i => i.ProjectCode).NotEmpty().NotNull().OverridePropertyName(x => x.ProjectCode).WithName("Project Code").WithMessage("Project Code is Obligatory."); | ||||||
|  |             RuleFor(i => i.ProjectDescription).NotEmpty().NotNull().OverridePropertyName(x => x.ProjectDescription).WithName("Project Description").WithMessage("Project Description is Obligatory."); | ||||||
|  |             RuleFor(i => i.UserId).NotEmpty().NotNull().OverridePropertyName(x => x.UserId).WithName("User Identifier").WithMessage("User Identifier is Obligatory."); | ||||||
|  |             RuleFor(i => i.Status).NotNull().OverridePropertyName(x => x.Status).WithName("UserProject Status").WithMessage("UserProject Status is Obligatory."); | ||||||
|  |             RuleFor(i => i.CreatedAt).NotNull().OverridePropertyName(x => x.CreatedAt).WithName("UserProject CreatedAt").WithMessage("UserProject CreatedAt is Obligatory."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										119
									
								
								Core.Blueprint.Service.API/Controllers/BlobStorageController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								Core.Blueprint.Service.API/Controllers/BlobStorageController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  | using Asp.Versioning; | ||||||
|  | using Core.Blueprint.Application.UsesCases.BlobStorage.Ports; | ||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Service.API.Controllers | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Handles all services and business rules related to <see cref="MStorageController"/>. | ||||||
|  |     /// </summary> | ||||||
|  |     [ApiVersion("1.0")] | ||||||
|  |     [Route("api/v{api-version:apiVersion}/[controller]")] | ||||||
|  |     [Produces("application/json")] | ||||||
|  |     [ApiController] | ||||||
|  |     public class BlobStorageController : ControllerBase | ||||||
|  |     { | ||||||
|  |         private readonly IComponentHandler<UploadBlobRequest> uploadBlobHandler; | ||||||
|  |         private readonly IComponentHandler<GetBlobListRequest> getBlobListHandler; | ||||||
|  |         private readonly IComponentHandler<DownloadBlobRequest> downloadBlobHandler; | ||||||
|  |         private readonly IComponentHandler<DeleteBlobRequest> deleteBlobHandler; | ||||||
|  |         private readonly IStoragePort port; | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Handles all services and business rules related to <see cref="MStorageController"/>. | ||||||
|  |         /// </summary> | ||||||
|  |         public BlobStorageController( | ||||||
|  |             IComponentHandler<UploadBlobRequest> uploadBlobHandler, | ||||||
|  |             IComponentHandler<GetBlobListRequest> getBlobListHandler, | ||||||
|  |             IComponentHandler<DownloadBlobRequest> downloadBlobHandler, | ||||||
|  |             IComponentHandler<DeleteBlobRequest> deleteBlobHandler, | ||||||
|  |             IStoragePort port | ||||||
|  |             ) | ||||||
|  |         { | ||||||
|  |             this.uploadBlobHandler = uploadBlobHandler; | ||||||
|  |             this.getBlobListHandler = getBlobListHandler; | ||||||
|  |             this.downloadBlobHandler = downloadBlobHandler; | ||||||
|  |             this.deleteBlobHandler = deleteBlobHandler; | ||||||
|  |             this.port = port; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Uploads a new blob. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("UploadBlob")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> UploadBlobAsync([FromBody] UploadBlobRequest newBlob, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             await uploadBlobHandler.ExecuteAsync(newBlob, cancellationToken).ConfigureAwait(false); | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets all blobs into the container. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpGet] | ||||||
|  |         [Route("GetBlobList")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetBlobList([FromQuery] string? prefix, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             await getBlobListHandler.ExecuteAsync(new GetBlobListRequest { Prefix = prefix }, cancellationToken).ConfigureAwait(false); | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Downloads a blob by name. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("DownloadBlob")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> DownloadBlobAsync([FromBody] DownloadBlobRequest request, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             if (string.IsNullOrEmpty(request.BlobName)) { return BadRequest("Invalid blob name"); } | ||||||
|  |  | ||||||
|  |             await downloadBlobHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Deletes a blob by name. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpDelete] | ||||||
|  |         [Route("DeleteBlob")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> DeleteBlobAsync([FromBody] DeleteBlobRequest request, | ||||||
|  |                                                                      CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             if (string.IsNullOrEmpty(request.BlobName)) { return BadRequest("Invalid blob name"); } | ||||||
|  |  | ||||||
|  |             await deleteBlobHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										124
									
								
								Core.Blueprint.Service.API/Controllers/KeyVaultController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								Core.Blueprint.Service.API/Controllers/KeyVaultController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | |||||||
|  | using Asp.Versioning; | ||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Ports; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Service.API.Controllers | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Handles all services and business rules related to <see cref="MKeyVaultController"/>. | ||||||
|  |     /// </summary> | ||||||
|  |     [ApiVersion("1.0")] | ||||||
|  |     [Route("api/v{api-version:apiVersion}/[controller]")] | ||||||
|  |     [Produces("application/json")] | ||||||
|  |     [ApiController] | ||||||
|  |     public class KeyVaultController : ControllerBase | ||||||
|  |     { | ||||||
|  |         private readonly IComponentHandler<CreateSecretRequest> createSecretHandler; | ||||||
|  |         private readonly IComponentHandler<GetSecretRequest> getSecretHandler; | ||||||
|  |         private readonly IComponentHandler<UpdateSecretRequest> updateSecretHandler; | ||||||
|  |         private readonly IComponentHandler<DeleteSecretRequest> deleteSecretHandler; | ||||||
|  |         private readonly IKeyVaultPort port; | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Handles all services and business rules related to <see cref="MKeyVaultController"/>. | ||||||
|  |         /// </summary> | ||||||
|  |         public KeyVaultController( | ||||||
|  |             IComponentHandler<GetSecretRequest> getSecretHandler, | ||||||
|  |             IComponentHandler<CreateSecretRequest> createSecretHandler, | ||||||
|  |             IComponentHandler<UpdateSecretRequest> updateSecretHandler, | ||||||
|  |             IComponentHandler<DeleteSecretRequest> deleteSecretHandler, | ||||||
|  |             IKeyVaultPort port | ||||||
|  |             ) | ||||||
|  |         { | ||||||
|  |             this.createSecretHandler = createSecretHandler; | ||||||
|  |             this.updateSecretHandler = updateSecretHandler; | ||||||
|  |             this.deleteSecretHandler = deleteSecretHandler; | ||||||
|  |             this.getSecretHandler = getSecretHandler; | ||||||
|  |             this.port = port; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Creates a new secret. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("CreateSecret")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> CreateSecretAsync([FromBody] CreateSecretRequest newSecret, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             await createSecretHandler.ExecuteAsync(newSecret, cancellationToken).ConfigureAwait(false); | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets the secret by name. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost] | ||||||
|  |         [Route("GetSecretByName")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetSecretByName([FromBody] GetSecretRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             if (string.IsNullOrEmpty(request.Name)) { return BadRequest("Invalid secret name"); } | ||||||
|  |  | ||||||
|  |             await getSecretHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Updates a full secret by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPut("UpdateSecret")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> UpdateSecretAsync([FromBody] UpdateSecretRequest request, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             if (string.IsNullOrEmpty(request.Name)) { return BadRequest("Invalid secret name"); } | ||||||
|  |  | ||||||
|  |             if (string.IsNullOrEmpty(request.Value)) { return BadRequest("Invalid secret value"); } | ||||||
|  |  | ||||||
|  |             await updateSecretHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Deletes a secret by name. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpDelete] | ||||||
|  |         [Route("DeleteSecret")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> DeleteSecretAsync([FromBody] DeleteSecretRequest request, | ||||||
|  |                                                                      CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             if (string.IsNullOrEmpty(request.Name)) { return BadRequest("Invalid secret name"); } | ||||||
|  |  | ||||||
|  |             await deleteSecretHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,142 @@ | |||||||
|  | using Asp.Versioning; | ||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Ports; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Service.API.Controllers | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Handles all services and business rules related to <see cref="MongoBlueprintController"/>. | ||||||
|  |     /// </summary> | ||||||
|  |     [ApiVersion("1.0")] | ||||||
|  |     [Route("api/v{api-version:apiVersion}/[controller]")] | ||||||
|  |     [Produces("application/json")] | ||||||
|  |     [ApiController] | ||||||
|  |     public class MongoBlueprintController : ControllerBase | ||||||
|  |     { | ||||||
|  |         private readonly IComponentHandler<CreateBlueprintRequest> createBlueprintHandler; | ||||||
|  |         private readonly IComponentHandler<GetAllBlueprintsRequest> getAllBlueprintsHandler; | ||||||
|  |         private readonly IComponentHandler<GetBlueprintRequest> getBlueprintHandler; | ||||||
|  |         private readonly IComponentHandler<UpdateBlueprintRequest> updateBlueprintHandler; | ||||||
|  |         private readonly IComponentHandler<DeleteBlueprintRequest> deleteBlueprintHandler; | ||||||
|  |         private readonly IMongoPort port; | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Handles all services and business rules related to <see cref="MongoBlueprintController"/>. | ||||||
|  |         /// </summary> | ||||||
|  |         public MongoBlueprintController( | ||||||
|  |             IComponentHandler<GetBlueprintRequest> getBlueprintHandler, | ||||||
|  |             IComponentHandler<GetAllBlueprintsRequest> getAllBlueprintsHandler, | ||||||
|  |             IComponentHandler<CreateBlueprintRequest> createBlueprintHandler, | ||||||
|  |             IComponentHandler<UpdateBlueprintRequest> updateBlueprintHandler, | ||||||
|  |             IComponentHandler<DeleteBlueprintRequest> deleteBlueprintHandler, | ||||||
|  |             IMongoPort port | ||||||
|  |             ) | ||||||
|  |         { | ||||||
|  |             this.createBlueprintHandler = createBlueprintHandler; | ||||||
|  |             this.updateBlueprintHandler = updateBlueprintHandler; | ||||||
|  |             this.deleteBlueprintHandler = deleteBlueprintHandler; | ||||||
|  |             this.getAllBlueprintsHandler = getAllBlueprintsHandler; | ||||||
|  |             this.getBlueprintHandler = getBlueprintHandler; | ||||||
|  |             this.port = port; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Creates a new blueprint. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("Create")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> CreateBlueprintAsync([FromBody] CreateBlueprintRequest newBlueprint, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             await createBlueprintHandler.ExecuteAsync(newBlueprint, cancellationToken).ConfigureAwait(false); | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets all blueprints. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpGet("GetAll")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> GetAllBlueprintsAsync(CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             await getAllBlueprintsHandler.ExecuteAsync(new GetAllBlueprintsRequest { }, cancellationToken).ConfigureAwait(false); | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets the blueprint by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost] | ||||||
|  |         [Route("GetById")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetBlueprintById([FromBody] GetBlueprintRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             if (string.IsNullOrEmpty(request._Id)) { return BadRequest("Invalid blueprint identifier"); } | ||||||
|  |  | ||||||
|  |             await getBlueprintHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Updates a full blueprint by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPut("Update")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> UpdateBlueprintAsync([FromBody] UpdateBlueprintRequest request, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             if (string.IsNullOrEmpty(request._Id)) { return BadRequest("Invalid blueprint identifier"); } | ||||||
|  |  | ||||||
|  |             await updateBlueprintHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Deletes a blueprint. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpDelete] | ||||||
|  |         [Route("Delete")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> DeleteBlueprintAsync([FromBody] DeleteBlueprintRequest request, | ||||||
|  |                                                                      CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             if (string.IsNullOrEmpty(request._Id)) { return BadRequest("Invalid blueprint identifier"); } | ||||||
|  |  | ||||||
|  |             await deleteBlueprintHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,142 @@ | |||||||
|  | using Asp.Versioning; | ||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Ports; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Cerberos.Service.API.Controllers | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Handles all services and business rules related to <see cref="SQLUserProjectController"/>. | ||||||
|  |     /// </summary> | ||||||
|  |     [ApiVersion("1.0")] | ||||||
|  |     [Route("api/v{api-version:apiVersion}/[controller]")] | ||||||
|  |     [Produces("application/json")] | ||||||
|  |     [ApiController] | ||||||
|  |     public class SQLUserProjectController : ControllerBase | ||||||
|  |     { | ||||||
|  |         private readonly IComponentHandler<CreateUserProjectRequest> createUserProjectHandler; | ||||||
|  |         private readonly IComponentHandler<GetAllUserProjectsRequest> getAllUserProjectsHandler; | ||||||
|  |         private readonly IComponentHandler<GetUserProjectRequest> getUserProjectHandler; | ||||||
|  |         private readonly IComponentHandler<UpdateUserProjectRequest> updateUserProjectHandler; | ||||||
|  |         private readonly IComponentHandler<DeleteUserProjectRequest> deleteUserProjectStatusHandler; | ||||||
|  |         private readonly ISQLPort port; | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Handles all services and business rules related to <see cref="SQLUserProjectController"/>. | ||||||
|  |         /// </summary> | ||||||
|  |         public SQLUserProjectController( | ||||||
|  |             IComponentHandler<GetUserProjectRequest> getUserProjectHandler, | ||||||
|  |             IComponentHandler<GetAllUserProjectsRequest> getAllUserProjectsHandler, | ||||||
|  |             IComponentHandler<CreateUserProjectRequest> createUserProjectHandler, | ||||||
|  |             IComponentHandler<UpdateUserProjectRequest> updateUserProjectHandler, | ||||||
|  |             IComponentHandler<DeleteUserProjectRequest> deleteUserProjectStatusHandler, | ||||||
|  |             ISQLPort port | ||||||
|  |             ) | ||||||
|  |         { | ||||||
|  |             this.createUserProjectHandler = createUserProjectHandler; | ||||||
|  |             this.updateUserProjectHandler = updateUserProjectHandler; | ||||||
|  |             this.deleteUserProjectStatusHandler = deleteUserProjectStatusHandler; | ||||||
|  |             this.getAllUserProjectsHandler = getAllUserProjectsHandler; | ||||||
|  |             this.getUserProjectHandler = getUserProjectHandler; | ||||||
|  |             this.port = port; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Creates a new UserProject. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("Create")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> CreateUserProjectAsync([FromBody] CreateUserProjectRequest newUserProject, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             await createUserProjectHandler.ExecuteAsync(newUserProject, cancellationToken).ConfigureAwait(false); | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets all UserProjects. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpGet("GetAll")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> GetAllUserProjectsAsync(CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             await getAllUserProjectsHandler.ExecuteAsync(new GetAllUserProjectsRequest { }, cancellationToken).ConfigureAwait(false); | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets the UserProject by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost] | ||||||
|  |         [Route("GetById")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetUserProjectById([FromBody] GetUserProjectRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             if (request.Id <= 0) { return BadRequest("Invalid UserProject identifier"); } | ||||||
|  |  | ||||||
|  |             await getUserProjectHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Updates a full UserProject by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPut("Update")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         public async Task<IActionResult> UpdateUserProjectAsync([FromBody] UpdateUserProjectRequest request, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             if (request.Id <= 0) { return BadRequest("Invalid UserProject identifier"); } | ||||||
|  |  | ||||||
|  |             await updateUserProjectHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Deletes a UserProject. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpDelete] | ||||||
|  |         [Route("Delete")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> DeleteUserProjectStatusAsync([FromBody] DeleteUserProjectRequest request, | ||||||
|  |                                                                      CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             if (request.Id <= 0) { return BadRequest("Invalid UserProject identifier"); } | ||||||
|  |  | ||||||
|  |             await deleteUserProjectStatusHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             return port.ViewModel; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								Core.Blueprint.Service.API/Core.Blueprint.Service.API.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Core.Blueprint.Service.API/Core.Blueprint.Service.API.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk.Web"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net8.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <InvariantGlobalization>true</InvariantGlobalization> | ||||||
|  |     <UserSecretsId>a776c24d-b2ab-4520-a66b-d1802fb016fb</UserSecretsId> | ||||||
|  |     <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" /> | ||||||
|  |     <PackageReference Include="Core.Blueprint.Logging" Version="0.3.0-alpha0034" /> | ||||||
|  |     <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.7" /> | ||||||
|  |     <PackageReference Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="8.1.0-preview" /> | ||||||
|  |     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" /> | ||||||
|  |     <PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\Core.Blueprint.Application\Core.Blueprint.Application.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | @Core.Blueprint.Service.API_HostAddress = http://localhost:5047 | ||||||
|  |  | ||||||
|  | GET {{Core.Blueprint.Service.API_HostAddress}}/weatherforecast/ | ||||||
|  | Accept: application/json | ||||||
|  |  | ||||||
|  | ### | ||||||
							
								
								
									
										25
									
								
								Core.Blueprint.Service.API/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Core.Blueprint.Service.API/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. | ||||||
|  |  | ||||||
|  | FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base | ||||||
|  | USER app | ||||||
|  | WORKDIR /app | ||||||
|  | EXPOSE 8080 | ||||||
|  | EXPOSE 8081 | ||||||
|  |  | ||||||
|  | FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build | ||||||
|  | ARG BUILD_CONFIGURATION=Release | ||||||
|  | WORKDIR /src | ||||||
|  | COPY ["Core.Blueprint.Service.API/Core.Blueprint.Service.API.csproj", "Core.Blueprint.Service.API/"] | ||||||
|  | RUN dotnet restore "./Core.Blueprint.Service.API/./Core.Blueprint.Service.API.csproj" | ||||||
|  | COPY . . | ||||||
|  | WORKDIR "/src/Core.Blueprint.Service.API" | ||||||
|  | RUN dotnet build "./Core.Blueprint.Service.API.csproj" -c $BUILD_CONFIGURATION -o /app/build | ||||||
|  |  | ||||||
|  | FROM build AS publish | ||||||
|  | ARG BUILD_CONFIGURATION=Release | ||||||
|  | RUN dotnet publish "./Core.Blueprint.Service.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false | ||||||
|  |  | ||||||
|  | FROM base AS final | ||||||
|  | WORKDIR /app | ||||||
|  | COPY --from=publish /app/publish . | ||||||
|  | ENTRYPOINT ["dotnet", "Core.Blueprint.Service.API.dll"] | ||||||
| @@ -0,0 +1,111 @@ | |||||||
|  | using Core.Blueprint.Application.UsesCases.BlobStorage.Adapter; | ||||||
|  | using Core.Blueprint.Application.UsesCases.BlobStorage.Ports; | ||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.KeyVault.Ports; | ||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.Mongo.Ports; | ||||||
|  | using Core.Blueprint.Application.UsesCases.MongoStorage.Adapter; | ||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Adapter; | ||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Input; | ||||||
|  | using Core.Blueprint.Application.UsesCases.SQL.Ports; | ||||||
|  | using Core.Cerberos.Application.UseCases.Blueprints; | ||||||
|  | using Core.Cerberos.Application.UseCases.Blueprints.Validator; | ||||||
|  | using Core.Cerberos.Application.UseCases.KeyVault; | ||||||
|  | using Core.Cerberos.Application.UseCases.KeyVault.Validator; | ||||||
|  | using Core.Cerberos.Application.UseCases.SQL.Validator; | ||||||
|  | using Core.Cerberos.Application.UseCases.UserProjects; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.API.Extensions | ||||||
|  | { | ||||||
|  |     public static class ServiceCollectionExtension | ||||||
|  |     { | ||||||
|  |         public static IServiceCollection AddServiceConfigurationLayer(this IServiceCollection services) | ||||||
|  |         { | ||||||
|  |             #region Mongo Services | ||||||
|  |             services.AddScoped<IMongoPort, MongoPort>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<CreateBlueprintValidator>(); | ||||||
|  |             services.AddScoped<IValidator<CreateBlueprintRequest>, CreateBlueprintValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<CreateBlueprintRequest>, MongoHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddScoped<IComponentHandler<GetAllBlueprintsRequest>, MongoHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<GetBlueprintValidator>(); | ||||||
|  |             services.AddScoped<IValidator<GetBlueprintRequest>, GetBlueprintValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<GetBlueprintRequest>, MongoHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<UpdateBlueprintValidator>(); | ||||||
|  |             services.AddScoped<IValidator<UpdateBlueprintRequest>, UpdateBlueprintValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<UpdateBlueprintRequest>, MongoHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<DeleteBlueprintValidator>(); | ||||||
|  |             services.AddScoped<IValidator<DeleteBlueprintRequest>, DeleteBlueprintValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<DeleteBlueprintRequest>, MongoHandler>(); | ||||||
|  |             #endregion | ||||||
|  |  | ||||||
|  |             #region SQL Services | ||||||
|  |             services.AddScoped<ISQLPort, SQLPort>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<CreateUserProjectValidator>(); | ||||||
|  |             services.AddScoped<IValidator<CreateUserProjectRequest>, CreateUserProjectValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<CreateUserProjectRequest>, SQLHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddScoped<IComponentHandler<GetAllUserProjectsRequest>, SQLHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<GetUserProjectValidator>(); | ||||||
|  |             services.AddScoped<IValidator<GetUserProjectRequest>, GetUserProjectValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<GetUserProjectRequest>, SQLHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<UpdateUserProjectValidator>(); | ||||||
|  |             services.AddScoped<IValidator<UpdateUserProjectRequest>, UpdateUserProjectValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<UpdateUserProjectRequest>, SQLHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<DeleteUserProjectValidator>(); | ||||||
|  |             services.AddScoped<IValidator<DeleteUserProjectRequest>, DeleteUserProjectValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<DeleteUserProjectRequest>, SQLHandler>(); | ||||||
|  |             #endregion | ||||||
|  |  | ||||||
|  |             #region KeyVault Services | ||||||
|  |             services.AddScoped<IKeyVaultPort, KeyVaultPort>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<CreateSecretValidator>(); | ||||||
|  |             services.AddScoped<IValidator<CreateSecretRequest>, CreateSecretValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<CreateSecretRequest>, KeyVaultHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<GetSecretValidator>(); | ||||||
|  |             services.AddScoped<IValidator<GetSecretRequest>, GetSecretValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<GetSecretRequest>, KeyVaultHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<UpdateSecretValidator>(); | ||||||
|  |             services.AddScoped<IValidator<UpdateSecretRequest>, UpdateSecretValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<UpdateSecretRequest>, KeyVaultHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<DeleteSecretValidator>(); | ||||||
|  |             services.AddScoped<IValidator<DeleteSecretRequest>, DeleteSecretValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<DeleteSecretRequest>, KeyVaultHandler>(); | ||||||
|  |             #endregion | ||||||
|  |  | ||||||
|  |             #region Storage Services | ||||||
|  |             services.AddScoped<IStoragePort, StoragePort>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<UploadBlobValidator>(); | ||||||
|  |             services.AddScoped<IValidator<UploadBlobRequest>, UploadBlobValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<UploadBlobRequest>, StorageHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddScoped<IComponentHandler<GetBlobListRequest>, StorageHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<DownloadBlobValidator>(); | ||||||
|  |             services.AddScoped<IValidator<DownloadBlobRequest>, DownloadBlobValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<DownloadBlobRequest>, StorageHandler>(); | ||||||
|  |  | ||||||
|  |             services.AddValidatorsFromAssemblyContaining<DeleteBlobValidator>(); | ||||||
|  |             services.AddScoped<IValidator<DeleteBlobRequest>, DeleteBlobValidator>(); | ||||||
|  |             services.AddScoped<IComponentHandler<DeleteBlobRequest>, StorageHandler>(); | ||||||
|  |             #endregion | ||||||
|  |  | ||||||
|  |             return services; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										71
									
								
								Core.Blueprint.Service.API/Extensions/SwaggerExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								Core.Blueprint.Service.API/Extensions/SwaggerExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | |||||||
|  | using Asp.Versioning.ApiExplorer; | ||||||
|  | using Microsoft.Extensions.Options; | ||||||
|  | using Microsoft.OpenApi.Any; | ||||||
|  | using Swashbuckle.AspNetCore.SwaggerGen; | ||||||
|  | using Swashbuckle.AspNetCore.SwaggerUI; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.API.Extensions | ||||||
|  | { | ||||||
|  |     public static class SwaggerExtensions | ||||||
|  |     { | ||||||
|  |         public static void AddSwagger(this IServiceCollection services) | ||||||
|  |         { | ||||||
|  |             services.AddEndpointsApiExplorer(); | ||||||
|  |             services.AddSwaggerGen(); | ||||||
|  |             services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public static void ConfigureSwagger(this WebApplication app) | ||||||
|  |         { | ||||||
|  |             app.UseSwagger(); | ||||||
|  |             app.UseSwaggerUI(options => | ||||||
|  |             { | ||||||
|  |                 foreach (var version in app.DescribeApiVersions().Select(version => version.GroupName)) | ||||||
|  |                     options.SwaggerEndpoint($"/swagger/{version}/swagger.json", version); | ||||||
|  |  | ||||||
|  |                 options.DisplayRequestDuration(); | ||||||
|  |                 options.EnableTryItOutByDefault(); | ||||||
|  |                 options.DocExpansion(DocExpansion.None); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |         public static IServiceCollection AddVersioning(this IServiceCollection services) | ||||||
|  |         { | ||||||
|  |             services.AddApiVersioning(options => options.ReportApiVersions = true) | ||||||
|  |                    .AddApiExplorer(options => | ||||||
|  |                    { | ||||||
|  |                        options.GroupNameFormat = "'v'VVV"; | ||||||
|  |                        options.SubstituteApiVersionInUrl = true; | ||||||
|  |                    }); | ||||||
|  |  | ||||||
|  |             return services; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     public class ConfigureSwaggerOptions : IConfigureOptions<SwaggerGenOptions> | ||||||
|  |     { | ||||||
|  |         private readonly IApiVersionDescriptionProvider _provider; | ||||||
|  |  | ||||||
|  |         public ConfigureSwaggerOptions(IApiVersionDescriptionProvider provider) | ||||||
|  |         { | ||||||
|  |             _provider = provider; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public void Configure(SwaggerGenOptions options) | ||||||
|  |         { | ||||||
|  |             foreach (var description in _provider.ApiVersionDescriptions) | ||||||
|  |                 options.SwaggerDoc(description.GroupName, new() | ||||||
|  |                 { | ||||||
|  |                     Title = AppDomain.CurrentDomain.FriendlyName, | ||||||
|  |                     Version = description.ApiVersion.ToString() | ||||||
|  |                 }); | ||||||
|  |  | ||||||
|  |             //Map ALL Values Format TODO | ||||||
|  |             options.MapType<DateOnly>(() => new() | ||||||
|  |             { | ||||||
|  |                 Format = "date", | ||||||
|  |                 Example = new OpenApiString(DateOnly.MinValue.ToString()) | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |             options.CustomSchemaIds(type => type.ToString().Replace("+", ".")); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										98
									
								
								Core.Blueprint.Service.API/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								Core.Blueprint.Service.API/Program.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | |||||||
|  |  | ||||||
|  | using Azure.Identity; | ||||||
|  | using Core.Blueprint.External.ClientConfiguration; | ||||||
|  | using Core.Blueprint.Logging.Configuration; | ||||||
|  | using Core.Blueprint.Service.API.Extensions; | ||||||
|  | using Microsoft.AspNetCore.HttpLogging; | ||||||
|  | using Microsoft.Extensions.Configuration.AzureAppConfiguration; | ||||||
|  | using System.Reflection; | ||||||
|  | using System.Text.Json.Serialization; | ||||||
|  |  | ||||||
|  | var builder = WebApplication.CreateBuilder(args); | ||||||
|  |  | ||||||
|  | builder.Configuration.AddAzureAppConfiguration(options => | ||||||
|  | { | ||||||
|  |     var endpoint = builder.Configuration.GetSection("Endpoints:AppConfigurationURI").Value; | ||||||
|  |  | ||||||
|  |     if (string.IsNullOrEmpty(endpoint)) | ||||||
|  |         throw new ArgumentException("The app configuration is missing"); | ||||||
|  |  | ||||||
|  |     options.Connect(new Uri(endpoint), new DefaultAzureCredential()) | ||||||
|  |     .Select(KeyFilter.Any, "blueprint_service"); | ||||||
|  |  | ||||||
|  |     options.ConfigureKeyVault(keyVaultOptions => | ||||||
|  |     { | ||||||
|  |         keyVaultOptions.SetCredential(new DefaultAzureCredential()); | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | builder.Services.AddLogs(builder); | ||||||
|  |  | ||||||
|  | builder.Services.AddEndpointsApiExplorer(); | ||||||
|  | builder.Services.AddSwaggerGen(); | ||||||
|  | builder.Configuration | ||||||
|  |     .AddUserSecrets(Assembly.GetExecutingAssembly()) | ||||||
|  |     .AddEnvironmentVariables(); | ||||||
|  |  | ||||||
|  | builder.Services.RegisterExternalLayer(builder.Configuration); | ||||||
|  | builder.Services.AddServiceConfigurationLayer(); | ||||||
|  | builder.Services.AddResponseCompression(); | ||||||
|  | builder.Services.AddProblemDetails(); | ||||||
|  | builder.Services.AddMemoryCache(); | ||||||
|  |  | ||||||
|  | builder.Host.ConfigureServices((context, services) => | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     services.AddLogging(); | ||||||
|  |     services.AddControllers(); | ||||||
|  |     services.AddProblemDetails(); | ||||||
|  |     services.AddCors(options | ||||||
|  |         => options.AddDefaultPolicy(policyBuilder | ||||||
|  |             => policyBuilder | ||||||
|  |                 .AllowAnyOrigin() | ||||||
|  |                 .AllowAnyHeader() | ||||||
|  |                 .AllowAnyMethod())); | ||||||
|  |  | ||||||
|  |     builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => | ||||||
|  |     { | ||||||
|  |         options.SerializerOptions.Converters.Add(new JsonStringEnumConverter()); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     services | ||||||
|  |         .AddEndpointsApiExplorer() | ||||||
|  |         .AddVersioning() | ||||||
|  |         .AddSwagger(); | ||||||
|  |  | ||||||
|  |     services.AddHealthChecks(); | ||||||
|  |     services.AddHttpLogging(options => options.LoggingFields = HttpLoggingFields.All); | ||||||
|  |  | ||||||
|  |     builder.Services.AddOutputCache(options => | ||||||
|  |     { | ||||||
|  |         options.AddBasePolicy(builder => | ||||||
|  |             builder.Expire(TimeSpan.FromSeconds(10))); | ||||||
|  |         options.AddPolicy("Expire20", builder => | ||||||
|  |             builder.Expire(TimeSpan.FromSeconds(20))); | ||||||
|  |         options.AddPolicy("Expire30", builder => | ||||||
|  |             builder.Expire(TimeSpan.FromSeconds(30))); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | var app = builder.Build(); | ||||||
|  |  | ||||||
|  | app.UseSwagger(); | ||||||
|  | app.UseSwaggerUI(); | ||||||
|  |  | ||||||
|  | app.MapControllers(); | ||||||
|  | app.UseCors(); | ||||||
|  | app.ConfigureSwagger(); | ||||||
|  | app.UseHttpsRedirection(); | ||||||
|  | app.UseStaticFiles(); | ||||||
|  | app.UseRouting(); | ||||||
|  | app.UseResponseCompression(); | ||||||
|  | app.UseOutputCache(); | ||||||
|  | app.UseResponseCaching(); | ||||||
|  | app.UseLogging(builder.Configuration); | ||||||
|  | app.MapHealthChecks("/health"); | ||||||
|  |  | ||||||
|  | app.Run(); | ||||||
							
								
								
									
										52
									
								
								Core.Blueprint.Service.API/Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								Core.Blueprint.Service.API/Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | { | ||||||
|  |   "profiles": { | ||||||
|  |     "http": { | ||||||
|  |       "commandName": "Project", | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "launchUrl": "swagger", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_ENVIRONMENT": "Local" | ||||||
|  |       }, | ||||||
|  |       "dotnetRunMessages": true, | ||||||
|  |       "applicationUrl": "http://localhost:5047" | ||||||
|  |     }, | ||||||
|  |     "https": { | ||||||
|  |       "commandName": "Project", | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "launchUrl": "swagger", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_ENVIRONMENT": "Local" | ||||||
|  |       }, | ||||||
|  |       "dotnetRunMessages": true, | ||||||
|  |       "applicationUrl": "https://localhost:7243;http://localhost:5047" | ||||||
|  |     }, | ||||||
|  |     "IIS Express": { | ||||||
|  |       "commandName": "IISExpress", | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "launchUrl": "swagger", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_ENVIRONMENT": "Local" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "Docker": { | ||||||
|  |       "commandName": "Docker", | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_HTTPS_PORTS": "8081", | ||||||
|  |         "ASPNETCORE_HTTP_PORTS": "8080" | ||||||
|  |       }, | ||||||
|  |       "publishAllPorts": true, | ||||||
|  |       "useSSL": true | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "$schema": "http://json.schemastore.org/launchsettings.json", | ||||||
|  |   "iisSettings": { | ||||||
|  |     "windowsAuthentication": false, | ||||||
|  |     "anonymousAuthentication": true, | ||||||
|  |     "iisExpress": { | ||||||
|  |       "applicationUrl": "http://localhost:13744", | ||||||
|  |       "sslPort": 44338 | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								Core.Blueprint.Service.API/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Core.Blueprint.Service.API/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   "Logging": { | ||||||
|  |     "LogLevel": { | ||||||
|  |       "Default": "Information", | ||||||
|  |       "Microsoft.AspNetCore": "Warning" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								Core.Blueprint.Service.API/appsettings.Local.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Core.Blueprint.Service.API/appsettings.Local.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | { | ||||||
|  |   "Logging": { | ||||||
|  |     "LogLevel": { | ||||||
|  |       "Default": "Information", | ||||||
|  |       "Microsoft.AspNetCore": "Warning" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "LocalGateways": { | ||||||
|  |     "BlueprintDAL": "https://localhost:7075/api" | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |    | ||||||
							
								
								
									
										12
									
								
								Core.Blueprint.Service.API/appsettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Core.Blueprint.Service.API/appsettings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | { | ||||||
|  |   "Logging": { | ||||||
|  |     "LogLevel": { | ||||||
|  |       "Default": "Information", | ||||||
|  |       "Microsoft.AspNetCore": "Warning" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "AllowedHosts": "*", | ||||||
|  |   "Endpoints": { | ||||||
|  |     "AppConfigurationURI": "https://sandbox-hci-usc-appcg.azconfig.io" | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net8.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
							
								
								
									
										13
									
								
								Core.Blueprint.Service.Domain/Dtos/SampleImageUrlDto.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Core.Blueprint.Service.Domain/Dtos/SampleImageUrlDto.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.Domain.Dtos | ||||||
|  | { | ||||||
|  |     public class SampleImageUrlDto | ||||||
|  |     { | ||||||
|  |         public string Url { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.Domain.Entities | ||||||
|  | { | ||||||
|  |     public class BlobSampleImageEntity | ||||||
|  |     { | ||||||
|  |         public Guid? Id { get; set; } | ||||||
|  |         public byte[] FileContent { get; set; } = []; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								Core.Blueprint.Service.Domain/Entities/SecretEntity.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Core.Blueprint.Service.Domain/Entities/SecretEntity.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.Domain.Entities | ||||||
|  | { | ||||||
|  |     public class SecretEntity | ||||||
|  |     { | ||||||
|  |         public string? Value { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,17 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.Domain.Entities | ||||||
|  | { | ||||||
|  |     public class SqlSampleItemEntity | ||||||
|  |     { | ||||||
|  |         public string? Id { get; set; } | ||||||
|  |         public string TestName { get; set; } = string.Empty; | ||||||
|  |         public char StatusCode { get; set; } = 'P'; | ||||||
|  |         public int NumValue { get; set; } = 0; | ||||||
|  |         public DateTime CreatedAt { get; set; } = DateTime.Now; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,58 @@ | |||||||
|  | using Core.Blueprint.Service.External.Clients; | ||||||
|  | using Core.Blueprint.Service.External.GatewayConfigurations; | ||||||
|  | using Core.Blueprint.Service.External.Helpers.Token; | ||||||
|  | using Microsoft.AspNetCore.Authentication; | ||||||
|  | using Microsoft.AspNetCore.Http; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.DependencyInjection; | ||||||
|  | using Refit; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.External.ClientConfiguration | ||||||
|  | { | ||||||
|  |     public static class RegisterClientConfiguration | ||||||
|  |     { | ||||||
|  |         public static IServiceCollection RegisterExternalLayer(this IServiceCollection services, IConfiguration configuration) | ||||||
|  |         { | ||||||
|  |             var gatewayConfiguration = new GatewayConfiguration(); | ||||||
|  |             var gatewaySettingsConfiguration = new GatewaySettingsConfiguration(configuration); | ||||||
|  |  | ||||||
|  |             // Register GatewayConfiguration as a singleton | ||||||
|  |             services.AddSingleton(gatewayConfiguration); | ||||||
|  |  | ||||||
|  |             // Register IHttpContextAccessor | ||||||
|  |             services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); | ||||||
|  |  | ||||||
|  |             // Register ITokenProvider | ||||||
|  |             services.AddSingleton<ITokenProvider, HttpContextTokenProvider>(); | ||||||
|  |  | ||||||
|  |             // Register the custom AuthenticatedHttpClientHandler | ||||||
|  |             services.AddTransient(provider => | ||||||
|  |             { | ||||||
|  |                 var tokenProvider = provider.GetRequiredService<ITokenProvider>(); | ||||||
|  |                 var handler = new AuthenticatedHttpClientHandler(tokenProvider) | ||||||
|  |                 { | ||||||
|  |                     InnerHandler = new HttpClientHandler() // Setting the InnerHandler manually | ||||||
|  |                 }; | ||||||
|  |                 return handler; | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |             var secretServiceApiUrl = GatewaySettingsConfiguration.GetBlueprintApiEndpoint.Endpoint.Uri; | ||||||
|  |  | ||||||
|  |             // Register IBlueprintServiceClient with the manually created HttpClient | ||||||
|  |             services.AddScoped<IBlueprintServiceClient>(provider => | ||||||
|  |             { | ||||||
|  |                 var handler = provider.GetRequiredService<AuthenticatedHttpClientHandler>(); | ||||||
|  |                 var httpClient = new HttpClient(handler) | ||||||
|  |                 { | ||||||
|  |                     BaseAddress = secretServiceApiUrl, | ||||||
|  |                     Timeout = TimeSpan.FromMinutes(1) | ||||||
|  |                 }; | ||||||
|  |                 return RestService.For<IBlueprintServiceClient>(httpClient); | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |             services.AddScoped<IAuthenticationService, AuthenticationService>(); | ||||||
|  |  | ||||||
|  |             return services; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | namespace Core.Blueprint.Service.External.Clients.Adapters | ||||||
|  | { | ||||||
|  |     public class BlueprintAdapter | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |         public string? Description { get; set; } | ||||||
|  |         public string _Id { get; set; } = null!; | ||||||
|  |         public string Id { get; init; } = null!; | ||||||
|  |         public DateTime CreatedAt { get; set; } | ||||||
|  |         public string? CreatedBy { get; set; } | ||||||
|  |         public DateTime? UpdatedAt { get; set; } | ||||||
|  |         public string? UpdatedBy { get; set; } | ||||||
|  |         public StatusEnum Status { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,10 @@ | |||||||
|  | using Core.Blueprint.KeyVault; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.External.Clients.Adapters | ||||||
|  | { | ||||||
|  |     public class KeyVaultAdapter | ||||||
|  |     { | ||||||
|  |         public KeyVaultResponse Item1 { get; set; } | ||||||
|  |         public string Item2 { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | using System.Text.Json.Serialization; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.External.Clients.Adapters | ||||||
|  | { | ||||||
|  |     [JsonConverter(typeof(JsonStringEnumConverter))] | ||||||
|  |     public enum StatusEnum | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         Active = 0, | ||||||
|  |  | ||||||
|  |         Inactive = 1, | ||||||
|  |  | ||||||
|  |         Deleted = 2 | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | namespace Core.Blueprint.Service.External.Clients.Adapters | ||||||
|  | { | ||||||
|  |     public class UserProjectAdapter | ||||||
|  |     { | ||||||
|  |         public string ProjectCode { get; set; } = null!; | ||||||
|  |         public string ProjectDescription { get; set; } = null!; | ||||||
|  |         public string UserId { get; set; } = null!; | ||||||
|  |         public int Id { get; set; } | ||||||
|  |         public string Guid { get; set; } = null!; | ||||||
|  |         public DateTime CreatedAt { get; set; } | ||||||
|  |         public string? CreatedBy { get; set; } | ||||||
|  |         public DateTime? UpdatedAt { get; set; } | ||||||
|  |         public string? UpdatedBy { get; set; } | ||||||
|  |         public StatusEnum Status { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,67 @@ | |||||||
|  | using Core.Blueprint.KeyVault; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Adapters; | ||||||
|  | using Core.Blueprint.Service.External.Clients.Requests; | ||||||
|  | using Core.Blueprint.Storage; | ||||||
|  | using Core.Blueprint.Storage.Adapters; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  | using Refit; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.External.Clients | ||||||
|  | { | ||||||
|  |     public interface IBlueprintServiceClient | ||||||
|  |     { | ||||||
|  |         [Post("/v1/MongoBlueprint/Create")] | ||||||
|  |         Task<BlueprintAdapter> CreateBlueprintAsync([FromBody] BlueprintRequest newBlueprint, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/MongoBlueprint/GetAll")] | ||||||
|  |         Task<IEnumerable<BlueprintAdapter>> GetAllBlueprintsAsync(CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/MongoBlueprint/{_id}/GetBy_Id")] | ||||||
|  |         Task<BlueprintAdapter> GetBlueprintByIdAsync([FromRoute] string _id, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Put("/v1/MongoBlueprint/{_id}/Update")] | ||||||
|  |         Task<BlueprintAdapter> UpdateBlueprintAsync([FromRoute] string _id, [FromBody] BlueprintAdapter entity, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Delete("/v1/MongoBlueprint/{_id}/Delete")] | ||||||
|  |         Task<BlueprintAdapter> DeleteBlueprintAsync([FromRoute] string _id, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/UserProject/Create")] | ||||||
|  |         Task<UserProjectAdapter> CreateUserProjectAsync([FromBody] UserProjectRequest newUserProject, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/UserProject/GetAll")] | ||||||
|  |         Task<IEnumerable<UserProjectAdapter>> GetAllUserProjectsAsync(CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/UserProject/{id}/GetById")] | ||||||
|  |         Task<UserProjectAdapter> GetUserProjectByIdAsync([FromRoute] int id, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Put("/v1/UserProject/{id}/Update")] | ||||||
|  |         Task<UserProjectAdapter> UpdateUserProjectAsync([FromRoute] int id, [FromBody] UserProjectAdapter entity, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Delete("/v1/UserProject/{id}/Delete")] | ||||||
|  |         Task<UserProjectAdapter> DeleteUserProjectAsync([FromRoute] int id, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/KeyVault/CreateSecret")] | ||||||
|  |         Task<KeyVaultResponse> CreateSecretAsync([FromBody] KeyVaultRequest newKeyVault, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/KeyVault/{secretName}/GetSecret")] | ||||||
|  |         Task<KeyVaultAdapter> GetSecretByNameAsync([FromRoute] string secretName, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Put("/v1/KeyVault/UpdateSecret")] | ||||||
|  |         Task<KeyVaultAdapter> UpdateSecretAsync([FromBody] KeyVaultRequest entity, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Delete("/v1/KeyVault/{secretName}/DeleteSecret")] | ||||||
|  |         Task<KeyVaultAdapter> DeleteSecretAsync([FromRoute] string secretName, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/BlobStorage/UploadBlob")] | ||||||
|  |         Task<BlobFileAdapter> UploadBlobAsync([FromQuery] BlobAddDto request, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/BlobStorage/GetBlobList")] | ||||||
|  |         Task<List<BlobFileAdapter>> GetBlobListAsync([FromQuery] string? prefix, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/BlobStorage/DownloadBlob")] | ||||||
|  |         Task<BlobDownloadUriAdapter> DownloadBlobAsync([FromQuery] string blobName, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Delete("/v1/BlobStorage/DeleteBlob")] | ||||||
|  |         Task<BlobFileAdapter> DeleteBlobAsync([FromQuery] string blobName, CancellationToken cancellationToken = default); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | namespace Core.Blueprint.Service.External.Clients.Requests | ||||||
|  | { | ||||||
|  |     public class BlueprintRequest | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |         public string? Description { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | namespace Core.Blueprint.Service.External.Clients.Requests | ||||||
|  | { | ||||||
|  |     public class UserProjectRequest | ||||||
|  |     { | ||||||
|  |         public string ProjectCode { get; set; } = null!; | ||||||
|  |         public string ProjectDescription { get; set; } = null!; | ||||||
|  |         public string UserId { get; set; } = null!; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,25 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net8.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="Azure.Storage.Blobs" Version="12.23.0" /> | ||||||
|  |     <PackageReference Include="Core.Blueprint.KeyVault" Version="0.3.0-alpha0037" /> | ||||||
|  |     <PackageReference Include="Core.Blueprint.Storage" Version="0.3.0-alpha0049" /> | ||||||
|  |     <PackageReference Include="Lib.Architecture.BuildingBlocks" Version="0.9.0-alpha0008" /> | ||||||
|  |     <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" /> | ||||||
|  |     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" /> | ||||||
|  |     <PackageReference Include="Refit" Version="8.0.0" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Reference Include="LSA.Core.Adapters"> | ||||||
|  |       <HintPath>..\..\Dependencies\LSA.Core.Adapters.dll</HintPath> | ||||||
|  |     </Reference> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,24 @@ | |||||||
|  | using Core.Blueprint.External; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.External.GatewayConfigurations | ||||||
|  | { | ||||||
|  |     public record GatewayConfiguration | ||||||
|  |     { | ||||||
|  |         public GatewayConfiguration() | ||||||
|  |         { | ||||||
|  |             BlueprintServiceAPI = new BlueprintServiceApi(); | ||||||
|  |         } | ||||||
|  |         public BlueprintServiceApi BlueprintServiceAPI { get; set; } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public record BlueprintServiceApi | ||||||
|  |     { | ||||||
|  |         public string Channel { get; set; } | ||||||
|  |         public BaseEndpoint Endpoint { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,43 @@ | |||||||
|  | using Core.Blueprint.External; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.External.GatewayConfigurations | ||||||
|  | { | ||||||
|  |     public class GatewaySettingsConfiguration | ||||||
|  |     { | ||||||
|  |         private readonly IConfiguration _configuration; | ||||||
|  |         public GatewaySettingsConfiguration(IConfiguration configuration) | ||||||
|  |         { | ||||||
|  |             _configuration = configuration; | ||||||
|  |             this.SetBlueprintServiceApiEndpoint(); | ||||||
|  |         } | ||||||
|  |         private static GatewayConfiguration GatewayConfiguration { get; set; } = new GatewayConfiguration(); | ||||||
|  |  | ||||||
|  |         public static BlueprintServiceApi GetBlueprintApiEndpoint => GatewayConfiguration.BlueprintServiceAPI; | ||||||
|  |  | ||||||
|  |         private GatewayConfiguration SetBlueprintServiceApiEndpoint() | ||||||
|  |         { | ||||||
|  |             IConfigurationSection source; | ||||||
|  |             var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; | ||||||
|  |  | ||||||
|  |             if (environment == "Local") | ||||||
|  |                 source = _configuration.GetSection("LocalGateways"); | ||||||
|  |             else | ||||||
|  |                 source = _configuration.GetSection("Gateways"); | ||||||
|  |  | ||||||
|  |             var endpoint = source["BlueprintDAL"]; | ||||||
|  |             GatewayConfiguration.BlueprintServiceAPI = new BlueprintServiceApi | ||||||
|  |             { | ||||||
|  |                 Endpoint = new BaseEndpoint() | ||||||
|  |                 { | ||||||
|  |                     Uri = new Uri(endpoint), | ||||||
|  |                     Url = endpoint, | ||||||
|  |                     Token = string.Empty, | ||||||
|  |                     APIName = "Blueprint API" | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  |  | ||||||
|  |             return GatewayConfiguration; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,32 @@ | |||||||
|  | // *********************************************************************** | ||||||
|  | // <copyright file="AuthenticatedHttpClientHandler.cs"> | ||||||
|  | //     Heath | ||||||
|  | // </copyright> | ||||||
|  | // *********************************************************************** | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.External.Helpers.Token | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Class to inject the token in all requests. | ||||||
|  |     /// </summary> | ||||||
|  |     public class AuthenticatedHttpClientHandler : DelegatingHandler | ||||||
|  |     { | ||||||
|  |         private readonly ITokenProvider _tokenProvider; | ||||||
|  |  | ||||||
|  |         public AuthenticatedHttpClientHandler(ITokenProvider tokenProvider) | ||||||
|  |         { | ||||||
|  |             _tokenProvider = tokenProvider; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             var token = _tokenProvider.GetToken(); | ||||||
|  |             if (!string.IsNullOrEmpty(token)) | ||||||
|  |             { | ||||||
|  |                 request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return await base.SendAsync(request, cancellationToken); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,31 @@ | |||||||
|  | // *********************************************************************** | ||||||
|  | // <copyright file="HttpContextTokenProvider.cs"> | ||||||
|  | //     Heath | ||||||
|  | // </copyright> | ||||||
|  | // *********************************************************************** | ||||||
|  |  | ||||||
|  | using Microsoft.AspNetCore.Http; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.External.Helpers.Token | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Class to return the access token to controllers. | ||||||
|  |     /// </summary> | ||||||
|  |     public class HttpContextTokenProvider : ITokenProvider | ||||||
|  |     { | ||||||
|  |         private readonly IHttpContextAccessor _httpContextAccessor; | ||||||
|  |  | ||||||
|  |         public HttpContextTokenProvider(IHttpContextAccessor httpContextAccessor) | ||||||
|  |         { | ||||||
|  |             _httpContextAccessor = httpContextAccessor; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Get token from headers. | ||||||
|  |         /// </summary> | ||||||
|  |         public string GetToken() | ||||||
|  |         { | ||||||
|  |             return _httpContextAccessor.HttpContext?.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,19 @@ | |||||||
|  | // *********************************************************************** | ||||||
|  | // <copyright file="ITokenProvider.cs"> | ||||||
|  | //     Heath | ||||||
|  | // </copyright> | ||||||
|  | // *********************************************************************** | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.External.Helpers.Token | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Interface for token provider. | ||||||
|  |     /// </summary> | ||||||
|  |     public interface ITokenProvider | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Get token from headers. | ||||||
|  |         /// </summary> | ||||||
|  |         string GetToken(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,25 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net8.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |  | ||||||
|  |     <IsPackable>false</IsPackable> | ||||||
|  |     <IsTestProject>true</IsTestProject> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" /> | ||||||
|  |     <PackageReference Include="xunit" Version="2.9.3" /> | ||||||
|  |     <PackageReference Include="xunit.runner.visualstudio" Version="3.0.1"> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |     </PackageReference> | ||||||
|  |     <PackageReference Include="coverlet.collector" Version="6.0.3"> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |     </PackageReference> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
							
								
								
									
										1
									
								
								Core.Blueprint.Service.Testing/GlobalUsings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Core.Blueprint.Service.Testing/GlobalUsings.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | global using Xunit; | ||||||
							
								
								
									
										11
									
								
								Core.Blueprint.Service.Testing/UnitTest1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Core.Blueprint.Service.Testing/UnitTest1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | namespace Core.Blueprint.Service.Testing | ||||||
|  | { | ||||||
|  |     public class UnitTest1 | ||||||
|  |     { | ||||||
|  |         [Fact] | ||||||
|  |         public void Test1() | ||||||
|  |         { | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,90 @@ | |||||||
|  | using Core.Blueprint.Service.External.Clients; | ||||||
|  | using Core.Blueprint.Service.External.Clients.BluePrintService; | ||||||
|  | using Refit; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.BluePrint | ||||||
|  | { | ||||||
|  |     public interface IBlueprintService | ||||||
|  |     { | ||||||
|  |         Task<IEnumerable<MongoBlueprintCollection>> GetBlueprintsAsync(); | ||||||
|  |         Task<MongoBlueprintCollection> GetBlueprintAsync(string id); | ||||||
|  |         Task<MongoBlueprintCollection> CreateBlueprintAsync(MongoBlueprintCollection blueprint); | ||||||
|  |         Task UpdateBlueprintAsync(string id, MongoBlueprintCollection blueprint); | ||||||
|  |         Task DeleteBlueprintAsync(string id); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |     public class BlueprintService: IBlueprintService | ||||||
|  |     { | ||||||
|  |         private readonly IBluePrintServiceClient _blueprintApi; | ||||||
|  |  | ||||||
|  |         public BlueprintService(IBluePrintServiceClient client) | ||||||
|  |         { | ||||||
|  |             _blueprintApi = client; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task<IEnumerable<MongoBlueprintCollection>> GetBlueprintsAsync() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 return await _blueprintApi.GetBlueprintsAsync(); | ||||||
|  |             } | ||||||
|  |             catch (ApiException ex) | ||||||
|  |             { | ||||||
|  |                 Console.WriteLine($"Error fetching blueprints: {ex.Message}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task<MongoBlueprintCollection> GetBlueprintAsync(string id) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 return await _blueprintApi.GetBlueprintAsync(id); | ||||||
|  |             } | ||||||
|  |             catch (ApiException ex) | ||||||
|  |             { | ||||||
|  |                 Console.WriteLine($"Error fetching blueprint with ID {id}: {ex.Message}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task<MongoBlueprintCollection> CreateBlueprintAsync(MongoBlueprintCollection blueprint) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 return await _blueprintApi.CreateBlueprintAsync(blueprint); | ||||||
|  |             } | ||||||
|  |             catch (ApiException ex) | ||||||
|  |             { | ||||||
|  |                 Console.WriteLine($"Error creating blueprint: {ex.Message}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task UpdateBlueprintAsync(string id, MongoBlueprintCollection blueprint) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 await _blueprintApi.UpdateBlueprintAsync(id, blueprint); | ||||||
|  |             } | ||||||
|  |             catch (ApiException ex) | ||||||
|  |             { | ||||||
|  |                 Console.WriteLine($"Error updating blueprint with ID {id}: {ex.Message}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task DeleteBlueprintAsync(string id) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 await _blueprintApi.DeleteBlueprintAsync(id); | ||||||
|  |             } | ||||||
|  |             catch (ApiException ex) | ||||||
|  |             { | ||||||
|  |                 Console.WriteLine($"Error deleting blueprint with ID {id}: {ex.Message}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,74 @@ | |||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Adapter; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Ports; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Validator; | ||||||
|  | using Core.Blueprint.Service.UseCases.DeleteSampleItem; | ||||||
|  | using Core.Blueprint.Service.UseCases.DeleteSampleItem.Adapter; | ||||||
|  | using Core.Blueprint.Service.UseCases.DeleteSampleItem.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.DeleteSampleItem.Ports; | ||||||
|  | using Core.Blueprint.Service.UseCases.DeleteSampleItem.Validator; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetOneSampleItem; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetOneSampleItem.Adapter; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetOneSampleItem.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetOneSampleItem.Ports; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetOneSampleItem.Validator; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleImage; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleImage.Adapter; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleImage.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleImage.Ports; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleImage.Validator; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleItems; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleItems.Adapter; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleItems.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleItems.Ports; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetSampleItems.Validator; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetUploadImageUrl; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetUploadImageUrl.Adapter; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetUploadImageUrl.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetUploadImageUrl.Ports; | ||||||
|  | using Core.Blueprint.Service.UseCases.GetUploadImageUrl.Validator; | ||||||
|  | using Core.Blueprint.Service.UseCases.UpdateSampleItem; | ||||||
|  | using Core.Blueprint.Service.UseCases.UpdateSampleItem.Adapter; | ||||||
|  | using Core.Blueprint.Service.UseCases.UpdateSampleItem.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.UpdateSampleItem.Ports; | ||||||
|  | using Core.Blueprint.Service.UseCases.UpdateSampleItem.Validator; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.Extensions.DependencyInjection; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.Configuration | ||||||
|  | { | ||||||
|  |     public static class UseCasesConfiguration | ||||||
|  |     { | ||||||
|  |         public static IServiceCollection AddUseCasesLayer(this IServiceCollection services) | ||||||
|  |         { | ||||||
|  |             services | ||||||
|  |                 .AddScoped<IGetSampleItemsPort, GetSampleItemsPort>() | ||||||
|  |                 .AddScoped<IGetOneSampleItemPort, GetOneSampleItemPort>() | ||||||
|  |                 .AddScoped<ICreateSampleItemPort, CreateSampleItemPort>() | ||||||
|  |                 .AddScoped<IUpdateSampleItemPort, UpdateSampleItemPort>() | ||||||
|  |                 .AddScoped<IDeleteSampleItemPort, DeleteSampleItemPort>() | ||||||
|  |                 .AddScoped<IGetSampleImagePort, GetSampleImagePort>() | ||||||
|  |                 .AddScoped<IGetUploadUrlPort, GetUploadUrlPort>() | ||||||
|  |  | ||||||
|  |                 .AddScoped<IValidator<GetSampleItemsRequest>, GetSampleItemValidator>() | ||||||
|  |                 .AddScoped<IValidator<GetOneSampleItemRequest>, GetOneSampleItemValidator>() | ||||||
|  |                 .AddScoped<IValidator<CreateSampleItemRequest>, CreateSampleItemValidator>() | ||||||
|  |                 .AddScoped<IValidator<UpdateSampleItemRequest>, UpdateSampleItemValidator>() | ||||||
|  |                 .AddScoped<IValidator<DeleteSampleItemRequest>, DeleteSampleItemValidator>() | ||||||
|  |                 .AddScoped<IValidator<GetSampleImageRequest>, GetSampleImageValidator>() | ||||||
|  |                 .AddScoped<IValidator<GetUploadUrlRequest>, GetUploadUrlValidator>() | ||||||
|  |  | ||||||
|  |                 .AddScoped<IComponentHandler<GetSampleItemsRequest>, GetSampleItemsHandler>() | ||||||
|  |                 .AddScoped<IComponentHandler<GetOneSampleItemRequest>, GetOneSampleItemHandler>() | ||||||
|  |                 .AddScoped<IComponentHandler<CreateSampleItemRequest>, CreateSampleItemHandler>() | ||||||
|  |                 .AddScoped<IComponentHandler<UpdateSampleItemRequest>, UpdateSampleItemHandler>() | ||||||
|  |                 .AddScoped<IComponentHandler<DeleteSampleItemRequest>, DeleteSampleItemHandler>() | ||||||
|  |                 .AddScoped<IComponentHandler<GetSampleImageRequest>, GetSampleImageHandler>() | ||||||
|  |                 .AddScoped<IComponentHandler<GetUploadUrlRequest>, GetUploadUrlHandler>(); | ||||||
|  |  | ||||||
|  |             return services; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,18 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net8.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="Lib.Architecture.BuildingBlocks" Version="0.9.0-alpha0001" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\Core.Blueprint.Service.Domain\Core.Blueprint.Service.Domain.csproj" /> | ||||||
|  |     <ProjectReference Include="..\Core.Blueprint.Service.External\Core.Blueprint.Service.External.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | using Core.Blueprint.Service.Domain.Entities; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleImage.Ports; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleImage.Adapter | ||||||
|  | { | ||||||
|  |     public class CreateSampleImagePort : BasePresenter, ICreateSampleImagePort | ||||||
|  |     { | ||||||
|  |         public void Success(SqlSampleItemEntity output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | using Core.Blueprint.Service.Domain.Entities; | ||||||
|  | using Core.Blueprint.Service.External.Clients.SampleItemClient; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Ports; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleImage | ||||||
|  | { | ||||||
|  |     public class CreateSampleItemHandler(ICreateSampleItemPort port, IValidator<CreateSampleItemRequest> validator, ISampleItemClientService clientService) : IComponentHandler<CreateSampleItemRequest> | ||||||
|  |     { | ||||||
|  |         private readonly ICreateSampleItemPort _port = port; | ||||||
|  |         private readonly IValidator<CreateSampleItemRequest> _validator = validator; | ||||||
|  |         private readonly ISampleItemClientService _clientService = clientService; | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(CreateSampleItemRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 if (!command.IsValid(_validator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var result = await _clientService.CreateSampleItemAsync( | ||||||
|  |                     new SqlSampleItemEntity { TestName = command.TestName, NumValue = command.NumValue }); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch(Exception ex) | ||||||
|  |             { | ||||||
|  |                 _port.BusinessError(ex.Message); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleImage.Input | ||||||
|  | { | ||||||
|  |     public class CreateSampleImageRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public Guid? Id; | ||||||
|  |         public byte[] NumValue { get; set; } = []; | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | using Core.Blueprint.Service.Domain.Entities; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleImage.Ports | ||||||
|  | { | ||||||
|  |     public interface ICreateSampleImagePort : IBasePort, ICommandSuccessPort<SqlSampleItemEntity>, INoContentPort, IBusinessErrorPort, ITimeoutPort, IValidationErrorPort | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Input; | ||||||
|  | using FluentValidation; | ||||||
|  | using System.Diagnostics.CodeAnalysis; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleImage.Validator | ||||||
|  | { | ||||||
|  |     [ExcludeFromCodeCoverage] | ||||||
|  |     public class CreateSampleImageValidator : AbstractValidator<CreateSampleItemRequest> | ||||||
|  |     { | ||||||
|  |         public CreateSampleImageValidator() | ||||||
|  |         { | ||||||
|  |              | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | using Core.Blueprint.Service.Domain.Entities; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Ports; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleItem.Adapter | ||||||
|  | { | ||||||
|  |     public class CreateSampleItemPort : BasePresenter, ICreateSampleItemPort | ||||||
|  |     { | ||||||
|  |         public void Success(SqlSampleItemEntity output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | using Core.Blueprint.Service.Domain.Entities; | ||||||
|  | using Core.Blueprint.Service.External.Clients.SampleItemClient; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Ports; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleItem | ||||||
|  | { | ||||||
|  |     public class CreateSampleItemHandler(ICreateSampleItemPort port, IValidator<CreateSampleItemRequest> validator, ISampleItemClientService clientService) : IComponentHandler<CreateSampleItemRequest> | ||||||
|  |     { | ||||||
|  |         private readonly ICreateSampleItemPort _port = port; | ||||||
|  |         private readonly IValidator<CreateSampleItemRequest> _validator = validator; | ||||||
|  |         private readonly ISampleItemClientService _clientService = clientService; | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(CreateSampleItemRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 if (!command.IsValid(_validator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var result = await _clientService.CreateSampleItemAsync( | ||||||
|  |                     new SqlSampleItemEntity { TestName = command.TestName, NumValue = command.NumValue }); | ||||||
|  |  | ||||||
|  |                 if (result == null) | ||||||
|  |                 { | ||||||
|  |                     _port.NoContentSuccess(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _port.Success(result); | ||||||
|  |             } | ||||||
|  |             catch(Exception ex) | ||||||
|  |             { | ||||||
|  |                 _port.BusinessError(ex.Message); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleItem.Input | ||||||
|  | { | ||||||
|  |     public class CreateSampleItemRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string TestName { get; set; } = string.Empty; | ||||||
|  |         public int NumValue { get; set; } = 0; | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | using Core.Blueprint.Service.Domain.Entities; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleItem.Ports | ||||||
|  | { | ||||||
|  |     public interface ICreateSampleItemPort : IBasePort, ICommandSuccessPort<SqlSampleItemEntity>, INoContentPort, IBusinessErrorPort, ITimeoutPort, IValidationErrorPort | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | using Core.Blueprint.Service.UseCases.CreateSampleItem.Input; | ||||||
|  | using FluentValidation; | ||||||
|  | using System.Diagnostics.CodeAnalysis; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.CreateSampleItem.Validator | ||||||
|  | { | ||||||
|  |     [ExcludeFromCodeCoverage] | ||||||
|  |     public class CreateSampleItemValidator : AbstractValidator<CreateSampleItemRequest> | ||||||
|  |     { | ||||||
|  |         public CreateSampleItemValidator() | ||||||
|  |         { | ||||||
|  |             RuleFor(i => i.TestName).NotNull().NotEmpty().WithMessage("Is required."); | ||||||
|  |             RuleFor(i => i.NumValue).GreaterThanOrEqualTo(1).LessThanOrEqualTo(100).WithMessage("Should be between 1-100."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | using Core.Blueprint.Service.Domain.Entities; | ||||||
|  | using Core.Blueprint.Service.UseCases.DeleteSampleItem.Ports; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.DeleteSampleItem.Adapter | ||||||
|  | { | ||||||
|  |     public class DeleteSampleItemPort : BasePresenter, IDeleteSampleItemPort | ||||||
|  |     { | ||||||
|  |         public void Success(SqlSampleItemEntity output) | ||||||
|  |         { | ||||||
|  |             ViewModel = new OkObjectResult(output); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,42 @@ | |||||||
|  | using Core.Blueprint.Service.External.Clients.SampleItemClient; | ||||||
|  | using Core.Blueprint.Service.UseCases.DeleteSampleItem.Input; | ||||||
|  | using Core.Blueprint.Service.UseCases.DeleteSampleItem.Ports; | ||||||
|  | using FluentValidation; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.DeleteSampleItem | ||||||
|  | { | ||||||
|  |     public class DeleteSampleItemHandler(IDeleteSampleItemPort port, IValidator<DeleteSampleItemRequest> validator, ISampleItemClientService clientService) : IComponentHandler<DeleteSampleItemRequest> | ||||||
|  |     { | ||||||
|  |         private readonly IDeleteSampleItemPort _port = port; | ||||||
|  |         private readonly IValidator<DeleteSampleItemRequest> _validator = validator; | ||||||
|  |         private readonly ISampleItemClientService _clientService = clientService; | ||||||
|  |  | ||||||
|  |         public async ValueTask ExecuteAsync(DeleteSampleItemRequest command, CancellationToken cancellationToken = default) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 if (!command.IsValid(_validator)) | ||||||
|  |                 { | ||||||
|  |                     _port.ValidationErrors(command.Notifications); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 var entity = await _clientService.GetSampleItemAsync(command.Id); | ||||||
|  |                 if (entity == null) | ||||||
|  |                 { | ||||||
|  |                     _port.BusinessError("Not Found"); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 entity.StatusCode = 'D'; | ||||||
|  |                 await _clientService.UpdateSampleItemAsync(command.Id, entity); | ||||||
|  |  | ||||||
|  |                 _port.NoContentSuccess(); | ||||||
|  |             } | ||||||
|  |             catch(Exception ex) | ||||||
|  |             { | ||||||
|  |                 _port.BusinessError(ex.Message); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Service.UseCases.DeleteSampleItem.Input | ||||||
|  | { | ||||||
|  |     public class DeleteSampleItemRequest : Notificator, ICommand | ||||||
|  |     { | ||||||
|  |         public string Id { get; set; } = string.Empty; | ||||||
|  |         public bool Validate() | ||||||
|  |         { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Sergio Matias Urquin
					Sergio Matias Urquin