public override async Task <CreateApprovalRequestResponse> CreateApprovalRequest(CreateApprovalRequestRequest request, ServerCallContext context) { var tenantId = request.TenantId; var vaultId = context.GetVaultId(); foreach (var validatorRequest in request.ValidatorRequests) { var entity = ApprovalRequestMyNoSqlEntity.Generate(validatorRequest.ValidatorId, request.TransferSigningRequestId); entity.TenantId = tenantId; entity.MessageEnc = validatorRequest.TransactionDetailsEncBase64; entity.SecretEnc = validatorRequest.SecretEncBase64; entity.IvNonce = validatorRequest.IvNonce; entity.IsOpen = true; entity.VaultId = vaultId; await _dataWriter.InsertOrReplaceAsync(entity); await _pushNotificator.SendPushNotifications(entity); _logger.LogInformation("CreateApprovalRequest processed. TransferSigningRequestId={TransferSigningRequestId}; TenantId={TenantId}; VaultId={VaultId}; ValidatorId={ValidatorId}", request.TransferSigningRequestId, tenantId, vaultId, validatorRequest.ValidatorId); } //await _dataWriter.BulkInsertOrReplaceAsync(list, DataSynchronizationPeriod.Immediately); var resp = new CreateApprovalRequestResponse(); return(resp); }
public override Task <GetApprovalRequestsResponse> GetApprovalRequests(GetApprovalRequestsRequests request, ServerCallContext context) { var validatorId = context.GetHttpContext().User.GetClaimOrDefault(Claims.KeyKeeperId); var tenantId = context.GetHttpContext().User.GetTenantIdOrDefault(); var apiKeyId = context.GetHttpContext().User.GetClaimOrDefault(Claims.ApiKeyId); if (string.IsNullOrEmpty(tenantId)) { return(Task.FromResult(new GetApprovalRequestsResponse { Error = new ValidatorApiError { Code = ValidatorApiError.Types.ErrorCodes.Unknown, Message = "Tenant Id required" } })); } var validatorLinkEntity = _validatorLinkReader.Get( ValidatorLinkEntity.GeneratePartitionKey(tenantId), ValidatorLinkEntity.GenerateRowKey(apiKeyId)); if (validatorLinkEntity == null) { return(Task.FromResult(new GetApprovalRequestsResponse { Error = new ValidatorApiError { Code = ValidatorApiError.Types.ErrorCodes.ExpiredApiKey, Message = "API key is expired or deleted", Data = apiKeyId } })); } var res = new GetApprovalRequestsResponse(); var requests = _approvalRequestReader.Get(ApprovalRequestMyNoSqlEntity.GeneratePartitionKey(validatorId)) .Where(r => r.IsOpen && r.TenantId == tenantId); //todo: add filter by tenant from API key, need to add tenant into api key foreach (var entity in requests) { var item = new GetApprovalRequestsResponse.Types.ApprovalRequest() { TransferSigningRequestId = entity.TransferSigningRequestId, Status = GetApprovalRequestsResponse.Types.ApprovalRequest.Types.RequestStatus.Open, TransactionDetailsEncBase64 = entity.MessageEnc, SecretEncBase64 = entity.SecretEnc, IvNonce = entity.IvNonce }; res.Payload.Add(item); } _logger.LogInformation("Return {Count} ApprovalRequests to ValidatorId='{ValidatorId}'", res.Payload.Count, validatorId); return(Task.FromResult(res)); }
public override async Task <ResolveApprovalRequestsResponse> ResolveApprovalRequests(ResolveApprovalRequestsRequest request, ServerCallContext context) { var validatorId = context.GetHttpContext().User.GetClaimOrDefault(Claims.KeyKeeperId); var tenantId = context.GetHttpContext().User.GetTenantIdOrDefault(); var apiKeyId = context.GetHttpContext().User.GetClaimOrDefault(Claims.ApiKeyId); var validatorLinkEntity = _validatorLinkReader.Get( ValidatorLinkEntity.GeneratePartitionKey(tenantId), ValidatorLinkEntity.GenerateRowKey(apiKeyId)); if (validatorLinkEntity == null) { return(new ResolveApprovalRequestsResponse { Error = new ValidatorApiError { Code = ValidatorApiError.Types.ErrorCodes.ExpiredApiKey, Message = "API key is expired or deleted", Data = apiKeyId } }); } Console.WriteLine($"==============================="); Console.WriteLine("Receive ResolveApprovalRequests:"); Console.WriteLine($"{DateTime.UtcNow:s}"); Console.WriteLine($"validatorId: {validatorId}"); Console.WriteLine($"DeviceInfo: {request.DeviceInfo}"); Console.WriteLine($"TransferSigningRequestId: {request.TransferSigningRequestId}"); Console.WriteLine($"Signature: {request.Signature}"); Console.WriteLine($"ResolutionDocumentEncBase64: {request.ResolutionDocumentEncBase64}"); Console.WriteLine($"-------------------------------"); var approvalRequest = _approvalRequestReader.Get( ApprovalRequestMyNoSqlEntity.GeneratePartitionKey(validatorId), ApprovalRequestMyNoSqlEntity.GenerateRowKey(request.TransferSigningRequestId)); if (approvalRequest == null || !approvalRequest.IsOpen) { _logger.LogInformation("ResolveApprovalRequests skip because active request not found. TransferSigningRequestId={TransferSigningRequestId}; ValidatorId={ValidatorId}", request.TransferSigningRequestId, validatorId); return(new ResolveApprovalRequestsResponse()); } approvalRequest.ResolutionDocumentEncBase64 = request.ResolutionDocumentEncBase64; approvalRequest.ResolutionSignature = request.Signature; approvalRequest.IsOpen = false; await _approvalRequestWriter.InsertOrReplaceAsync(approvalRequest); _logger.LogInformation("ResolveApprovalRequests processed. TransferSigningRequestId={TransferSigningRequestId}; ValidatorId={ValidatorId}", request.TransferSigningRequestId, validatorId); return(new ResolveApprovalRequestsResponse()); }
public override async Task <AcknowledgeResultResponse> AcknowledgeResult(AcknowledgeResultRequest request, ServerCallContext context) { var vaultId = context.GetVaultId(); var item = _dataReader.Get(ApprovalRequestMyNoSqlEntity.GeneratePartitionKey(request.ValidatorId), ApprovalRequestMyNoSqlEntity.GenerateRowKey(request.TransferSigningRequestId)); if (item != null && item.VaultId == vaultId) { await _dataWriter.DeleteAsync(ApprovalRequestMyNoSqlEntity.GeneratePartitionKey(request.ValidatorId), ApprovalRequestMyNoSqlEntity.GenerateRowKey(request.TransferSigningRequestId)); _logger.LogInformation("Acknowledge ApprovalResults. TransferSigningRequestId={TransferSigningRequestId}; TenantId={TenantId}; VaultId={VaultId}; ValidatorId={ValidatorId}", item.TransferSigningRequestId, item.TenantId, item.VaultId, item.ValidatorId); } return(new AcknowledgeResultResponse()); }
public async Task SendPushNotifications(ApprovalRequestMyNoSqlEntity approvalRequest) { var traceLog = string.Empty; try { if (!_isActive) { return; } var validators = _validatorLinkReader.Get() .Where(v => v.TenantId == approvalRequest.TenantId) .Where(v => v.ValidatorId == approvalRequest.ValidatorId) .Where(v => v.IsAccepted) .Where(v => !v.IsBlocked) .Where(v => !string.IsNullOrEmpty(v.DeviceInfo)) .Where(v => !string.IsNullOrEmpty(v.PushNotificationFcmToken)); var hashset = new HashSet <string>(); var tokens = new List <string>(); foreach (var validator in validators) { if (!hashset.Contains(validator.DeviceInfo)) { tokens.Add(validator.PushNotificationFcmToken); hashset.Add(validator.DeviceInfo); } } if (!tokens.Any()) { _logger.LogInformation( "Push notification for TransferSigningRequestId={TransferSigningRequestId} is sent to {ValidatorId}. SuccessCount: {SuccessCount}. FailureCount: {FailureCount}.", approvalRequest.TransferSigningRequestId, approvalRequest.ValidatorId, 0, 0); return; } var message = new MulticastMessage() { Notification = new Notification() { Title = "New Approval Request", Body = "You receive a new approval request. Please check the transfer details in the application." }, Tokens = tokens }; traceLog = JsonConvert.SerializeObject(message); var response = await FirebaseMessaging.DefaultInstance.SendMulticastAsync(message); _logger.LogInformation( "Push notification for TransferSigningRequestId={TransferSigningRequestId} is sent to {ValidatorId}. SuccessCount: {SuccessCount}. FailureCount: {FailureCount}.", approvalRequest.TransferSigningRequestId, approvalRequest.ValidatorId, response.SuccessCount, response.FailureCount); if (response.FailureCount > 0) { var tokensList = JsonConvert.SerializeObject(tokens); foreach (var result in response.Responses.Where(r => r.IsSuccess == false)) { _logger.LogWarning( "Fail push notification. TransferSigningRequestId: {TransferSigningRequestId}; ValidatorId: {ValidatorId}; MessageId: {MessageId}; MessagingErrorCode: {MessagingErrorCode}; Message: {Message}; Tokens: {TokensList}", approvalRequest.TransferSigningRequestId, approvalRequest.ValidatorId, result.MessageId, result.Exception.MessagingErrorCode, result.Exception.Message, tokensList); } } } catch (Exception ex) { Console.WriteLine(traceLog); _logger.LogError(ex, "Cannot send push notification to validator. TransferSigningRequestId={TransferSigningRequestId}; ValidatorId={ValidatorId}", approvalRequest.TransferSigningRequestId, approvalRequest.ValidatorId); } }