聚合 API 网关

This commit is contained in:
hello 2024-04-25 22:59:28 +08:00
parent f13e775ca1
commit b7caaa2d0c
6 changed files with 65 additions and 2 deletions

View File

@ -0,0 +1,18 @@
using HelloShop.ApiService.Services;
using HelloShop.ServiceDefaults.Permissions;
using Microsoft.AspNetCore.Mvc;
namespace HelloShop.ApiService.Controllers;
[Route("api/[controller]")]
[ApiController]
public class PermissionsController(IPermissionService permissionService) : ControllerBase
{
[HttpGet("Definitions")]
public async Task<ActionResult<IReadOnlyList<PermissionGroupDefinitionResponse>>> GetAllPermissionDefinitions()
{
IReadOnlyList<PermissionGroupDefinitionResponse> permissionGroupDefinitions = await permissionService.GetAllPermissionGorupDefinitionsAsync(HttpContext.RequestAborted);
return permissionGroupDefinitions.Any() ? Ok(permissionGroupDefinitions) : NoContent();
}
}

View File

@ -4,6 +4,7 @@ using HelloShop.ServiceDefaults.Extensions;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Swashbuckle.AspNetCore.SwaggerUI; using Swashbuckle.AspNetCore.SwaggerUI;
using HelloShop.ApiService.Extensions; using HelloShop.ApiService.Extensions;
using HelloShop.ApiService.Services;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@ -22,6 +23,7 @@ builder.Services.AddReverseProxy()
builder.Services.AddSingleton<IConfiguredServiceEndPointResolver, ConfiguredServiceEndPointResolver>(); builder.Services.AddSingleton<IConfiguredServiceEndPointResolver, ConfiguredServiceEndPointResolver>();
builder.Services.AddSingleton<IReverseProxyConfigProvider, CustomReverseProxyConfigProvider>(); builder.Services.AddSingleton<IReverseProxyConfigProvider, CustomReverseProxyConfigProvider>();
builder.Services.AddTransient<IConfigureOptions<SwaggerUIOptions>, OpenApiConfigureOptions>(); builder.Services.AddTransient<IConfigureOptions<SwaggerUIOptions>, OpenApiConfigureOptions>();
builder.Services.AddTransient<IPermissionService, PermissionService>();
builder.Services.AddOpenApi(); builder.Services.AddOpenApi();

View File

@ -0,0 +1,8 @@
using HelloShop.ServiceDefaults.Permissions;
namespace HelloShop.ApiService.Services;
public interface IPermissionService
{
Task<IReadOnlyList<PermissionGroupDefinitionResponse>> GetAllPermissionGorupDefinitionsAsync(CancellationToken cancellationToken = default);
}

View File

@ -0,0 +1,35 @@
using HelloShop.ApiService.Infrastructure;
using HelloShop.ServiceDefaults.Permissions;
namespace HelloShop.ApiService.Services;
public class PermissionService(HttpClient httpClient, IConfiguredServiceEndPointResolver serviceEndPointResolver) : IPermissionService
{
public async Task<IReadOnlyList<PermissionGroupDefinitionResponse>> GetAllPermissionGorupDefinitionsAsync(CancellationToken cancellationToken = default)
{
List<PermissionGroupDefinitionResponse> result = [];
httpClient.Timeout = TimeSpan.FromSeconds(10);
IReadOnlyCollection<ConfiguredServiceEndPoint> serviceEndPoints = await serviceEndPointResolver.GetConfiguredServiceEndpointsAsync(cancellationToken);
await Parallel.ForEachAsync(serviceEndPoints, new ParallelOptions{ CancellationToken= cancellationToken}, async (serviceEndPoint, cancelToken) =>
{
UriBuilder uriBuilder = new(serviceEndPoint.ServiceName) { Path = "api/Permissions/PermissionDefinitions" };
HttpResponseMessage response = await httpClient.GetAsync(uriBuilder.Uri, cancelToken);
if (response.IsSuccessStatusCode)
{
List<PermissionGroupDefinitionResponse>? permissionGroupDefinition = await response.Content.ReadFromJsonAsync<List<PermissionGroupDefinitionResponse>>(cancelToken);
if (permissionGroupDefinition != null)
{
result.AddRange(permissionGroupDefinition);
}
}
});
return result.DistinctBy(x => x.GroupName).ToList();
}
}

View File

@ -38,7 +38,7 @@ public static class PermissionExtensions
{ {
PermissionGroupDefinitionResponse permissionGroupDefinition = new() PermissionGroupDefinitionResponse permissionGroupDefinition = new()
{ {
Name = permissionGroup.Name, GroupName = permissionGroup.Name,
DisplayName = permissionGroup.DisplayName, DisplayName = permissionGroup.DisplayName,
Permissions = [] Permissions = []
}; };

View File

@ -2,7 +2,7 @@
public class PermissionGroupDefinitionResponse public class PermissionGroupDefinitionResponse
{ {
public required string Name { get; init; } public required string GroupName { get; init; }
public string? DisplayName { get; set; } public string? DisplayName { get; set; }