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; } }