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;
///
/// Internal gRPC endpoint implementation for identity runtime operations.
///
public sealed class IdentityRuntimeGrpcService(
IIssueIdentityTokenUseCase issueIdentityTokenUseCase,
IEvaluateIdentityPolicyUseCase evaluateIdentityPolicyUseCase,
IIdentityPolicyGrpcContractAdapter grpcContractAdapter) : IdentityRuntime.IdentityRuntimeBase
{
///
/// Issues identity token through service use-case orchestration.
///
/// gRPC token issuance request.
/// gRPC server call context.
/// gRPC token issuance response.
public override async Task 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
};
}
///
/// Evaluates identity policy through service use-case orchestration.
///
/// gRPC policy evaluation request.
/// gRPC server call context.
/// gRPC policy evaluation response.
public override async Task 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(provider, true, out var parsedProvider)
? parsedProvider
: IdentityAuthProvider.InternalJwt;
}
}