From e834547cf67f6a16fa0fcb08222b68551f57c4cc Mon Sep 17 00:00:00 2001 From: Jonathan Zernik Date: Sun, 18 Oct 2020 14:26:58 -0400 Subject: [PATCH] Get sent payments working in test (#299) --- itests/tests/test_squeak_node.py | 7 +++ proto/squeak_admin.proto | 51 +++++++++++++++++++ .../admin/squeak_admin_server_handler.py | 4 ++ .../admin/squeak_admin_server_servicer.py | 29 +++++++++++ squeakserver/db/squeak_db.py | 25 +++++++++ squeakserver/node/squeak_node.py | 6 ++- 6 files changed, 120 insertions(+), 2 deletions(-) diff --git a/itests/tests/test_squeak_node.py b/itests/tests/test_squeak_node.py index ec81baf0..df427ee1 100644 --- a/itests/tests/test_squeak_node.py +++ b/itests/tests/test_squeak_node.py @@ -880,3 +880,10 @@ def test_connect_other_node(server_stub, admin_stub, other_server_stub, other_ad get_squeak_display_response.squeak_display_entry.content_str == "Hello from the profile on the server!" ) + + # Get all sent payments + get_sent_payments_response = other_admin_stub.GetSentPayments( + squeak_admin_pb2.GetSentPaymentsRequest(), + ) + squeak_hashes = [sent_payment.squeak_hash for sent_payment in get_sent_payments_response.sent_payments] + assert saved_squeak_hash.hex() in squeak_hashes diff --git a/proto/squeak_admin.proto b/proto/squeak_admin.proto index dc5213c6..996ffb98 100644 --- a/proto/squeak_admin.proto +++ b/proto/squeak_admin.proto @@ -164,6 +164,10 @@ service SqueakAdmin { */ rpc PayOffer (PayOfferRequest) returns (PayOfferReply) {} + /** sqkadmin: `getsentpayments` + */ + rpc GetSentPayments (GetSentPaymentsRequest) returns (GetSentPaymentsReply) {} + } message CreateSigningProfileRequest { @@ -539,3 +543,50 @@ message PayOfferReply { /// Sent payment id int32 sent_payment_id = 1; } + +message GetSentPaymentsRequest { +} + +message GetSentPaymentsReply { + /// The sent payments + repeated SentPayment sent_payments = 1; +} + +// message GetSentPaymentRequest { +// /// Sent payment id +// int32 sent_payment_id = 1; +// } + +// message GetSentPaymentReply { +// /// The sent payment +// SentPayment sent_payment = 1; +// } + +message SentPayment { + /// The sent payment id + int32 sent_payment_id = 1; + + /// The offer id + int32 offer_id = 2; + + /// The peer id + int32 peer_id = 3; + + /// The squeak hash + string squeak_hash = 4; + + /// The preimage hash + string preimage_hash = 5; + + /// The preimage + string preimage = 6; + + /// The amount + int64 amount = 7; + + /// The seller node pubkey + string node_pubkey = 8; + + /// Valid preimage + bool preimage_is_valid = 9; +} diff --git a/squeakserver/admin/squeak_admin_server_handler.py b/squeakserver/admin/squeak_admin_server_handler.py index 6d2db453..b3e9707d 100644 --- a/squeakserver/admin/squeak_admin_server_handler.py +++ b/squeakserver/admin/squeak_admin_server_handler.py @@ -284,3 +284,7 @@ class SqueakAdminServerHandler(object): def handle_pay_offer(self, offer_id): logger.info("Handle pay offer for offer id: {}".format(offer_id)) return self.squeak_node.pay_offer(offer_id) + + def handle_get_sent_payments(self): + logger.info("Handle get sent payments") + return self.squeak_node.get_sent_payments() diff --git a/squeakserver/admin/squeak_admin_server_servicer.py b/squeakserver/admin/squeak_admin_server_servicer.py index 1e1866fc..67c2490a 100644 --- a/squeakserver/admin/squeak_admin_server_servicer.py +++ b/squeakserver/admin/squeak_admin_server_servicer.py @@ -304,6 +304,19 @@ class SqueakAdminServerServicer(squeak_admin_pb2_grpc.SqueakAdminServicer): sent_payment_id=sent_payment_id, ) + def GetSentPayments(self, request, context): + sent_payments = self.handler.handle_get_sent_payments() + sent_payment_msgs = [self._sent_payment_to_message(sent_payment) for sent_payment in sent_payments] + logger.info("Returning sent payments: {}".format(sent_payment_msgs)) + return squeak_admin_pb2.GetSentPaymentsReply( + sent_payments=sent_payment_msgs, + ) + + # def GetSentPayment(self, request, context): + # return squeak_admin_pb2.GetSentPaymentReply( + # sent_payment=None, + # ) + def _squeak_entry_to_message(self, squeak_entry_with_profile): if squeak_entry_with_profile is None: return None @@ -374,6 +387,22 @@ class SqueakAdminServerServicer(squeak_admin_pb2_grpc.SqueakAdminServicer): invoice_expiry=offer.invoice_expiry, ) + def _sent_payment_to_message(self, sent_payment): + if sent_payment is None: + return None + logger.info("sent_payment: {}".format(sent_payment)) + return squeak_admin_pb2.SentPayment( + sent_payment_id=sent_payment.sent_payment_id, + offer_id=sent_payment.offer_id, + peer_id=sent_payment.peer_id, + squeak_hash=sent_payment.squeak_hash, + preimage_hash=sent_payment.preimage_hash, + preimage=sent_payment.preimage, + amount=sent_payment.amount, + node_pubkey=sent_payment.node_pubkey, + preimage_is_valid=sent_payment.preimage_is_valid, + ) + def serve(self): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) squeak_admin_pb2_grpc.add_SqueakAdminServicer_to_server(self, server) diff --git a/squeakserver/db/squeak_db.py b/squeakserver/db/squeak_db.py index 028ceee4..b0dda282 100644 --- a/squeakserver/db/squeak_db.py +++ b/squeakserver/db/squeak_db.py @@ -26,6 +26,7 @@ from squeakserver.core.squeak_entry import SqueakEntry from squeakserver.core.squeak_entry_with_profile import SqueakEntryWithProfile from squeakserver.server.squeak_peer import SqueakPeer from squeakserver.server.squeak_profile import SqueakProfile +from squeakserver.server.sent_payment import SentPayment from squeakserver.server.util import get_hash logger = logging.getLogger(__name__) @@ -1003,6 +1004,15 @@ class SqueakDb: sent_payment_id = res.inserted_primary_key[0] return sent_payment_id + def get_sent_payments(self): + """ Get all sent payments. """ + s = select([self.sent_payments]) + with self.get_connection() as connection: + result = connection.execute(s) + rows = result.fetchall() + sent_payments = [self._parse_sent_payment(row) for row in rows] + return sent_payments + def _parse_squeak_entry(self, row): if row is None: return None @@ -1101,3 +1111,18 @@ class SqueakDb: offer=offer, peer=peer, ) + + def _parse_sent_payment(self, row): + if row is None: + return None + return SentPayment( + sent_payment_id=row["sent_payment_id"], + offer_id=row["offer_id"], + peer_id=row["peer_id"], + squeak_hash=row["squeak_hash"], + preimage_hash=row["preimage_hash"], + preimage=row["preimage"], + amount=row["amount"], + node_pubkey=row["node_pubkey"], + preimage_is_valid=row["preimage_is_valid"], + ) diff --git a/squeakserver/node/squeak_node.py b/squeakserver/node/squeak_node.py index a5236ef9..d2426753 100644 --- a/squeakserver/node/squeak_node.py +++ b/squeakserver/node/squeak_node.py @@ -285,7 +285,7 @@ class SqueakNode: peer_id=offer.peer_id, squeak_hash=offer.squeak_hash, preimage_hash=offer.payment_hash, - preimage=preimage, + preimage=preimage.hex(), amount=offer.price_msat, node_pubkey=offer.destination, preimage_is_valid=is_valid_preimage, @@ -322,6 +322,8 @@ class SqueakNode: serialized_decryption_key, ) - def sync_squeaks(self): self.squeak_peer_sync_worker.sync_peers() + + def get_sent_payments(self): + return self.postgres_db.get_sent_payments()