reeplace cerberos by thalos

This commit is contained in:
Sergio Matias Urquin
2025-05-18 19:31:25 -06:00
parent 2519e1b4fb
commit bb87b0e148
59 changed files with 194 additions and 194 deletions

View File

@@ -0,0 +1,67 @@
using Core.Thalos.Adapters.Contracts;
using Core.Thalos.Adapters.Handlers;
using Core.Thalos.Adapters.TokenProvider;
using Core.Thalos.External.GatewayConfigurations;
using LSA.Dashboard.External.Clients.Dashboard;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Refit;
namespace Core.Thalos.External.ClientConfiguration
{
public static class RegisterClientConfiguration
{
public static IServiceCollection RegisterExternalLayer(this IServiceCollection services, IConfiguration configuration)
{
var gatewayConfiguration = new GatewayConfiguration();
var gatewaySettingsConfiguration = new GatewaySettingsConfigurations(configuration);
// Register GatewayConfiguration as a singleton
services.AddSingleton(gatewayConfiguration);
// Register IHttpContextAccessor
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Register ITokenProvider
services.AddSingleton<ITokenProvider, HttpContextTokenProvider>();
// Register the custom AuthenticatedHttpClientHandler
services.AddTransient(provider =>
{
var tokenProvider = provider.GetRequiredService<ITokenProvider>();
var trackingIdHandler = new TrackingMechanismExtension(provider.GetRequiredService<IHttpContextAccessor>());
var handler = new AuthenticatedHttpClientHandler(tokenProvider)
{
InnerHandler = new HttpClientHandler() // Setting the InnerHandler manually
};
// Attach the TrackingIdHandler as the outermost handler
trackingIdHandler.InnerHandler = handler;
return handler;
});
var thalosServiceApiUrl = GatewaySettingsConfigurations.GetThalosServiceAPIEndpoint().Endpoint.Url;
// Register IDashBoardServiceClient with the manually created HttpClient
services.AddScoped(provider =>
{
var handler = provider.GetRequiredService<AuthenticatedHttpClientHandler>();
var handlerTrackingId = new TrackingMechanismExtension(provider.GetRequiredService<IHttpContextAccessor>()); // Using the TrackingIdHandler here
// Chain the handlers
handlerTrackingId.InnerHandler = handler; //chaining
var httpClient = new HttpClient(handlerTrackingId)
{
BaseAddress = new Uri(thalosServiceApiUrl),
Timeout = TimeSpan.FromMinutes(1)
};
return RestService.For<IThalosServiceClient>(httpClient);
});
return services;
}
}
}

View File

@@ -0,0 +1,118 @@
using Core.Thalos.Adapters;
using Core.Thalos.Application.UseCases.Roles.Input;
using Core.Thalos.Application.UseCases.Users.Input;
using Core.Thalos.External.Clients.Thalos.Requests.Permissions;
using Core.Thalos.External.Clients.Thalos.Requests.Users;
using Microsoft.AspNetCore.Mvc;
using Refit;
namespace LSA.Dashboard.External.Clients.Dashboard
{
public interface IThalosServiceClient
{
[Post("/v1/User/Create")]
Task<ApiResponse<UserAdapter>> CreateUserService([Header("TrackingId")][Body] CreateUserRequest request, CancellationToken cancellationToken = default);
[Post("/v1/User/GetById")]
Task<ApiResponse<UserAdapter>> GetUserByIdService([Header("TrackingId")][Body] GetUserRequest request, CancellationToken cancellationToken = default);
[Post("/v1/User/GetByEmail")]
Task<ApiResponse<UserAdapter>> GetUserByEmailService([Header("TrackingId")][Body] GetUserByEmailRequest request, CancellationToken cancellationToken = default);
[Post("/v1/User/ValidateExistence")]
Task<ApiResponse<UserExistenceAdapter>> ValidateUserExistenceService([Header("TrackingId")][Body] ValidateUserExistenceRequest request, CancellationToken cancellationToken = default);
[Post("/v1/User/GetByEmail")]
Task<ApiResponse<UserAdapter>> GetUserByEmailService([Header("Authorization")] string? authorization, [Header("TrackingId")][Body] GetUserByEmailRequest request, CancellationToken cancellationToken = default);
[Get("/v1/User/GetAll")]
Task<ApiResponse<IEnumerable<UserAdapter>>> GetAllUsersService([Header("TrackingId")][Body] GetAllUsersRequest request, CancellationToken cancellationToken = default);
[Put("/v1/User/Update")]
Task<ApiResponse<UserAdapter>> UpdateUserService([Header("TrackingId")][Body] UpdateUserRequest request, CancellationToken cancellationToken = default);
[Patch("/v1/User/LoginUser")]
Task<ApiResponse<UserAdapter>> LoginUserService([Header("TrackingId")][Body] LoginUserRequest request, CancellationToken cancellationToken = default);
[Patch("/v1/User/LogoutUser")]
Task<ApiResponse<UserAdapter>> LogoutUserService([Header("TrackingId")][FromBody] LogoutUserRequest request, CancellationToken cancellationToken = default);
[Patch("/v1/User/ChangeStatus")]
Task<ApiResponse<UserAdapter>> ChangeUserStatusService([Header("TrackingId")][Body] ChangeUserStatusRequest request, CancellationToken cancellationToken = default);
[Post("/v1/User/AddCompany")]
Task<ApiResponse<UserAdapter>> AddCompanyToUserService([Header("TrackingId")][Body] AddCompanyToUserRequest request, CancellationToken cancellationToken = default);
[Delete("/v1/User/RemoveCompany")]
Task<ApiResponse<UserAdapter>> RemoveCompanyFromUserService([Header("TrackingId")][Body] RemoveCompanyFromUserRequest request, CancellationToken cancellationToken = default);
[Post("/v1/User/AddProject")]
Task<ApiResponse<UserAdapter>> AddProjectToUserService([Header("TrackingId")][Body] AddProjectToUserRequest request, CancellationToken cancellationToken = default);
[Delete("/v1/User/RemoveProject")]
Task<ApiResponse<UserAdapter>> RemoveProjectFromUserService([Header("TrackingId")][Body] RemoveProjectFromUserRequest request, CancellationToken cancellationToken = default);
[Post("/v1/User/GetTokenAdapter")]
Task<ApiResponse<TokenAdapter>> GetTokenAdapterService([Header("TrackingId")][Body] GetTokenAdapterRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Role/Create")]
Task<ApiResponse<RoleAdapter>> CreateRoleService([Header("TrackingId")][Body] CreateRoleRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Role/GetById")]
Task<ApiResponse<RoleAdapter>> GetRoleByIdService([Header("TrackingId")][Body] GetRoleRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Role/GetById")]
Task<ApiResponse<RoleAdapter>> GetRoleByIdService([Header("Authorization")] string? authorization, [Header("TrackingId")][Body] GetRoleRequest request, CancellationToken cancellationToken = default);
[Get("/v1/Role/GetAll")]
Task<ApiResponse<IEnumerable<RoleAdapter>>> GetAllRolesService([Header("TrackingId")][Body] GetAllRolesRequest request, CancellationToken cancellationToken = default);
[Put("/v1/Role/Update")]
Task<ApiResponse<RoleAdapter>> UpdateRoleService([Header("TrackingId")][Body] UpdateRoleRequest request, CancellationToken cancellationToken = default);
[Patch("/v1/Role/ChangeStatus")]
Task<ApiResponse<RoleAdapter>> ChangeRoleStatusService([Header("TrackingId")][Body] ChangeRoleStatusRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Role/AddApplication")]
Task<ApiResponse<RoleAdapter>> AddApplicationToRoleService([Header("TrackingId")][Body] AddApplicationToRoleRequest request, CancellationToken cancellationToken = default);
[Delete("/v1/Role/RemoveApplication")]
Task<ApiResponse<RoleAdapter>> RemoveApplicationFromRoleService([Header("TrackingId")][Body] RemoveApplicationFromRoleRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Permission/Create")]
Task<ApiResponse<PermissionAdapter>> CreatePermissionService([Header("TrackingId")][Body] CreatePermissionRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Permission/GetById")]
Task<ApiResponse<PermissionAdapter>> GetPermissionByIdService([Header("TrackingId")][Body] GetPermissionRequest request, CancellationToken cancellationToken = default);
[Get("/v1/Permission/GetAll")]
Task<ApiResponse<IEnumerable<PermissionAdapter>>> GetAllPermissionsService([Header("TrackingId")][Body] GetAllPermissionsRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Permission/GetPermissionList")]
Task<ApiResponse<IEnumerable<PermissionAdapter>>> GetAllPermissionsByListService([Header("TrackingId")][Body] GetAllPermissionsByListRequest request, CancellationToken cancellationToken = default);
[Put("/v1/Permission/Update")]
Task<ApiResponse<PermissionAdapter>> UpdatePermissionService([Header("TrackingId")][Body] UpdatePermissionRequest request, CancellationToken cancellationToken = default);
[Patch("/v1/Permission/ChangeStatus")]
Task<ApiResponse<PermissionAdapter>> ChangePermissionStatusService([Header("TrackingId")][Body] ChangePermissionStatusRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Module/Create")]
Task<ApiResponse<ModuleAdapter>> CreateModuleService([Header("TrackingId")][Body] CreateModuleRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Module/GetById")]
Task<ApiResponse<ModuleAdapter>> GetModuleByIdService([Header("TrackingId")][Body] GetModuleRequest request, CancellationToken cancellationToken = default);
[Get("/v1/Module/GetAll")]
Task<ApiResponse<IEnumerable<ModuleAdapter>>> GetAllModulesService([Header("TrackingId")][Body] GetAllModulesRequest request, CancellationToken cancellationToken = default);
[Post("/v1/Module/GetModuleList")]
Task<ApiResponse<IEnumerable<ModuleAdapter>>> GetAllModulesByListService([Header("TrackingId")][Body] GetAllModulesByListRequest request, CancellationToken cancellationToken = default);
[Put("/v1/Module/Update")]
Task<ApiResponse<ModuleAdapter>> UpdateModuleService([Header("TrackingId")][Body] UpdateModuleRequest request, CancellationToken cancellationToken = default);
[Patch("/v1/Module/ChangeStatus")]
Task<ApiResponse<ModuleAdapter>> ChangeModuleStatusService([Header("TrackingId")][Body] ChangeModuleStatusRequest request, CancellationToken cancellationToken = default);
}
}

View File

@@ -0,0 +1,10 @@
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class ChangeModuleStatusRequest
{
public string Id { get; set; }
public StatusEnum Status { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class CreateModuleRequest
{
public string Name { get; set; } = null!;
public string? Description { get; set; }
public string? Icon { get; set; }
public string Route { get; set; } = null!;
public int? Order { get; set; }
public ApplicationsEnum? Application { get; set; } = null!;
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class GetAllModulesByListRequest
{
public string[] Modules { get; set; }
}
}

View File

@@ -0,0 +1,6 @@
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class GetAllModulesRequest
{
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class GetModuleRequest
{
public string Id { get; set; }
}
}

View File

@@ -0,0 +1,17 @@
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class UpdateModuleRequest
{
public string Id { get; set; } = null!;
public string Name { get; set; } = null!;
public string? Description { get; set; }
public string? Icon { get; set; }
public string Route { get; set; } = null!;
public int? Order { get; set; }
public ApplicationsEnum? Application { get; set; } = null!;
public StatusEnum Status { get; set; }
}
}

View File

@@ -0,0 +1,10 @@
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class ChangePermissionStatusRequest
{
public string Id { get; set; }
public StatusEnum Status { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
using Core.Thalos.Adapters.Common.Constants;
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class CreatePermissionRequest
{
public string Name { get; set; } = null!;
public string Description { get; set; } = null!;
public AccessLevelEnum? AccessLevel { get; set; } = null!;
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class GetAllPermissionsByListRequest
{
public string[] Permissions { get; set; }
}
}

View File

@@ -0,0 +1,6 @@
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class GetAllPermissionsRequest
{
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class GetPermissionRequest
{
public string Id { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using Core.Thalos.Adapters.Common.Constants;
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.External.Clients.Thalos.Requests.Permissions
{
public class UpdatePermissionRequest
{
public string Id { get; set; } = null!;
public string Name { get; set; } = null!;
public string? Description { get; set; }
public AccessLevelEnum? AccessLevel { get; set; } = null!;
public StatusEnum Status { get; set; } = StatusEnum.Active;
}
}

View File

@@ -0,0 +1,10 @@
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.Application.UseCases.Roles.Input
{
public class AddApplicationToRoleRequest
{
public string RoleId { get; set; }
public ApplicationsEnum Application { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.Application.UseCases.Roles.Input
{
public class ChangeRoleStatusRequest
{
public string Id { get; set; }
public StatusEnum Status { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
using Core.Thalos.Adapters.Common.Enums;
using System.Text.Json.Serialization;
namespace Core.Thalos.Application.UseCases.Roles.Input
{
public class CreateRoleRequest
{
public string Name { get; set; } = null!;
public string Description { get; set; } = null!;
[JsonConverter(typeof(EnumArrayJsonConverter<ApplicationsEnum>))]
public ApplicationsEnum[]? Applications { get; set; } = null!;
public string[] Modules { get; set; } = null!;
public string[] Permissions { get; set; } = null!;
}
}

View File

@@ -0,0 +1,6 @@
namespace Core.Thalos.Application.UseCases.Roles.Input
{
public class GetAllRolesRequest
{
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.Application.UseCases.Roles.Input
{
public class GetRoleRequest
{
public string Id { get; set; }
}
}

View File

@@ -0,0 +1,10 @@
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.Application.UseCases.Roles.Input
{
public class RemoveApplicationFromRoleRequest
{
public string RoleId { get; set; }
public ApplicationsEnum Application { get; set; }
}
}

View File

@@ -0,0 +1,17 @@
using Core.Thalos.Adapters.Common.Enums;
using System.Text.Json.Serialization;
namespace Core.Thalos.Application.UseCases.Roles.Input
{
public class UpdateRoleRequest
{
public string Id { get; set; } = null!;
public string Name { get; set; } = null!;
public string? Description { get; set; }
[JsonConverter(typeof(EnumArrayJsonConverter<ApplicationsEnum>))]
public ApplicationsEnum[]? Applications { get; set; }
public string[] Modules { get; set; } = null!;
public string[] Permissions { get; set; } = null!;
public StatusEnum Status { get; set; }
}
}

View File

@@ -0,0 +1,8 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class AddCompanyToUserRequest
{
public string UserId { get; set; }
public string CompanyId { get; set; }
}
}

View File

@@ -0,0 +1,8 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class AddProjectToUserRequest
{
public string UserId { get; set; }
public string ProjectId { get; set; }
}
}

View File

@@ -0,0 +1,10 @@
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class ChangeUserStatusRequest
{
public string Id { get; set; }
public StatusEnum Status { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class CreateUserRequest
{
public string Email { get; set; } = null!;
public string Name { get; set; } = null!;
public string? MiddleName { get; set; }
public string LastName { get; set; } = null!;
public string RoleId { get; set; } = null!;
public string[] Companies { get; set; } = null!;
public string[]? Projects { get; set; }
public bool SendInvitation { get; set; }
}
}

View File

@@ -0,0 +1,6 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class GetAllUsersRequest
{
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class GetUserByEmailRequest
{
public string Email { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class GetTokenAdapterRequest
{
public string Email { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class GetUserRequest
{
public string Id { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.External.Clients.Thalos.Requests.Users
{
public class LoginUserRequest
{
public string Email { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.External.Clients.Thalos.Requests.Users
{
public class LogoutUserRequest
{
public string Email { get; set; }
}
}

View File

@@ -0,0 +1,8 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class RemoveCompanyFromUserRequest
{
public string UserId { get; set; }
public string CompanyId { get; set; }
}
}

View File

@@ -0,0 +1,8 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class RemoveProjectFromUserRequest
{
public string UserId { get; set; }
public string ProjectId { get; set; }
}
}

View File

@@ -0,0 +1,17 @@
using Core.Thalos.Adapters.Common.Enums;
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class UpdateUserRequest
{
public string Id { get; set; } = null!;
public string Email { get; set; } = null!;
public string Name { get; set; } = null!;
public string? MiddleName { get; set; }
public string LastName { get; set; } = null!;
public string RoleId { get; set; } = null!;
public string[] Companies { get; set; } = null!;
public string[]? Projects { get; set; }
public StatusEnum Status { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
namespace Core.Thalos.Application.UseCases.Users.Input
{
public class ValidateUserExistenceRequest
{
public string Email { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BuildingBlocks.Library" Version="0.0.1" />
<PackageReference Include="Thalos.Building.Blocks" Version="0.0.1" />
<PackageReference Include="Refit" Version="8.0.0" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,19 @@
using Core.Blueprint.External;
namespace Core.Thalos.External.GatewayConfigurations
{
public record GatewayConfiguration
{
public GatewayConfiguration()
{
ThalosService = new ThalosServiceAPI();
}
public ThalosServiceAPI ThalosService { get; set; }
}
public record ThalosServiceAPI
{
public string Channel { get; set; }
public BaseEndpoint Endpoint { get; set; }
}
}

View File

@@ -0,0 +1,48 @@
using Core.Blueprint.External;
using Microsoft.Extensions.Configuration;
namespace Core.Thalos.External.GatewayConfigurations
{
public class GatewaySettingsConfigurations
{
private static GatewayConfiguration GatewayConfigurations { get; set; } = new GatewayConfiguration();
private readonly IConfiguration _configuration;
public GatewaySettingsConfigurations(IConfiguration configuration)
{
_configuration = configuration;
SetDashboardServiceAPIEndpoint();
}
public static ThalosServiceAPI GetThalosServiceAPIEndpoint()
{
return GatewayConfigurations.ThalosService;
}
private GatewayConfiguration SetDashboardServiceAPIEndpoint()
{
IConfigurationSection source;
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty;
if (environment == "Local")
source = _configuration.GetSection("LocalGateways");
else
source = _configuration.GetSection("Gateways");
var endpoint = source["ThalosService"] ?? string.Empty;
if (string.IsNullOrEmpty(endpoint)) throw new Exception("Thalos Service endpoint is empty or null");
GatewayConfigurations.ThalosService = new ThalosServiceAPI()
{
Endpoint = new BaseEndpoint()
{
Uri = new Uri(endpoint),
Url = endpoint,
Token = string.Empty,
APIName = "Thalos Service"
}
};
return GatewayConfigurations;
}
}
}

View File

@@ -0,0 +1,18 @@
using Microsoft.AspNetCore.Http;
namespace Core.Thalos.External
{
public sealed class TrackingMechanismExtension(IHttpContextAccessor httpContextAccessor) : DelegatingHandler
{
private readonly IHttpContextAccessor _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (_httpContextAccessor.HttpContext != null)
{
request.Headers.Add("TrackingId", Guid.NewGuid().ToString());
}
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}
}