Add project files.
This commit is contained in:
parent
116793710f
commit
6358f5f199
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/**
|
||||
61
Core.Blueprint.DAL.API/Controllers/BlobStorageController.cs
Normal file
61
Core.Blueprint.DAL.API/Controllers/BlobStorageController.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using Asp.Versioning;
|
||||
using Core.Blueprint.DAL.Storage.Contracts;
|
||||
using Core.Blueprint.Storage;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Core.Blueprint.DAL.API.Controllers
|
||||
{
|
||||
[ApiVersion("1.0")]
|
||||
[Route("api/v{api-version:apiVersion}/[controller]")]
|
||||
[Produces("application/json")]
|
||||
[ApiController]
|
||||
[AllowAnonymous]
|
||||
public class BlobStorageController(IBlobStorageService storageService) : ControllerBase
|
||||
{
|
||||
[HttpPost("UploadBlobFromFileBrowser")]
|
||||
[Consumes("multipart/form-data")]
|
||||
public async Task<IActionResult> UploadBlobAsync([FromQuery] string blobName, IFormFile file)
|
||||
{
|
||||
if (file == null || file.Length == 0)
|
||||
return BadRequest("No file uploaded.");
|
||||
|
||||
using var stream = file.OpenReadStream();
|
||||
|
||||
var result = await storageService.UploadBlobAsync(blobName, stream);
|
||||
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpPost("UploadBlob")]
|
||||
public async Task<IActionResult> UploadBlobAsync([FromBody] BlobAddDto newBlob)
|
||||
{
|
||||
var result = await storageService.UploadBlobAsync(newBlob);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpGet("GetBlobList")]
|
||||
public async Task<IActionResult> GetBlobsListAsync([FromQuery] string? prefix)
|
||||
{
|
||||
var result = await storageService.GetBlobsListAsync(prefix).ConfigureAwait(false);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpGet("DownloadBlob")]
|
||||
public IActionResult DownloadBlobAsync([FromQuery] string blobName)
|
||||
{
|
||||
var result = storageService.DownloadBlobAsync(blobName);
|
||||
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpDelete("DeleteBlob")]
|
||||
public async Task<IActionResult> DeleteFileAsync([FromQuery] string blobName)
|
||||
{
|
||||
var result = await storageService.DeleteBlobAsync(blobName).ConfigureAwait(false);
|
||||
|
||||
if (result is null) return NotFound($"Blob {blobName} doesn't exist");
|
||||
return Ok(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
44
Core.Blueprint.DAL.API/Controllers/KeyVaultController.cs
Normal file
44
Core.Blueprint.DAL.API/Controllers/KeyVaultController.cs
Normal file
@ -0,0 +1,44 @@
|
||||
using Asp.Versioning;
|
||||
using Core.Blueprint.DAL.KeyVault.Contracts;
|
||||
using Core.Blueprint.KeyVault;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Core.Blueprint.DAL.API.Controllers
|
||||
{
|
||||
[ApiVersion("1.0")]
|
||||
[Route("api/v{api-version:apiVersion}/[controller]")]
|
||||
[Produces("application/json")]
|
||||
[ApiController]
|
||||
[AllowAnonymous]
|
||||
public class KeyVaultController(IKeyVaultService service) : ControllerBase
|
||||
{
|
||||
[HttpPost("CreateSecret")]
|
||||
public async Task<IActionResult> CreateSecret([FromBody] KeyVaultRequest newSecret, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await service.CreateSecretAsync(newSecret, cancellationToken);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpGet("{secretName}/GetSecret")]
|
||||
public async Task<IActionResult> GetSecret([FromRoute] string secretName, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await service.GetSecretAsync(secretName, cancellationToken);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpPut("UpdateSecret")]
|
||||
public async Task<IActionResult> UpdateSecret([FromBody] KeyVaultRequest newSecret, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await service.UpdateSecretAsync(newSecret, cancellationToken);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpDelete("{secretName}/DeleteSecret")]
|
||||
public async Task<IActionResult> DeleteSecret([FromRoute] string secretName, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await service.DeleteSecretAsync(secretName, cancellationToken);
|
||||
return Ok(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,67 @@
|
||||
using Asp.Versioning;
|
||||
using Core.Blueprint.DAL.Mongo.Contracts;
|
||||
using Core.Blueprint.DAL.Mongo.Entities.Collections;
|
||||
using Core.Blueprint.DAL.Mongo.Entities.Requests;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Core.Blueprint.DAL.API.Controllers
|
||||
{
|
||||
[ApiVersion("1.0")]
|
||||
[Route("api/v{api-version:apiVersion}/[controller]")]
|
||||
[Produces("application/json")]
|
||||
[ApiController]
|
||||
[AllowAnonymous]
|
||||
public class MongoBlueprintController(IBlueprintService service) : ControllerBase
|
||||
{
|
||||
[HttpPost("Create")]
|
||||
public async Task<IActionResult> CreateBlueprint([FromBody] BlueprintRequest entity, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await service.CreateBlueprint(entity, cancellationToken).ConfigureAwait(false);
|
||||
return Created("CreatedWithIdAsync", result);
|
||||
}
|
||||
|
||||
[HttpGet("GetAll")]
|
||||
public async Task<IActionResult> GetEntities(CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await service.GetAllBlueprints(cancellationToken).ConfigureAwait(false);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpGet("{_id}/GetBy_Id")]
|
||||
public async Task<IActionResult> GetBlueprint([FromRoute] string _id, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await service.GetBlueprintById(_id, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
return NotFound("Entity not found");
|
||||
}
|
||||
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpPut("{_id}/Update")]
|
||||
public async Task<IActionResult> UpdateBlueprint([FromRoute] string _id, [FromBody] BlueprintCollection entity, CancellationToken cancellationToken)
|
||||
{
|
||||
if (_id != entity._Id?.ToString())
|
||||
{
|
||||
return BadRequest("Blueprint ID mismatch");
|
||||
}
|
||||
|
||||
var result = await service.UpdateBlueprint(_id, entity, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpDelete("{_id}/Delete")]
|
||||
public async Task<IActionResult> DeleteBlueprint([FromRoute] string _id, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await service.DeleteBlueprint(_id, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
if (result is null) return NotFound();
|
||||
|
||||
return Ok(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
63
Core.Blueprint.DAL.API/Controllers/UserProjectController.cs
Normal file
63
Core.Blueprint.DAL.API/Controllers/UserProjectController.cs
Normal file
@ -0,0 +1,63 @@
|
||||
using Asp.Versioning;
|
||||
using Core.Blueprint.DAL.SQLServer.Contracts;
|
||||
using Core.Blueprint.DAL.SQLServer.Entities;
|
||||
using Core.Blueprint.DAL.SQLServer.Entities.Request;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Core.Blueprint.DAL.API.Controllers
|
||||
{
|
||||
[ApiVersion("1.0")]
|
||||
[Route("api/v{api-version:apiVersion}/[controller]")]
|
||||
[Produces("application/json")]
|
||||
[ApiController]
|
||||
[AllowAnonymous]
|
||||
public class UserProjectController(IUserProjectService service) : ControllerBase
|
||||
{
|
||||
[HttpPost("Create")]
|
||||
public async Task<ActionResult<UserProject>> CreateEntity([FromBody] UserProjectRequest request)
|
||||
{
|
||||
var result = await service.AddUserProject(request).ConfigureAwait(false);
|
||||
return Created("CreatedWithIdAsync", result);
|
||||
}
|
||||
|
||||
[HttpGet("GetAll")]
|
||||
public async Task<ActionResult<IEnumerable<UserProject>>> GetEntities()
|
||||
{
|
||||
var result = await service.GetAllUserProjects().ConfigureAwait(false);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpGet("{id}/GetById")]
|
||||
public async Task<ActionResult<UserProject>> GetEntity(int id)
|
||||
{
|
||||
var result = await service.GetUserProjectById(id).ConfigureAwait(false);
|
||||
|
||||
if (result is null) return NotFound("User Project not found");
|
||||
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpPut("{id}/Update")]
|
||||
public async Task<ActionResult<UserProject>> UpdateEntity(int id, UserProject entity)
|
||||
{
|
||||
if (id != entity.Id)
|
||||
{
|
||||
return BadRequest("ID mismatch");
|
||||
}
|
||||
|
||||
var result = await service.UpdateUserProject(entity).ConfigureAwait(false);
|
||||
return Ok(entity);
|
||||
}
|
||||
|
||||
[HttpDelete("{id}/Delete")]
|
||||
public async Task<IActionResult> DeleteEntity(int id)
|
||||
{
|
||||
var result = await service.DeleteUserProject(id).ConfigureAwait(false);
|
||||
|
||||
if (result is null) return NotFound();
|
||||
|
||||
return Ok(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Core.Blueprint.DAL.API/Core.Blueprint.DAL.API.csproj
Normal file
31
Core.Blueprint.DAL.API/Core.Blueprint.DAL.API.csproj
Normal file
@ -0,0 +1,31 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<UserSecretsId>b441578c-ea54-49f9-ba82-09c2b23bd830</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.10" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
|
||||
<PackageReference Include="Serilog" Version="4.2.0" />
|
||||
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Core.Blueprint.DAL.KeyVault\Core.Blueprint.DAL.KeyVault.csproj" />
|
||||
<ProjectReference Include="..\Core.Blueprint.DAL.Logs\Core.Blueprint.DAL.Logs.csproj" />
|
||||
<ProjectReference Include="..\Core.Blueprint.DAL.Mongo\Core.Blueprint.DAL.Mongo.csproj" />
|
||||
<ProjectReference Include="..\Core.Blueprint.DAL.Redis\Core.Blueprint.DAL.Redis.csproj" />
|
||||
<ProjectReference Include="..\Core.Blueprint.DAL.SQLServer\Core.Blueprint.DAL.SQLServer.csproj" />
|
||||
<ProjectReference Include="..\Core.Blueprint.DAL.Storage\Core.Blueprint.DAL.Storage.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
6
Core.Blueprint.DAL.API/Core.Blueprint.DAL.API.http
Normal file
6
Core.Blueprint.DAL.API/Core.Blueprint.DAL.API.http
Normal file
@ -0,0 +1,6 @@
|
||||
@Core.Blueprint.DAL.API_HostAddress = http://localhost:5013
|
||||
|
||||
GET {{Core.Blueprint.DAL.API_HostAddress}}/weatherforecast/
|
||||
Accept: application/json
|
||||
|
||||
###
|
||||
25
Core.Blueprint.DAL.API/Dockerfile
Normal file
25
Core.Blueprint.DAL.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.DAL.API/Core.Blueprint.DAL.API.csproj", "Core.Blueprint.DAL.API/"]
|
||||
RUN dotnet restore "./Core.Blueprint.DAL.API/./Core.Blueprint.DAL.API.csproj"
|
||||
COPY . .
|
||||
WORKDIR "/src/Core.Blueprint.DAL.API"
|
||||
RUN dotnet build "./Core.Blueprint.DAL.API.csproj" -c $BUILD_CONFIGURATION -o /app/build
|
||||
|
||||
FROM build AS publish
|
||||
ARG BUILD_CONFIGURATION=Release
|
||||
RUN dotnet publish "./Core.Blueprint.DAL.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.DAL.API.dll"]
|
||||
36
Core.Blueprint.DAL.API/Extensions/ConfigurationExtension.cs
Normal file
36
Core.Blueprint.DAL.API/Extensions/ConfigurationExtension.cs
Normal file
@ -0,0 +1,36 @@
|
||||
using Core.Blueprint.DAL.KeyVault.Contracts;
|
||||
using Core.Blueprint.DAL.KeyVault.Services;
|
||||
using Core.Blueprint.DAL.Mongo.Contracts;
|
||||
using Core.Blueprint.DAL.Mongo.Entities.Collections;
|
||||
using Core.Blueprint.DAL.Mongo.Service;
|
||||
using Core.Blueprint.DAL.SQLServer.Context;
|
||||
using Core.Blueprint.DAL.SQLServer.Contracts;
|
||||
using Core.Blueprint.DAL.Storage.Contracts;
|
||||
using Core.Blueprint.DAL.Storage.Service;
|
||||
using Core.Blueprint.Mongo;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace Core.Blueprint.DAL.API.Extensions
|
||||
{
|
||||
public static class ConfigurationExtension
|
||||
{
|
||||
public static IServiceCollection AddDALLayerServices(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
//Mongo
|
||||
services.AddScoped<IBlueprintService, BlueprintService>();
|
||||
services.AddScoped<CollectionRepository<BlueprintCollection>>();
|
||||
|
||||
//SQL
|
||||
services.AddDbContext<SqlServerContext>(options => options.UseSqlServer(configuration.GetConnectionString("SQLServer")));
|
||||
services.AddScoped<IUserProjectService, UserProjectService>();
|
||||
|
||||
//Storage
|
||||
services.AddScoped<IBlobStorageService, BlobStorageService>();
|
||||
|
||||
//KeyVault
|
||||
services.AddScoped<IKeyVaultService, KeyVaultService>();
|
||||
|
||||
return services;
|
||||
}
|
||||
}
|
||||
}
|
||||
71
Core.Blueprint.DAL.API/Extensions/SwaggerExtensions.cs
Normal file
71
Core.Blueprint.DAL.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.DAL.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("+", "."));
|
||||
}
|
||||
}
|
||||
}
|
||||
103
Core.Blueprint.DAL.API/Program.cs
Normal file
103
Core.Blueprint.DAL.API/Program.cs
Normal file
@ -0,0 +1,103 @@
|
||||
using Azure.Identity;
|
||||
using Core.Blueprint.DAL.API.Extensions;
|
||||
using Core.Blueprint.DAL.Mongo.Configuration;
|
||||
using Core.Blueprint.KeyVault.Configuration;
|
||||
using Core.Blueprint.Logging.Configuration;
|
||||
using Core.Blueprint.Redis.Configuration;
|
||||
using Core.Blueprint.SQLServer.Configuration;
|
||||
using Core.Blueprint.Storage.Configuration;
|
||||
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_dal");
|
||||
|
||||
options.ConfigureKeyVault(keyVaultOptions =>
|
||||
{
|
||||
keyVaultOptions.SetCredential(new DefaultAzureCredential());
|
||||
});
|
||||
});
|
||||
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
builder.Configuration
|
||||
.AddUserSecrets(Assembly.GetExecutingAssembly())
|
||||
.AddEnvironmentVariables();
|
||||
|
||||
builder.Services.AddResponseCompression();
|
||||
builder.Services.AddProblemDetails();
|
||||
builder.Services.AddMemoryCache();
|
||||
builder.Services.AddLogs(builder);
|
||||
builder.Services.AddKeyVault(builder.Configuration);
|
||||
builder.Services.AddBlobStorage(builder.Configuration);
|
||||
builder.Services.AddRedis(builder.Configuration);
|
||||
builder.Services.AddMongoLayer(builder.Configuration);
|
||||
builder.Services.AddSQLServer(builder.Configuration);
|
||||
builder.Services.AddDALLayerServices(builder.Configuration);
|
||||
|
||||
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.DAL.API/Properties/launchSettings.json
Normal file
52
Core.Blueprint.DAL.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:5013"
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Local"
|
||||
},
|
||||
"dotnetRunMessages": true,
|
||||
"applicationUrl": "https://localhost:7075;http://localhost:5013"
|
||||
},
|
||||
"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:13526",
|
||||
"sslPort": 44366
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Core.Blueprint.DAL.API/appsettings.Development.json
Normal file
11
Core.Blueprint.DAL.API/appsettings.Development.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"CacheSettings": {
|
||||
"DefaultCacheDurationInMinutes": 3
|
||||
}
|
||||
}
|
||||
11
Core.Blueprint.DAL.API/appsettings.Local.json
Normal file
11
Core.Blueprint.DAL.API/appsettings.Local.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"CacheSettings": {
|
||||
"DefaultCacheDurationInMinutes": 3
|
||||
}
|
||||
}
|
||||
11
Core.Blueprint.DAL.API/appsettings.json
Normal file
11
Core.Blueprint.DAL.API/appsettings.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"Endpoints": {
|
||||
"AppConfigurationURI": "https://sandbox-hci-usc-appcg.azconfig.io"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Configuration\**" />
|
||||
<Compile Remove="Contracts\**" />
|
||||
<Compile Remove="Jobs\**" />
|
||||
<Compile Remove="Provider\**" />
|
||||
<EmbeddedResource Remove="Configuration\**" />
|
||||
<EmbeddedResource Remove="Contracts\**" />
|
||||
<EmbeddedResource Remove="Jobs\**" />
|
||||
<EmbeddedResource Remove="Provider\**" />
|
||||
<None Remove="Configuration\**" />
|
||||
<None Remove="Contracts\**" />
|
||||
<None Remove="Jobs\**" />
|
||||
<None Remove="Provider\**" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@ -0,0 +1,75 @@
|
||||
using Azure.Identity;
|
||||
using Core.Blueprint.DAL.Infrastructure.Context;
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.DAL.Infrastructure.Proxies;
|
||||
using Core.Blueprint.DAL.Infrastructure.Repository;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Azure;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Options;
|
||||
using System.Reflection;
|
||||
using Serilog;
|
||||
using Serilog.Events;
|
||||
using Serilog.Exceptions;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Configure
|
||||
{
|
||||
public static class DependencyInjection
|
||||
{
|
||||
public static IServiceCollection RegisterInfrastructure(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
var chainedCredentials = new ChainedTokenCredential(
|
||||
new ManagedIdentityCredential(),
|
||||
new SharedTokenCacheCredential(),
|
||||
new VisualStudioCredential(),
|
||||
new VisualStudioCodeCredential()
|
||||
);
|
||||
services.AddAzureClients(cfg =>
|
||||
{
|
||||
cfg.AddBlobServiceClient(configuration.GetRequiredSection("Azure:BlobStorage")).WithCredential(chainedCredentials);
|
||||
cfg.AddSecretClient(configuration.GetRequiredSection("Azure:KeyVault")).WithCredential(chainedCredentials);
|
||||
});
|
||||
|
||||
services.AddDbContext<SqlServerContext>(options => options.UseSqlServer(configuration.GetConnectionString("SQLServerConnString")));
|
||||
|
||||
// LogFactory
|
||||
services.ConfigureLogging();
|
||||
|
||||
//MongoDB
|
||||
services.Configure<MongoDbSettings>(configuration.GetRequiredSection("MongoDbSettings"));
|
||||
services.AddScoped<IMongoDbSettings>(serviceProvider =>
|
||||
serviceProvider.GetRequiredService<IOptions<MongoDbSettings>>().Value);
|
||||
services.AddScoped<IMongoContext, MongoContext>();
|
||||
services.AddScoped(serviceProvider =>
|
||||
{
|
||||
var mongoContext = serviceProvider.GetRequiredService<IMongoContext>();
|
||||
return mongoContext.Database;
|
||||
});
|
||||
|
||||
services.AddScoped<IProxyBlobStorage, ProxyBlobStorage>();
|
||||
services.AddScoped<ISampleImageRepository, SampleImageRepository>();
|
||||
services.AddScoped<ISampleItemRepository, SampleItemRepository>();
|
||||
services.AddScoped<IBlueprintRepository, BlueprintRepository>();
|
||||
services.AddScoped<ISecretRepository, SecretRepository>();
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
public static void ConfigureLogging(this IServiceCollection services)
|
||||
{
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.Enrich.FromLogContext()
|
||||
.Enrich.WithMachineName()
|
||||
.Enrich.WithProcessId()
|
||||
.Enrich.WithThreadId()
|
||||
.Enrich.WithProperty("Application", Assembly.GetExecutingAssembly().GetName().Name)
|
||||
.Enrich.WithExceptionDetails()
|
||||
.MinimumLevel.Is(LogEventLevel.Information)
|
||||
.WriteTo.Console()
|
||||
.CreateLogger();
|
||||
|
||||
services.AddSingleton(Log.Logger);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Configure
|
||||
{
|
||||
class LoggerExtension
|
||||
{
|
||||
}
|
||||
}
|
||||
135
Core.Blueprint.DAL.Infrastrcture/Context/MongoContext.cs
Normal file
135
Core.Blueprint.DAL.Infrastrcture/Context/MongoContext.cs
Normal file
@ -0,0 +1,135 @@
|
||||
using Azure.Core;
|
||||
using Azure.Identity;
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.Domain.Shared;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using MongoDB.Driver;
|
||||
using MongoDB.Driver.Authentication.Oidc;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Context
|
||||
{
|
||||
public interface IMongoDbSettings
|
||||
{
|
||||
string DatabaseName { get; set; }
|
||||
string ConnectionString { get; set; }
|
||||
}
|
||||
|
||||
public class MongoDbSettings : IMongoDbSettings
|
||||
{
|
||||
public string DatabaseName { get; set; }
|
||||
public string ConnectionString { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class HeathOidcCallback : IOidcCallback
|
||||
{
|
||||
private readonly string _audience;
|
||||
public HeathOidcCallback(string audience)
|
||||
{
|
||||
_audience = audience;
|
||||
}
|
||||
|
||||
public OidcAccessToken GetOidcAccessToken(OidcCallbackParameters parameters, CancellationToken cancellationToken)
|
||||
{
|
||||
TokenRequestContext tokenRequestContext =
|
||||
new TokenRequestContext(
|
||||
new[] { _audience }
|
||||
);
|
||||
|
||||
AccessToken token =
|
||||
new ChainedTokenCredential(
|
||||
new ManagedIdentityCredential(),
|
||||
new SharedTokenCacheCredential(),
|
||||
new VisualStudioCredential(),
|
||||
new VisualStudioCodeCredential()
|
||||
)
|
||||
.GetToken(
|
||||
tokenRequestContext
|
||||
);
|
||||
|
||||
return new(token.Token, expiresIn: null);
|
||||
}
|
||||
|
||||
public async Task<OidcAccessToken> GetOidcAccessTokenAsync(OidcCallbackParameters parameters, CancellationToken cancellationToken)
|
||||
{
|
||||
TokenRequestContext tokenRequestContext =
|
||||
new TokenRequestContext(
|
||||
new[] { _audience }
|
||||
);
|
||||
|
||||
AccessToken token =
|
||||
await new ChainedTokenCredential(
|
||||
new ManagedIdentityCredential(),
|
||||
new SharedTokenCacheCredential(),
|
||||
new VisualStudioCredential(),
|
||||
new VisualStudioCodeCredential()
|
||||
)
|
||||
.GetTokenAsync(
|
||||
tokenRequestContext, cancellationToken
|
||||
).ConfigureAwait(false);
|
||||
|
||||
return new(token.Token, expiresIn: null);
|
||||
}
|
||||
}
|
||||
public sealed class MongoContext : IMongoContext
|
||||
{
|
||||
private IMongoDatabase _database;
|
||||
public IMongoClient _client { get; private set; }
|
||||
public IMongoDatabase Database { get { return _database; } }
|
||||
public MongoUrl _mongoUrl { get; private set; }
|
||||
|
||||
//Constructors
|
||||
public MongoContext(IConfiguration configuration)
|
||||
{
|
||||
var mongoClientSettings = MongoClientSettings.FromConnectionString(configuration.GetConnectionString("MongoDBConnString"));
|
||||
mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new HeathOidcCallback(configuration.GetValue<string>("MongoDb:Audience")));
|
||||
_database = new MongoClient(mongoClientSettings).GetDatabase(configuration.GetValue<string>("MongoDb:DatabaseName")); //Mongo Database
|
||||
_client = Database.Client;
|
||||
}
|
||||
public MongoContext(string connectionString, string audience, string databaseName)
|
||||
{
|
||||
var mongoClientSettings = MongoClientSettings.FromConnectionString(connectionString);
|
||||
mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new HeathOidcCallback(audience));
|
||||
_client = new MongoClient(mongoClientSettings);
|
||||
_database = _client.GetDatabase(databaseName);
|
||||
}
|
||||
public MongoContext(MongoClient client, string databaseName)
|
||||
{
|
||||
_client = client;
|
||||
_database = client.GetDatabase(databaseName);
|
||||
}
|
||||
public void SetUpDatabase(string database)
|
||||
{
|
||||
_database = new MongoClient(_mongoUrl).GetDatabase(database);
|
||||
_client = Database.Client;
|
||||
}
|
||||
|
||||
|
||||
//Methods
|
||||
public void DropCollection<TDocument>(string? partitionKey = null) where TDocument : class
|
||||
{
|
||||
Database.DropCollection(GetCollectionName<TDocument>(partitionKey));
|
||||
}
|
||||
public IMongoCollection<T> GetCollection<T>(string collection)
|
||||
{
|
||||
return _database.GetCollection<T>(collection);
|
||||
}
|
||||
|
||||
private string GetCollectionName<TDocument>(string partitionKey)
|
||||
{
|
||||
var collectionName = GetAttributeCollectionName<TDocument>();
|
||||
if (string.IsNullOrEmpty(partitionKey))
|
||||
{
|
||||
return collectionName;
|
||||
}
|
||||
return $"{partitionKey}-{collectionName}";
|
||||
}
|
||||
private string? GetAttributeCollectionName<TDocument>()
|
||||
{
|
||||
return (typeof(TDocument).GetTypeInfo()
|
||||
.GetCustomAttributes(typeof(CollectionAttributeName))
|
||||
.FirstOrDefault() as CollectionAttributeName)?.Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
16
Core.Blueprint.DAL.Infrastrcture/Context/SqlServerContext.cs
Normal file
16
Core.Blueprint.DAL.Infrastrcture/Context/SqlServerContext.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Context
|
||||
{
|
||||
public sealed class SqlServerContext : DbContext
|
||||
{
|
||||
public SqlServerContext(DbContextOptions options) : base(options) { }
|
||||
public DbSet<SampleItem> BlueprintTests { get; set; }
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
base.OnModelCreating(modelBuilder);
|
||||
modelBuilder.Entity<SampleItem>().Property(p => p.Id).HasConversion(a => a, b => b);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Contracts
|
||||
{
|
||||
public interface IBlueprintRepository : IRepositoryIdentityBase<BlueprintCollection>
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
13
Core.Blueprint.DAL.Infrastrcture/Contracts/IMongoContext.cs
Normal file
13
Core.Blueprint.DAL.Infrastrcture/Contracts/IMongoContext.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using MongoDB.Driver;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Contracts
|
||||
{
|
||||
public interface IMongoContext
|
||||
{
|
||||
|
||||
IMongoClient _client { get; }
|
||||
IMongoDatabase Database { get; }
|
||||
void DropCollection<TDocument>(string partitionKey = null) where TDocument : class;
|
||||
void SetUpDatabase(string database);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
using Core.Blueprint.Domain.Dtos;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Contracts
|
||||
{
|
||||
public interface IProxyBlobStorage
|
||||
{
|
||||
IAsyncEnumerable<ImageUrlDto> ListAllItemsAsync();
|
||||
Task<ImageUrlDto> GetFirstImageUrlAsync();
|
||||
Task<ImageUrlDto> GetUploadUrl();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Contracts
|
||||
{
|
||||
public interface IRepositoryBase<T> where T : class
|
||||
{
|
||||
ValueTask<T> GetByIdAsync(string id);
|
||||
ValueTask<IQueryable<T>> GetAllAsync();
|
||||
ValueTask<T> CreateAsync(T blueprint);
|
||||
Task<bool> UpdateAsync(string id, T blueprint);
|
||||
Task<bool> DeleteAsync(string id);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Contracts
|
||||
{
|
||||
public interface IRepositoryIdentityBase<T> : IRepositoryBase<T> where T : AbsEntity
|
||||
{
|
||||
ValueTask<T> GetByIdAsync(Guid id) => GetByIdAsync(id.ToString());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
using Core.Blueprint.Domain.Dtos;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Contracts
|
||||
{
|
||||
public interface ISampleImageRepository
|
||||
{
|
||||
IAsyncEnumerable<ImageUrlDto> GetAllImagesUrls();
|
||||
Task<ImageUrlDto> GetFirstImageUrl();
|
||||
Task<ImageUrlDto> GetUploadUrl();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Contracts
|
||||
{
|
||||
public interface ISampleItemRepository : IRepositoryIdentityBase<SampleItem>
|
||||
{
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Contracts
|
||||
{
|
||||
public interface ISecretRepository
|
||||
{
|
||||
Task<Secret> GetSecret(string secretName, CancellationToken cancellationToken);
|
||||
Task SetSecret(string secretName, string secretValue, CancellationToken cancellationToken);
|
||||
Task RemoveSecret(string secretName, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Azure.Identity" Version="1.13.1" />
|
||||
<PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.7.0" />
|
||||
<PackageReference Include="Azure.Storage.Blobs" Version="12.23.0" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Azure" Version="1.8.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Identity.Client" Version="4.66.2" />
|
||||
<PackageReference Include="MongoDB.Driver" Version="3.0.0" />
|
||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.3" />
|
||||
<PackageReference Include="Serilog.Enrichers.Environment" Version="3.0.1" />
|
||||
<PackageReference Include="Serilog.Enrichers.Process" Version="3.0.0" />
|
||||
<PackageReference Include="Serilog.Enrichers.Thread" Version="4.0.0" />
|
||||
<PackageReference Include="Serilog.Exceptions" Version="8.4.0" />
|
||||
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Core.Blueprint.Domain\Core.Blueprint.Domain.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
95
Core.Blueprint.DAL.Infrastrcture/Proxies/ProxyBlobStorage.cs
Normal file
95
Core.Blueprint.DAL.Infrastrcture/Proxies/ProxyBlobStorage.cs
Normal file
@ -0,0 +1,95 @@
|
||||
using Azure.Storage.Blobs;
|
||||
using Azure.Storage.Blobs.Models;
|
||||
using Azure.Storage.Sas;
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.Domain.Dtos;
|
||||
using Microsoft.Extensions.Azure;
|
||||
using System.Reflection.Metadata;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Proxies;
|
||||
|
||||
public class ProxyBlobStorage : IProxyBlobStorage
|
||||
{
|
||||
|
||||
private readonly BlobServiceClient _blobServiceClient;
|
||||
private readonly BlobContainerClient _blobContainerClient;
|
||||
private const string TIMESTAMP_TAG_NAME = "Timestamp";
|
||||
private UserDelegationKey _blobDelegationKey;
|
||||
|
||||
public ProxyBlobStorage(BlobServiceClient blobServiceClient)
|
||||
{
|
||||
_blobServiceClient = blobServiceClient;
|
||||
_blobContainerClient = blobServiceClient.GetBlobContainerClient("blueprint");
|
||||
_blobDelegationKey = _blobServiceClient.GetUserDelegationKey(DateTimeOffset.UtcNow,
|
||||
DateTimeOffset.UtcNow.AddHours(2));
|
||||
}
|
||||
|
||||
public async IAsyncEnumerable<ImageUrlDto> ListAllItemsAsync()
|
||||
{
|
||||
await using (var blobs = _blobContainerClient.GetBlobsAsync().GetAsyncEnumerator())
|
||||
{
|
||||
while (await blobs.MoveNextAsync())
|
||||
{
|
||||
yield return new ImageUrlDto
|
||||
{
|
||||
Url = _blobContainerClient.GenerateSasUri(BlobContainerSasPermissions.Read, DateTimeOffset.UtcNow.AddMinutes(5))
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<ImageUrlDto> GetFirstImageUrlAsync()
|
||||
{
|
||||
await using (var blob = _blobContainerClient.GetBlobsAsync().GetAsyncEnumerator())
|
||||
{
|
||||
System.Console.WriteLine(_blobContainerClient.Uri.ToString());
|
||||
await blob.MoveNextAsync();
|
||||
|
||||
var blobClient = _blobContainerClient.GetBlobClient(blob.Current.Name);
|
||||
|
||||
var sasBuilder = new BlobSasBuilder()
|
||||
{
|
||||
BlobContainerName = blobClient.BlobContainerName,
|
||||
BlobName = blobClient.Name,
|
||||
Resource = "b",
|
||||
StartsOn = DateTimeOffset.UtcNow,
|
||||
ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(5),
|
||||
};
|
||||
sasBuilder.SetPermissions(BlobAccountSasPermissions.Read);
|
||||
|
||||
var blobUriBuilder = new BlobUriBuilder(blobClient.Uri){
|
||||
Sas = sasBuilder.ToSasQueryParameters(_blobDelegationKey, _blobServiceClient.AccountName)
|
||||
};
|
||||
|
||||
var uri = blobUriBuilder.ToUri();
|
||||
System.Console.WriteLine(uri);
|
||||
return new ImageUrlDto { Url = uri };
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<ImageUrlDto> GetUploadUrl()
|
||||
{
|
||||
await using (var blobs = _blobContainerClient.GetBlobsAsync().GetAsyncEnumerator())
|
||||
{
|
||||
await blobs.MoveNextAsync();
|
||||
|
||||
var blobClient = _blobContainerClient.GetBlobClient(blobs.Current.Name);
|
||||
|
||||
var sasBuilder = new BlobSasBuilder(){
|
||||
BlobContainerName = blobClient.BlobContainerName,
|
||||
BlobName = blobClient.Name,
|
||||
Resource = "b",
|
||||
StartsOn = DateTimeOffset.UtcNow,
|
||||
ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(5),
|
||||
};
|
||||
sasBuilder.SetPermissions(BlobAccountSasPermissions.Read);
|
||||
|
||||
var blobUriBuilder = new BlobUriBuilder(blobClient.Uri){
|
||||
Sas = sasBuilder.ToSasQueryParameters(_blobDelegationKey, _blobServiceClient.AccountName)
|
||||
};
|
||||
|
||||
var uri = blobUriBuilder.ToUri();
|
||||
return new ImageUrlDto { Url = uri };
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using MongoDB.Driver;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Repository
|
||||
{
|
||||
public sealed class BlueprintRepository: IBlueprintRepository
|
||||
{
|
||||
private readonly IMongoContext _context;
|
||||
private readonly ILogger<BlueprintRepository> _logger;
|
||||
private readonly IMongoCollection<BlueprintCollection> _collection;
|
||||
|
||||
public BlueprintRepository(IMongoContext context, IProxyBlobStorage blobProxy, ILogger<BlueprintRepository> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
_collection = _context.Database.GetCollection<BlueprintCollection>("Blueprints");
|
||||
}
|
||||
|
||||
public async ValueTask<BlueprintCollection> GetByIdAsync(string id)
|
||||
{
|
||||
var result = await _collection.FindAsync(b => b.Id == id);
|
||||
return result.First();
|
||||
}
|
||||
|
||||
async ValueTask<IQueryable<BlueprintCollection>> IRepositoryBase<BlueprintCollection>.GetAllAsync()
|
||||
{
|
||||
var result = await _collection.FindAsync(_ => true);
|
||||
return (await result.ToListAsync()).AsQueryable();
|
||||
}
|
||||
|
||||
async ValueTask<BlueprintCollection> IRepositoryBase<BlueprintCollection>.CreateAsync(BlueprintCollection blueprint)
|
||||
{
|
||||
blueprint.Id = null;
|
||||
await _collection.InsertOneAsync(blueprint);
|
||||
return blueprint;
|
||||
}
|
||||
|
||||
public async Task<bool> UpdateAsync(string id, BlueprintCollection blueprint)
|
||||
{
|
||||
var result = await _collection.ReplaceOneAsync(b => b.Id == id, blueprint);
|
||||
return result.IsAcknowledged && result.ModifiedCount > 0;
|
||||
}
|
||||
|
||||
public async Task<bool> DeleteAsync(string id)
|
||||
{
|
||||
var result = await _collection.DeleteOneAsync(b => b.Id == id);
|
||||
return result.IsAcknowledged && result.DeletedCount > 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,54 @@
|
||||
using Core.Blueprint.DAL.Infrastructure.Context;
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Repository
|
||||
{
|
||||
public abstract class RepositorySqlBase<T> : IRepositoryIdentityBase<T> where T: AbsEntity
|
||||
{
|
||||
protected SqlServerContext _dbContext;
|
||||
|
||||
protected RepositorySqlBase(SqlServerContext dbContext)
|
||||
{
|
||||
_dbContext = dbContext;
|
||||
}
|
||||
|
||||
public async ValueTask<T> CreateAsync(T blueprint)
|
||||
{
|
||||
blueprint.Id = Guid.NewGuid().ToString();
|
||||
_dbContext.Add(blueprint);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
return blueprint;
|
||||
}
|
||||
|
||||
public async Task<bool> DeleteAsync(string id)
|
||||
{
|
||||
var item = await GetByIdAsync(id);
|
||||
if (item == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
_dbContext.Remove(item);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
return true;
|
||||
}
|
||||
|
||||
public async ValueTask<IQueryable<T>> GetAllAsync()
|
||||
{
|
||||
return _dbContext.Set<T>();
|
||||
}
|
||||
|
||||
public async ValueTask<T> GetByIdAsync(string id)
|
||||
{
|
||||
var result = await _dbContext.FindAsync<T>(id);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<bool> UpdateAsync(string id, T entity)
|
||||
{
|
||||
_dbContext.Update(entity);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.Domain.Dtos;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Repository
|
||||
{
|
||||
public class SampleImageRepository : ISampleImageRepository
|
||||
{
|
||||
private readonly IProxyBlobStorage _proxyBlobStorage;
|
||||
public SampleImageRepository(IProxyBlobStorage proxyBlobStorage)
|
||||
{
|
||||
_proxyBlobStorage = proxyBlobStorage;
|
||||
}
|
||||
|
||||
public async IAsyncEnumerable<ImageUrlDto> GetAllImagesUrls()
|
||||
{
|
||||
await using (var images = _proxyBlobStorage.ListAllItemsAsync().GetAsyncEnumerator())
|
||||
{
|
||||
await images.MoveNextAsync();
|
||||
yield return images.Current;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<ImageUrlDto> GetFirstImageUrl()
|
||||
{
|
||||
return await _proxyBlobStorage.GetFirstImageUrlAsync();
|
||||
}
|
||||
|
||||
public async Task<ImageUrlDto> GetUploadUrl()
|
||||
{
|
||||
return await _proxyBlobStorage.GetUploadUrl();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
using Core.Blueprint.DAL.Infrastructure.Context;
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Repository
|
||||
{
|
||||
public class SampleItemRepository : RepositorySqlBase<SampleItem>, ISampleItemRepository
|
||||
{
|
||||
private readonly ILogger<SampleItemRepository> _logger;
|
||||
public SampleItemRepository(SqlServerContext dbContext, ILogger<SampleItemRepository> logger) : base(dbContext)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,41 @@
|
||||
using Azure.Security.KeyVault.Secrets;
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Core.Blueprint.DAL.Infrastructure.Repository
|
||||
{
|
||||
public class SecretRepository : ISecretRepository
|
||||
{
|
||||
private readonly SecretClient _client;
|
||||
public SecretRepository(SecretClient client)
|
||||
{
|
||||
_client = client;
|
||||
}
|
||||
|
||||
public async Task<Secret> GetSecret(string secretName, CancellationToken cancellationToken)
|
||||
{
|
||||
var ret = await _client.GetSecretAsync(secretName, cancellationToken: cancellationToken);
|
||||
return new Secret() { Value = ret.Value?.Value };
|
||||
}
|
||||
|
||||
public async Task SetSecret(string secretName, string secretValue, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
await _client.SetSecretAsync(new KeyVaultSecret(secretName, secretValue), cancellationToken: cancellationToken);
|
||||
|
||||
}
|
||||
|
||||
public async Task RemoveSecret(string secretName, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
await _client.StartDeleteSecretAsync(secretName, cancellationToken: cancellationToken);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
12
Core.Blueprint.DAL.KeyVault/Contracts/IKeyVaultService.cs
Normal file
12
Core.Blueprint.DAL.KeyVault/Contracts/IKeyVaultService.cs
Normal file
@ -0,0 +1,12 @@
|
||||
using Core.Blueprint.KeyVault;
|
||||
|
||||
namespace Core.Blueprint.DAL.KeyVault.Contracts
|
||||
{
|
||||
public interface IKeyVaultService
|
||||
{
|
||||
Task<KeyVaultResponse> CreateSecretAsync(KeyVaultRequest secret, CancellationToken cancellationToken);
|
||||
Task<Tuple<KeyVaultResponse, string?>> GetSecretAsync(string secret, CancellationToken cancellationToken);
|
||||
Task<Tuple<string, bool>> DeleteSecretAsync(string secretName, CancellationToken cancellationToken);
|
||||
Task<Tuple<KeyVaultResponse, string>> UpdateSecretAsync(KeyVaultRequest secretName, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Azure.Identity" Version="1.13.1" />
|
||||
<PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.7.0" />
|
||||
<PackageReference Include="Core.Blueprint.KeyVault" Version="0.3.0-alpha0037" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
31
Core.Blueprint.DAL.KeyVault/Services/KeyVaultService.cs
Normal file
31
Core.Blueprint.DAL.KeyVault/Services/KeyVaultService.cs
Normal file
@ -0,0 +1,31 @@
|
||||
using Core.Blueprint.DAL.KeyVault.Contracts;
|
||||
using Core.Blueprint.KeyVault;
|
||||
|
||||
namespace Core.Blueprint.DAL.KeyVault.Services
|
||||
{
|
||||
public class KeyVaultService(IKeyVaultProvider keyVaultProvider) : IKeyVaultService
|
||||
{
|
||||
public async Task<KeyVaultResponse> CreateSecretAsync(KeyVaultRequest newSecret, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await keyVaultProvider.CreateSecretAsync(newSecret, cancellationToken);
|
||||
return result;
|
||||
}
|
||||
public async Task<Tuple<KeyVaultResponse, string?>> GetSecretAsync(string secretName, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await keyVaultProvider.GetSecretAsync(secretName, cancellationToken: cancellationToken);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Tuple<KeyVaultResponse, string>> UpdateSecretAsync(KeyVaultRequest newSecret, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await keyVaultProvider.UpdateSecretAsync(newSecret, cancellationToken);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Tuple<string, bool>> DeleteSecretAsync(string secretName, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await keyVaultProvider.DeleteSecretAsync(secretName, cancellationToken);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
50
Core.Blueprint.DAL.Logs/BlueprintSerilogLogger.cs
Normal file
50
Core.Blueprint.DAL.Logs/BlueprintSerilogLogger.cs
Normal file
@ -0,0 +1,50 @@
|
||||
using Core.Blueprint.DAL.Logs.Contracts;
|
||||
using Serilog;
|
||||
|
||||
namespace Core.Blueprint.DAL.Logs
|
||||
{
|
||||
public class BlueprintSerilogLogger : IBlueprintSerilogLogger
|
||||
{
|
||||
private readonly ILogger logger;
|
||||
|
||||
public BlueprintSerilogLogger(ILogger logger)
|
||||
{
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
public void LogInformation(string service, params object[] args)
|
||||
{
|
||||
logger.Information("Starting operation in {service} service", service, args);
|
||||
}
|
||||
|
||||
public void LogOperationStarted(string service, params object[] args)
|
||||
{
|
||||
logger.Information("Starting operation in {Service} service with parameters: {@Args}", service, args);
|
||||
}
|
||||
public void LogOperationFinished(string service, params object[] args)
|
||||
{
|
||||
logger.Information("Finishing operation in {Service} service with parameters: {@Args}", service, args);
|
||||
}
|
||||
|
||||
public void LogInformation(string message)
|
||||
{
|
||||
logger.Information(message);
|
||||
}
|
||||
|
||||
public void LogWarning(string message, params object[] args)
|
||||
{
|
||||
logger.Warning(message, args);
|
||||
}
|
||||
|
||||
public void LogError(string service, params object[] args)
|
||||
{
|
||||
logger.Error("An error occurred in `{service}` Exception: {@Args}", service, args);
|
||||
}
|
||||
|
||||
public void LogCritical(Exception exception, string message, params object[] args)
|
||||
{
|
||||
logger.Fatal(exception, message, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,15 @@
|
||||
using Core.Blueprint.DAL.Logs.Contracts;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace Core.Blueprint.DAL.Logs.Configuration
|
||||
{
|
||||
public static class LogExtensionConfiguration
|
||||
{
|
||||
public static IServiceCollection AddLogLayer(this IServiceCollection services)
|
||||
{
|
||||
services.AddScoped<IBlueprintSerilogLogger, BlueprintSerilogLogger>();
|
||||
|
||||
return services;
|
||||
}
|
||||
}
|
||||
}
|
||||
9
Core.Blueprint.DAL.Logs/Contracts/IBlueprintLogger.cs
Normal file
9
Core.Blueprint.DAL.Logs/Contracts/IBlueprintLogger.cs
Normal file
@ -0,0 +1,9 @@
|
||||
namespace Core.Blueprint.DAL.Logs.Contracts
|
||||
{
|
||||
public interface IBlueprintLogger<T> where T : class, new()
|
||||
{
|
||||
//logger
|
||||
//serilog...
|
||||
//patterns of structuie logging
|
||||
}
|
||||
}
|
||||
12
Core.Blueprint.DAL.Logs/Contracts/IBlueprintSerilogLogger.cs
Normal file
12
Core.Blueprint.DAL.Logs/Contracts/IBlueprintSerilogLogger.cs
Normal file
@ -0,0 +1,12 @@
|
||||
namespace Core.Blueprint.DAL.Logs.Contracts
|
||||
{
|
||||
public interface IBlueprintSerilogLogger
|
||||
{
|
||||
public void LogInformation(string service, params object[] args);
|
||||
public void LogOperationStarted(string service, params object[] args);
|
||||
public void LogOperationFinished(string service, params object[] args);
|
||||
public void LogWarning(string message, params object[] args);
|
||||
public void LogError(string servicee, params object[] args);
|
||||
public void LogCritical(Exception exception, string message, params object[] args);
|
||||
}
|
||||
}
|
||||
14
Core.Blueprint.DAL.Logs/Core.Blueprint.DAL.Logs.csproj
Normal file
14
Core.Blueprint.DAL.Logs/Core.Blueprint.DAL.Logs.csproj
Normal file
@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" />
|
||||
<PackageReference Include="Serilog" Version="4.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
24
Core.Blueprint.DAL.Logs/Log.cs
Normal file
24
Core.Blueprint.DAL.Logs/Log.cs
Normal file
@ -0,0 +1,24 @@
|
||||
namespace Core.Blueprint.DAL.Logs;
|
||||
public static partial class Log
|
||||
{
|
||||
//[LoggerMessage(
|
||||
// EventId = 1,
|
||||
// Level = LogLevel.Information,
|
||||
// Message = "Starting operation in`{service}` service with parameters: {@Args}"
|
||||
//)]
|
||||
//static partial void OperationStarted(ILogger logger, string service, params object[] args);
|
||||
|
||||
//[LoggerMessage(
|
||||
// EventId = 1,
|
||||
// Level = LogLevel.Information,
|
||||
// Message = "Operation finished in`{service}` service with parameters: {@Args}"
|
||||
//)]
|
||||
//static partial void OperationFinished(ILogger logger, string service, params object[] args);
|
||||
|
||||
//[LoggerMessage(
|
||||
// EventId = 2,
|
||||
// Level = LogLevel.Error,
|
||||
// Message = "An error occurred in `{service}` service"
|
||||
//)]
|
||||
//static partial void OperationFailed(ILogger logger, string service, Exception exception);
|
||||
}
|
||||
18
Core.Blueprint.DAL.Mongo/Contracts/IBlueprintService.cs
Normal file
18
Core.Blueprint.DAL.Mongo/Contracts/IBlueprintService.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using Core.Blueprint.DAL.Mongo.Entities.Collections;
|
||||
using Core.Blueprint.DAL.Mongo.Entities.Requests;
|
||||
|
||||
namespace Core.Blueprint.DAL.Mongo.Contracts
|
||||
{
|
||||
public interface IBlueprintService
|
||||
{
|
||||
ValueTask<BlueprintCollection> CreateBlueprint(BlueprintRequest newBlueprint, CancellationToken cancellationToken);
|
||||
|
||||
ValueTask<BlueprintCollection> GetBlueprintById(string _id, CancellationToken cancellationToken);
|
||||
|
||||
ValueTask<IEnumerable<BlueprintCollection>> GetAllBlueprints(CancellationToken cancellationToken);
|
||||
|
||||
ValueTask<BlueprintCollection> UpdateBlueprint(string _id, BlueprintCollection entity, CancellationToken cancellationToken);
|
||||
|
||||
ValueTask<BlueprintCollection> DeleteBlueprint(string _id, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
22
Core.Blueprint.DAL.Mongo/Core.Blueprint.DAL.Mongo.csproj
Normal file
22
Core.Blueprint.DAL.Mongo/Core.Blueprint.DAL.Mongo.csproj
Normal file
@ -0,0 +1,22 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Azure.Identity" Version="1.13.1" />
|
||||
<PackageReference Include="Core.Blueprint.Mongo" Version="0.3.0-alpha0047" />
|
||||
<PackageReference Include="Core.Blueprint.Redis" Version="0.3.0-alpha0032" />
|
||||
<PackageReference Include="Mapster" Version="7.4.1-pre01" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options" Version="9.0.0" />
|
||||
<PackageReference Include="MongoDB.Driver" Version="3.1.0" />
|
||||
<PackageReference Include="Serilog" Version="4.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@ -0,0 +1,11 @@
|
||||
using Core.Blueprint.Mongo;
|
||||
|
||||
namespace Core.Blueprint.DAL.Mongo.Entities.Collections
|
||||
{
|
||||
[CollectionAttributeName("Blueprints")]
|
||||
public class BlueprintCollection : Document
|
||||
{
|
||||
public string Name { get; set; } = null!;
|
||||
public string? Description { get; set; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
namespace Core.Blueprint.DAL.Mongo.Entities.Requests
|
||||
{
|
||||
public class BlueprintRequest
|
||||
{
|
||||
public string Name { get; set; } = null!;
|
||||
|
||||
public string? Description { get; set; }
|
||||
}
|
||||
}
|
||||
80
Core.Blueprint.DAL.Mongo/Service/BlueprintService.cs
Normal file
80
Core.Blueprint.DAL.Mongo/Service/BlueprintService.cs
Normal file
@ -0,0 +1,80 @@
|
||||
using Core.Blueprint.DAL.Mongo.Contracts;
|
||||
using Core.Blueprint.DAL.Mongo.Entities.Collections;
|
||||
using Core.Blueprint.DAL.Mongo.Entities.Requests;
|
||||
using Core.Blueprint.Mongo;
|
||||
using Core.Blueprint.Redis;
|
||||
using Core.Blueprint.Redis.Helpers;
|
||||
using Mapster;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace Core.Blueprint.DAL.Mongo.Service
|
||||
{
|
||||
public class BlueprintService : IBlueprintService
|
||||
{
|
||||
private readonly CollectionRepository<BlueprintCollection> repository;
|
||||
private readonly CacheSettings cacheSettings;
|
||||
private readonly IRedisCacheProvider cacheProvider;
|
||||
|
||||
public BlueprintService(CollectionRepository<BlueprintCollection> repository,
|
||||
IRedisCacheProvider cacheProvider, IOptions<CacheSettings> cacheSettings)
|
||||
{
|
||||
this.repository = repository;
|
||||
this.repository.CollectionInitialization();
|
||||
this.cacheSettings = cacheSettings.Value;
|
||||
this.cacheProvider = cacheProvider;
|
||||
}
|
||||
|
||||
public async ValueTask<BlueprintCollection> CreateBlueprint(BlueprintRequest newBlueprint, CancellationToken cancellationToken)
|
||||
{
|
||||
var blueprintCollection = newBlueprint.Adapt<BlueprintCollection>();
|
||||
|
||||
await this.repository.InsertOneAsync(blueprintCollection);
|
||||
|
||||
return blueprintCollection;
|
||||
}
|
||||
|
||||
public async ValueTask<BlueprintCollection> GetBlueprintById(string _id, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
var cacheKey = CacheKeyHelper.GenerateCacheKey(this, "GetBlueprintById", _id);
|
||||
var cachedData = await cacheProvider.GetAsync<BlueprintCollection>(cacheKey);
|
||||
|
||||
if (cachedData is not null) { return cachedData; }
|
||||
|
||||
var blueprint = await this.repository.FindByIdAsync(_id);
|
||||
|
||||
await cacheProvider.SetAsync(cacheKey, blueprint);
|
||||
|
||||
return blueprint;
|
||||
}
|
||||
|
||||
public async ValueTask<IEnumerable<BlueprintCollection>> GetAllBlueprints(CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
var cacheKey = CacheKeyHelper.GenerateCacheKey(this, "GetAllBlueprints");
|
||||
var cachedData = await cacheProvider.GetAsync<IEnumerable<BlueprintCollection>>(cacheKey) ?? [];
|
||||
|
||||
if (cachedData.Any()) return cachedData;
|
||||
|
||||
var blueprints = await this.repository.AsQueryable();
|
||||
|
||||
await cacheProvider.SetAsync(cacheKey, blueprints);
|
||||
|
||||
return blueprints;
|
||||
}
|
||||
|
||||
public async ValueTask<BlueprintCollection> UpdateBlueprint(string _id, BlueprintCollection entity, CancellationToken cancellationToken)
|
||||
{
|
||||
await this.repository.ReplaceOneAsync(entity);
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
public async ValueTask<BlueprintCollection> DeleteBlueprint(string _id, CancellationToken cancellationToken)
|
||||
{
|
||||
var entity = await this.repository.DeleteOneAsync(doc => doc._Id == _id);
|
||||
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
134
Core.Blueprint.DAL.Redis/CacheService.cs
Normal file
134
Core.Blueprint.DAL.Redis/CacheService.cs
Normal file
@ -0,0 +1,134 @@
|
||||
using Azure.Identity;
|
||||
using Core.Blueprint.DAL.Redis.Contracts;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using StackExchange.Redis;
|
||||
using System.Text.Json;
|
||||
|
||||
|
||||
namespace Core.Blueprint.DAL.Redis
|
||||
{
|
||||
public class CacheService : ICacheService
|
||||
{
|
||||
private IDatabase _cacheDatabase = null!;
|
||||
private readonly ILogger<CacheService> _logger;
|
||||
|
||||
|
||||
public CacheService(string connectionString, ILogger<CacheService> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
Task.Run(async () =>
|
||||
{
|
||||
_cacheDatabase = await GetRedisDatabase(connectionString);
|
||||
}).Wait();
|
||||
}
|
||||
|
||||
private async Task<IDatabase> GetRedisDatabase(string connectionString)
|
||||
{
|
||||
try
|
||||
{
|
||||
var configurationOptions = await ConfigurationOptions.Parse($"{connectionString}")
|
||||
.ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential());
|
||||
|
||||
configurationOptions.AbortOnConnectFail = false;
|
||||
var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions);
|
||||
|
||||
_logger.LogInformation("Successfully connected to Redis.");
|
||||
|
||||
return connectionMultiplexer.GetDatabase();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error establishing Redis connection.");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async Task<T> GetAsync<T>(string key)
|
||||
{
|
||||
try
|
||||
{
|
||||
var value = await _cacheDatabase.StringGetAsync(key);
|
||||
if (value.IsNullOrEmpty)
|
||||
{
|
||||
_logger.LogInformation($"Cache miss for key: {key}");
|
||||
return default;
|
||||
}
|
||||
|
||||
_logger.LogInformation($"Cache hit for key: {key}");
|
||||
return JsonSerializer.Deserialize<T>(value);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"Error getting cache item with key {key}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SetAsync<T>(string key, T value, TimeSpan? expiry = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var json = JsonSerializer.Serialize(value);
|
||||
await _cacheDatabase.StringSetAsync(key, json, expiry);
|
||||
_logger.LogInformation($"Cache item set with key: {key}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"Error setting cache item with key {key}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task RemoveAsync(string key)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _cacheDatabase.KeyDeleteAsync(key);
|
||||
_logger.LogInformation($"Cache item removed with key: {key}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"Error removing cache item with key {key}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<bool> ExistsAsync(string key)
|
||||
{
|
||||
try
|
||||
{
|
||||
var exists = await _cacheDatabase.KeyExistsAsync(key);
|
||||
_logger.LogInformation($"Cache item exists check for key: {key} - {exists}");
|
||||
return exists;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"Error checking existence of cache item with key {key}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task RefreshAsync(string key, TimeSpan? expiry = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var value = await _cacheDatabase.StringGetAsync(key);
|
||||
if (!value.IsNullOrEmpty)
|
||||
{
|
||||
await _cacheDatabase.StringSetAsync(key, value, expiry);
|
||||
_logger.LogInformation($"Cache item refreshed with key: {key}");
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogWarning($"Cache item with key: {key} does not exist, cannot refresh");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"Error refreshing cache item with key {key}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
7
Core.Blueprint.DAL.Redis/Configuration/CacheSettings.cs
Normal file
7
Core.Blueprint.DAL.Redis/Configuration/CacheSettings.cs
Normal file
@ -0,0 +1,7 @@
|
||||
namespace Core.Blueprint.DAL.Redis.Configuration
|
||||
{
|
||||
public class CacheSettings
|
||||
{
|
||||
public int DefaultCacheDurationInMinutes { get; set; }
|
||||
}
|
||||
}
|
||||
27
Core.Blueprint.DAL.Redis/Configuration/RedisExtension.cs
Normal file
27
Core.Blueprint.DAL.Redis/Configuration/RedisExtension.cs
Normal file
@ -0,0 +1,27 @@
|
||||
using Core.Blueprint.DAL.Redis.Contracts;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Core.Blueprint.DAL.Redis.Configuration
|
||||
{
|
||||
public static class RedisExtension
|
||||
{
|
||||
public static IServiceCollection AddRedisLayer(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
var source = configuration.GetSection("ConnectionStrings");
|
||||
|
||||
var redisConnectionString = source["Redis"]?.ToString();
|
||||
|
||||
if (string.IsNullOrEmpty(redisConnectionString))
|
||||
{
|
||||
throw new InvalidOperationException("Redis connection string is not configured.");
|
||||
}
|
||||
|
||||
services.AddSingleton<ICacheService>(provider =>
|
||||
new CacheService(redisConnectionString, provider.GetRequiredService<ILogger<CacheService>>()));
|
||||
|
||||
return services;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Core.Blueprint.DAL.Redis/Contracts/ICacheService.cs
Normal file
11
Core.Blueprint.DAL.Redis/Contracts/ICacheService.cs
Normal file
@ -0,0 +1,11 @@
|
||||
namespace Core.Blueprint.DAL.Redis.Contracts
|
||||
{
|
||||
public interface ICacheService
|
||||
{
|
||||
Task<T> GetAsync<T>(string key);
|
||||
Task SetAsync<T>(string key, T value, TimeSpan? expiry = null);
|
||||
Task RemoveAsync(string key);
|
||||
Task<bool> ExistsAsync(string key);
|
||||
Task RefreshAsync(string key, TimeSpan? expiry = null);
|
||||
}
|
||||
}
|
||||
17
Core.Blueprint.DAL.Redis/Core.Blueprint.DAL.Redis.csproj
Normal file
17
Core.Blueprint.DAL.Redis/Core.Blueprint.DAL.Redis.csproj
Normal file
@ -0,0 +1,17 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Azure.Identity" Version="1.13.1" />
|
||||
<PackageReference Include="Microsoft.Azure.StackExchangeRedis" Version="3.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" />
|
||||
<PackageReference Include="StackExchange.Redis" Version="2.8.24" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
30
Core.Blueprint.DAL.Redis/Helpers/CacheHelper.cs
Normal file
30
Core.Blueprint.DAL.Redis/Helpers/CacheHelper.cs
Normal file
@ -0,0 +1,30 @@
|
||||
using Core.Blueprint.DAL.Redis.Configuration;
|
||||
|
||||
namespace Core.Blueprint.DAL.Redis.Helpers
|
||||
{
|
||||
public static class CacheHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines the cache duration based on specific duration, settings, or a default value.
|
||||
/// </summary>
|
||||
/// <param name="specificCacheDuration">Specific cache duration in minutes, if provided.</param>
|
||||
/// <param name="cacheSettings">General cache settings containing default duration values.</param>
|
||||
/// <returns>The cache duration as a TimeSpan.</returns>
|
||||
public static TimeSpan GetCacheDuration(CacheSettings cacheSettings, int? specificCacheDuration = 0)
|
||||
{
|
||||
var defaultCacheDuration = TimeSpan.FromMinutes(.5);
|
||||
|
||||
if (specificCacheDuration.HasValue && specificCacheDuration.Value > 0)
|
||||
{
|
||||
return TimeSpan.FromMinutes(specificCacheDuration.Value);
|
||||
}
|
||||
|
||||
if (cacheSettings.DefaultCacheDurationInMinutes > 0)
|
||||
{
|
||||
return TimeSpan.FromMinutes(cacheSettings.DefaultCacheDurationInMinutes);
|
||||
}
|
||||
|
||||
return defaultCacheDuration;
|
||||
}
|
||||
}
|
||||
}
|
||||
46
Core.Blueprint.DAL.Redis/Helpers/CacheKeyHelper.cs
Normal file
46
Core.Blueprint.DAL.Redis/Helpers/CacheKeyHelper.cs
Normal file
@ -0,0 +1,46 @@
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Core.Blueprint.DAL.Redis.Helpers
|
||||
{
|
||||
public static class CacheKeyHelper
|
||||
{
|
||||
public static string GenerateCacheKey(object instance, string methodName, params object[] parameters)
|
||||
{
|
||||
var className = instance.GetType().Name;
|
||||
var keyBuilder = new StringBuilder($"{className}.{methodName}");
|
||||
|
||||
foreach (var param in parameters)
|
||||
{
|
||||
string normalizedParam = NormalizeParameter(param);
|
||||
keyBuilder.Append($".{normalizedParam}");
|
||||
}
|
||||
|
||||
return keyBuilder.ToString();
|
||||
}
|
||||
|
||||
private static string NormalizeParameter(object param)
|
||||
{
|
||||
if (param == null)
|
||||
{
|
||||
return "null";
|
||||
}
|
||||
|
||||
string paramString;
|
||||
|
||||
if (param is DateTime dateTime)
|
||||
{
|
||||
paramString = dateTime.ToString("yyyyMMdd");
|
||||
}
|
||||
else
|
||||
{
|
||||
paramString = param.ToString();
|
||||
}
|
||||
|
||||
// Replace special characters with an underscore
|
||||
string normalizedParam = Regex.Replace(paramString, @"[^a-zA-Z0-9]", "_");
|
||||
|
||||
return normalizedParam;
|
||||
}
|
||||
}
|
||||
}
|
||||
25
Core.Blueprint.DAL.SQLServer/Context/SqlServerContext.cs
Normal file
25
Core.Blueprint.DAL.SQLServer/Context/SqlServerContext.cs
Normal file
@ -0,0 +1,25 @@
|
||||
using Core.Blueprint.DAL.SQLServer.Entities;
|
||||
using Core.Blueprint.SQLServer.Entities;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace Core.Blueprint.DAL.SQLServer.Context
|
||||
{
|
||||
public sealed class SqlServerContext : DbContext
|
||||
{
|
||||
public SqlServerContext(DbContextOptions<SqlServerContext> options) : base(options) { }
|
||||
public DbSet<UserProject> UserProjects { get; set; }
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
foreach (var entityType in modelBuilder.Model.GetEntityTypes()
|
||||
.Where(t => typeof(BaseSQLAdapter).IsAssignableFrom(t.ClrType)))
|
||||
{
|
||||
modelBuilder.Entity(entityType.ClrType)
|
||||
.HasKey("Id");
|
||||
|
||||
modelBuilder.Entity(entityType.ClrType).Property("Status")
|
||||
.HasConversion<string>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,19 @@
|
||||
using Core.Blueprint.DAL.SQLServer.Entities;
|
||||
using Core.Blueprint.DAL.SQLServer.Entities.Request;
|
||||
|
||||
namespace Core.Blueprint.DAL.SQLServer.Contracts
|
||||
{
|
||||
public interface IUserProjectService
|
||||
{
|
||||
Task<IEnumerable<UserProject>> GetAllUserProjects();
|
||||
|
||||
Task<UserProject?> GetUserProjectById(int id);
|
||||
|
||||
Task<UserProject> AddUserProject(UserProjectRequest newUserProject);
|
||||
|
||||
Task<UserProject?> UpdateUserProject(UserProject userProject);
|
||||
|
||||
Task<UserProject?> DeleteUserProject(int id);
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,19 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Core.Blueprint.Redis" Version="0.3.0-alpha0032" />
|
||||
<PackageReference Include="Core.Blueprint.SQLServer" Version="0.3.0-alpha0030" />
|
||||
<PackageReference Include="Mapster" Version="7.4.1-pre01" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@ -0,0 +1,9 @@
|
||||
namespace Core.Blueprint.DAL.SQLServer.Entities.Request
|
||||
{
|
||||
public class UserProjectRequest
|
||||
{
|
||||
public string ProjectCode { get; set; } = null!;
|
||||
public string ProjectDescription { get; set; } = null!;
|
||||
public string UserId { get; set; } = null!;
|
||||
}
|
||||
}
|
||||
13
Core.Blueprint.DAL.SQLServer/Entities/UserProject.cs
Normal file
13
Core.Blueprint.DAL.SQLServer/Entities/UserProject.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using Core.Blueprint.SQLServer.Entities;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace Core.Blueprint.DAL.SQLServer.Entities
|
||||
{
|
||||
[Table("UserProjects")]
|
||||
public class UserProject : BaseSQLAdapter
|
||||
{
|
||||
public string ProjectCode { get; set; } = null!;
|
||||
public string ProjectDescription { get; set; } = null!;
|
||||
public string UserId { get; set; } = null!;
|
||||
}
|
||||
}
|
||||
82
Core.Blueprint.DAL.SQLServer/Services/UserProjectService.cs
Normal file
82
Core.Blueprint.DAL.SQLServer/Services/UserProjectService.cs
Normal file
@ -0,0 +1,82 @@
|
||||
using Core.Blueprint.DAL.SQLServer;
|
||||
using Core.Blueprint.DAL.SQLServer.Context;
|
||||
using Core.Blueprint.DAL.SQLServer.Contracts;
|
||||
using Core.Blueprint.DAL.SQLServer.Entities;
|
||||
using Core.Blueprint.DAL.SQLServer.Entities.Request;
|
||||
using Core.Blueprint.Redis;
|
||||
using Core.Blueprint.Redis.Helpers;
|
||||
using Mapster;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
public class UserProjectService : IUserProjectService
|
||||
{
|
||||
private readonly IEntityRepository<UserProject, SqlServerContext> _userProjectRepository;
|
||||
private readonly CacheSettings cacheSettings;
|
||||
private readonly IRedisCacheProvider cacheProvider;
|
||||
|
||||
public UserProjectService(IEntityRepository<UserProject, SqlServerContext> userProjectRepository, IRedisCacheProvider cacheProvider, IOptions<CacheSettings> cacheSettings)
|
||||
{
|
||||
_userProjectRepository = userProjectRepository;
|
||||
this.cacheSettings = cacheSettings.Value;
|
||||
this.cacheProvider = cacheProvider;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<UserProject>> GetAllUserProjects()
|
||||
{
|
||||
var cacheKey = CacheKeyHelper.GenerateCacheKey(this, "GetAllUserProjects");
|
||||
var cachedData = await cacheProvider.GetAsync<IEnumerable<UserProject>>(cacheKey) ?? [];
|
||||
|
||||
if (cachedData.Any()) return cachedData;
|
||||
|
||||
var userProjects = await _userProjectRepository.GetAllAsync();
|
||||
|
||||
await cacheProvider.SetAsync(cacheKey, userProjects);
|
||||
|
||||
return userProjects;
|
||||
}
|
||||
|
||||
public async Task<UserProject?> GetUserProjectById(int id)
|
||||
{
|
||||
var cacheKey = CacheKeyHelper.GenerateCacheKey(this, "GetUserProjectById", id);
|
||||
var cachedData = await cacheProvider.GetAsync<UserProject>(cacheKey);
|
||||
|
||||
if (cachedData is not null) { return cachedData; }
|
||||
|
||||
var userProject = await _userProjectRepository.GetByIdAsync(id);
|
||||
|
||||
await cacheProvider.SetAsync(cacheKey, userProject);
|
||||
|
||||
return userProject;
|
||||
}
|
||||
|
||||
public async Task<UserProject> AddUserProject(UserProjectRequest newUserProject)
|
||||
{
|
||||
var userProject = newUserProject.Adapt<UserProject>();
|
||||
|
||||
await _userProjectRepository.AddAsync(userProject);
|
||||
await _userProjectRepository.SaveAsync();
|
||||
return userProject;
|
||||
}
|
||||
|
||||
public async Task<UserProject?> UpdateUserProject(UserProject userProject)
|
||||
{
|
||||
var existingEntity = await _userProjectRepository.GetByIdAsync(userProject.Id);
|
||||
|
||||
if (existingEntity is null) return existingEntity;
|
||||
|
||||
_userProjectRepository.Update(userProject);
|
||||
await _userProjectRepository.SaveAsync();
|
||||
return userProject;
|
||||
}
|
||||
|
||||
public async Task<UserProject?> DeleteUserProject(int id)
|
||||
{
|
||||
var userProject = await _userProjectRepository.GetByIdAsync(id);
|
||||
if (userProject == null)
|
||||
return null;
|
||||
|
||||
_userProjectRepository.Delete(userProject);
|
||||
await _userProjectRepository.SaveAsync();
|
||||
return userProject;
|
||||
}
|
||||
}
|
||||
125
Core.Blueprint.DAL.Service/BlueprintService.cs
Normal file
125
Core.Blueprint.DAL.Service/BlueprintService.cs
Normal file
@ -0,0 +1,125 @@
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.DAL.Service.Contracts;
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
using Microsoft.AspNetCore.Http.HttpResults;
|
||||
using Serilog;
|
||||
|
||||
|
||||
namespace Core.Blueprint.DAL.Service
|
||||
{
|
||||
public class BlueprintService : IBlueprintService
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
private readonly IRepositoryIdentityBase<BlueprintCollection> _repository;
|
||||
|
||||
public BlueprintService(IBlueprintRepository repository, ILogger logger)
|
||||
{
|
||||
_repository = repository;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public virtual async ValueTask<BlueprintCollection> CreateAsync(BlueprintCollection entity)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Start to create the BluePrintCollection | Method: {method} | Class: {class}", nameof(CreateAsync), nameof(BlueprintService));
|
||||
|
||||
|
||||
var ret = await _repository.CreateAsync(entity);
|
||||
|
||||
_logger.Information("The blueprint collection was created | Method: {method} | Class: {class}", nameof(CreateAsync), nameof(BlueprintService));
|
||||
|
||||
return ret;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(CreateAsync), nameof(BlueprintService));
|
||||
return default;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public virtual async ValueTask<bool> DeleteAsync(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Start to delete BluePrintCollection | Method: {method} | Class: {class}", nameof(DeleteAsync), nameof(BlueprintService));
|
||||
|
||||
var ret = await _repository.DeleteAsync(id);
|
||||
|
||||
_logger.Information("The blueprintcollection delete Finished | Method: {method} | Class: {class}", nameof(DeleteAsync), nameof(BlueprintService));
|
||||
|
||||
return ret;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(DeleteAsync), nameof(BlueprintService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public virtual async ValueTask<IEnumerable<BlueprintCollection>> GetAllAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Start to get the BluePrintCollection list | Method: {method} | Class: {class}", nameof(GetAllAsync), nameof(BlueprintService));
|
||||
|
||||
var ret = await _repository.GetAllAsync();
|
||||
|
||||
_logger.Information("The get blueprintcollection list Finished | Method: {method} | Class: {class}", nameof(GetAllAsync), nameof(BlueprintService));
|
||||
|
||||
return ret;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(GetAllAsync), nameof(BlueprintService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public virtual async ValueTask<BlueprintCollection> GetByIdAsync(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Start to get a sigle BluePrintCollection | Method: {method} | Class: {class}", nameof(GetByIdAsync), nameof(BlueprintService));
|
||||
|
||||
var ret = await _repository.GetByIdAsync(id);
|
||||
|
||||
_logger.Information("The single blueprintcollection got | Method: {method} | Class: {class}", nameof(GetByIdAsync), nameof(BlueprintService));
|
||||
|
||||
return ret;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(GetByIdAsync), nameof(BlueprintService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public virtual async Task<bool> UpdateAsync(string id, BlueprintCollection entity)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Start to update BluePrintCollection | Method: {method} | Class: {class}", nameof(UpdateAsync), nameof(BlueprintService));
|
||||
|
||||
var ret = await _repository.UpdateAsync(id, entity);
|
||||
|
||||
_logger.Information("The blueprintcollection update Finished | Method: {method} | Class: {class}", nameof(UpdateAsync), nameof(BlueprintService));
|
||||
|
||||
return ret;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(UpdateAsync), nameof(BlueprintService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
22
Core.Blueprint.DAL.Service/Configure/DependencyInjection.cs
Normal file
22
Core.Blueprint.DAL.Service/Configure/DependencyInjection.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using Core.Blueprint.DAL.Infrastructure.Configure;
|
||||
using Core.Blueprint.DAL.Service.Contracts;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace Core.Blueprint.DAL.Service.Configure
|
||||
{
|
||||
public static class DependencyInjection
|
||||
{
|
||||
public static IServiceCollection RegisterServices(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
services.RegisterInfrastructure(configuration);
|
||||
|
||||
services.AddScoped<IBlueprintService, BlueprintService>();
|
||||
services.AddScoped<ISampleItemService, SampleItemService>();
|
||||
services.AddScoped<ISampleImageService, SampleImageService>();
|
||||
services.AddScoped<ISecretService, SecretService>();
|
||||
|
||||
return services;
|
||||
}
|
||||
}
|
||||
}
|
||||
13
Core.Blueprint.DAL.Service/Contracts/IBlueprintService.cs
Normal file
13
Core.Blueprint.DAL.Service/Contracts/IBlueprintService.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
|
||||
namespace Core.Blueprint.DAL.Service.Contracts
|
||||
{
|
||||
public interface IBlueprintService
|
||||
{
|
||||
ValueTask<BlueprintCollection> CreateAsync(BlueprintCollection entity);
|
||||
ValueTask<bool> DeleteAsync(string id);
|
||||
ValueTask<IEnumerable<BlueprintCollection>> GetAllAsync();
|
||||
ValueTask<BlueprintCollection> GetByIdAsync(string id);
|
||||
Task<bool> UpdateAsync(string id, BlueprintCollection entity);
|
||||
}
|
||||
}
|
||||
11
Core.Blueprint.DAL.Service/Contracts/ISampleImageService.cs
Normal file
11
Core.Blueprint.DAL.Service/Contracts/ISampleImageService.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using Core.Blueprint.Domain.Dtos;
|
||||
|
||||
namespace Core.Blueprint.DAL.Service.Contracts
|
||||
{
|
||||
public interface ISampleImageService
|
||||
{
|
||||
IAsyncEnumerable<ImageUrlDto> GetAllUrl();
|
||||
Task<ImageUrlDto> GetFirstUrl();
|
||||
Task<ImageUrlDto> GetUploadUrl();
|
||||
}
|
||||
}
|
||||
14
Core.Blueprint.DAL.Service/Contracts/ISampleItemService.cs
Normal file
14
Core.Blueprint.DAL.Service/Contracts/ISampleItemService.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
|
||||
namespace Core.Blueprint.DAL.Service.Contracts
|
||||
{
|
||||
public interface ISampleItemService
|
||||
{
|
||||
ValueTask<SampleItem> CreateAsync(SampleItem entity);
|
||||
ValueTask<bool> DeleteAsync(string id);
|
||||
ValueTask<IEnumerable<SampleItem>> GetAllAsync();
|
||||
ValueTask<SampleItem> GetByIdAsync(string id);
|
||||
Task<bool> UpdateAsync(string id, SampleItem entity);
|
||||
|
||||
}
|
||||
}
|
||||
11
Core.Blueprint.DAL.Service/Contracts/ISecretService.cs
Normal file
11
Core.Blueprint.DAL.Service/Contracts/ISecretService.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
|
||||
namespace Core.Blueprint.DAL.Service.Contracts
|
||||
{
|
||||
public interface ISecretService
|
||||
{
|
||||
Task<Secret> GetSecret(string secretName, CancellationToken cancellationToken);
|
||||
Task SetSecret(string secretName, string secretValue, CancellationToken cancellationToken);
|
||||
Task RemoveSecret(string secretName, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
14
Core.Blueprint.DAL.Service/Core.Blueprint.DAL.Service.csproj
Normal file
14
Core.Blueprint.DAL.Service/Core.Blueprint.DAL.Service.csproj
Normal file
@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Core.Blueprint.DAL.Infrastrcture\Core.Blueprint.DAL.Infrastructure.csproj" />
|
||||
<ProjectReference Include="..\Core.Blueprint.Domain\Core.Blueprint.Domain.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
74
Core.Blueprint.DAL.Service/SampleImageService.cs
Normal file
74
Core.Blueprint.DAL.Service/SampleImageService.cs
Normal file
@ -0,0 +1,74 @@
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.DAL.Service.Contracts;
|
||||
using Core.Blueprint.Domain.Dtos;
|
||||
using Serilog;
|
||||
|
||||
namespace Core.Blueprint.DAL.Service
|
||||
{
|
||||
public class SampleImageService : ISampleImageService
|
||||
{
|
||||
private readonly ISampleImageRepository _sampleImageRepository;
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public SampleImageService(ISampleImageRepository sampleImageRepository, ILogger logger)
|
||||
{
|
||||
_sampleImageRepository = sampleImageRepository;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public IAsyncEnumerable<ImageUrlDto> GetAllUrl()
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to get the images urls list | Method: {method} | Class: {class}", nameof(GetAllUrl), nameof(SampleImageService));
|
||||
var ret = _sampleImageRepository.GetAllImagesUrls();
|
||||
_logger.Information("Finishing to get the images urls list | Method: {method} | Class: {class}", nameof(GetAllUrl), nameof(SampleImageService));
|
||||
return ret;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(GetAllUrl), nameof(SampleImageService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public async Task<ImageUrlDto> GetFirstUrl()
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to get the first image url | Method: {method} | Class: {class}", nameof(GetFirstUrl), nameof(SampleImageService));
|
||||
var ret = await _sampleImageRepository.GetFirstImageUrl();
|
||||
_logger.Information("Finishing to get the first image url | Method: {method} | Class: {class}", nameof(GetFirstUrl), nameof(SampleImageService));
|
||||
return ret;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(GetFirstUrl), nameof(SampleImageService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public async Task<ImageUrlDto> GetUploadUrl()
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to get the upload image url | Method: {method} | Class: {class}", nameof(GetUploadUrl), nameof(SampleImageService));
|
||||
var ret = await _sampleImageRepository.GetUploadUrl();
|
||||
_logger.Information("Finishing to get the upload image url | Method: {method} | Class: {class}", nameof(GetUploadUrl), nameof(SampleImageService));
|
||||
return ret;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(GetUploadUrl), nameof(SampleImageService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
114
Core.Blueprint.DAL.Service/SampleItemService.cs
Normal file
114
Core.Blueprint.DAL.Service/SampleItemService.cs
Normal file
@ -0,0 +1,114 @@
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.DAL.Service.Contracts;
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
using Serilog;
|
||||
|
||||
|
||||
namespace Core.Blueprint.DAL.Service
|
||||
{
|
||||
//[LoggingAttribute]
|
||||
public class SampleItemService : ISampleItemService
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
private readonly IRepositoryIdentityBase<SampleItem> _repository;
|
||||
public SampleItemService(ISampleItemRepository repository, ILogger logger)
|
||||
{
|
||||
_repository = repository;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
//[LoggingAttribute] //Time of request, class name, class method... memory usage....
|
||||
public virtual async ValueTask<SampleItem> CreateAsync(SampleItem entity)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to create the Sample item");
|
||||
var ret = await _repository.CreateAsync(entity);
|
||||
_logger.Information("Finishing to create the Sample item | Method: {method} | Class: {class}", nameof(CreateAsync), nameof(SampleItemService));
|
||||
return ret;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(CreateAsync), nameof(SampleItemService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public virtual async ValueTask<bool> DeleteAsync(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to delete the Sample item | Method: {method} | Class: {class}", nameof(DeleteAsync), nameof(SampleItemService));
|
||||
var ret = await _repository.DeleteAsync(id);
|
||||
_logger.Information("Finishing to delete the Sample item | Method: {method} | Class: {class}", nameof(DeleteAsync), nameof(SampleItemService));
|
||||
return ret;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(DeleteAsync), nameof(SampleItemService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public virtual async ValueTask<IEnumerable<SampleItem>> GetAllAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to get all Sample item | Method: {method} | Class: {class}", nameof(GetAllAsync), nameof(SampleItemService));
|
||||
var ret = await _repository.GetAllAsync();
|
||||
_logger.Information("Finishing to get all Sample item | Method: {method} | Class: {class}", nameof(GetAllAsync), nameof(SampleItemService));
|
||||
return ret;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(GetAllAsync), nameof(SampleItemService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public virtual async ValueTask<SampleItem> GetByIdAsync(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to get Sample item by id | Method: {method} | Class: {class}", nameof(GetByIdAsync), nameof(SampleItemService));
|
||||
var ret = await _repository.GetByIdAsync(id);
|
||||
_logger.Information("Finishing to get all Sample item | Method: {method} | Class: {class}", nameof(GetByIdAsync), nameof(SampleItemService));
|
||||
return ret;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(GetByIdAsync), nameof(SampleItemService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public virtual async Task<bool> UpdateAsync(string id, SampleItem entity)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to update Sample item | Method: {method} | Class: {class}", nameof(UpdateAsync), nameof(SampleItemService));
|
||||
var ret = await _repository.UpdateAsync(id, entity);
|
||||
_logger.Information("Finishing to update Sample item | Method: {method} | Class: {class}", nameof(UpdateAsync), nameof(SampleItemService));
|
||||
return ret;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(UpdateAsync), nameof(SampleItemService));
|
||||
return default;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
76
Core.Blueprint.DAL.Service/SecretService.cs
Normal file
76
Core.Blueprint.DAL.Service/SecretService.cs
Normal file
@ -0,0 +1,76 @@
|
||||
using Core.Blueprint.DAL.Infrastructure.Contracts;
|
||||
using Core.Blueprint.DAL.Service.Contracts;
|
||||
using Core.Blueprint.Domain.Entities;
|
||||
using Serilog;
|
||||
using SharpCompress.Common;
|
||||
|
||||
namespace Core.Blueprint.DAL.Service
|
||||
{
|
||||
public class SecretService : ISecretService
|
||||
{
|
||||
private readonly ISecretRepository _repository;
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public SecretService(ISecretRepository repository, ILogger logger)
|
||||
{
|
||||
_repository = repository;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<Secret> GetSecret(string secretName, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to get the secret | Method: {method} | Class: {class}", nameof(GetSecret), nameof(SecretService));
|
||||
var ret = await _repository.GetSecret(secretName, cancellationToken);
|
||||
_logger.Information("Finishing to get the secret | Method: {method} | Class: {class}", nameof(GetSecret), nameof(SecretService));
|
||||
return ret;
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(GetSecret), nameof(SecretService));
|
||||
return default;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SetSecret(string secretName, string secretValue, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to set the secret | Method: {method} | Class: {class}", nameof(SetSecret), nameof(SecretService));
|
||||
await _repository.SetSecret(secretName, secretValue, cancellationToken);
|
||||
_logger.Information("Finishing to set the secret | Method: {method} | Class: {class}", nameof(SetSecret), nameof(SecretService));
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(SetSecret), nameof(SecretService));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public async Task RemoveSecret(string secretName, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
_logger.Information("Starting to remove the secret | Method: {method} | Class: {class}", nameof(RemoveSecret), nameof(SecretService));
|
||||
await _repository.RemoveSecret(secretName, cancellationToken);
|
||||
_logger.Information("Finishing to remove the secret | Method: {method} | Class: {class}", nameof(RemoveSecret), nameof(SecretService));
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
_logger.Error(ex, "{error} | Method: {method} | Class: {class}", ex.Message, nameof(RemoveSecret), nameof(SecretService));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
16
Core.Blueprint.DAL.Storage/Contracts/IBlobStorageService.cs
Normal file
16
Core.Blueprint.DAL.Storage/Contracts/IBlobStorageService.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using Azure;
|
||||
using Azure.Storage.Blobs.Models;
|
||||
using Core.Blueprint.Storage;
|
||||
using Core.Blueprint.Storage.Adapters;
|
||||
|
||||
namespace Core.Blueprint.DAL.Storage.Contracts
|
||||
{
|
||||
public interface IBlobStorageService
|
||||
{
|
||||
Task<IEnumerable<BlobFileAdapter>> GetBlobsListAsync(string? prefix);
|
||||
Task<Response<BlobContentInfo>> UploadBlobAsync(string blobName, Stream content);
|
||||
Task<BlobFileAdapter> UploadBlobAsync(BlobAddDto newBlob);
|
||||
BlobDownloadUriAdapter DownloadBlobAsync(string blobName);
|
||||
Task<BlobFileAdapter?> DeleteBlobAsync(string fileName);
|
||||
}
|
||||
}
|
||||
22
Core.Blueprint.DAL.Storage/Core.Blueprint.DAL.Storage.csproj
Normal file
22
Core.Blueprint.DAL.Storage/Core.Blueprint.DAL.Storage.csproj
Normal file
@ -0,0 +1,22 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Provider\BlobStorageService - Copy.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Azure.Identity" Version="1.13.1" />
|
||||
<PackageReference Include="Azure.Storage.Blobs" Version="12.23.0" />
|
||||
<PackageReference Include="Core.Blueprint.Storage" Version="0.3.0-alpha0049" />
|
||||
<PackageReference Include="Microsoft.Extensions.Azure" Version="1.9.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
41
Core.Blueprint.DAL.Storage/Provider/BlobStorageService.cs
Normal file
41
Core.Blueprint.DAL.Storage/Provider/BlobStorageService.cs
Normal file
@ -0,0 +1,41 @@
|
||||
using Azure;
|
||||
using Azure.Storage.Blobs.Models;
|
||||
using Core.Blueprint.DAL.Storage.Contracts;
|
||||
using Core.Blueprint.Storage;
|
||||
using Core.Blueprint.Storage.Adapters;
|
||||
using Core.Blueprint.Storage.Contracts;
|
||||
|
||||
namespace Core.Blueprint.DAL.Storage.Service
|
||||
{
|
||||
public class BlobStorageService(IBlobStorageProvider blobStorageProvider) : IBlobStorageService
|
||||
{
|
||||
|
||||
public async Task<Response<BlobContentInfo>> UploadBlobAsync(string blobName, Stream content)
|
||||
{
|
||||
var result = await blobStorageProvider.UploadBlobAsync(blobName, content);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<BlobFileAdapter> UploadBlobAsync(BlobAddDto newBlob)
|
||||
{
|
||||
var result = await blobStorageProvider.UploadBlobAsync(newBlob);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<BlobFileAdapter>> GetBlobsListAsync(string? prefix)
|
||||
{
|
||||
return await blobStorageProvider.ListBlobsAsync(prefix);
|
||||
}
|
||||
|
||||
public BlobDownloadUriAdapter DownloadBlobAsync(string blobName)
|
||||
{
|
||||
var result = blobStorageProvider.GenerateBlobDownloadUri(blobName);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<BlobFileAdapter?> DeleteBlobAsync(string blobName)
|
||||
{
|
||||
return await blobStorageProvider.DeleteBlobsAsync(blobName);
|
||||
}
|
||||
}
|
||||
}
|
||||
25
Core.Blueprint.DAL.Testing/Core.Blueprint.DAL.Testing.csproj
Normal file
25
Core.Blueprint.DAL.Testing/Core.Blueprint.DAL.Testing.csproj
Normal file
@ -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.11.1" />
|
||||
<PackageReference Include="xunit" Version="2.9.2" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.2">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
81
Core.Blueprint.DAL.sln
Normal file
81
Core.Blueprint.DAL.sln
Normal file
@ -0,0 +1,81 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.8.34309.116
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.DAL.API", "Core.Blueprint.DAL.API\Core.Blueprint.DAL.API.csproj", "{D66611EE-2AE0-48B2-8D79-AF10A5E11C91}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Presentation", "Presentation", "{0DD43B65-17E6-4AA2-BE35-F9C7FCB5DD18}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BuildingBlocks", "BuildingBlocks", "{4D299A91-3EDD-4ABF-B134-CE4966E8C990}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.DAL.SQLServer", "Core.Blueprint.DAL.SQLServer\Core.Blueprint.DAL.SQLServer.csproj", "{546B418A-2DBD-499D-B7AA-57078231B950}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.DAL.Storage", "Core.Blueprint.DAL.Storage\Core.Blueprint.DAL.Storage.csproj", "{B744C1BC-7EDA-47C5-BC04-91D0FB061985}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.DAL.Hangfire", "Core.Blueprint.DAL.Hangfire\Core.Blueprint.DAL.Hangfire.csproj", "{5D3F8418-7BFA-4EA7-ADE7-7285A91FB1D9}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.DAL.Mongo", "Core.Blueprint.DAL.Mongo\Core.Blueprint.DAL.Mongo.csproj", "{14F77CBD-952F-40F1-8568-A084EF7D2224}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.DAL.Redis", "Core.Blueprint.DAL.Redis\Core.Blueprint.DAL.Redis.csproj", "{CD655B60-8C94-494A-87BA-F689CDD65F2B}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.DAL.Logs", "Core.Blueprint.DAL.Logs\Core.Blueprint.DAL.Logs.csproj", "{B91E1D72-FB2E-4532-83E9-3E9EF2231740}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.DAL.KeyVault", "Core.Blueprint.DAL.KeyVault\Core.Blueprint.DAL.KeyVault.csproj", "{ACE11F5D-338D-4DF0-B2A1-D8886DEC4B1E}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D66611EE-2AE0-48B2-8D79-AF10A5E11C91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D66611EE-2AE0-48B2-8D79-AF10A5E11C91}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D66611EE-2AE0-48B2-8D79-AF10A5E11C91}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D66611EE-2AE0-48B2-8D79-AF10A5E11C91}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{546B418A-2DBD-499D-B7AA-57078231B950}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{546B418A-2DBD-499D-B7AA-57078231B950}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{546B418A-2DBD-499D-B7AA-57078231B950}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{546B418A-2DBD-499D-B7AA-57078231B950}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B744C1BC-7EDA-47C5-BC04-91D0FB061985}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B744C1BC-7EDA-47C5-BC04-91D0FB061985}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B744C1BC-7EDA-47C5-BC04-91D0FB061985}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B744C1BC-7EDA-47C5-BC04-91D0FB061985}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5D3F8418-7BFA-4EA7-ADE7-7285A91FB1D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5D3F8418-7BFA-4EA7-ADE7-7285A91FB1D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5D3F8418-7BFA-4EA7-ADE7-7285A91FB1D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5D3F8418-7BFA-4EA7-ADE7-7285A91FB1D9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{14F77CBD-952F-40F1-8568-A084EF7D2224}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{14F77CBD-952F-40F1-8568-A084EF7D2224}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{14F77CBD-952F-40F1-8568-A084EF7D2224}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{14F77CBD-952F-40F1-8568-A084EF7D2224}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CD655B60-8C94-494A-87BA-F689CDD65F2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CD655B60-8C94-494A-87BA-F689CDD65F2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CD655B60-8C94-494A-87BA-F689CDD65F2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CD655B60-8C94-494A-87BA-F689CDD65F2B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B91E1D72-FB2E-4532-83E9-3E9EF2231740}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B91E1D72-FB2E-4532-83E9-3E9EF2231740}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B91E1D72-FB2E-4532-83E9-3E9EF2231740}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B91E1D72-FB2E-4532-83E9-3E9EF2231740}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{ACE11F5D-338D-4DF0-B2A1-D8886DEC4B1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{ACE11F5D-338D-4DF0-B2A1-D8886DEC4B1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{ACE11F5D-338D-4DF0-B2A1-D8886DEC4B1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{ACE11F5D-338D-4DF0-B2A1-D8886DEC4B1E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{D66611EE-2AE0-48B2-8D79-AF10A5E11C91} = {0DD43B65-17E6-4AA2-BE35-F9C7FCB5DD18}
|
||||
{546B418A-2DBD-499D-B7AA-57078231B950} = {4D299A91-3EDD-4ABF-B134-CE4966E8C990}
|
||||
{B744C1BC-7EDA-47C5-BC04-91D0FB061985} = {4D299A91-3EDD-4ABF-B134-CE4966E8C990}
|
||||
{5D3F8418-7BFA-4EA7-ADE7-7285A91FB1D9} = {4D299A91-3EDD-4ABF-B134-CE4966E8C990}
|
||||
{14F77CBD-952F-40F1-8568-A084EF7D2224} = {4D299A91-3EDD-4ABF-B134-CE4966E8C990}
|
||||
{CD655B60-8C94-494A-87BA-F689CDD65F2B} = {4D299A91-3EDD-4ABF-B134-CE4966E8C990}
|
||||
{B91E1D72-FB2E-4532-83E9-3E9EF2231740} = {4D299A91-3EDD-4ABF-B134-CE4966E8C990}
|
||||
{ACE11F5D-338D-4DF0-B2A1-D8886DEC4B1E} = {4D299A91-3EDD-4ABF-B134-CE4966E8C990}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {A74EEA93-F8F3-4607-92C8-D94D5E7F305C}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@ -0,0 +1,18 @@
|
||||
namespace Core.Blueprint.Domain.Contexts.SQLServer.BaseConfig
|
||||
{
|
||||
public abstract class BaseSQLEntity
|
||||
{
|
||||
public Guid Id { get; set; } = Guid.NewGuid();
|
||||
|
||||
public Guid TransactionalId { get; private set; }
|
||||
public DateTime Created = DateTime.Now;
|
||||
public DateTime Update { get; private set; }
|
||||
|
||||
|
||||
public void IsUpdate()
|
||||
{
|
||||
TransactionalId = Guid.NewGuid();
|
||||
Update = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
20
Core.Blueprint.Domain/Core.Blueprint.Domain.csproj
Normal file
20
Core.Blueprint.Domain/Core.Blueprint.Domain.csproj
Normal file
@ -0,0 +1,20 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MongoDB.Bson" Version="3.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Contexts\Mongo\" />
|
||||
<Folder Include="Contexts\KeyVault\" />
|
||||
<Folder Include="Contexts\Storage\" />
|
||||
<Folder Include="Contexts\Redis\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
7
Core.Blueprint.Domain/Dtos/ImageUrlDto.cs
Normal file
7
Core.Blueprint.Domain/Dtos/ImageUrlDto.cs
Normal file
@ -0,0 +1,7 @@
|
||||
namespace Core.Blueprint.Domain.Dtos
|
||||
{
|
||||
public class ImageUrlDto
|
||||
{
|
||||
public Uri Url { get; set; }
|
||||
}
|
||||
}
|
||||
14
Core.Blueprint.Domain/Dtos/KeyVaultSecretDto.cs
Normal file
14
Core.Blueprint.Domain/Dtos/KeyVaultSecretDto.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Core.Blueprint.Domain.Dtos
|
||||
{
|
||||
public class KeyVaultSecretDto
|
||||
{
|
||||
public string Key { get; set; }
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
||||
14
Core.Blueprint.Domain/Entities/AbsEntity.cs
Normal file
14
Core.Blueprint.Domain/Entities/AbsEntity.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using MongoDB.Bson.Serialization.Attributes;
|
||||
using MongoDB.Bson;
|
||||
|
||||
namespace Core.Blueprint.Domain.Entities
|
||||
{
|
||||
public abstract class AbsEntity
|
||||
{
|
||||
[BsonId]
|
||||
[BsonRepresentation(BsonType.ObjectId)]
|
||||
[BsonElement("_id")]
|
||||
public string? Id { get; set; }
|
||||
public char StatusCode { get; set; } = 'P';
|
||||
}
|
||||
}
|
||||
7
Core.Blueprint.Domain/Entities/AbsFileEntity.cs
Normal file
7
Core.Blueprint.Domain/Entities/AbsFileEntity.cs
Normal file
@ -0,0 +1,7 @@
|
||||
namespace Core.Blueprint.Domain.Entities
|
||||
{
|
||||
public abstract class AbsFileEntity : AbsEntity
|
||||
{
|
||||
public byte[] FileContent { get; set; } = [];
|
||||
}
|
||||
}
|
||||
15
Core.Blueprint.Domain/Entities/BlueprintCollection.cs
Normal file
15
Core.Blueprint.Domain/Entities/BlueprintCollection.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using Core.Blueprint.Domain.Shared;
|
||||
using MongoDB.Bson;
|
||||
using MongoDB.Bson.Serialization.Attributes;
|
||||
|
||||
namespace Core.Blueprint.Domain.Entities
|
||||
{
|
||||
[CollectionAttributeName("blueprint")]
|
||||
public class BlueprintCollection : AbsEntity
|
||||
{
|
||||
public Guid CorrelationId { get; set; }
|
||||
|
||||
public DateTime Created { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
7
Core.Blueprint.Domain/Entities/SampleImage.cs
Normal file
7
Core.Blueprint.Domain/Entities/SampleImage.cs
Normal file
@ -0,0 +1,7 @@
|
||||
namespace Core.Blueprint.Domain.Entities
|
||||
{
|
||||
public class SampleImage : AbsFileEntity
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
17
Core.Blueprint.Domain/Entities/SampleItem.cs
Normal file
17
Core.Blueprint.Domain/Entities/SampleItem.cs
Normal file
@ -0,0 +1,17 @@
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace Core.Blueprint.Domain.Entities
|
||||
{
|
||||
[Table("Blueprint_Test01")]
|
||||
public class SampleItem : AbsEntity
|
||||
{
|
||||
public Guid Id { get; set; } = Guid.NewGuid();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//User - Project
|
||||
13
Core.Blueprint.Domain/Entities/Secret.cs
Normal file
13
Core.Blueprint.Domain/Entities/Secret.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.Domain.Entities
|
||||
{
|
||||
public class Secret
|
||||
{
|
||||
public string? Value { get; set; }
|
||||
}
|
||||
}
|
||||
12
Core.Blueprint.Domain/Shared/CollectionAttributeName.cs
Normal file
12
Core.Blueprint.Domain/Shared/CollectionAttributeName.cs
Normal file
@ -0,0 +1,12 @@
|
||||
namespace Core.Blueprint.Domain.Shared
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public class CollectionAttributeName : Attribute
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public CollectionAttributeName(string name)
|
||||
{
|
||||
Name = name;
|
||||
}
|
||||
}
|
||||
}
|
||||
48
Lib.Common.LoggingAPI.Service/Constants/Claims.cs
Normal file
48
Lib.Common.LoggingAPI.Service/Constants/Claims.cs
Normal file
@ -0,0 +1,48 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="Claims.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
namespace Lib.Common.LoggingAPI.Service.Constants
|
||||
{
|
||||
/// <summary>
|
||||
/// Constants for claims used in JWT tokens.
|
||||
/// </summary>
|
||||
public class Claims
|
||||
{
|
||||
/// <summary>
|
||||
/// Claim name for user's name.
|
||||
/// </summary>
|
||||
public const string Name = "name";
|
||||
|
||||
/// <summary>
|
||||
/// Claim name for user's name.
|
||||
/// </summary>
|
||||
public const string Email = "email";
|
||||
|
||||
/// <summary>
|
||||
/// Claim name for user's ID.
|
||||
/// </summary>
|
||||
public const string Id = "id";
|
||||
|
||||
/// <summary>
|
||||
/// Claim name for user's role ID.
|
||||
/// </summary>
|
||||
public const string Rol = "rol";
|
||||
|
||||
/// <summary>
|
||||
/// Claim name for user's companies.
|
||||
/// </summary>
|
||||
public const string Companies = "companies";
|
||||
|
||||
/// <summary>
|
||||
/// Claim name for user's projects.
|
||||
/// </summary>
|
||||
public const string Projects = "projects";
|
||||
|
||||
/// <summary>
|
||||
/// Claim name for user's surveys.
|
||||
/// </summary>
|
||||
public const string Surveys = "surveys";
|
||||
}
|
||||
}
|
||||
397
Lib.Common.LoggingAPI.Service/Constants/DisplayNames.cs
Normal file
397
Lib.Common.LoggingAPI.Service/Constants/DisplayNames.cs
Normal file
@ -0,0 +1,397 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="DisplayNames.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
|
||||
namespace Lib.Common.LoggingAPI.Service.Constants
|
||||
{
|
||||
/// <summary>
|
||||
/// Constants of the display names for this service.
|
||||
/// </summary>
|
||||
public static class DisplayNames
|
||||
{
|
||||
/// <summary>
|
||||
/// The active patameter.
|
||||
/// </summary>
|
||||
public const string Active = "active";
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The client identifier parameter.
|
||||
/// </summary>
|
||||
public const string ClientId = "clientId";
|
||||
|
||||
/// <summary>
|
||||
/// The client request parameter.
|
||||
/// </summary>
|
||||
public const string ClientRequest = "clientRequest";
|
||||
|
||||
/// <summary>
|
||||
/// The client response parameter.
|
||||
/// </summary>
|
||||
public const string ClientResponse = "clientResponse";
|
||||
|
||||
/// <summary>
|
||||
/// The creation date.
|
||||
/// </summary>
|
||||
public const string CreationDate = "creationDate";
|
||||
|
||||
/// <summary>
|
||||
/// The content parameter.
|
||||
/// </summary>
|
||||
public const string Content = "content";
|
||||
|
||||
/// <summary>
|
||||
/// The delete parameter.
|
||||
/// </summary>
|
||||
public const string Delete = "delete";
|
||||
|
||||
/// <summary>
|
||||
/// The description parameter.
|
||||
/// </summary>
|
||||
public const string Description = "description";
|
||||
|
||||
/// <summary>
|
||||
/// The detail parameter.
|
||||
/// </summary>
|
||||
public const string Detail = "detail";
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The environment parameter.
|
||||
/// </summary>
|
||||
public const string Environment = "environment";
|
||||
|
||||
/// <summary>
|
||||
/// The error log severity level parameter.
|
||||
/// </summary>
|
||||
public const string Error = "error";
|
||||
|
||||
/// <summary>
|
||||
/// The error code parameter.
|
||||
/// </summary>
|
||||
public const string ErrorCode = "errorCode";
|
||||
|
||||
/// <summary>
|
||||
/// The external request parameter.
|
||||
/// </summary>
|
||||
public const string ExternalRequest = "externalRequest";
|
||||
|
||||
/// <summary>
|
||||
/// The external response parameter.
|
||||
/// </summary>
|
||||
public const string ExternalResponse = "externalResponse";
|
||||
|
||||
/// <summary>
|
||||
/// The fatal log severity level parameter.
|
||||
/// </summary>
|
||||
public const string Fatal = "fatal";
|
||||
|
||||
/// <summary>
|
||||
/// The host parameter.
|
||||
/// </summary>
|
||||
public const string Host = "host";
|
||||
|
||||
/// <summary>
|
||||
/// The identifier parameter.
|
||||
/// </summary>
|
||||
public const string Id = "id";
|
||||
|
||||
/// <summary>
|
||||
/// The inactive parameter.
|
||||
/// </summary>
|
||||
public const string Inactive = "inactive";
|
||||
|
||||
/// <summary>
|
||||
/// The info log severity level parameter.
|
||||
/// </summary>
|
||||
public const string Info = "info";
|
||||
|
||||
/// <summary>
|
||||
/// The information log severity level parameter.
|
||||
/// </summary>
|
||||
public const string Information = "information";
|
||||
|
||||
/// <summary>
|
||||
/// The media parameter.
|
||||
/// </summary>
|
||||
public const string Media = "media";
|
||||
|
||||
/// <summary>
|
||||
/// The media type parameter.
|
||||
/// </summary>
|
||||
public const string MediaType = "mediaType";
|
||||
|
||||
/// <summary>
|
||||
/// The media use type parameter.
|
||||
/// </summary>
|
||||
public const string MediaUseType = "mediaUseType";
|
||||
|
||||
/// <summary>
|
||||
/// Th message parameter.
|
||||
/// </summary>
|
||||
public const string Message = "message";
|
||||
|
||||
/// <summary>
|
||||
/// The method parameter.
|
||||
/// </summary>
|
||||
public const string Method = "method";
|
||||
|
||||
/// <summary>
|
||||
/// The monday parameter.
|
||||
/// </summary>
|
||||
public const string Monday = "monday";
|
||||
|
||||
/// <summary>
|
||||
/// The MXN parameter.
|
||||
/// </summary>
|
||||
public const string MXN = "MXN";
|
||||
|
||||
/// <summary>
|
||||
/// The name parameter.
|
||||
/// </summary>
|
||||
public const string Name = "name";
|
||||
|
||||
/// <summary>
|
||||
/// The next page parameter.
|
||||
/// </summary>
|
||||
public const string NextPage = "nextPage";
|
||||
|
||||
/// <summary>
|
||||
/// The nick name parameter.
|
||||
/// </summary>
|
||||
public const string NickName = "nickName";
|
||||
|
||||
/// <summary>
|
||||
/// The note parameter.
|
||||
/// </summary>
|
||||
public const string Note = "note";
|
||||
|
||||
/// <summary>
|
||||
/// The not so affordable parameter.
|
||||
/// </summary>
|
||||
public const string NotSoAffordable = "notSoAffordable";
|
||||
|
||||
/// <summary>
|
||||
/// The object status parameter.
|
||||
/// </summary>
|
||||
public const string ObjectStatus = "objectStatus";
|
||||
|
||||
/// <summary>
|
||||
/// The opening time parameter.
|
||||
/// </summary>
|
||||
public const string OpeningTime = "openingTime";
|
||||
|
||||
/// <summary>
|
||||
/// The operation days parameter.
|
||||
/// </summary>
|
||||
public const string OperationDays = "operationDays";
|
||||
|
||||
/// <summary>
|
||||
/// The page parameter.
|
||||
/// </summary>
|
||||
public const string Page = "page";
|
||||
|
||||
/// <summary>
|
||||
/// The page count parameter.
|
||||
/// </summary>
|
||||
public const string PageCount = "pageCount";
|
||||
|
||||
/// <summary>
|
||||
/// The page metadata parameter.
|
||||
/// </summary>
|
||||
public const string PageMetadata = "pageMetadata";
|
||||
|
||||
/// <summary>
|
||||
/// The page size parameter.
|
||||
/// </summary>
|
||||
public const string PageSize = "pageSize";
|
||||
|
||||
/// <summary>
|
||||
/// The parent identifier parameter.
|
||||
/// </summary>
|
||||
public const string ParentId = "ParentId";
|
||||
|
||||
/// <summary>
|
||||
/// The pet ticket price parameter.
|
||||
/// </summary>
|
||||
public const string PetTicketPrice = "petTicketPrice";
|
||||
|
||||
/// <summary>
|
||||
/// The place parameter.
|
||||
/// </summary>
|
||||
public const string Place = "place";
|
||||
|
||||
/// <summary>
|
||||
/// The place type parameter.
|
||||
/// </summary>
|
||||
public const string PlaceType = "placeType";
|
||||
|
||||
/// <summary>
|
||||
/// The previous page parameter.
|
||||
/// </summary>
|
||||
public const string PreviousPage = "previousPage";
|
||||
|
||||
/// <summary>
|
||||
/// The provider identifier parameter.
|
||||
/// </summary>
|
||||
public const string ProviderId = "providerId";
|
||||
|
||||
/// <summary>
|
||||
/// The provider type identifier parameter.
|
||||
/// </summary>
|
||||
public const string ProviderTypeId = "providerTypeId";
|
||||
|
||||
/// <summary>
|
||||
/// The request identifier parameter.
|
||||
/// </summary>
|
||||
public const string RequestId = "requestId";
|
||||
|
||||
/// <summary>
|
||||
/// The RNT identifier parameter.
|
||||
/// </summary>
|
||||
public const string RntId = "rntId";
|
||||
|
||||
/// <summary>
|
||||
/// The route parameter.
|
||||
/// </summary>
|
||||
public const string Route = "route";
|
||||
|
||||
/// <summary>
|
||||
/// The operation parameter.
|
||||
/// </summary>
|
||||
public const string Operation = "operation";
|
||||
|
||||
/// <summary>
|
||||
/// The other ticket price parameter.
|
||||
/// </summary>
|
||||
public const string OtherTicketPrice = "otherTicketPrice";
|
||||
|
||||
/// <summary>
|
||||
/// The path parameter.
|
||||
/// </summary>
|
||||
public const string Path = "path";
|
||||
|
||||
/// <summary>
|
||||
/// The saturday parameter.
|
||||
/// </summary>
|
||||
public const string Saturday = "saturday";
|
||||
|
||||
/// <summary>
|
||||
/// The secondary parameter.
|
||||
/// </summary>
|
||||
public const string Secondary = "secondary";
|
||||
|
||||
/// <summary>
|
||||
/// The service health parameter.
|
||||
/// </summary>
|
||||
public const string ServiceHealth = "serviceHealth";
|
||||
|
||||
/// <summary>
|
||||
/// The service identifier parameter.
|
||||
/// </summary>
|
||||
public const string ServiceId = "serviceId";
|
||||
|
||||
/// <summary>
|
||||
/// The severity parameter.
|
||||
/// </summary>
|
||||
public const string Severity = "severity";
|
||||
|
||||
/// <summary>
|
||||
/// The state identifier parameter.
|
||||
/// </summary>
|
||||
public const string StateId = "stateId";
|
||||
|
||||
/// <summary>
|
||||
/// The region identifier parameter.
|
||||
/// </summary>
|
||||
public const string StateProvinceRegionId = "regionId";
|
||||
|
||||
/// <summary>
|
||||
/// The sunday parameter.
|
||||
/// </summary>
|
||||
public const string Sunday = "sunday";
|
||||
|
||||
/// <summary>
|
||||
/// The tax identifier parameter.
|
||||
/// </summary>
|
||||
public const string TaxId = "taxId";
|
||||
|
||||
/// <summary>
|
||||
/// The target parameter.
|
||||
/// </summary>
|
||||
public const string Target = "target";
|
||||
|
||||
/// <summary>
|
||||
/// The thursday parameter.
|
||||
/// </summary>
|
||||
public const string Thursday = "thursday";
|
||||
|
||||
/// <summary>
|
||||
/// The timestamp parameter.
|
||||
/// </summary>
|
||||
public const string Timestamp = "timestamp";
|
||||
|
||||
/// <summary>
|
||||
/// The total items parameter.
|
||||
/// </summary>
|
||||
public const string TotalItems = "totalItems";
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the transaction identifier parameter.
|
||||
/// </summary>
|
||||
public const string TransactionId = "transactionId";
|
||||
|
||||
/// <summary>
|
||||
/// The tuesday parameter.
|
||||
/// </summary>
|
||||
public const string Tuesday = "tuesday";
|
||||
|
||||
/// <summary>
|
||||
/// The URI parameter.
|
||||
/// </summary>
|
||||
public const string Uri = "uri";
|
||||
|
||||
/// <summary>
|
||||
/// The update parameter.
|
||||
/// </summary>
|
||||
public const string Update = "update";
|
||||
|
||||
/// <summary>
|
||||
/// The x-forwarded-for header parameter.
|
||||
/// </summary>
|
||||
public const string XForwardedFor = "xForwardedFor";
|
||||
|
||||
/// <summary>
|
||||
/// The x-forwarded-for header parameter.
|
||||
/// </summary>
|
||||
public const string XForwardedForHeader = "X-Forwarded-For";
|
||||
|
||||
/// <summary>
|
||||
/// The final currency identifier parameter.
|
||||
/// </summary>
|
||||
public const string CurrencyId = "currencyId";
|
||||
|
||||
/// <summary>
|
||||
/// The user identifier parameter.
|
||||
/// </summary>
|
||||
public const string UserId = "userId";
|
||||
|
||||
/// <summary>
|
||||
/// The user parameter.
|
||||
/// </summary>
|
||||
public const string User = "user";
|
||||
|
||||
/// <summary>
|
||||
/// The warning log severity level.
|
||||
/// </summary>
|
||||
public const string Warning = "warning";
|
||||
|
||||
/// <summary>
|
||||
/// The email parameter.
|
||||
/// </summary>
|
||||
public const string Email = "email";
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="EnvironmentVariables.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
|
||||
namespace Lib.Common.LoggingAPI.Service.Constants
|
||||
{
|
||||
/// <summary>
|
||||
/// Constants of the environment variables for this service.
|
||||
/// </summary>
|
||||
public static class EnvironmentVariables
|
||||
{
|
||||
/// <summary>
|
||||
/// The stage environment vriable.
|
||||
/// </summary>
|
||||
public const string Stage = "ASPNETCORE_ENVIRONMENT";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
79
Lib.Common.LoggingAPI.Service/Constants/ErrorCodes.cs
Normal file
79
Lib.Common.LoggingAPI.Service/Constants/ErrorCodes.cs
Normal file
@ -0,0 +1,79 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="ErrorCodes.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
|
||||
namespace Lib.Common.LoggingAPI.Service.Constants
|
||||
{
|
||||
/// <summary>
|
||||
/// Constants for the error codes.
|
||||
/// </summary>
|
||||
public static class ErrorCodes
|
||||
{
|
||||
/// <summary>
|
||||
/// The generic entities not found error code.
|
||||
/// </summary>
|
||||
public const string EntitiesNotFound = "{0}EntitiesNotFound";
|
||||
|
||||
/// <summary>
|
||||
/// The entity already exsits error message.
|
||||
/// </summary>
|
||||
public const string EntityAlreadyExists = "{0}EntityAlreadyExists";
|
||||
|
||||
/// <summary>
|
||||
/// The generic entity not found error code.
|
||||
/// </summary>
|
||||
public const string EntityNotFound = "{0}EntityNotFound";
|
||||
|
||||
/// <summary>
|
||||
/// The generic not supported error code.
|
||||
/// </summary>
|
||||
public const string EntityNotSupported = "{0}NotSupported";
|
||||
|
||||
/// <summary>
|
||||
/// The internal server error code.
|
||||
/// </summary>
|
||||
public const string InternalServerError = "InternalServerError";
|
||||
|
||||
/// <summary>
|
||||
/// The invalid parameters in mapper error code.
|
||||
/// </summary>
|
||||
public const string InvalidParametersMapper = "InvalidParametersMapper";
|
||||
|
||||
/// <summary>
|
||||
/// The page size invalid value error code.
|
||||
/// </summary>
|
||||
public const string PageSizeInvalidValue = "PageSizeInvalidValue";
|
||||
|
||||
/// <summary>
|
||||
/// The page ot of range error code.
|
||||
/// </summary>
|
||||
public const string PageOutOfRange = "PageOutOfRange";
|
||||
|
||||
/// <summary>
|
||||
/// The property does not match the regular expresion error code.
|
||||
/// </summary>
|
||||
public const string PropertyDoesNotMatchRegex = "{0}PropertyDoesNotMatchRegex";
|
||||
|
||||
/// <summary>
|
||||
/// The property is required error code.
|
||||
/// </summary>
|
||||
public const string PropertyIsRequired = "{0}PropertyIsRequired";
|
||||
|
||||
/// <summary>
|
||||
/// The property length invalid error code.
|
||||
/// </summary>
|
||||
public const string PropertyLengthInvalid = "{0}PropertyLengthInvalid";
|
||||
|
||||
/// <summary>
|
||||
/// The property must be in range error code.
|
||||
/// </summary>
|
||||
public const string PropertyMustBeInRange = "{0}PropertyMustBeInRange";
|
||||
|
||||
/// <summary>
|
||||
/// The route not found error code.
|
||||
/// </summary>
|
||||
public const string RouteNotFound = "RouteNotFound";
|
||||
}
|
||||
}
|
||||
10
Lib.Common.LoggingAPI.Service/Constants/Headers.cs
Normal file
10
Lib.Common.LoggingAPI.Service/Constants/Headers.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace Lib.Common.LoggingAPI.Service.Constants
|
||||
{
|
||||
public static class Headers
|
||||
{
|
||||
/// <summary>
|
||||
/// The authorization header.
|
||||
/// </summary>
|
||||
public const string Authorization = "Authorization";
|
||||
}
|
||||
}
|
||||
148
Lib.Common.LoggingAPI.Service/Constants/MimeTypes.cs
Normal file
148
Lib.Common.LoggingAPI.Service/Constants/MimeTypes.cs
Normal file
@ -0,0 +1,148 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="MimeTypes.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
|
||||
using System.Globalization;
|
||||
|
||||
namespace Lib.Common.LoggingAPI.Service.Constants
|
||||
{
|
||||
/// <summary>
|
||||
/// Constants for the mime types.
|
||||
/// </summary>
|
||||
public static class MimeTypes
|
||||
{
|
||||
/// <summary>
|
||||
/// The service application/json mime type.
|
||||
/// </summary>
|
||||
public const string ApplicationJson = "application/json";
|
||||
|
||||
/// <summary>
|
||||
/// The application/pdf mime type.
|
||||
/// </summary>
|
||||
public const string ApplicationPdf = "application/pdf";
|
||||
|
||||
/// <summary>
|
||||
/// The end index.
|
||||
/// </summary>
|
||||
public const int EndIndex = 5;
|
||||
|
||||
/// <summary>
|
||||
/// The JPEG extension.
|
||||
/// </summary>
|
||||
public const string ExtensionGif = "gif";
|
||||
|
||||
/// <summary>
|
||||
/// The JPEG extension.
|
||||
/// </summary>
|
||||
public const string ExtensionJpeg = "jpeg";
|
||||
|
||||
/// <summary>
|
||||
/// The PNG extension.
|
||||
/// </summary>
|
||||
public const string ExtensionPng = "png";
|
||||
|
||||
/// <summary>
|
||||
/// The SVG extension.
|
||||
/// </summary>
|
||||
public const string ExtensionSvg = "svg";
|
||||
|
||||
/// <summary>
|
||||
/// The image/gif mime type.
|
||||
/// </summary>
|
||||
public const string ImageGif = "image/gif";
|
||||
|
||||
/// <summary>
|
||||
/// The image/jpeg mime type.
|
||||
/// </summary>
|
||||
public const string ImageJpeg = "image/jpeg";
|
||||
|
||||
/// <summary>
|
||||
/// The image/png mime type.
|
||||
/// </summary>
|
||||
public const string ImagePng = "image/png";
|
||||
|
||||
/// <summary>
|
||||
/// The image/svg+xml mime type.
|
||||
/// </summary>
|
||||
public const string ImageSvg = "image/svg+xml";
|
||||
|
||||
/// <summary>
|
||||
/// The identifier GIF.
|
||||
/// </summary>
|
||||
public const string IdentifierGif = "R0LGO";
|
||||
|
||||
/// <summary>
|
||||
/// The identifier PNG.
|
||||
/// </summary>
|
||||
public const string IdentifierJpeg = "/9J/4";
|
||||
|
||||
/// <summary>
|
||||
/// The identifier PDF.
|
||||
/// </summary>
|
||||
public const string IdentifierPdf = "JVBER";
|
||||
|
||||
/// <summary>
|
||||
/// The identifier PNG.
|
||||
/// </summary>
|
||||
public const string IdentifierPng = "IVBOR";
|
||||
|
||||
/// <summary>
|
||||
/// The identifier SVG.
|
||||
/// </summary>
|
||||
public const string IdentifierSvg = "PHN2Z";
|
||||
|
||||
/// <summary>
|
||||
/// The parameter name.
|
||||
/// </summary>
|
||||
public const string ParameterName = "MimeType";
|
||||
|
||||
/// <summary>
|
||||
/// The start index.
|
||||
/// </summary>
|
||||
public const int StartIndex = 0;
|
||||
|
||||
/// <summary>
|
||||
/// The mime type dictionary.
|
||||
/// </summary>
|
||||
public static readonly Dictionary<string, string> Dictionary = new Dictionary<string, string>
|
||||
{
|
||||
{ IdentifierJpeg, ImageJpeg },
|
||||
{ IdentifierPng, ImagePng },
|
||||
{ IdentifierGif, ImageGif },
|
||||
{ IdentifierSvg, ImageSvg },
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// The mime type dictionary.
|
||||
/// </summary>
|
||||
public static readonly Dictionary<string, string> DictionaryExtension = new Dictionary<string, string>
|
||||
{
|
||||
{ IdentifierJpeg, ExtensionJpeg },
|
||||
{ IdentifierPng, ExtensionPng },
|
||||
{ IdentifierGif, ExtensionGif },
|
||||
{ IdentifierSvg, ExtensionSvg },
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Gets the mime type.
|
||||
/// </summary>
|
||||
/// <param name="content">The cpntent with mime type identifier, substring 0, 5 from content.</param>
|
||||
/// <returns>A <see cref="string"/> representing the value.</returns>
|
||||
public static string GetMimeType(this string content)
|
||||
{
|
||||
return Dictionary.FirstOrDefault(_ => _.Key == content[..EndIndex].ToUpper(CultureInfo.InvariantCulture)).Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the extension.
|
||||
/// </summary>
|
||||
/// <param name="content">The mime type identifier, substring 0, 5 from content.</param>
|
||||
/// <returns>A <see cref="string"/> representing the value.</returns>
|
||||
public static string GetExtension(this string content)
|
||||
{
|
||||
return DictionaryExtension.FirstOrDefault(_ => _.Key == content[..EndIndex].ToUpper(CultureInfo.InvariantCulture)).Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
29
Lib.Common.LoggingAPI.Service/Constants/Responses.cs
Normal file
29
Lib.Common.LoggingAPI.Service/Constants/Responses.cs
Normal file
@ -0,0 +1,29 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="Responses.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
|
||||
namespace Lib.Common.LoggingAPI.Service.Constants
|
||||
{
|
||||
/// <summary>
|
||||
/// Constants of the responses for this service.
|
||||
/// </summary>
|
||||
public static class Responses
|
||||
{
|
||||
/// <summary>
|
||||
/// The health response.
|
||||
/// </summary>
|
||||
public const string HealthyService = "healthy";
|
||||
|
||||
/// <summary>
|
||||
/// The route does not exist response.
|
||||
/// </summary>
|
||||
public const string RouteDoesNotExist = "The specified route '{0}' does not exist for method '{1}' in this service.";
|
||||
|
||||
/// <summary>
|
||||
/// The target response.
|
||||
/// </summary>
|
||||
public const string Target = "{0}|{1}://{2}{3}";
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="ErrorDetailsDto.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
|
||||
using Lib.Common.LoggingAPI.Service.Constants;
|
||||
using System.ComponentModel;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Lib.Common.LoggingAPI.Service.DataTransferObjects.Error
|
||||
{
|
||||
/// <summary>
|
||||
/// The service error details transfer object.
|
||||
/// </summary>
|
||||
public class ErrorDetailsDto
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the service error code.
|
||||
/// </summary>
|
||||
/// <example>healthy</example>
|
||||
[DisplayName(DisplayNames.ErrorCode)]
|
||||
[JsonPropertyName(DisplayNames.ErrorCode)]
|
||||
public string? ErrorCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the service error message.
|
||||
/// </summary>
|
||||
/// <example>This is an example message.</example>
|
||||
[DisplayName(DisplayNames.Message)]
|
||||
[JsonPropertyName(DisplayNames.Message)]
|
||||
public string? Message { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the service target.
|
||||
/// </summary>
|
||||
/// <example>healthy</example>
|
||||
[DisplayName(DisplayNames.Target)]
|
||||
[JsonPropertyName(DisplayNames.Target)]
|
||||
public string? Target { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="HttpErrorDto.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
|
||||
using Lib.Common.LoggingAPI.Service.Constants;
|
||||
using System.ComponentModel;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Lib.Common.LoggingAPI.Service.DataTransferObjects.Error
|
||||
{
|
||||
/// <summary>
|
||||
/// The service HTTP error data transfer object.
|
||||
/// </summary>
|
||||
public class HttpErrorDto
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the error.
|
||||
/// </summary>
|
||||
[DisplayName(DisplayNames.Error)]
|
||||
[JsonPropertyName(DisplayNames.Error)]
|
||||
public ErrorDetailsDto Error { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of <see cref="HttpErrorDto{TMessage}"/>
|
||||
/// with custom parameters.
|
||||
/// </summary>
|
||||
/// <param name="message">The HTTP error message.</param>
|
||||
/// <param name="errorCode">The HTTP error code.</param>
|
||||
/// <param name="target">The HTTP error target.</param>
|
||||
public HttpErrorDto(
|
||||
string? message,
|
||||
string? errorCode,
|
||||
string? target)
|
||||
{
|
||||
this.Error = new ErrorDetailsDto
|
||||
{
|
||||
ErrorCode = errorCode,
|
||||
Message = message,
|
||||
Target = target,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,121 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="LogDetail.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
|
||||
using Lib.Common.LoggingAPI.Service.Constants;
|
||||
using System.ComponentModel;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Lib.Common.LoggingAPI.Service.DataTransferObjects.Logger
|
||||
{
|
||||
/// <summary>
|
||||
/// The service logger detail object.
|
||||
/// </summary>
|
||||
/// <typeparam name="TMessage">The generic message type.</typeparam>
|
||||
public class LogDetail<TMessage>
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the log severity.
|
||||
/// </summary>
|
||||
/// <example>info</example>
|
||||
[DisplayName(DisplayNames.Severity)]
|
||||
[JsonPropertyName(DisplayNames.Severity)]
|
||||
public LogSeverity Severity { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the timestamp.
|
||||
/// </summary>
|
||||
[DisplayName(DisplayNames.Timestamp)]
|
||||
[JsonPropertyName(DisplayNames.Timestamp)]
|
||||
public DateTime Timestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the environment.
|
||||
/// </summary>
|
||||
/// <example>Development</example>
|
||||
[DisplayName(DisplayNames.Environment)]
|
||||
[JsonPropertyName(DisplayNames.Environment)]
|
||||
public string? Environment { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the target.
|
||||
/// </summary>
|
||||
[DisplayName(DisplayNames.Target)]
|
||||
[JsonPropertyName(DisplayNames.Target)]
|
||||
public LogTarget? Target { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the x-forwarded-for header.
|
||||
/// </summary>
|
||||
/// <example>localhost</example>
|
||||
[DisplayName(DisplayNames.XForwardedFor)]
|
||||
[JsonPropertyName(DisplayNames.XForwardedFor)]
|
||||
public string? XForwardedFor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the service identifier.
|
||||
/// </summary>
|
||||
/// <example><see cref="Guid.NewGuid()"/></example>
|
||||
[DisplayName(DisplayNames.ServiceId)]
|
||||
[JsonPropertyName(DisplayNames.ServiceId)]
|
||||
public string? ServiceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the request identifier.
|
||||
/// </summary>
|
||||
/// <example><see cref="Guid.NewGuid()"/></example>
|
||||
[DisplayName(DisplayNames.RequestId)]
|
||||
[JsonPropertyName(DisplayNames.RequestId)]
|
||||
public string? RequestId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the client identifier.
|
||||
/// </summary>
|
||||
/// <example><see cref="Guid.NewGuid()"/></example>
|
||||
[DisplayName(DisplayNames.ClientId)]
|
||||
[JsonPropertyName(DisplayNames.ClientId)]
|
||||
public string? ClientId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the client identifier.
|
||||
/// </summary>
|
||||
/// <example>clientRequest</example>
|
||||
[DisplayName(DisplayNames.Operation)]
|
||||
[JsonPropertyName(DisplayNames.Operation)]
|
||||
public LogOperation Operation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the user name.
|
||||
/// </summary>
|
||||
/// <example>clientRequest</example>
|
||||
[DisplayName(DisplayNames.User)]
|
||||
[JsonPropertyName(DisplayNames.User)]
|
||||
public string? User { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets user's email.
|
||||
/// </summary>
|
||||
/// <example>clientRequest</example>
|
||||
[DisplayName(DisplayNames.Email)]
|
||||
[JsonPropertyName(DisplayNames.Email)]
|
||||
public string? Email { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the user identifier.
|
||||
/// </summary>
|
||||
/// <example>clientRequest</example>
|
||||
[DisplayName(DisplayNames.UserId)]
|
||||
[JsonPropertyName(DisplayNames.UserId)]
|
||||
public string? UserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the message.
|
||||
/// </summary>
|
||||
/// <example>A custom log message.</example>
|
||||
[DisplayName(DisplayNames.Message)]
|
||||
[JsonPropertyName(DisplayNames.Message)]
|
||||
public TMessage? Message { get; set; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,56 @@
|
||||
// ***********************************************************************
|
||||
// <copyright file="LogOperation.cs">
|
||||
// Heath
|
||||
// </copyright>
|
||||
// ***********************************************************************
|
||||
|
||||
using Lib.Common.LoggingAPI.Service.Constants;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Lib.Common.LoggingAPI.Service.DataTransferObjects.Logger
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents all possible values for log operation.
|
||||
/// </summary>
|
||||
[DataContract]
|
||||
public enum LogOperation
|
||||
{
|
||||
/// <summary>
|
||||
/// The client request log operation type.
|
||||
/// </summary>
|
||||
[EnumMember(Value = DisplayNames.ClientRequest)]
|
||||
[JsonPropertyName(DisplayNames.ClientRequest)]
|
||||
ClientRequest = 0,
|
||||
|
||||
/// <summary>
|
||||
/// The client response log operation type.
|
||||
/// </summary>
|
||||
[EnumMember(Value = DisplayNames.ClientResponse)]
|
||||
ClientResponse = 1,
|
||||
|
||||
/// <summary>
|
||||
/// The external request log operation type.
|
||||
/// </summary>
|
||||
[EnumMember(Value = DisplayNames.ExternalRequest)]
|
||||
ExternalRequest = 2,
|
||||
|
||||
/// <summary>
|
||||
/// The external response log operation type.
|
||||
/// </summary>
|
||||
[EnumMember(Value = DisplayNames.ExternalResponse)]
|
||||
ExternalResponse = 3,
|
||||
|
||||
/// <summary>
|
||||
/// The error log operation type.
|
||||
/// </summary>
|
||||
[EnumMember(Value = DisplayNames.Error)]
|
||||
Error = 4,
|
||||
|
||||
/// <summary>
|
||||
/// The info log operation type.
|
||||
/// </summary>
|
||||
[EnumMember(Value = DisplayNames.Info)]
|
||||
Info = 5,
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user