thalos-service/src/Thalos.Service.Grpc/Services/IdentityRuntimeGrpcService.cs
2026-02-25 13:13:56 -06:00

76 lines
2.9 KiB
C#

using Grpc.Core;
using BuildingBlock.Identity.Contracts.Conventions;
using Thalos.Service.Application.Adapters;
using Thalos.Service.Application.Grpc;
using Thalos.Service.Application.UseCases;
using BuildingBlock.Identity.Contracts.Requests;
namespace Thalos.Service.Grpc.Services;
/// <summary>
/// Internal gRPC endpoint implementation for identity runtime operations.
/// </summary>
public sealed class IdentityRuntimeGrpcService(
IIssueIdentityTokenUseCase issueIdentityTokenUseCase,
IEvaluateIdentityPolicyUseCase evaluateIdentityPolicyUseCase,
IIdentityPolicyGrpcContractAdapter grpcContractAdapter) : IdentityRuntime.IdentityRuntimeBase
{
/// <summary>
/// Issues identity token through service use-case orchestration.
/// </summary>
/// <param name="request">gRPC token issuance request.</param>
/// <param name="context">gRPC server call context.</param>
/// <returns>gRPC token issuance response.</returns>
public override async Task<IssueIdentityTokenGrpcResponse> IssueIdentityToken(
IssueIdentityTokenGrpcRequest request,
ServerCallContext context)
{
var useCaseRequest = new IssueIdentityTokenRequest(
request.SubjectId,
request.TenantId,
ParseProvider(request.Provider),
request.ExternalToken);
var useCaseResponse = await issueIdentityTokenUseCase.HandleAsync(useCaseRequest);
return new IssueIdentityTokenGrpcResponse
{
Token = useCaseResponse.Token,
ExpiresInSeconds = useCaseResponse.ExpiresInSeconds
};
}
/// <summary>
/// Evaluates identity policy through service use-case orchestration.
/// </summary>
/// <param name="request">gRPC policy evaluation request.</param>
/// <param name="context">gRPC server call context.</param>
/// <returns>gRPC policy evaluation response.</returns>
public override async Task<EvaluateIdentityPolicyGrpcResponse> EvaluateIdentityPolicy(
EvaluateIdentityPolicyGrpcRequest request,
ServerCallContext context)
{
var grpcContract = new EvaluateIdentityPolicyGrpcContract(
request.SubjectId,
request.TenantId,
request.PermissionCode,
request.Provider);
var useCaseRequest = grpcContractAdapter.FromGrpc(grpcContract);
var useCaseResponse = await evaluateIdentityPolicyUseCase.HandleAsync(useCaseRequest);
return new EvaluateIdentityPolicyGrpcResponse
{
SubjectId = useCaseResponse.SubjectId,
PermissionCode = useCaseResponse.PermissionCode,
IsAllowed = useCaseResponse.IsAllowed
};
}
private static IdentityAuthProvider ParseProvider(string provider)
{
return Enum.TryParse<IdentityAuthProvider>(provider, true, out var parsedProvider)
? parsedProvider
: IdentityAuthProvider.InternalJwt;
}
}