diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..5171c540 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +node_modules +npm-debug.log \ No newline at end of file diff --git a/itests/test.py b/itests/test.py index 959298da..adf191c0 100644 --- a/itests/test.py +++ b/itests/test.py @@ -267,6 +267,7 @@ def run(): ) print("Get squeak profile response: " + str(get_squeak_profile_response)) assert get_squeak_profile_response.squeak_profile.profile_name == profile_name + squeak_profile_address = get_squeak_profile_response.squeak_profile.address # Create a new squeak using the new profile make_squeak_content = "Hello from the profile on the server!" @@ -341,6 +342,17 @@ def run(): len(get_signing_profiles_response.squeak_profiles) == 1 ) + # Get all squeak displays for the known address + get_address_squeak_display_response = admin_stub.GetAddressSqueakDisplays( + squeak_admin_pb2.GetAddressSqueakDisplaysRequest( + address=squeak_profile_address + ) + ) + print("Get address squeak displays response: " + str(get_address_squeak_display_response)) + assert ( + len(get_address_squeak_display_response.squeak_display_entries) == 2 + ) + if __name__ == "__main__": logging.basicConfig() diff --git a/proto/squeak_admin.proto b/proto/squeak_admin.proto index ae227315..55c26d0b 100644 --- a/proto/squeak_admin.proto +++ b/proto/squeak_admin.proto @@ -46,6 +46,10 @@ service SqueakAdmin { */ rpc GetFollowedSqueakDisplays (GetFollowedSqueakDisplaysRequest) returns (GetFollowedSqueakDisplaysReply) {} + /** sqkadmin: `getaddresssqueakdisplays` + */ + rpc GetAddressSqueakDisplays (GetAddressSqueakDisplaysRequest) returns (GetAddressSqueakDisplaysReply) {} + } message HelloRequest { @@ -166,3 +170,13 @@ message GetFollowedSqueakDisplaysReply { /// Multiple squeak display entries repeated SqueakDisplayEntry squeak_display_entries = 1; } + +message GetAddressSqueakDisplaysRequest { + /// The address + string address = 1; +} + +message GetAddressSqueakDisplaysReply { + /// Multiple squeak display entries + repeated SqueakDisplayEntry squeak_display_entries = 1; +} diff --git a/squeakserver/admin/squeak_admin_server_handler.py b/squeakserver/admin/squeak_admin_server_handler.py index 45114c48..5f3e3b1b 100644 --- a/squeakserver/admin/squeak_admin_server_handler.py +++ b/squeakserver/admin/squeak_admin_server_handler.py @@ -69,3 +69,12 @@ class SqueakAdminServerHandler(object): ) ) return squeak_entries_with_profile + + def handle_get_squeak_display_entries_for_address(self, address, min_block, max_block): + logger.info("Handle get squeak display entries for address: {}".format(address)) + squeak_entries_with_profile = self.squeak_node.get_squeak_entries_with_profile_for_address( + address, + min_block, + max_block, + ) + return squeak_entries_with_profile diff --git a/squeakserver/admin/squeak_admin_server_servicer.py b/squeakserver/admin/squeak_admin_server_servicer.py index 6d40eaed..975d2f2d 100644 --- a/squeakserver/admin/squeak_admin_server_servicer.py +++ b/squeakserver/admin/squeak_admin_server_servicer.py @@ -1,3 +1,5 @@ +import sys + import logging from concurrent import futures @@ -81,6 +83,24 @@ class SqueakAdminServerServicer(squeak_admin_pb2_grpc.SqueakAdminServicer): squeak_display_entries=ret ) + def GetAddressSqueakDisplays(self, request, context): + address = request.address + min_block = 0 + max_block = sys.maxsize + squeak_entries_with_profile = self.handler.handle_get_squeak_display_entries_for_address( + address, + min_block, + max_block, + ) + # TODO: use list comprehension + ret = [] + for entry in squeak_entries_with_profile: + display_message = self._squeak_entry_to_message(entry) + ret.append(display_message) + return squeak_admin_pb2.GetFollowedSqueakDisplaysReply( + squeak_display_entries=ret + ) + def _squeak_entry_to_message(self, squeak_entry_with_profile): squeak_entry = squeak_entry_with_profile.squeak_entry squeak = squeak_entry.squeak diff --git a/squeakserver/node/squeak_node.py b/squeakserver/node/squeak_node.py index ad27d4a5..1d58778f 100644 --- a/squeakserver/node/squeak_node.py +++ b/squeakserver/node/squeak_node.py @@ -128,3 +128,10 @@ class SqueakNode: def get_followed_squeak_entries_with_profile(self): return self.postgres_db.get_followed_squeak_entries_with_profile() + + def get_squeak_entries_with_profile_for_address(self, address, min_block, max_block): + return self.postgres_db.get_squeak_entries_with_profile_for_address( + address, + min_block, + max_block, + ) diff --git a/squeakserver/server/postgres_db.py b/squeakserver/server/postgres_db.py index 0a611328..38b24e0d 100644 --- a/squeakserver/server/postgres_db.py +++ b/squeakserver/server/postgres_db.py @@ -124,6 +124,23 @@ class PostgresDb: rows = curs.fetchall() return [self._parse_squeak_entry_with_profile(row) for row in rows] + def get_squeak_entries_with_profile_for_address(self, address, min_block, max_block): + """ Get a squeak. """ + sql = """ + SELECT * FROM squeak + JOIN profile + ON squeak.address=profile.address + WHERE squeak.block_header IS NOT NULL + AND squeak.address=%s + AND n_block_height >= %s + AND n_block_height <= %s + ORDER BY n_block_height DESC, n_time DESC; + """ + with self.get_cursor() as curs: + curs.execute(sql, (address, min_block, max_block)) + rows = curs.fetchall() + return [self._parse_squeak_entry_with_profile(row) for row in rows] + def lookup_squeaks(self, addresses, min_block, max_block): """ Lookup squeaks. """ sql = """