Add project files.
This commit is contained in:
parent
c4ec91852f
commit
b2635193dc
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
Loading…
Reference in New Issue
Block a user