From 80cd4a15a8a9574332e39991279c8f335829ecc9 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Mon, 23 Dec 2024 18:15:28 -0500 Subject: [PATCH 01/83] Create new follow tables and try to populate them --- hive/db/schema.py | 56 ++++++++- hive/indexer/blocks.py | 4 + hive/indexer/custom_op.py | 1 + hive/indexer/new_follow.py | 237 +++++++++++++++++++++++++++++++++++++ 4 files changed, 295 insertions(+), 3 deletions(-) create mode 100644 hive/indexer/new_follow.py diff --git a/hive/db/schema.py b/hive/db/schema.py index 1923ef279..393212a75 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -196,9 +196,9 @@ def build_metadata(): sa.Column('permlink_id', sa.Integer, nullable=False), sa.Column('weight', sa.Numeric, nullable=False, server_default='0'), sa.Column('rshares', sa.BigInteger, nullable=False, server_default='0'), - sa.Column('vote_percent', sa.Integer, server_default='0'), + sa.Column('vote_percent', sa.Integer, nullable=False, server_default='0'), sa.Column('last_update', sa.DateTime, nullable=False, server_default='1970-01-01 00:00:00'), - sa.Column('num_changes', sa.Integer, server_default='0'), + sa.Column('num_changes', sa.Integer, nullable=False, server_default='0'), sa.Column('block_num', sa.Integer, nullable=False), sa.Column('is_effective', BOOLEAN, nullable=False, server_default='0'), sa.UniqueConstraint( @@ -317,6 +317,56 @@ def build_metadata(): metadata = build_metadata_community(metadata) + sa.Table( + 'follows', metadata, + sa.Column('follower', sa.Integer, primary_key=True, nullable=False), + sa.Column('following', sa.Integer, primary_key=True, nullable=False), + sa.Column('block_num', sa.Integer, nullable=False), + sa.Index('follows_follower_idx', 'follower'), + sa.Index('follows_following_idx', 'following'), + schema=SCHEMA_NAME + ) + + sa.Table( + 'muted', metadata, + sa.Column('follower', sa.Integer, primary_key=True, nullable=False), + sa.Column('following', sa.Integer, primary_key=True, nullable=False), + sa.Column('block_num', sa.Integer, nullable=False), + sa.Index('muted_follower_idx', 'follower'), + sa.Index('muted_following_idx', 'following'), + schema=SCHEMA_NAME + ) + + sa.Table( + 'blacklisted', metadata, + sa.Column('follower', sa.Integer, primary_key=True, nullable=False), + sa.Column('following', sa.Integer, primary_key=True, nullable=False), + sa.Column('block_num', sa.Integer, nullable=False), + sa.Index('blacklisted_follower_idx', 'follower'), + sa.Index('blacklisted_following_idx', 'following'), + schema=SCHEMA_NAME + ) + + sa.Table( + 'follow_muted', metadata, + sa.Column('follower', sa.Integer, primary_key=True, nullable=False), + sa.Column('following', sa.Integer, primary_key=True, nullable=False), + sa.Column('block_num', sa.Integer, nullable=False), + sa.Index('follow_muted_follower_idx', 'follower'), + sa.Index('follow_muted_following_idx', 'following'), + schema=SCHEMA_NAME + ) + + sa.Table( + 'follow_blacklisted', metadata, + sa.Column('follower', sa.Integer, primary_key=True, nullable=False), + sa.Column('following', sa.Integer, primary_key=True, nullable=False), + sa.Column('block_num', sa.Integer, nullable=False), + sa.Index('follow_blacklisted_follower_idx', 'follower'), + sa.Index('follow_blacklisted_following_idx', 'following'), + schema=SCHEMA_NAME + ) + return metadata @@ -776,7 +826,7 @@ def set_logged_table_attribute(db, logged): 'hive_votes', ] - for table in logged_config: + for table in logged_config.items(): log.info(f"Setting {'LOGGED' if logged else 'UNLOGGED'} attribute on a table: {table}") sql = """ALTER TABLE {} SET {}""" db.query_no_return(sql.format(table, 'LOGGED' if logged else 'UNLOGGED')) diff --git a/hive/indexer/blocks.py b/hive/indexer/blocks.py index ac7227263..edcb815fa 100644 --- a/hive/indexer/blocks.py +++ b/hive/indexer/blocks.py @@ -16,6 +16,7 @@ from hive.indexer.accounts import Accounts from hive.indexer.block import Block, Operation, OperationType, Transaction, VirtualOperationType from hive.indexer.custom_op import CustomOp from hive.indexer.follow import Follow +from hive.indexer.new_follow import NewFollow from hive.indexer.hive_db.block import BlockHiveDb from hive.indexer.notify import Notify from hive.indexer.post_data_cache import PostDataCache @@ -54,6 +55,7 @@ class Blocks: ('PostDataCache', PostDataCache.flush, PostDataCache), ('Votes', Votes.flush, Votes), ('Follow', Follow.flush, Follow), + ('NewFollow', NewFollow.flush, NewFollow), ('Reblog', Reblog.flush, Reblog), ('Notify', Notify.flush, Notify), ('Accounts', Accounts.flush, Accounts), @@ -80,6 +82,7 @@ class Blocks: PostDataCache.setup_own_db_access(shared_db_adapter, "PostDataCache") Votes.setup_own_db_access(shared_db_adapter, "Votes") Follow.setup_own_db_access(shared_db_adapter, "Follow") + NewFollow.setup_own_db_access(shared_db_adapter, "NewFollow") Posts.setup_own_db_access(shared_db_adapter, "Posts") Reblog.setup_own_db_access(shared_db_adapter, "Reblog") Notify.setup_own_db_access(shared_db_adapter, "Notify") @@ -93,6 +96,7 @@ class Blocks: PostDataCache.close_own_db_access() Votes.close_own_db_access() Follow.close_own_db_access() + NewFollow.close_own_db_access() Posts.close_own_db_access() Reblog.close_own_db_access() Notify.close_own_db_access() diff --git a/hive/indexer/custom_op.py b/hive/indexer/custom_op.py index 839f0fd57..63a7a80ba 100644 --- a/hive/indexer/custom_op.py +++ b/hive/indexer/custom_op.py @@ -112,5 +112,6 @@ class CustomOp: cmd, op_json = op_json # ['follow', {data...}] if cmd == 'follow': Follow.follow_op(account, op_json, block_date, block_num) + NewFollow.process_new_follow_op(account, op_json, block_num) elif cmd == 'reblog': Reblog.reblog_op(account, op_json, block_date, block_num) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py new file mode 100644 index 000000000..6cf8884d4 --- /dev/null +++ b/hive/indexer/new_follow.py @@ -0,0 +1,237 @@ +import logging +import enum + +from hive.conf import SCHEMA_NAME +from hive.indexer.db_adapter_holder import DbAdapterHolder +from hive.indexer.accounts import Accounts +from hive.utils.normalize import escape_characters +from funcy.seqs import first # Ensure 'first' is imported + +log = logging.getLogger(__name__) + + +class NewFollowAction(enum.IntEnum): + Nothing = 0 + Mute = 1 + Blacklist = 2 + Unmute = 3 + Unblacklist = 4 + Follow = 5 + Unfollow = 6 + FollowBlacklisted = 7 # Added for 'follow_blacklist' + UnFollowBlacklisted = 8 # Added for 'unfollow_blacklist' + FollowMuted = 9 # Added for 'follow_muted' + UnfollowMuted = 10 # Added for 'unfollow_muted' + # Add other actions as needed + + +class NewFollow(DbAdapterHolder): + """Handles processing of new follow-related operations.""" + + mute_items_to_flush = {} + blacklisted_items_to_flush = {} + follow_muted_items_to_flush = {} + follow_blacklisted_items_to_flush = {} + follow_items_to_flush = {} + follow_blacklisted_items_to_flush = {} + follow_muted_items_to_flush = {} + + idx = 0 + + @classmethod + def _validate_op(cls, account, op): + """Validate and normalize the new follow-related operation.""" + if 'what' not in op or not isinstance(op['what'], list) or 'follower' not in op or 'following' not in op: + log.info("follow_op %s ignored due to basic errors", op) + return None + + what = first(op['what']) or '' + defs = { + '': NewFollowAction.Nothing, + 'blog': NewFollowAction.Follow, + 'follow': NewFollowAction.Follow, + 'ignore': NewFollowAction.Mute, + 'blacklist': NewFollowAction.Blacklist, + 'follow_blacklist': NewFollowAction.FollowBlacklisted, + 'unblacklist': NewFollowAction.Unblacklist, + 'unfollow_blacklist': NewFollowAction.UnFollowBlacklisted, + 'follow_muted': NewFollowAction.FollowMuted, + 'unfollow_muted': NewFollowAction.UnfollowMuted, + 'reset_blacklist': NewFollowAction.Nothing, + 'reset_following_list': NewFollowAction.Nothing, + 'reset_muted_list': NewFollowAction.Nothing, + 'reset_follow_blacklist': NewFollowAction.Nothing, + 'reset_follow_muted_list': NewFollowAction.Nothing, + 'reset_all_lists': NewFollowAction.Nothing, + } + if not isinstance(what, str) or what not in defs: + log.info("follow_op %s ignored due to unknown type of follow", op) + return None + + if not op['follower'] or not Accounts.exists(op['follower']) or op['follower'] != account: + log.info("follow_op %s ignored due to invalid follower", op) + return None + + return { + 'follower': escape_characters(op['follower']), + 'following': escape_characters(op['following']), + 'action': defs[what] + } + + @classmethod + def process_new_follow_op(cls, account, op_json, block_num): + """Process an incoming new follow-related operation.""" + + op = cls._validate_op(account, op_json) + if not op: + log.warning("Invalid operation: %s", op_json) + return + + op['block_num'] = block_num + action = op['action'] + follower = op['follower'] + following = op['following'] + + key = (follower, following) + + # Process the operation and accumulate in memory + if action == NewFollowAction.Mute: + cls.mute_items_to_flush[key] = op + elif action == NewFollowAction.Blacklist: + cls.blacklisted_items_to_flush[key] = op + elif action == NewFollowAction.Unmute: + if key in cls.mute_items_to_flush: + del cls.mute_items_to_flush[key] + elif action == NewFollowAction.Unblacklist: + if key in cls.blacklisted_items_to_flush: + del cls.blacklisted_items_to_flush[key] + elif action == NewFollowAction.Follow: + cls.follow_items_to_flush[key] = op + elif action == NewFollowAction.Unfollow: + if key in cls.follow_items_to_flush: + del cls.follow_items_to_flush[key] + elif action == NewFollowAction.FollowBlacklisted: + cls.follow_blacklisted_items_to_flush[key] = op + elif action == NewFollowAction.UnFollowBlacklisted: + if key in cls.follow_blacklisted_items_to_flush: + del cls.follow_blacklisted_items_to_flush[key] + elif action == NewFollowAction.FollowMuted: + cls.follow_muted_items_to_flush[key] = op + elif action == NewFollowAction.UnfollowMuted: + if key in cls.follow_muted_items_to_flush: + del cls.follow_muted_items_to_flush[key] + + cls.idx += 1 + + @classmethod + def flush(cls): + """Flush accumulated follow operations to the database in batches.""" + n = 0 + with cls.db_adapter.get_connection() as conn: + with conn.cursor() as cur: + if cls.mute_items_to_flush: + # Insert or update mute records + for key, op in cls.mute_items_to_flush.items(): + cur.execute( + f""" + INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.mute_items_to_flush.clear() + n += 1 + + if cls.blacklisted_items_to_flush: + # Insert or update blacklist records + for key, op in cls.blacklisted_items_to_flush.items(): + cur.execute( + f""" + INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.blacklisted_items_to_flush.clear() + n += 1 + + if cls.follow_muted_items_to_flush: + # Insert or update follow_muted records + for key, op in cls.follow_muted_items_to_flush.items(): + cur.execute( + f""" + INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.follow_muted_items_to_flush.clear() + n += 1 + + if cls.follow_blacklisted_items_to_flush: + # Insert or update follow_blacklist records + for key, op in cls.follow_blacklisted_items_to_flush.items(): + cur.execute( + f""" + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.follow_blacklisted_items_to_flush.clear() + n += 1 + + if cls.follow_items_to_flush: + # Insert or update follow records + for key, op in cls.follow_items_to_flush.items(): + cur.execute( + f""" + INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.follow_items_to_flush.clear() + n += 1 + + if cls.follow_blacklisted_items_to_flush: + # Insert or update follow_blacklist records + for key, op in cls.follow_blacklisted_items_to_flush.items(): + cur.execute( + f""" + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.follow_blacklisted_items_to_flush.clear() + n += 1 + + if cls.follow_muted_items_to_flush: + # Insert or update follow_muted records + for key, op in cls.follow_muted_items_to_flush.items(): + cur.execute( + f""" + INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.follow_muted_items_to_flush.clear() + n += 1 + + return n -- GitLab From c5c67752a6e6422c68ca0ab48da240950547fd17 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Mon, 23 Dec 2024 22:37:07 -0500 Subject: [PATCH 02/83] fix db_adapter name and remove dup code --- hive/indexer/new_follow.py | 38 +++++--------------------------------- 1 file changed, 5 insertions(+), 33 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 6cf8884d4..9947946f8 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -33,8 +33,10 @@ class NewFollow(DbAdapterHolder): follow_muted_items_to_flush = {} follow_blacklisted_items_to_flush = {} follow_items_to_flush = {} - follow_blacklisted_items_to_flush = {} - follow_muted_items_to_flush = {} + # Removed duplicated declarations + + # Ensure 'db_adapter' is available as a class attribute + db_adapter = DbAdapterHolder.db_adapter # Add this line idx = 0 @@ -127,7 +129,7 @@ class NewFollow(DbAdapterHolder): def flush(cls): """Flush accumulated follow operations to the database in batches.""" n = 0 - with cls.db_adapter.get_connection() as conn: + with cls.db.get_connection() as conn: # Changed from cls.db_adapter to cls.db with conn.cursor() as cur: if cls.mute_items_to_flush: # Insert or update mute records @@ -204,34 +206,4 @@ class NewFollow(DbAdapterHolder): cls.follow_items_to_flush.clear() n += 1 - if cls.follow_blacklisted_items_to_flush: - # Insert or update follow_blacklist records - for key, op in cls.follow_blacklisted_items_to_flush.items(): - cur.execute( - f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) - VALUES (%s, %s, %s) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - (op['follower'], op['following'], op['block_num']) - ) - cls.follow_blacklisted_items_to_flush.clear() - n += 1 - - if cls.follow_muted_items_to_flush: - # Insert or update follow_muted records - for key, op in cls.follow_muted_items_to_flush.items(): - cur.execute( - f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) - VALUES (%s, %s, %s) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - (op['follower'], op['following'], op['block_num']) - ) - cls.follow_muted_items_to_flush.clear() - n += 1 - return n -- GitLab From d6aa6faed48840665c7c6cfed51c3d5ce18c4a9d Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Mon, 23 Dec 2024 23:05:49 -0500 Subject: [PATCH 03/83] remove ai silliness --- hive/indexer/new_follow.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 9947946f8..e16d92cd1 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -33,10 +33,6 @@ class NewFollow(DbAdapterHolder): follow_muted_items_to_flush = {} follow_blacklisted_items_to_flush = {} follow_items_to_flush = {} - # Removed duplicated declarations - - # Ensure 'db_adapter' is available as a class attribute - db_adapter = DbAdapterHolder.db_adapter # Add this line idx = 0 -- GitLab From b863147c8358047dd02c8e40a3e0759ff0d119e3 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 01:16:04 -0500 Subject: [PATCH 04/83] try quick fix for writing data to db --- hive/indexer/new_follow.py | 153 +++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 76 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index e16d92cd1..72e72e216 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -125,81 +125,82 @@ class NewFollow(DbAdapterHolder): def flush(cls): """Flush accumulated follow operations to the database in batches.""" n = 0 - with cls.db.get_connection() as conn: # Changed from cls.db_adapter to cls.db - with conn.cursor() as cur: - if cls.mute_items_to_flush: - # Insert or update mute records - for key, op in cls.mute_items_to_flush.items(): - cur.execute( - f""" - INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) - VALUES (%s, %s, %s) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - (op['follower'], op['following'], op['block_num']) - ) - cls.mute_items_to_flush.clear() - n += 1 - - if cls.blacklisted_items_to_flush: - # Insert or update blacklist records - for key, op in cls.blacklisted_items_to_flush.items(): - cur.execute( - f""" - INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) - VALUES (%s, %s, %s) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - (op['follower'], op['following'], op['block_num']) - ) - cls.blacklisted_items_to_flush.clear() - n += 1 - - if cls.follow_muted_items_to_flush: - # Insert or update follow_muted records - for key, op in cls.follow_muted_items_to_flush.items(): - cur.execute( - f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) - VALUES (%s, %s, %s) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - (op['follower'], op['following'], op['block_num']) - ) - cls.follow_muted_items_to_flush.clear() - n += 1 - - if cls.follow_blacklisted_items_to_flush: - # Insert or update follow_blacklist records - for key, op in cls.follow_blacklisted_items_to_flush.items(): - cur.execute( - f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) - VALUES (%s, %s, %s) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - (op['follower'], op['following'], op['block_num']) - ) - cls.follow_blacklisted_items_to_flush.clear() - n += 1 - - if cls.follow_items_to_flush: - # Insert or update follow records - for key, op in cls.follow_items_to_flush.items(): - cur.execute( - f""" - INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) - VALUES (%s, %s, %s) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - (op['follower'], op['following'], op['block_num']) - ) - cls.follow_items_to_flush.clear() - n += 1 + if cls.mute_items_to_flush or cls.blacklisted_items_to_flush or cls.follow_muted_items_to_flush or cls.follow_blacklisted_items_to_flush or cls.follow_items_to_flush: + cls.beginTx() + if cls.mute_items_to_flush: + # Insert or update mute records + for key, op in cls.mute_items_to_flush.items(): + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.mute_items_to_flush.clear() + n += 1 + + if cls.blacklisted_items_to_flush: + # Insert or update blacklist records + for key, op in cls.blacklisted_items_to_flush.items(): + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.blacklisted_items_to_flush.clear() + n += 1 + + if cls.follow_muted_items_to_flush: + # Insert or update follow_muted records + for key, op in cls.follow_muted_items_to_flush.items(): + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.follow_muted_items_to_flush.clear() + n += 1 + + if cls.follow_blacklisted_items_to_flush: + # Insert or update follow_blacklist records + for key, op in cls.follow_blacklisted_items_to_flush.items(): + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.follow_blacklisted_items_to_flush.clear() + n += 1 + + if cls.follow_items_to_flush: + # Insert or update follow records + for key, op in cls.follow_items_to_flush.items(): + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) + VALUES (%s, %s, %s) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + (op['follower'], op['following'], op['block_num']) + ) + cls.follow_items_to_flush.clear() + n += 1 + cls.commitTx() return n -- GitLab From 10b3ab549f528617c073c61cac71fdc7ce6ddc4c Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 02:25:09 -0500 Subject: [PATCH 05/83] add import for NewFollow --- hive/indexer/custom_op.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hive/indexer/custom_op.py b/hive/indexer/custom_op.py index 63a7a80ba..2e6c99ff5 100644 --- a/hive/indexer/custom_op.py +++ b/hive/indexer/custom_op.py @@ -11,6 +11,7 @@ from hive.indexer.notify import Notify from hive.indexer.reblog import Reblog from hive.utils.json import valid_command, valid_date, valid_keys, valid_op_json from hive.utils.normalize import load_json_key +from hive.indexer.new_follow import NewFollow # Import NewFollow log = logging.getLogger(__name__) -- GitLab From ca238a3b68ddbaee230cfe416e74bc7318896c99 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 12:17:49 -0500 Subject: [PATCH 06/83] support follow operations that follow more than one account --- hive/indexer/new_follow.py | 89 ++++++++++++++++++++++---------------- 1 file changed, 51 insertions(+), 38 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 72e72e216..f524fe1f5 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -66,13 +66,25 @@ class NewFollow(DbAdapterHolder): log.info("follow_op %s ignored due to unknown type of follow", op) return None + + # follower is empty or follower account does not exist, or it wasn't that account that authorized operation if not op['follower'] or not Accounts.exists(op['follower']) or op['follower'] != account: log.info("follow_op %s ignored due to invalid follower", op) return None + # normalize following to list + op['following'] = op['following'] if isinstance(op['following'], list) else [op['following']] + + # if following name does not exist do not process it: basically equal to drop op for single following entry + op['following'] = [ + following + for following in op['following'] + if following and Accounts.exists(following) and following != op['follower'] + ] + return { 'follower': escape_characters(op['follower']), - 'following': escape_characters(op['following']), + 'following': [escape_characters(following) for following in op['following']], 'action': defs[what] } @@ -88,38 +100,34 @@ class NewFollow(DbAdapterHolder): op['block_num'] = block_num action = op['action'] follower = op['follower'] - following = op['following'] - - key = (follower, following) - - # Process the operation and accumulate in memory - if action == NewFollowAction.Mute: - cls.mute_items_to_flush[key] = op - elif action == NewFollowAction.Blacklist: - cls.blacklisted_items_to_flush[key] = op - elif action == NewFollowAction.Unmute: - if key in cls.mute_items_to_flush: - del cls.mute_items_to_flush[key] - elif action == NewFollowAction.Unblacklist: - if key in cls.blacklisted_items_to_flush: - del cls.blacklisted_items_to_flush[key] - elif action == NewFollowAction.Follow: - cls.follow_items_to_flush[key] = op - elif action == NewFollowAction.Unfollow: - if key in cls.follow_items_to_flush: - del cls.follow_items_to_flush[key] - elif action == NewFollowAction.FollowBlacklisted: - cls.follow_blacklisted_items_to_flush[key] = op - elif action == NewFollowAction.UnFollowBlacklisted: - if key in cls.follow_blacklisted_items_to_flush: - del cls.follow_blacklisted_items_to_flush[key] - elif action == NewFollowAction.FollowMuted: - cls.follow_muted_items_to_flush[key] = op - elif action == NewFollowAction.UnfollowMuted: - if key in cls.follow_muted_items_to_flush: - del cls.follow_muted_items_to_flush[key] - - cls.idx += 1 + followings = op['following'] + + # Process each following individually + for following in followings: + key = (follower, following) + + if action == NewFollowAction.Mute: + cls.mute_items_to_flush[key] = op + elif action == NewFollowAction.Blacklist: + cls.blacklisted_items_to_flush[key] = op + elif action == NewFollowAction.Unmute: + cls.mute_items_to_flush.pop(key, None) + elif action == NewFollowAction.Unblacklist: + cls.blacklisted_items_to_flush.pop(key, None) + elif action == NewFollowAction.Follow: + cls.follow_items_to_flush[key] = op + elif action == NewFollowAction.Unfollow: + cls.follow_items_to_flush.pop(key, None) + elif action == NewFollowAction.FollowBlacklisted: + cls.follow_blacklisted_items_to_flush[key] = op + elif action == NewFollowAction.UnFollowBlacklisted: + cls.follow_blacklisted_items_to_flush.pop(key, None) + elif action == NewFollowAction.FollowMuted: + cls.follow_muted_items_to_flush[key] = op + elif action == NewFollowAction.UnfollowMuted: + cls.follow_muted_items_to_flush.pop(key, None) + + cls.idx += 1 @classmethod def flush(cls): @@ -131,6 +139,7 @@ class NewFollow(DbAdapterHolder): if cls.mute_items_to_flush: # Insert or update mute records for key, op in cls.mute_items_to_flush.items(): + follower, following = key cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) @@ -138,7 +147,7 @@ class NewFollow(DbAdapterHolder): ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (op['follower'], op['following'], op['block_num']) + (follower, following, op['block_num']) ) cls.mute_items_to_flush.clear() n += 1 @@ -146,6 +155,7 @@ class NewFollow(DbAdapterHolder): if cls.blacklisted_items_to_flush: # Insert or update blacklist records for key, op in cls.blacklisted_items_to_flush.items(): + follower, following = key cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) @@ -153,7 +163,7 @@ class NewFollow(DbAdapterHolder): ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (op['follower'], op['following'], op['block_num']) + (follower, following, op['block_num']) ) cls.blacklisted_items_to_flush.clear() n += 1 @@ -161,6 +171,7 @@ class NewFollow(DbAdapterHolder): if cls.follow_muted_items_to_flush: # Insert or update follow_muted records for key, op in cls.follow_muted_items_to_flush.items(): + follower, following = key cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) @@ -168,7 +179,7 @@ class NewFollow(DbAdapterHolder): ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (op['follower'], op['following'], op['block_num']) + (follower, following, op['block_num']) ) cls.follow_muted_items_to_flush.clear() n += 1 @@ -176,6 +187,7 @@ class NewFollow(DbAdapterHolder): if cls.follow_blacklisted_items_to_flush: # Insert or update follow_blacklist records for key, op in cls.follow_blacklisted_items_to_flush.items(): + follower, following = key cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) @@ -183,7 +195,7 @@ class NewFollow(DbAdapterHolder): ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (op['follower'], op['following'], op['block_num']) + (follower, following, op['block_num']) ) cls.follow_blacklisted_items_to_flush.clear() n += 1 @@ -191,6 +203,7 @@ class NewFollow(DbAdapterHolder): if cls.follow_items_to_flush: # Insert or update follow records for key, op in cls.follow_items_to_flush.items(): + follower, following = key cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) @@ -198,7 +211,7 @@ class NewFollow(DbAdapterHolder): ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (op['follower'], op['following'], op['block_num']) + (follower, following, op['block_num']) ) cls.follow_items_to_flush.clear() n += 1 -- GitLab From d221ce2da35d8a486f28da10b9b1f925bd2ebb6a Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 12:46:16 -0500 Subject: [PATCH 07/83] refactor NewFollow class to use keyword arguments for database queries --- hive/indexer/new_follow.py | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index f524fe1f5..72bd8fb88 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -143,11 +143,13 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) - VALUES (%s, %s, %s) + VALUES (:follower, :following, :block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (follower, following, op['block_num']) + follower=follower, + following=following, + block_num=op['block_num'] # Pass parameters as keyword arguments ) cls.mute_items_to_flush.clear() n += 1 @@ -159,11 +161,13 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) - VALUES (%s, %s, %s) + VALUES (:follower, :following, :block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (follower, following, op['block_num']) + follower=follower, + following=following, + block_num=op['block_num'] # Pass parameters as keyword arguments ) cls.blacklisted_items_to_flush.clear() n += 1 @@ -175,11 +179,13 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) - VALUES (%s, %s, %s) + VALUES (:follower, :following, :block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (follower, following, op['block_num']) + follower=follower, + following=following, + block_num=op['block_num'] # Pass parameters as keyword arguments ) cls.follow_muted_items_to_flush.clear() n += 1 @@ -191,11 +197,13 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) - VALUES (%s, %s, %s) + VALUES (:follower, :following, :block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (follower, following, op['block_num']) + follower=follower, + following=following, + block_num=op['block_num'] # Pass parameters as keyword arguments ) cls.follow_blacklisted_items_to_flush.clear() n += 1 @@ -207,11 +215,13 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) - VALUES (%s, %s, %s) + VALUES (:follower, :following, :block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, - (follower, following, op['block_num']) + follower=follower, + following=following, + block_num=op['block_num'] # Pass parameters as keyword arguments ) cls.follow_items_to_flush.clear() n += 1 -- GitLab From 7fec46ef6ecf27645c559935d78ce42871e34068 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 13:04:08 -0500 Subject: [PATCH 08/83] remove unnecessary character escaping from follower and following fields --- hive/indexer/new_follow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 72bd8fb88..331a724d4 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -83,8 +83,8 @@ class NewFollow(DbAdapterHolder): ] return { - 'follower': escape_characters(op['follower']), - 'following': [escape_characters(following) for following in op['following']], + 'follower': op['follower'], # Removed escape_characters + 'following': [following for following in op['following']], # Removed escape_characters 'action': defs[what] } -- GitLab From dc0bdcc30afef4dd8180cae52f64cec430ca375b Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 13:28:24 -0500 Subject: [PATCH 09/83] refactor NewFollow class to optimize database inserts by using account IDs and handling missing records --- hive/indexer/new_follow.py | 107 ++++++++++++++++++++++++++----------- 1 file changed, 77 insertions(+), 30 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 331a724d4..6b578da85 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -136,20 +136,43 @@ class NewFollow(DbAdapterHolder): if cls.mute_items_to_flush or cls.blacklisted_items_to_flush or cls.follow_muted_items_to_flush or cls.follow_blacklisted_items_to_flush or cls.follow_items_to_flush: cls.beginTx() + + # Collect all unique account names to retrieve their IDs in a single query + unique_names = set() + for items in [cls.mute_items_to_flush, cls.blacklisted_items_to_flush, cls.follow_muted_items_to_flush, cls.follow_blacklisted_items_to_flush, cls.follow_items_to_flush]: + for key in items.keys(): + unique_names.update(key) + + # Retrieve all account IDs + name_to_id_records = cls.db.query_all("SELECT name, id FROM hive_accounts WHERE name IN :names", names=tuple(unique_names)) + name_to_id = {record['name']: record['id'] for record in name_to_id_records} + + # Ensure all account names have corresponding IDs + missing_accounts = unique_names - set(name_to_id.keys()) + if missing_accounts: + log.warning(f"Missing account IDs for names: {missing_accounts}") + # Optionally, handle missing accounts (e.g., skip inserts or raise an error) + if cls.mute_items_to_flush: # Insert or update mute records for key, op in cls.mute_items_to_flush.items(): follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot insert mute record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) - VALUES (:follower, :following, :block_num) - ON CONFLICT (follower, following) DO UPDATE + INSERT INTO {SCHEMA_NAME}.muted (follower_id, following_id, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num """, - follower=follower, - following=following, - block_num=op['block_num'] # Pass parameters as keyword arguments + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] ) cls.mute_items_to_flush.clear() n += 1 @@ -158,16 +181,22 @@ class NewFollow(DbAdapterHolder): # Insert or update blacklist records for key, op in cls.blacklisted_items_to_flush.items(): follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot insert blacklist record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) - VALUES (:follower, :following, :block_num) - ON CONFLICT (follower, following) DO UPDATE + INSERT INTO {SCHEMA_NAME}.blacklisted (follower_id, following_id, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num """, - follower=follower, - following=following, - block_num=op['block_num'] # Pass parameters as keyword arguments + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] ) cls.blacklisted_items_to_flush.clear() n += 1 @@ -176,16 +205,22 @@ class NewFollow(DbAdapterHolder): # Insert or update follow_muted records for key, op in cls.follow_muted_items_to_flush.items(): follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot insert follow_muted record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) - VALUES (:follower, :following, :block_num) - ON CONFLICT (follower, following) DO UPDATE + INSERT INTO {SCHEMA_NAME}.follow_muted (follower_id, following_id, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num """, - follower=follower, - following=following, - block_num=op['block_num'] # Pass parameters as keyword arguments + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] ) cls.follow_muted_items_to_flush.clear() n += 1 @@ -194,16 +229,22 @@ class NewFollow(DbAdapterHolder): # Insert or update follow_blacklist records for key, op in cls.follow_blacklisted_items_to_flush.items(): follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot insert follow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) - VALUES (:follower, :following, :block_num) - ON CONFLICT (follower, following) DO UPDATE + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower_id, following_id, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num """, - follower=follower, - following=following, - block_num=op['block_num'] # Pass parameters as keyword arguments + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] ) cls.follow_blacklisted_items_to_flush.clear() n += 1 @@ -212,16 +253,22 @@ class NewFollow(DbAdapterHolder): # Insert or update follow records for key, op in cls.follow_items_to_flush.items(): follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot insert follow record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) - VALUES (:follower, :following, :block_num) - ON CONFLICT (follower, following) DO UPDATE + INSERT INTO {SCHEMA_NAME}.follows (follower_id, following_id, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num """, - follower=follower, - following=following, - block_num=op['block_num'] # Pass parameters as keyword arguments + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] ) cls.follow_items_to_flush.clear() n += 1 -- GitLab From 43eeace8a0d5121f6f4417ad0e47272b7a8b48c6 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 13:43:29 -0500 Subject: [PATCH 10/83] add schema to query --- hive/indexer/new_follow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 6b578da85..3c2d615d2 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -144,7 +144,7 @@ class NewFollow(DbAdapterHolder): unique_names.update(key) # Retrieve all account IDs - name_to_id_records = cls.db.query_all("SELECT name, id FROM hive_accounts WHERE name IN :names", names=tuple(unique_names)) + name_to_id_records = cls.db.query_all(f"""SELECT name, id FROM {SCHEMA_NAME}.hive_accounts WHERE name IN :names""", names=tuple(unique_names)) name_to_id = {record['name']: record['id'] for record in name_to_id_records} # Ensure all account names have corresponding IDs -- GitLab From 04a9289121412672b14413dcba54261a33f786b5 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 15:17:02 -0500 Subject: [PATCH 11/83] fix follower, following field names --- hive/indexer/new_follow.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 3c2d615d2..92d832af1 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -165,7 +165,7 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.muted (follower_id, following_id, block_num) + INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num @@ -189,7 +189,7 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.blacklisted (follower_id, following_id, block_num) + INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num @@ -213,7 +213,7 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower_id, following_id, block_num) + INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num @@ -237,7 +237,7 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower_id, following_id, block_num) + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num @@ -261,7 +261,7 @@ class NewFollow(DbAdapterHolder): cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.follows (follower_id, following_id, block_num) + INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) ON CONFLICT (follower_id, following_id) DO UPDATE SET block_num = EXCLUDED.block_num -- GitLab From fda76ee24536deee43a678bb647a7f439debc301 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 16:52:59 -0500 Subject: [PATCH 12/83] fix queries --- hive/indexer/new_follow.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 92d832af1..5f8136a59 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -167,7 +167,7 @@ class NewFollow(DbAdapterHolder): f""" INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower_id, following_id) DO UPDATE + ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, follower_id=follower_id, @@ -191,7 +191,7 @@ class NewFollow(DbAdapterHolder): f""" INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower_id, following_id) DO UPDATE + ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, follower_id=follower_id, @@ -215,7 +215,7 @@ class NewFollow(DbAdapterHolder): f""" INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower_id, following_id) DO UPDATE + ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, follower_id=follower_id, @@ -239,7 +239,7 @@ class NewFollow(DbAdapterHolder): f""" INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower_id, following_id) DO UPDATE + ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, follower_id=follower_id, @@ -263,7 +263,7 @@ class NewFollow(DbAdapterHolder): f""" INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower_id, following_id) DO UPDATE + ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num """, follower_id=follower_id, -- GitLab From 9ff0723ea91fc207fd8984412c287a111ed60d2c Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 20:20:27 -0500 Subject: [PATCH 13/83] add new get_followers --- hive/db/schema.py | 1 + .../new_condenser_api_get_followers.sql | 73 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql diff --git a/hive/db/schema.py b/hive/db/schema.py index 393212a75..3ca25ea96 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -706,6 +706,7 @@ def setup_runtime_code(db): "postgrest/bridge_api/bridge_api_list_pop_communities.sql", "postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql", "postgrest/condenser_api/condenser_api_get_followers.sql", + "postgrest/condenser_api/new_condenser_api_get_followers.sql", "postgrest/condenser_api/condenser_api_get_following.sql", "postgrest/utilities/find_subscription_id.sql", "postgrest/bridge_api/bridge_api_get_profiles.sql", diff --git a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql new file mode 100644 index 000000000..8ab7592f5 --- /dev/null +++ b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql @@ -0,0 +1,73 @@ +DROP FUNCTION IF EXISTS hivemind_endpoints.new_condenser_api_get_followers; +CREATE FUNCTION hivemind_endpoints.new_condenser_api_get_followers(IN _params JSONB) +RETURNS JSONB +LANGUAGE 'plpgsql' +STABLE +AS +$$ +DECLARE + _account TEXT; + _account_id INT; + _start TEXT; + _start_id INT; + _follow_type TEXT; + _limit INT; + _result JSONB; +BEGIN + _params := hivemind_postgrest_utilities.validate_json_arguments( _params, '{"account": "string", "start" : "string", "type" : "string", "limit" : "number"}', 4, NULL ); + + _account := params->'account'; + _account_id := hivemind_postgrest_utilities.find_account_id( _account, TRUE ); + if (_account_id = 0) then + raise_parameter_validation_exception('Invalid account'); + end if; + + _start := params->'start'; + _start_id := hivemind_postgrest_utilities.find_account_id( _start, TRUE ); + if (_start_id = 0) then + raise_parameter_validation_exception('Invalid start account'); + end if; + + _follow_type := hivemind_postgrest_utilities.parse_argument_from_json(_params, 'type', FALSE); + _limit = (_params->'limit')::INT; + + IF _follow_type = 'blog' THEN + _result := ( + SELECT jsonb_agg( + jsonb_build_object( + 'following', _account, + 'follower', ha.name, + 'what', '[blog]', + ) + ) + FROM {SCHEMA_NAME}.follows f + JOIN {SCHEMA_NAME}.hive_accounts ha ON ha.id = f.follower + WHERE f.following = _account_id AND ha.id < _start_id + ORDER BY f.follower DESC + LIMIT _limit + ); +ELSIF _follow_type = 'ignore' THEN + _result := ( + SELECT jsonb_agg( + jsonb_build_object( + 'following', _account, + 'follower', ha.name, + 'what', _f'[ignore]', + ) + ) + FROM {SCHEMA_NAME}.muted m + JOIN {SCHEMA_NAME}.hive_accounts ha ON ha.id = m.follower + WHERE m.following = _account_id AND ha.id < _start_id + ORDER BY f.follower DESC + LIMIT _limit + ); + ELSE + RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception( + 'Unsupported follow_type, valid values: blog, ignore' + ); + END IF; + + RETURN COALESCE(_result, '[]'::jsonb); +END +$$ +; -- GitLab From 445e01364b23a7be124f415b89324874ad1e3d85 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Tue, 24 Dec 2024 22:54:15 -0500 Subject: [PATCH 14/83] fix syntax --- .../condenser_api/new_condenser_api_get_followers.sql | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql index 8ab7592f5..58d5d59d1 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql @@ -19,13 +19,13 @@ BEGIN _account := params->'account'; _account_id := hivemind_postgrest_utilities.find_account_id( _account, TRUE ); if (_account_id = 0) then - raise_parameter_validation_exception('Invalid account'); + RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception('Invalid account'); end if; _start := params->'start'; _start_id := hivemind_postgrest_utilities.find_account_id( _start, TRUE ); if (_start_id = 0) then - raise_parameter_validation_exception('Invalid start account'); + RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception('Invalid start account'); end if; _follow_type := hivemind_postgrest_utilities.parse_argument_from_json(_params, 'type', FALSE); @@ -62,9 +62,7 @@ ELSIF _follow_type = 'ignore' THEN LIMIT _limit ); ELSE - RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception( - 'Unsupported follow_type, valid values: blog, ignore' - ); + RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception('Unsupported follow_type, valid values: blog, ignore'); END IF; RETURN COALESCE(_result, '[]'::jsonb); -- GitLab From 83dfc78fb7a696f3b411868881e8734a63277e66 Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Fri, 27 Dec 2024 12:30:35 -0500 Subject: [PATCH 15/83] fix typos --- .../condenser_api/new_condenser_api_get_followers.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql index 58d5d59d1..aca5a016d 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql @@ -16,13 +16,13 @@ DECLARE BEGIN _params := hivemind_postgrest_utilities.validate_json_arguments( _params, '{"account": "string", "start" : "string", "type" : "string", "limit" : "number"}', 4, NULL ); - _account := params->'account'; + _account := _params->'account'; _account_id := hivemind_postgrest_utilities.find_account_id( _account, TRUE ); if (_account_id = 0) then RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception('Invalid account'); end if; - _start := params->'start'; + _start := _params->'start'; _start_id := hivemind_postgrest_utilities.find_account_id( _start, TRUE ); if (_start_id = 0) then RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception('Invalid start account'); @@ -52,13 +52,13 @@ ELSIF _follow_type = 'ignore' THEN jsonb_build_object( 'following', _account, 'follower', ha.name, - 'what', _f'[ignore]', + 'what', '[ignore]', ) ) FROM {SCHEMA_NAME}.muted m JOIN {SCHEMA_NAME}.hive_accounts ha ON ha.id = m.follower WHERE m.following = _account_id AND ha.id < _start_id - ORDER BY f.follower DESC + ORDER BY m.follower DESC LIMIT _limit ); ELSE -- GitLab From c946fa1c5916fc5f55eb12483e4b52e1f0b23d8a Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Fri, 27 Dec 2024 12:44:22 -0500 Subject: [PATCH 16/83] fix more syntax errors --- .../condenser_api/new_condenser_api_get_followers.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql index aca5a016d..77d8adfea 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql @@ -29,7 +29,7 @@ BEGIN end if; _follow_type := hivemind_postgrest_utilities.parse_argument_from_json(_params, 'type', FALSE); - _limit = (_params->'limit')::INT; + _limit := (_params->'limit')::INT; IF _follow_type = 'blog' THEN _result := ( @@ -37,7 +37,7 @@ BEGIN jsonb_build_object( 'following', _account, 'follower', ha.name, - 'what', '[blog]', + 'what', '[blog]' ) ) FROM {SCHEMA_NAME}.follows f @@ -52,7 +52,7 @@ ELSIF _follow_type = 'ignore' THEN jsonb_build_object( 'following', _account, 'follower', ha.name, - 'what', '[ignore]', + 'what', '[ignore]' ) ) FROM {SCHEMA_NAME}.muted m -- GitLab From 2c9fcd85c8a3250361e0bd43e04b1273c144e12b Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Fri, 27 Dec 2024 12:54:50 -0500 Subject: [PATCH 17/83] fix schema references --- .../condenser_api/new_condenser_api_get_followers.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql index 77d8adfea..af6ea5ec8 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql @@ -40,8 +40,8 @@ BEGIN 'what', '[blog]' ) ) - FROM {SCHEMA_NAME}.follows f - JOIN {SCHEMA_NAME}.hive_accounts ha ON ha.id = f.follower + FROM hivemind_app.follows f + JOIN hivemind_app.hive_accounts ha ON ha.id = f.follower WHERE f.following = _account_id AND ha.id < _start_id ORDER BY f.follower DESC LIMIT _limit @@ -55,8 +55,8 @@ ELSIF _follow_type = 'ignore' THEN 'what', '[ignore]' ) ) - FROM {SCHEMA_NAME}.muted m - JOIN {SCHEMA_NAME}.hive_accounts ha ON ha.id = m.follower + FROM hivemind_app.muted m + JOIN hivemind_app.hive_accounts ha ON ha.id = m.follower WHERE m.following = _account_id AND ha.id < _start_id ORDER BY m.follower DESC LIMIT _limit -- GitLab From af022d4a6b55abe06839ca97a010d90b44934d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 8 Jan 2025 12:36:08 +0100 Subject: [PATCH 18/83] Add support for reset follows --- hive/indexer/new_follow.py | 178 +++++++++++++++++++++++++++++++++++-- 1 file changed, 169 insertions(+), 9 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 5f8136a59..d1d39fec7 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -22,7 +22,12 @@ class NewFollowAction(enum.IntEnum): UnFollowBlacklisted = 8 # Added for 'unfollow_blacklist' FollowMuted = 9 # Added for 'follow_muted' UnfollowMuted = 10 # Added for 'unfollow_muted' - # Add other actions as needed + ResetBlacklist = 11 # cancel all existing records of Blacklist type + ResetFollowingList = 12 # cancel all existing records of Blog type + ResetMutedList = 13 # cancel all existing records of Ignore type + ResetFollowBlacklist = 14 # cancel all existing records of Follow_blacklist type + ResetFollowMutedList = 15 # cancel all existing records of Follow_muted type + ResetAllLists = 16 # cancel all existing records of all types class NewFollow(DbAdapterHolder): @@ -33,6 +38,12 @@ class NewFollow(DbAdapterHolder): follow_muted_items_to_flush = {} follow_blacklisted_items_to_flush = {} follow_items_to_flush = {} + reset_blacklists_to_flush = {} + reset_followinglists_to_flush = {} + reset_mutedlists_to_flush = {} + reset_follow_blacklists_to_flush = {} + reset_follow_mutedlists_to_flush = {} + reset_all_lists_to_flush = {} idx = 0 @@ -55,12 +66,12 @@ class NewFollow(DbAdapterHolder): 'unfollow_blacklist': NewFollowAction.UnFollowBlacklisted, 'follow_muted': NewFollowAction.FollowMuted, 'unfollow_muted': NewFollowAction.UnfollowMuted, - 'reset_blacklist': NewFollowAction.Nothing, - 'reset_following_list': NewFollowAction.Nothing, - 'reset_muted_list': NewFollowAction.Nothing, - 'reset_follow_blacklist': NewFollowAction.Nothing, - 'reset_follow_muted_list': NewFollowAction.Nothing, - 'reset_all_lists': NewFollowAction.Nothing, + 'reset_blacklist': NewFollowAction.ResetBlacklist, + 'reset_following_list': NewFollowAction.ResetFollowingList, + 'reset_muted_list': NewFollowAction.ResetMutedList, + 'reset_follow_blacklist': NewFollowAction.ResetFollowBlacklist, + 'reset_follow_muted_list': NewFollowAction.ResetFollowMutedList, + 'reset_all_lists': NewFollowAction.ResetAllLists, } if not isinstance(what, str) or what not in defs: log.info("follow_op %s ignored due to unknown type of follow", op) @@ -100,7 +111,7 @@ class NewFollow(DbAdapterHolder): op['block_num'] = block_num action = op['action'] follower = op['follower'] - followings = op['following'] + followings = op.get('following', None) # Process each following individually for following in followings: @@ -126,6 +137,18 @@ class NewFollow(DbAdapterHolder): cls.follow_muted_items_to_flush[key] = op elif action == NewFollowAction.UnfollowMuted: cls.follow_muted_items_to_flush.pop(key, None) + elif action == NewFollowAction.ResetBlacklist: + cls.reset_blacklists_to_flush[key] = op + elif action == NewFollowAction.ResetFollowingList: + cls.reset_followinglists_to_flush[key] = op + elif action == NewFollowAction.ResetMutedList: + cls.reset_mutedlists_to_flush[key] = op + elif action == NewFollowAction.ResetFollowBlacklist: + cls.reset_follow_blacklists_to_flush[key] = op + elif action == NewFollowAction.ResetFollowMutedList: + cls.reset_follow_mutedlists_to_flush[key] = op + elif action == NewFollowAction.ResetAllLists: + cls.reset_all_lists_to_flush[key] = op cls.idx += 1 @@ -134,7 +157,7 @@ class NewFollow(DbAdapterHolder): """Flush accumulated follow operations to the database in batches.""" n = 0 - if cls.mute_items_to_flush or cls.blacklisted_items_to_flush or cls.follow_muted_items_to_flush or cls.follow_blacklisted_items_to_flush or cls.follow_items_to_flush: + if cls.mute_items_to_flush or cls.blacklisted_items_to_flush or cls.follow_muted_items_to_flush or cls.follow_blacklisted_items_to_flush or cls.follow_items_to_flush or cls.reset_blacklists_to_flush or cls.reset_followinglists_to_flush or cls.reset_mutedlists_to_flush or cls.reset_follow_blacklists_to_flush or cls.reset_follow_mutedlists_to_flush or cls.reset_all_lists_to_flush: cls.beginTx() # Collect all unique account names to retrieve their IDs in a single query @@ -272,5 +295,142 @@ class NewFollow(DbAdapterHolder): ) cls.follow_items_to_flush.clear() n += 1 + + if cls.reset_blacklists_to_flush: + for key, op in cls.reset_blacklists_to_flush.items(): + follower, _ = key + follower_id = name_to_id.get(follower) + if not follower_id: + log.warning("Cannot reset blacklist records: missing ID for follower.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.blacklisted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.reset_blacklists_to_flush.clear() + n += 1 + + if cls.reset_followinglists_to_flush: + for key, op in cls.reset_followinglists_to_flush.items(): + follower, _ = key + follower_id = name_to_id.get(follower) + if not follower_id: + log.warning("Cannot reset follow records: missing ID for follower.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.reset_followinglists_to_flush.clear() + n += 1 + + if cls.reset_mutedlists_to_flush: + for key, op in cls.reset_mutedlists_to_flush.items(): + follower, _ = key + follower_id = name_to_id.get(follower) + if not follower_id: + log.warning("Cannot reset muted list records: missing ID for follower.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.reset_mutedlists_to_flush.clear() + n += 1 + + if cls.reset_follow_blacklists_to_flush: + for key, op in cls.reset_follow_blacklists_to_flush.items(): + follower, _ = key + follower_id = name_to_id.get(follower) + if not follower_id: + log.warning("Cannot reset follow blacklist records: missing ID for follower.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.reset_follow_blacklists_to_flush.clear() + n += 1 + + if cls.reset_follow_mutedlists_to_flush: + for key, op in cls.reset_follow_mutedlists_to_flush.items(): + follower, _ = key + follower_id = name_to_id.get(follower) + if not follower_id: + log.warning("Cannot reset follow muted list records: missing ID for follower.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_muted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.reset_follow_mutedlists_to_flush.clear() + n += 1 + + if cls.reset_all_lists_to_flush: + for key, op in cls.reset_all_lists_to_flush.items(): + follower, _ = key + follower_id = name_to_id.get(follower) + if not follower_id: + log.warning("Cannot reset all follow list records: missing ID for follower.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.blacklisted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_muted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.reset_all_lists_to_flush.clear() + n += 1 + cls.commitTx() return n -- GitLab From eaa5dd7ce014e8291d877d02a01f446c279c8205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 8 Jan 2025 16:25:22 +0100 Subject: [PATCH 19/83] Fix unmutes/unfollows --- hive/indexer/new_follow.py | 115 +++++++++++++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 5 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index d1d39fec7..a1b38d7c0 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -38,6 +38,11 @@ class NewFollow(DbAdapterHolder): follow_muted_items_to_flush = {} follow_blacklisted_items_to_flush = {} follow_items_to_flush = {} + unmute_items_to_flush = {} + unblacklist_items_to_flush = {} + unfollow_items_to_flush = {} + unfollow_blacklisted_items_to_flush = {} + unfollow_muted_items_to_flush = {} reset_blacklists_to_flush = {} reset_followinglists_to_flush = {} reset_mutedlists_to_flush = {} @@ -122,21 +127,21 @@ class NewFollow(DbAdapterHolder): elif action == NewFollowAction.Blacklist: cls.blacklisted_items_to_flush[key] = op elif action == NewFollowAction.Unmute: - cls.mute_items_to_flush.pop(key, None) + cls.unmute_items_to_flush[key] = op elif action == NewFollowAction.Unblacklist: - cls.blacklisted_items_to_flush.pop(key, None) + cls.unblacklist_items_to_flush[key] = op elif action == NewFollowAction.Follow: cls.follow_items_to_flush[key] = op elif action == NewFollowAction.Unfollow: - cls.follow_items_to_flush.pop(key, None) + cls.unfollow_items_to_flush[key] = op elif action == NewFollowAction.FollowBlacklisted: cls.follow_blacklisted_items_to_flush[key] = op elif action == NewFollowAction.UnFollowBlacklisted: - cls.follow_blacklisted_items_to_flush.pop(key, None) + cls.unfollow_blacklisted_items_to_flush[key] = op elif action == NewFollowAction.FollowMuted: cls.follow_muted_items_to_flush[key] = op elif action == NewFollowAction.UnfollowMuted: - cls.follow_muted_items_to_flush.pop(key, None) + cls.unfollow_muted_items_to_flush[key] = op elif action == NewFollowAction.ResetBlacklist: cls.reset_blacklists_to_flush[key] = op elif action == NewFollowAction.ResetFollowingList: @@ -296,6 +301,106 @@ class NewFollow(DbAdapterHolder): cls.follow_items_to_flush.clear() n += 1 + if cls.unmute_items_to_flush: + for key, op in cls.unmute_items_to_flush.items(): + follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot delete unmute record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.unmute_items_to_flush.clear() + n += 1 + + if cls.unblacklist_items_to_flush: + for key, op in cls.unblacklist_items_to_flush.items(): + follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot delete unblacklist record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.blacklisted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.unblacklist_items_to_flush.clear() + n += 1 + + if cls.unfollow_items_to_flush: + for key, op in cls.unfollow_items_to_flush.items(): + follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot delete unfollow record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.unfollow_items_to_flush.clear() + n += 1 + + if cls.unfollow_blacklisted_items_to_flush: + for key, op in cls.unfollow_blacklisted_items_to_flush.items(): + follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot delete unfollow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.unfollow_blacklisted_items_to_flush.clear() + n += 1 + + if cls.unfollow_muted_items_to_flush: + for key, op in cls.unfollow_muted_items_to_flush.items(): + follower, following = key + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + if not follower_id or not following_id: + log.warning(f"Cannot delete unfollow_muted record: missing IDs for follower '{follower}' or following '{following}'.") + continue # Skip this record + + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_muted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.unfollow_muted_items_to_flush.clear() + n += 1 + if cls.reset_blacklists_to_flush: for key, op in cls.reset_blacklists_to_flush.items(): follower, _ = key -- GitLab From 79cf0f2e3c68d7a1044129a9387062f6ef2212fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 9 Jan 2025 16:16:58 +0100 Subject: [PATCH 20/83] Fix handling Follow/Mute/Nothing actions --- hive/indexer/new_follow.py | 179 ++++++++++++++++++------------------- 1 file changed, 85 insertions(+), 94 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index a1b38d7c0..942242134 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -14,10 +14,8 @@ class NewFollowAction(enum.IntEnum): Nothing = 0 Mute = 1 Blacklist = 2 - Unmute = 3 Unblacklist = 4 Follow = 5 - Unfollow = 6 FollowBlacklisted = 7 # Added for 'follow_blacklist' UnFollowBlacklisted = 8 # Added for 'unfollow_blacklist' FollowMuted = 9 # Added for 'follow_muted' @@ -33,14 +31,11 @@ class NewFollowAction(enum.IntEnum): class NewFollow(DbAdapterHolder): """Handles processing of new follow-related operations.""" - mute_items_to_flush = {} + nothing_items_to_flush = {} blacklisted_items_to_flush = {} follow_muted_items_to_flush = {} follow_blacklisted_items_to_flush = {} - follow_items_to_flush = {} - unmute_items_to_flush = {} unblacklist_items_to_flush = {} - unfollow_items_to_flush = {} unfollow_blacklisted_items_to_flush = {} unfollow_muted_items_to_flush = {} reset_blacklists_to_flush = {} @@ -60,6 +55,7 @@ class NewFollow(DbAdapterHolder): return None what = first(op['what']) or '' + # the empty 'what' is used to clear existing 'blog' or 'ignore' state, however it can also be used to defs = { '': NewFollowAction.Nothing, 'blog': NewFollowAction.Follow, @@ -122,18 +118,16 @@ class NewFollow(DbAdapterHolder): for following in followings: key = (follower, following) - if action == NewFollowAction.Mute: - cls.mute_items_to_flush[key] = op + if action == NewFollowAction.Nothing: + cls.nothing_items_to_flush[key] = op + elif action == NewFollowAction.Mute: + cls.nothing_items_to_flush[key] = op elif action == NewFollowAction.Blacklist: cls.blacklisted_items_to_flush[key] = op - elif action == NewFollowAction.Unmute: - cls.unmute_items_to_flush[key] = op elif action == NewFollowAction.Unblacklist: cls.unblacklist_items_to_flush[key] = op elif action == NewFollowAction.Follow: - cls.follow_items_to_flush[key] = op - elif action == NewFollowAction.Unfollow: - cls.unfollow_items_to_flush[key] = op + cls.nothing_items_to_flush[key] = op elif action == NewFollowAction.FollowBlacklisted: cls.follow_blacklisted_items_to_flush[key] = op elif action == NewFollowAction.UnFollowBlacklisted: @@ -162,12 +156,26 @@ class NewFollow(DbAdapterHolder): """Flush accumulated follow operations to the database in batches.""" n = 0 - if cls.mute_items_to_flush or cls.blacklisted_items_to_flush or cls.follow_muted_items_to_flush or cls.follow_blacklisted_items_to_flush or cls.follow_items_to_flush or cls.reset_blacklists_to_flush or cls.reset_followinglists_to_flush or cls.reset_mutedlists_to_flush or cls.reset_follow_blacklists_to_flush or cls.reset_follow_mutedlists_to_flush or cls.reset_all_lists_to_flush: + if cls.nothing_items_to_flush or cls.blacklisted_items_to_flush or cls.follow_muted_items_to_flush or cls.follow_blacklisted_items_to_flush or cls.unblacklist_items_to_flush or cls.unfollow_blacklisted_items_to_flush or cls.unfollow_muted_items_to_flush or cls.reset_blacklists_to_flush or cls.reset_followinglists_to_flush or cls.reset_mutedlists_to_flush or cls.reset_follow_blacklists_to_flush or cls.reset_follow_mutedlists_to_flush or cls.reset_all_lists_to_flush: cls.beginTx() # Collect all unique account names to retrieve their IDs in a single query unique_names = set() - for items in [cls.mute_items_to_flush, cls.blacklisted_items_to_flush, cls.follow_muted_items_to_flush, cls.follow_blacklisted_items_to_flush, cls.follow_items_to_flush]: + for items in [ + cls.nothing_items_to_flush, + cls.blacklisted_items_to_flush, + cls.follow_muted_items_to_flush, + cls.follow_blacklisted_items_to_flush, + cls.unblacklist_items_to_flush, + cls.unfollow_blacklisted_items_to_flush, + cls.unfollow_muted_items_to_flush, + cls.reset_blacklists_to_flush, + cls.reset_followinglists_to_flush, + cls.reset_mutedlists_to_flush, + cls.reset_follow_blacklists_to_flush, + cls.reset_follow_mutedlists_to_flush, + cls.reset_all_lists_to_flush, + ]: for key in items.keys(): unique_names.update(key) @@ -181,28 +189,75 @@ class NewFollow(DbAdapterHolder): log.warning(f"Missing account IDs for names: {missing_accounts}") # Optionally, handle missing accounts (e.g., skip inserts or raise an error) - if cls.mute_items_to_flush: + if cls.nothing_items_to_flush: # Insert or update mute records - for key, op in cls.mute_items_to_flush.items(): + for key, op in cls.nothing_items_to_flush.items(): follower, following = key follower_id = name_to_id.get(follower) following_id = name_to_id.get(following) if not follower_id or not following_id: - log.warning(f"Cannot insert mute record: missing IDs for follower '{follower}' or following '{following}'.") + action = 'delete follow/mute' if op['action'] == NewFollow.Nothing else f"insert {(op['action'].name.lower())}" + log.warning(f"Cannot {action} record: missing IDs for follower '{follower}' or following '{following}'.") continue # Skip this record - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - cls.mute_items_to_flush.clear() + if op['action'] == NewFollowAction.Nothing: + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + elif op['action'] == NewFollowAction.Follow: + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] + ) + elif op['action'] == NewFollowAction.Mute: + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.nothing_items_to_flush.clear() n += 1 if cls.blacklisted_items_to_flush: @@ -277,50 +332,6 @@ class NewFollow(DbAdapterHolder): cls.follow_blacklisted_items_to_flush.clear() n += 1 - if cls.follow_items_to_flush: - # Insert or update follow records - for key, op in cls.follow_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) - if not follower_id or not following_id: - log.warning(f"Cannot insert follow record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record - - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - cls.follow_items_to_flush.clear() - n += 1 - - if cls.unmute_items_to_flush: - for key, op in cls.unmute_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) - if not follower_id or not following_id: - log.warning(f"Cannot delete unmute record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record - - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - cls.unmute_items_to_flush.clear() - n += 1 - if cls.unblacklist_items_to_flush: for key, op in cls.unblacklist_items_to_flush.items(): follower, following = key @@ -341,26 +352,6 @@ class NewFollow(DbAdapterHolder): cls.unblacklist_items_to_flush.clear() n += 1 - if cls.unfollow_items_to_flush: - for key, op in cls.unfollow_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) - if not follower_id or not following_id: - log.warning(f"Cannot delete unfollow record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record - - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - cls.unfollow_items_to_flush.clear() - n += 1 - if cls.unfollow_blacklisted_items_to_flush: for key, op in cls.unfollow_blacklisted_items_to_flush.items(): follower, following = key -- GitLab From 5da69abada73c86909c9bf9df4ad85f66caf1f76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Fri, 10 Jan 2025 16:37:21 +0100 Subject: [PATCH 21/83] Change hivemind_endpoints.bridge_api_get_relationship_between_accounts to new follows tables --- ..._api_get_relationship_between_accounts.sql | 66 +++---------------- 1 file changed, 8 insertions(+), 58 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_get_relationship_between_accounts.sql b/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_get_relationship_between_accounts.sql index b61e28243..6181e5165 100644 --- a/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_get_relationship_between_accounts.sql +++ b/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_get_relationship_between_accounts.sql @@ -26,7 +26,7 @@ BEGIN hivemind_postgrest_utilities.parse_argument_from_json(_params, 'account2', True), False), True); - + _observer_id = hivemind_postgrest_utilities.find_account_id( hivemind_postgrest_utilities.valid_account( hivemind_postgrest_utilities.parse_argument_from_json(_params, 'observer', False), @@ -35,63 +35,13 @@ BEGIN _debug = hivemind_postgrest_utilities.parse_argument_from_json(_params, 'debug', False); - IF _debug IS NULL THEN - _debug = False; - END IF; - - RETURN COALESCE( - ( SELECT - CASE WHEN NOT _debug THEN - jsonb_build_object( -- bridge_api_get_relationship_between_accounts - 'follows', CASE WHEN row.state = 1 THEN TRUE ELSE FALSE END, - 'ignores', CASE WHEN row.state = 2 THEN TRUE ELSE FALSE END, - 'blacklists', row.blacklisted, - 'follows_blacklists', row.follow_blacklists, - 'follows_muted', row.follow_muted - ) ELSE - jsonb_build_object( -- bridge_api_get_relationship_between_accounts with debug - 'follows', CASE WHEN row.state = 1 THEN TRUE ELSE FALSE END, - 'ignores', CASE WHEN row.state = 2 THEN TRUE ELSE FALSE END, - 'blacklists', row.blacklisted, - 'follows_blacklists', row.follow_blacklists, - 'follows_muted', row.follow_muted, - 'created_at', COALESCE(to_char(row.created_at, 'YYYY-MM-DD"T"HH24:MI:SS'), NULL), - 'block_num', row.block_num - ) - END - FROM ( - SELECT - hf.state, - COALESCE(hf.blacklisted, False) AS blacklisted, - COALESCE(hf.follow_blacklists, FALSE) AS follow_blacklists, - COALESCE(hf.follow_muted, FALSE) AS follow_muted, - hf.created_at, - hf.block_num - FROM - hivemind_app.hive_follows hf - WHERE - hf.follower = _account1_id AND hf.following = _account2_id - LIMIT 1 - ) row ), - CASE WHEN NOT _debug THEN - jsonb_build_object( -- bridge_api_get_relationship_between_accounts null - 'follows', FALSE, - 'ignores', FALSE, - 'blacklists', FALSE, - 'follows_blacklists', FALSE, - 'follows_muted', FALSE - ) ELSE - jsonb_build_object( -- bridge_api_get_relationship_between_accounts null with debug - 'follows', FALSE, - 'ignores', FALSE, - 'blacklists', FALSE, - 'follows_blacklists', FALSE, - 'follows_muted', FALSE, - 'created_at', NULL, - 'block_num', NULL - ) - END + RETURN jsonb_build_object( + 'follows', (SELECT EXISTS (SELECT 1 FROM hivemind_app.follows WHERE follower=_account1_id AND FOLLOWING=_account2_id)), + 'ignores', (SELECT EXISTS (SELECT 1 FROM hivemind_app.muted WHERE follower=_account1_id AND FOLLOWING=_account2_id)), + 'blacklists', (SELECT EXISTS (SELECT 1 FROM hivemind_app.blacklisted WHERE follower=_account1_id AND FOLLOWING=_account2_id)), + 'follows_blacklists', (SELECT EXISTS (SELECT 1 FROM hivemind_app.follow_blacklisted WHERE follower=_account1_id AND FOLLOWING=_account2_id)), + 'follows_muted', (SELECT EXISTS (SELECT 1 FROM hivemind_app.follow_muted WHERE follower=_account1_id AND FOLLOWING=_account2_id)) ); END $$ -; \ No newline at end of file +; -- GitLab From 569358bcb56478a2a468085e7956225f646bc9cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Tue, 14 Jan 2025 17:13:54 +0100 Subject: [PATCH 22/83] Remove block_num and created_at from mock_tests --- .../mock_tests/get_relationship_between_accounts/00.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/01.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/02.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/03.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/04.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/05.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/06.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/07.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/08.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/09.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0null.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x0.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x1.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x2.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x3.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x4.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x5.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x6.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x7.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x8.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/0x9.pat.json | 2 -- .../get_relationship_between_accounts/0xnull.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/10.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/11.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/12.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/13.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/14.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/15.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/16.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/17.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/18.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/19.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1null.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x0.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x1.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x2.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x3.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x4.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x5.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x6.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x7.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x8.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/1x9.pat.json | 2 -- .../get_relationship_between_accounts/1xnull.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/20.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/21.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/22.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/23.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/24.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/25.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/26.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/27.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/28.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/29.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2null.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x0.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x1.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x2.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x3.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x4.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x5.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x6.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x7.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x8.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/2x9.pat.json | 2 -- .../get_relationship_between_accounts/2xnull.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/30.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/31.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/32.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/33.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/34.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/35.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/36.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/37.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/38.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/39.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/3null.pat.json | 2 -- .../get_relationship_between_accounts/3xnull.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/40.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/41.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/42.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/43.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/44.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/45.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/46.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/47.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/48.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/49.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4null.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x0.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x1.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x2.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x3.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x4.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x5.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x6.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x7.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x8.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/4x9.pat.json | 2 -- .../get_relationship_between_accounts/4xnull.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/50.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/51.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/52.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/53.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/54.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/55.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/56.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/57.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/58.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/59.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5null.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x0.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x1.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x2.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x3.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x4.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x5.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x6.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x7.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x8.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/5x9.pat.json | 2 -- .../get_relationship_between_accounts/5xnull.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/60.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/61.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/62.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/63.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/64.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/65.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/66.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/67.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/68.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/69.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6null.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x0.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x1.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x2.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x3.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x4.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x5.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x6.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x7.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x8.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/6x9.pat.json | 2 -- .../get_relationship_between_accounts/6xnull.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/70.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/71.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/72.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/73.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/74.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/75.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/76.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/77.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/78.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/79.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7null.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x0.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x1.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x2.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x3.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x4.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x5.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x6.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x7.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x8.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/7x9.pat.json | 2 -- .../get_relationship_between_accounts/7xnull.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/80.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/81.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/82.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/83.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/84.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/85.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/86.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/87.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/88.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/89.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/8null.pat.json | 2 -- .../get_relationship_between_accounts/8xnull.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/90.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/91.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/92.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/93.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/94.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/95.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/96.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/97.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/98.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/99.pat.json | 2 -- .../mock_tests/get_relationship_between_accounts/9null.pat.json | 2 -- .../get_relationship_between_accounts/9xnull.pat.json | 2 -- 190 files changed, 380 deletions(-) diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/00.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/00.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/00.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/00.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/01.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/01.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/01.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/01.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/02.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/02.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/02.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/02.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/03.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/03.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/03.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/03.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/04.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/04.pat.json index fa50c8d74..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/04.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/04.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2010000, - "created_at": "2016-06-03T08:19:06", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/05.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/05.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/05.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/05.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/06.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/06.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/06.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/06.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/07.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/07.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/07.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/07.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/08.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/08.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/08.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/08.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/09.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/09.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/09.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/09.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x0.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x0.pat.json index 7166a2456..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x0.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x0.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2070000, - "created_at": "2016-06-05T10:37:48", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x1.pat.json index 6fd7e4983..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x1.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x1.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x2.pat.json index f45327322..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x2.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x2.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2070000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x3.pat.json index bea312007..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x3.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x3.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x4.pat.json index 26b0dbd6e..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x4.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x4.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x5.pat.json index 5c29335d1..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x5.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x5.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x6.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x6.pat.json index bea312007..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x6.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x6.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x7.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x7.pat.json index f0367161a..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x7.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x7.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x8.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x8.pat.json index 5c29335d1..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x8.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x8.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x9.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x9.pat.json index cdd1eddb3..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x9.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0x9.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0xnull.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/0xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/10.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/10.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/10.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/10.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/11.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/11.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/11.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/11.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/12.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/12.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/12.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/12.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/13.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/13.pat.json index ffcd994b6..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/13.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/13.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2010000, - "created_at": "2016-06-03T08:19:06", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/14.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/14.pat.json index 07858daf8..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/14.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/14.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/15.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/15.pat.json index 07858daf8..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/15.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/15.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/16.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/16.pat.json index 92221df9d..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/16.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/16.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/17.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/17.pat.json index cbabce258..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/17.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/17.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/18.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/18.pat.json index e374515b5..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/18.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/18.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/19.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/19.pat.json index 4ec19eb7f..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/19.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/19.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x0.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x0.pat.json index 523fdcea3..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x0.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x0.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x1.pat.json index 09c28dbba..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x1.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x1.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2070000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x2.pat.json index f45327322..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x2.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x2.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2070000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x3.pat.json index f5d142033..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x3.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x3.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x4.pat.json index f0367161a..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x4.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x4.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x5.pat.json index 5c29335d1..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x5.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x5.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x6.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x6.pat.json index bea312007..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x6.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x6.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x7.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x7.pat.json index f0367161a..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x7.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x7.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x8.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x8.pat.json index 5c29335d1..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x8.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x8.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x9.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x9.pat.json index 32e98c321..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x9.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1x9.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1xnull.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/1xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/20.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/20.pat.json index 9c73f28d3..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/20.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/20.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/21.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/21.pat.json index 9c73f28d3..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/21.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/21.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/22.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/22.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/22.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/22.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/23.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/23.pat.json index 9c73f28d3..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/23.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/23.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/24.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/24.pat.json index 9c73f28d3..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/24.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/24.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/25.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/25.pat.json index 8761a1397..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/25.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/25.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/26.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/26.pat.json index c6fc22b72..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/26.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/26.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/27.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/27.pat.json index e08b77a24..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/27.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/27.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/28.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/28.pat.json index b6b06edcd..6a16ba98c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/28.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/28.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/29.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/29.pat.json index a166b1a3b..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/29.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/29.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x0.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x0.pat.json index 7166a2456..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x0.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x0.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2070000, - "created_at": "2016-06-05T10:37:48", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x1.pat.json index 9735c2612..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x1.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x1.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x2.pat.json index f45327322..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x2.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x2.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2070000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x3.pat.json index bea312007..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x3.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x3.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x4.pat.json index cdd1eddb3..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x4.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x4.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x5.pat.json index 5c29335d1..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x5.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x5.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x6.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x6.pat.json index bea312007..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x6.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x6.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x7.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x7.pat.json index f0367161a..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x7.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x7.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x8.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x8.pat.json index 5c29335d1..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x8.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x8.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x9.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x9.pat.json index 26b0dbd6e..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x9.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2x9.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2xnull.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/2xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/30.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/30.pat.json index ef213dda6..7054a162d 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/30.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/30.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": true, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/31.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/31.pat.json index 8761a1397..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/31.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/31.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/32.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/32.pat.json index c6fc22b72..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/32.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/32.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/33.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/33.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/33.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/33.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/34.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/34.pat.json index e08b77a24..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/34.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/34.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/35.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/35.pat.json index c6fc22b72..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/35.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/35.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/36.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/36.pat.json index 2e5a2ac75..114e22327 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/36.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/36.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/37.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/37.pat.json index c6fc22b72..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/37.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/37.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/38.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/38.pat.json index b6b06edcd..6a16ba98c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/38.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/38.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/39.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/39.pat.json index e2faa2956..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/39.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/39.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3xnull.pat.json index fc97f3e75..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2010000, - "created_at": "2016-06-03T08:19:06", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/40.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/40.pat.json index 9152d792c..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/40.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/40.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/41.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/41.pat.json index 9152d792c..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/41.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/41.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/42.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/42.pat.json index e08b77a24..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/42.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/42.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/43.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/43.pat.json index 9152d792c..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/43.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/43.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/44.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/44.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/44.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/44.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/45.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/45.pat.json index 35208ea9a..f348023bb 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/45.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/45.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/46.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/46.pat.json index a166b1a3b..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/46.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/46.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/47.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/47.pat.json index 2e5a2ac75..114e22327 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/47.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/47.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/48.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/48.pat.json index 4f211874c..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/48.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/48.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/49.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/49.pat.json index 28fc322b0..9214c125b 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/49.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/49.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x0.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x0.pat.json index c84a8697b..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x0.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x0.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T10:37:48", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x1.pat.json index 09c28dbba..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x1.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x1.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2070000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x2.pat.json index 415ac34a3..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x2.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x2.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x3.pat.json index 32e98c321..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x3.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x3.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x4.pat.json index f0367161a..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x4.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x4.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x5.pat.json index 6768be03c..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x5.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x5.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x6.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x6.pat.json index bea312007..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x6.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x6.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x7.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x7.pat.json index f0367161a..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x7.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x7.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x8.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x8.pat.json index 5c29335d1..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x8.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x8.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x9.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x9.pat.json index f5d142033..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x9.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4x9.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4xnull.pat.json index a361480ea..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/4xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/50.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/50.pat.json index 4f211874c..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/50.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/50.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/51.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/51.pat.json index e08b77a24..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/51.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/51.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/52.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/52.pat.json index 1832c87dd..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/52.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/52.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/53.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/53.pat.json index ef213dda6..7054a162d 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/53.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/53.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": true, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/54.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/54.pat.json index e9523d26a..28901457f 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/54.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/54.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/55.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/55.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/55.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/55.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/56.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/56.pat.json index 7673bbaf0..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/56.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/56.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/57.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/57.pat.json index 7673bbaf0..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/57.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/57.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/58.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/58.pat.json index 1832c87dd..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/58.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/58.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/59.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/59.pat.json index 7673bbaf0..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/59.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/59.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x0.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x0.pat.json index 7166a2456..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x0.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x0.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2070000, - "created_at": "2016-06-05T10:37:48", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x1.pat.json index 09c28dbba..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x1.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x1.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2070000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x2.pat.json index 523fdcea3..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x2.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x2.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x3.pat.json index bea312007..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x3.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x3.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x4.pat.json index f0367161a..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x4.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x4.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x5.pat.json index f5d142033..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x5.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x5.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x6.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x6.pat.json index bea312007..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x6.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x6.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x7.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x7.pat.json index f0367161a..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x7.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x7.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x8.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x8.pat.json index 5c29335d1..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x8.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x8.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x9.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x9.pat.json index 6768be03c..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x9.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5x9.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5xnull.pat.json index 6768be03c..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/60.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/60.pat.json index e08b77a24..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/60.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/60.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2040000, - "created_at": "2016-06-04T01:04:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/61.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/61.pat.json index a0307bd08..6a16ba98c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/61.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/61.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/62.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/62.pat.json index bc58a2942..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/62.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/62.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 5000010, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/63.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/63.pat.json index c2ec0d6e9..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/63.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/63.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/64.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/64.pat.json index a4ab1caaa..2f1decfb7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/64.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/64.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/65.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/65.pat.json index 469bcbf96..4d9fbc0d1 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/65.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/65.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 5000010, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/66.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/66.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/66.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/66.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/67.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/67.pat.json index f6e78f468..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/67.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/67.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/68.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/68.pat.json index 600c62399..7054a162d 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/68.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/68.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/69.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/69.pat.json index 274c2a60c..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/69.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/69.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 5000010, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x0.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x0.pat.json index 7f635aac2..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x0.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x0.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x1.pat.json index 7f635aac2..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x1.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x1.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x2.pat.json index 7f635aac2..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x2.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x2.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T10:37:48", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x3.pat.json index a361480ea..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x3.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x3.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x4.pat.json index a361480ea..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x4.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x4.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x5.pat.json index a361480ea..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x5.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x5.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x6.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x6.pat.json index bea312007..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x6.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x6.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x7.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x7.pat.json index f0367161a..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x7.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x7.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x8.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x8.pat.json index 5c29335d1..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x8.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x8.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x9.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x9.pat.json index 0fc8cbf0a..8dbfac18f 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x9.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6x9.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6xnull.pat.json index f5d142033..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2080000, - "created_at": "2016-06-05T18:59:36", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/70.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/70.pat.json index 798d6f948..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/70.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/70.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/71.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/71.pat.json index c2ec0d6e9..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/71.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/71.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/72.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/72.pat.json index 1b5a2efb7..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/72.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/72.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/73.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/73.pat.json index 214e5d87e..eba2282f8 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/73.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/73.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 5000010, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/74.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/74.pat.json index 8e99628f1..0aa085a14 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/74.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/74.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/75.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/75.pat.json index 798d6f948..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/75.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/75.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/76.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/76.pat.json index f43e76407..6a16ba98c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/76.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/76.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 5000010, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/77.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/77.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/77.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/77.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/78.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/78.pat.json index 1b5a2efb7..161fc780c 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/78.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/78.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/79.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/79.pat.json index 591c47201..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/79.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/79.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x0.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x0.pat.json index 4a1761c52..35e7fe6af 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x0.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x0.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090002, - "created_at": "2016-06-06T03:21:54", "follows": true, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x1.pat.json index b93a1ac0e..4d40991a9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x1.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x1.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090002, - "created_at": "2016-06-06T03:21:54", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x2.pat.json index 311a730fe..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x2.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x2.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2090002, - "created_at": "2016-06-06T03:21:54", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x3.pat.json index 7695df7ec..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x3.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x3.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090002, - "created_at": "2016-06-06T03:21:54", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x4.pat.json index 0dff8a2d3..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x4.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x4.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090002, - "created_at": "2016-06-06T03:21:54", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x5.pat.json index 4dfcdc67d..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x5.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x5.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090001, - "created_at": "2016-06-06T03:21:54", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x6.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x6.pat.json index 4dfcdc67d..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x6.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x6.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090001, - "created_at": "2016-06-06T03:21:54", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x7.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x7.pat.json index 4dfcdc67d..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x7.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x7.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090001, - "created_at": "2016-06-06T03:21:54", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x8.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x8.pat.json index bb7491b2e..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x8.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x8.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090000, - "created_at": "2016-06-06T03:21:54", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x9.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x9.pat.json index 4dfcdc67d..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x9.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7x9.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090001, - "created_at": "2016-06-06T03:21:54", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7xnull.pat.json index 132d2b6a3..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2090001, - "created_at": "2016-06-06T03:21:57", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/80.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/80.pat.json index 591c47201..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/80.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/80.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/81.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/81.pat.json index c2ec0d6e9..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/81.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/81.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/82.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/82.pat.json index e4c10d372..094990b60 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/82.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/82.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 5000010, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/83.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/83.pat.json index 591c47201..57d8f8134 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/83.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/83.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/84.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/84.pat.json index 56e1d1064..00d723135 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/84.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/84.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/85.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/85.pat.json index 8dda7ac09..114e22327 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/85.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/85.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 5000010, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/86.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/86.pat.json index d164c8f19..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/86.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/86.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/87.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/87.pat.json index d164c8f19..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/87.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/87.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/88.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/88.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/88.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/88.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/89.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/89.pat.json index d164c8f19..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/89.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/89.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8xnull.pat.json index e374515b5..d8216a702 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": true, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/90.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/90.pat.json index c2ec0d6e9..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/90.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/90.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/91.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/91.pat.json index 4a08645aa..6811e2096 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/91.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/91.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/92.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/92.pat.json index 62ae3bcfd..439582326 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/92.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/92.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 5000010, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/93.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/93.pat.json index 1abf672ac..eba2282f8 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/93.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/93.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/94.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/94.pat.json index 371d0c6b8..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/94.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/94.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/95.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/95.pat.json index 292ece865..f348023bb 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/95.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/95.pat.json @@ -1,7 +1,5 @@ { "blacklists": true, - "block_num": 5000010, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/96.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/96.pat.json index 220a25f6a..4d9fbc0d1 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/96.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/96.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2060000, - "created_at": "2016-06-04T17:54:00", "follows": true, "follows_blacklists": true, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/97.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/97.pat.json index 371d0c6b8..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/97.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/97.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": true, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/98.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/98.pat.json index c2ec0d6e9..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/98.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/98.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2050001, - "created_at": "2016-06-04T17:54:00", "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/99.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/99.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/99.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/99.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9null.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9null.pat.json index c64e5652e..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9null.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9null.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": null, - "created_at": null, "follows": false, "follows_blacklists": false, "follows_muted": false, diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9xnull.pat.json index 4ec19eb7f..ce88655e7 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9xnull.pat.json @@ -1,7 +1,5 @@ { "blacklists": false, - "block_num": 2020000, - "created_at": "2016-06-03T16:41:06", "follows": false, "follows_blacklists": false, "follows_muted": true, -- GitLab From 00c504136f2e771b9540fcc67256d908dbbf2833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Tue, 14 Jan 2025 17:16:00 +0100 Subject: [PATCH 23/83] Fix new_follow indexer Splitting data into separate lists means they are applied in different order, which cause tests to fail. To fix this just put all items in one big list so that they are applied in order. --- hive/indexer/new_follow.py | 414 +++++++++++++------------------------ 1 file changed, 140 insertions(+), 274 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 942242134..720cfa764 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -31,6 +31,8 @@ class NewFollowAction(enum.IntEnum): class NewFollow(DbAdapterHolder): """Handles processing of new follow-related operations.""" + items_to_flush = [] + unique_names = set() nothing_items_to_flush = {} blacklisted_items_to_flush = {} follow_muted_items_to_flush = {} @@ -110,169 +112,51 @@ class NewFollow(DbAdapterHolder): return op['block_num'] = block_num - action = op['action'] - follower = op['follower'] - followings = op.get('following', None) - - # Process each following individually - for following in followings: - key = (follower, following) - - if action == NewFollowAction.Nothing: - cls.nothing_items_to_flush[key] = op - elif action == NewFollowAction.Mute: - cls.nothing_items_to_flush[key] = op - elif action == NewFollowAction.Blacklist: - cls.blacklisted_items_to_flush[key] = op - elif action == NewFollowAction.Unblacklist: - cls.unblacklist_items_to_flush[key] = op - elif action == NewFollowAction.Follow: - cls.nothing_items_to_flush[key] = op - elif action == NewFollowAction.FollowBlacklisted: - cls.follow_blacklisted_items_to_flush[key] = op - elif action == NewFollowAction.UnFollowBlacklisted: - cls.unfollow_blacklisted_items_to_flush[key] = op - elif action == NewFollowAction.FollowMuted: - cls.follow_muted_items_to_flush[key] = op - elif action == NewFollowAction.UnfollowMuted: - cls.unfollow_muted_items_to_flush[key] = op - elif action == NewFollowAction.ResetBlacklist: - cls.reset_blacklists_to_flush[key] = op - elif action == NewFollowAction.ResetFollowingList: - cls.reset_followinglists_to_flush[key] = op - elif action == NewFollowAction.ResetMutedList: - cls.reset_mutedlists_to_flush[key] = op - elif action == NewFollowAction.ResetFollowBlacklist: - cls.reset_follow_blacklists_to_flush[key] = op - elif action == NewFollowAction.ResetFollowMutedList: - cls.reset_follow_mutedlists_to_flush[key] = op - elif action == NewFollowAction.ResetAllLists: - cls.reset_all_lists_to_flush[key] = op + follower = op['follower'] + cls.unique_names.add(follower) + for following in op.get('following', []): + cls.items_to_flush.append((follower, following, op)) + cls.unique_names.add(following) cls.idx += 1 @classmethod def flush(cls): """Flush accumulated follow operations to the database in batches.""" - n = 0 - - if cls.nothing_items_to_flush or cls.blacklisted_items_to_flush or cls.follow_muted_items_to_flush or cls.follow_blacklisted_items_to_flush or cls.unblacklist_items_to_flush or cls.unfollow_blacklisted_items_to_flush or cls.unfollow_muted_items_to_flush or cls.reset_blacklists_to_flush or cls.reset_followinglists_to_flush or cls.reset_mutedlists_to_flush or cls.reset_follow_blacklists_to_flush or cls.reset_follow_mutedlists_to_flush or cls.reset_all_lists_to_flush: - cls.beginTx() - - # Collect all unique account names to retrieve their IDs in a single query - unique_names = set() - for items in [ - cls.nothing_items_to_flush, - cls.blacklisted_items_to_flush, - cls.follow_muted_items_to_flush, - cls.follow_blacklisted_items_to_flush, - cls.unblacklist_items_to_flush, - cls.unfollow_blacklisted_items_to_flush, - cls.unfollow_muted_items_to_flush, - cls.reset_blacklists_to_flush, - cls.reset_followinglists_to_flush, - cls.reset_mutedlists_to_flush, - cls.reset_follow_blacklists_to_flush, - cls.reset_follow_mutedlists_to_flush, - cls.reset_all_lists_to_flush, - ]: - for key in items.keys(): - unique_names.update(key) - - # Retrieve all account IDs - name_to_id_records = cls.db.query_all(f"""SELECT name, id FROM {SCHEMA_NAME}.hive_accounts WHERE name IN :names""", names=tuple(unique_names)) - name_to_id = {record['name']: record['id'] for record in name_to_id_records} - - # Ensure all account names have corresponding IDs - missing_accounts = unique_names - set(name_to_id.keys()) - if missing_accounts: - log.warning(f"Missing account IDs for names: {missing_accounts}") - # Optionally, handle missing accounts (e.g., skip inserts or raise an error) - - if cls.nothing_items_to_flush: - # Insert or update mute records - for key, op in cls.nothing_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) - if not follower_id or not following_id: - action = 'delete follow/mute' if op['action'] == NewFollow.Nothing else f"insert {(op['action'].name.lower())}" - log.warning(f"Cannot {action} record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record - - if op['action'] == NewFollowAction.Nothing: - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - elif op['action'] == NewFollowAction.Follow: - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - elif op['action'] == NewFollowAction.Mute: - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - cls.nothing_items_to_flush.clear() - n += 1 - - if cls.blacklisted_items_to_flush: - # Insert or update blacklist records - for key, op in cls.blacklisted_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) - if not follower_id or not following_id: - log.warning(f"Cannot insert blacklist record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record + if not cls.items_to_flush: + return 0 + + n = len(cls.items_to_flush) + + cls.beginTx() + + name_to_id_records = cls.db.query_all(f"""SELECT name, id FROM {SCHEMA_NAME}.hive_accounts WHERE name IN :names""", names=tuple(cls.unique_names)) + name_to_id = {record['name']: record['id'] for record in name_to_id_records} + missing_accounts = cls.unique_names - set(name_to_id.keys()) + if missing_accounts: + log.warning(f"Missing account IDs for names: {missing_accounts}") + + for (follower, following, op) in cls.items_to_flush: + action = op['action'] + follower_id = name_to_id.get(follower) + following_id = name_to_id.get(following) + match action: + case NewFollowAction.Follow: + if not follower_id or not following_id: + log.warning(f"Cannot insert follow record: missing IDs for follower '{follower}' or following '{following}'.") + continue cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num @@ -281,22 +165,13 @@ class NewFollow(DbAdapterHolder): following_id=following_id, block_num=op['block_num'] ) - cls.blacklisted_items_to_flush.clear() - n += 1 - - if cls.follow_muted_items_to_flush: - # Insert or update follow_muted records - for key, op in cls.follow_muted_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) + case NewFollowAction.Mute: if not follower_id or not following_id: - log.warning(f"Cannot insert follow_muted record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record - + log.warning(f"Cannot insert mute record: missing IDs for follower '{follower}' or following '{following}'.") + continue cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) + INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num @@ -305,22 +180,41 @@ class NewFollow(DbAdapterHolder): following_id=following_id, block_num=op['block_num'] ) - cls.follow_muted_items_to_flush.clear() - n += 1 - - if cls.follow_blacklisted_items_to_flush: - # Insert or update follow_blacklist records - for key, op in cls.follow_blacklisted_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + case NewFollowAction.Nothing: if not follower_id or not following_id: - log.warning(f"Cannot insert follow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record - + log.warning(f"Cannot remove mute/follow record: missing IDs for follower '{follower}' or following '{following}'.") + continue cls.db.query_no_return( f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + case NewFollowAction.Blacklist: + if not follower_id or not following_id: + log.warning(f"Cannot insert blacklist record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) VALUES (:follower_id, :following_id, :block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num @@ -329,18 +223,10 @@ class NewFollow(DbAdapterHolder): following_id=following_id, block_num=op['block_num'] ) - cls.follow_blacklisted_items_to_flush.clear() - n += 1 - - if cls.unblacklist_items_to_flush: - for key, op in cls.unblacklist_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) + case NewFollowAction.Unblacklist: if not follower_id or not following_id: log.warning(f"Cannot delete unblacklist record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record - + continue cls.db.query_no_return( f""" DELETE FROM {SCHEMA_NAME}.blacklisted @@ -349,37 +235,27 @@ class NewFollow(DbAdapterHolder): follower_id=follower_id, following_id=following_id ) - cls.unblacklist_items_to_flush.clear() - n += 1 - - if cls.unfollow_blacklisted_items_to_flush: - for key, op in cls.unfollow_blacklisted_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) + + case NewFollowAction.FollowMuted: if not follower_id or not following_id: - log.warning(f"Cannot delete unfollow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record + log.warning(f"Cannot insert follow_muted record: missing IDs for follower '{follower}' or following '{following}'.") + continue cls.db.query_no_return( f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted - WHERE follower = :follower_id AND following = :following_id + INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num """, follower_id=follower_id, - following_id=following_id + following_id=following_id, + block_num=op['block_num'] ) - cls.unfollow_blacklisted_items_to_flush.clear() - n += 1 - - if cls.unfollow_muted_items_to_flush: - for key, op in cls.unfollow_muted_items_to_flush.items(): - follower, following = key - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) + case NewFollowAction.UnfollowMuted: if not follower_id or not following_id: log.warning(f"Cannot delete unfollow_muted record: missing IDs for follower '{follower}' or following '{following}'.") - continue # Skip this record + continue cls.db.query_no_return( f""" @@ -389,35 +265,39 @@ class NewFollow(DbAdapterHolder): follower_id=follower_id, following_id=following_id ) - cls.unfollow_muted_items_to_flush.clear() - n += 1 - - if cls.reset_blacklists_to_flush: - for key, op in cls.reset_blacklists_to_flush.items(): - follower, _ = key - follower_id = name_to_id.get(follower) - if not follower_id: - log.warning("Cannot reset blacklist records: missing ID for follower.") - continue # Skip this record + case NewFollowAction.FollowBlacklisted: + if not follower_id or not following_id: + log.warning(f"Cannot insert follow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") + continue cls.db.query_no_return( f""" - DELETE FROM {SCHEMA_NAME}.blacklisted - WHERE follower=:follower_id + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num """, - follower_id=follower_id + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] + ) + case NewFollowAction.UnFollowBlacklisted: + if not follower_id or not following_id: + log.warning(f"Cannot delete unfollow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id ) - cls.reset_blacklists_to_flush.clear() - n += 1 - if cls.reset_followinglists_to_flush: - for key, op in cls.reset_followinglists_to_flush.items(): - follower, _ = key - follower_id = name_to_id.get(follower) + case NewFollowAction.ResetFollowingList: if not follower_id: log.warning("Cannot reset follow records: missing ID for follower.") - continue # Skip this record - + continue cls.db.query_no_return( f""" DELETE FROM {SCHEMA_NAME}.follows @@ -425,17 +305,10 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) - cls.reset_followinglists_to_flush.clear() - n += 1 - - if cls.reset_mutedlists_to_flush: - for key, op in cls.reset_mutedlists_to_flush.items(): - follower, _ = key - follower_id = name_to_id.get(follower) + case NewFollowAction.ResetMutedList: if not follower_id: log.warning("Cannot reset muted list records: missing ID for follower.") - continue # Skip this record - + continue cls.db.query_no_return( f""" DELETE FROM {SCHEMA_NAME}.muted @@ -443,35 +316,21 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) - cls.reset_mutedlists_to_flush.clear() - n += 1 - - if cls.reset_follow_blacklists_to_flush: - for key, op in cls.reset_follow_blacklists_to_flush.items(): - follower, _ = key - follower_id = name_to_id.get(follower) + case NewFollowAction.ResetBlacklist: if not follower_id: - log.warning("Cannot reset follow blacklist records: missing ID for follower.") - continue # Skip this record - + log.warning("Cannot reset blacklist records: missing ID for follower.") + continue cls.db.query_no_return( f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted + DELETE FROM {SCHEMA_NAME}.blacklisted WHERE follower=:follower_id """, follower_id=follower_id ) - cls.reset_follow_blacklists_to_flush.clear() - n += 1 - - if cls.reset_follow_mutedlists_to_flush: - for key, op in cls.reset_follow_mutedlists_to_flush.items(): - follower, _ = key - follower_id = name_to_id.get(follower) + case NewFollowAction.ResetFollowMutedList: if not follower_id: log.warning("Cannot reset follow muted list records: missing ID for follower.") - continue # Skip this record - + continue cls.db.query_no_return( f""" DELETE FROM {SCHEMA_NAME}.follow_muted @@ -479,17 +338,21 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) - cls.reset_follow_mutedlists_to_flush.clear() - n += 1 - - if cls.reset_all_lists_to_flush: - for key, op in cls.reset_all_lists_to_flush.items(): - follower, _ = key - follower_id = name_to_id.get(follower) + case NewFollowAction.ResetFollowBlacklist: + if not follower_id: + log.warning("Cannot reset follow blacklist records: missing ID for follower.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + case NewFollowAction.ResetAllLists: if not follower_id: log.warning("Cannot reset all follow list records: missing ID for follower.") - continue # Skip this record - + continue cls.db.query_no_return( f""" DELETE FROM {SCHEMA_NAME}.blacklisted @@ -525,8 +388,11 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) - cls.reset_all_lists_to_flush.clear() - n += 1 - cls.commitTx() + case _: + raise Exception(f"Invalid item {item}") + + cls.items_to_flush.clear() + cls.unique_names.clear() + cls.commitTx() return n -- GitLab From 2ace74019d1de3fd7fd2800dfbdb0b6e953d3e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 15 Jan 2025 10:27:06 +0100 Subject: [PATCH 24/83] Change match to if branches --- hive/indexer/new_follow.py | 493 ++++++++++++++++++------------------- 1 file changed, 243 insertions(+), 250 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 720cfa764..20bb9e37d 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -141,256 +141,249 @@ class NewFollow(DbAdapterHolder): action = op['action'] follower_id = name_to_id.get(follower) following_id = name_to_id.get(following) - match action: - case NewFollowAction.Follow: - if not follower_id or not following_id: - log.warning(f"Cannot insert follow record: missing IDs for follower '{follower}' or following '{following}'.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - case NewFollowAction.Mute: - if not follower_id or not following_id: - log.warning(f"Cannot insert mute record: missing IDs for follower '{follower}' or following '{following}'.") - continue - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - case NewFollowAction.Nothing: - if not follower_id or not following_id: - log.warning(f"Cannot remove mute/follow record: missing IDs for follower '{follower}' or following '{following}'.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - case NewFollowAction.Blacklist: - if not follower_id or not following_id: - log.warning(f"Cannot insert blacklist record: missing IDs for follower '{follower}' or following '{following}'.") - continue - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - case NewFollowAction.Unblacklist: - if not follower_id or not following_id: - log.warning(f"Cannot delete unblacklist record: missing IDs for follower '{follower}' or following '{following}'.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.blacklisted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - - case NewFollowAction.FollowMuted: - if not follower_id or not following_id: - log.warning(f"Cannot insert follow_muted record: missing IDs for follower '{follower}' or following '{following}'.") - continue - - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - case NewFollowAction.UnfollowMuted: - if not follower_id or not following_id: - log.warning(f"Cannot delete unfollow_muted record: missing IDs for follower '{follower}' or following '{following}'.") - continue - - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_muted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - - case NewFollowAction.FollowBlacklisted: - if not follower_id or not following_id: - log.warning(f"Cannot insert follow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") - continue - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - case NewFollowAction.UnFollowBlacklisted: - if not follower_id or not following_id: - log.warning(f"Cannot delete unfollow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - - case NewFollowAction.ResetFollowingList: - if not follower_id: - log.warning("Cannot reset follow records: missing ID for follower.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - case NewFollowAction.ResetMutedList: - if not follower_id: - log.warning("Cannot reset muted list records: missing ID for follower.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - case NewFollowAction.ResetBlacklist: - if not follower_id: - log.warning("Cannot reset blacklist records: missing ID for follower.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.blacklisted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - case NewFollowAction.ResetFollowMutedList: - if not follower_id: - log.warning("Cannot reset follow muted list records: missing ID for follower.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_muted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - case NewFollowAction.ResetFollowBlacklist: - if not follower_id: - log.warning("Cannot reset follow blacklist records: missing ID for follower.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - case NewFollowAction.ResetAllLists: - if not follower_id: - log.warning("Cannot reset all follow list records: missing ID for follower.") - continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.blacklisted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_muted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - - case _: - raise Exception(f"Invalid item {item}") + if action == NewFollowAction.Follow: + if not follower_id or not following_id: + log.warning(f"Cannot insert follow record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] + ) + elif action == NewFollowAction.Mute: + if not follower_id or not following_id: + log.warning(f"Cannot insert mute record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + elif action == NewFollowAction.Nothing: + if not follower_id or not following_id: + log.warning(f"Cannot remove mute/follow record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + elif action == NewFollowAction.Blacklist: + if not follower_id or not following_id: + log.warning(f"Cannot insert blacklist record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] + ) + elif action == NewFollowAction.Unblacklist: + if not follower_id or not following_id: + log.warning(f"Cannot delete unblacklist record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.blacklisted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + elif action == NewFollowAction.FollowMuted: + if not follower_id or not following_id: + log.warning(f"Cannot insert follow_muted record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] + ) + elif action == NewFollowAction.UnfollowMuted: + if not follower_id or not following_id: + log.warning(f"Cannot delete unfollow_muted record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_muted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + elif action == NewFollowAction.FollowBlacklisted: + if not follower_id or not following_id: + log.warning(f"Cannot insert follow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=following_id, + block_num=op['block_num'] + ) + elif action == NewFollowAction.UnFollowBlacklisted: + if not follower_id or not following_id: + log.warning(f"Cannot delete unfollow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted + WHERE follower = :follower_id AND following = :following_id + """, + follower_id=follower_id, + following_id=following_id + ) + elif action == NewFollowAction.ResetFollowingList: + if not follower_id: + log.warning("Cannot reset follow records: missing ID for follower.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + elif action == NewFollowAction.ResetMutedList: + if not follower_id: + log.warning("Cannot reset muted list records: missing ID for follower.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + elif action == NewFollowAction.ResetBlacklist: + if not follower_id: + log.warning("Cannot reset blacklist records: missing ID for follower.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.blacklisted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + elif action == NewFollowAction.ResetFollowMutedList: + if not follower_id: + log.warning("Cannot reset follow muted list records: missing ID for follower.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_muted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + elif action == NewFollowAction.ResetFollowBlacklist: + if not follower_id: + log.warning("Cannot reset follow blacklist records: missing ID for follower.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + elif action == NewFollowAction.ResetAllLists: + if not follower_id: + log.warning("Cannot reset all follow list records: missing ID for follower.") + continue + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.blacklisted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_muted + WHERE follower=:follower_id + """, + follower_id=follower_id + ) + else: + raise Exception(f"Invalid action {action}") cls.items_to_flush.clear() cls.unique_names.clear() -- GitLab From 9537d3c9c5043a10a5db045930edf642f786a0fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Fri, 17 Jan 2025 15:47:34 +0100 Subject: [PATCH 25/83] Resets add following to account "null" --- hive/indexer/new_follow.py | 58 +++++++++++++++++-- mock_data/block_data/follow_op/tests_flow.txt | 1 - 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/hive/indexer/new_follow.py b/hive/indexer/new_follow.py index 20bb9e37d..bebccc473 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/new_follow.py @@ -115,10 +115,15 @@ class NewFollow(DbAdapterHolder): follower = op['follower'] cls.unique_names.add(follower) - for following in op.get('following', []): - cls.items_to_flush.append((follower, following, op)) - cls.unique_names.add(following) + action = op['action'] + if action in [NewFollowAction.ResetBlacklist, NewFollowAction.ResetFollowingList, NewFollowAction.ResetMutedList, NewFollowAction.ResetFollowBlacklist, NewFollowAction.ResetFollowMutedList, NewFollowAction.ResetAllLists]: + cls.items_to_flush.append((follower, None, op)) cls.idx += 1 + else: + for following in op.get('following', []): + cls.items_to_flush.append((follower, following, op)) + cls.unique_names.add(following) + cls.idx += 1 @classmethod def flush(cls): @@ -130,7 +135,7 @@ class NewFollow(DbAdapterHolder): cls.beginTx() - name_to_id_records = cls.db.query_all(f"""SELECT name, id FROM {SCHEMA_NAME}.hive_accounts WHERE name IN :names""", names=tuple(cls.unique_names)) + name_to_id_records = cls.db.query_all(f"""SELECT name, id FROM {SCHEMA_NAME}.hive_accounts WHERE name IN :names""", names=tuple(cls.unique_names | set(['null']))) name_to_id = {record['name']: record['id'] for record in name_to_id_records} missing_accounts = cls.unique_names - set(name_to_id.keys()) @@ -141,6 +146,7 @@ class NewFollow(DbAdapterHolder): action = op['action'] follower_id = name_to_id.get(follower) following_id = name_to_id.get(following) + null_id = name_to_id.get('null') if action == NewFollowAction.Follow: if not follower_id or not following_id: log.warning(f"Cannot insert follow record: missing IDs for follower '{follower}' or following '{following}'.") @@ -332,6 +338,17 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=null_id, + block_num=op['block_num'] + ) elif action == NewFollowAction.ResetFollowBlacklist: if not follower_id: log.warning("Cannot reset follow blacklist records: missing ID for follower.") @@ -343,6 +360,17 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=null_id, + block_num=op['block_num'] + ) elif action == NewFollowAction.ResetAllLists: if not follower_id: log.warning("Cannot reset all follow list records: missing ID for follower.") @@ -382,6 +410,28 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=null_id, + block_num=op['block_num'] + ) + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) + VALUES (:follower_id, :following_id, :block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """, + follower_id=follower_id, + following_id=null_id, + block_num=op['block_num'] + ) else: raise Exception(f"Invalid action {action}") diff --git a/mock_data/block_data/follow_op/tests_flow.txt b/mock_data/block_data/follow_op/tests_flow.txt index dcc545f02..d2283efc7 100644 --- a/mock_data/block_data/follow_op/tests_flow.txt +++ b/mock_data/block_data/follow_op/tests_flow.txt @@ -125,7 +125,6 @@ block 2050000, time 2016-06-04T17:54:00 and Tests for list resets. They first assign multiple flags/state to various pairs of accounts (x accounts as followers) - in the same or different packs of blocks - then they call list resets. Finally some tests set some flags again in the same block as reset to show that order of operations is preserved even though list reset and flag setting are executed in completely different ways. -(3x, 8x and 9x already have relations to 'null' from previous tests, so they are not touched), X = 0x, 1x, 2x, 4x, 5x, 6x block 2070000, time 2016-06-05 10:37:48 X0. 'blog' + 'follow_blacklist' X1. 'ignore' + 'blacklist' -- GitLab From 15439156c1a7eb5a3f4b2c90e2b67e3f27814f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Tue, 21 Jan 2025 13:25:18 +0100 Subject: [PATCH 26/83] Change notification views to new follow tables --- hive/db/sql_scripts/notifications_view.sql | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index 604ecdf6c..31835ac3d 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -46,7 +46,6 @@ AS $BODY$ $BODY$; DROP FUNCTION IF EXISTS hivemind_app.notification_id CASCADE; -; CREATE OR REPLACE FUNCTION hivemind_app.notification_id(in _block_number INTEGER, in _notifyType INTEGER, in _id INTEGER) RETURNS BIGINT AS @@ -115,22 +114,21 @@ CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view FROM hivemind_app.hive_posts_pp_view hpv WHERE hpv.depth > 0 AND NOT EXISTS (SELECT NULL::text - FROM hivemind_app.hive_follows hf - WHERE hf.follower = hpv.parent_author_id AND hf.following = hpv.author_id AND hf.state = 2) + FROM hivemind_app.muted AS m + WHERE m.follower = hpv.parent_author_id AND m.following = hpv.author_id) UNION ALL - SELECT hf.block_num, - hivemind_app.notification_id(hf.block_num, 15, hf.id) AS id, + SELECT f.block_num, + hivemind_app.notification_id(f.block_num, 15, f.hive_rowid::integer) AS id, 0 AS post_id, 15 AS type_id, - (select hb.created_at from hivemind_app.blocks_view hb where hb.num = (hf.block_num - 1)) as created_at, -- use time of previous block to match head_block_time behavior at given block - hf.follower AS src, - hf.following AS dst, + (select hb.created_at from hivemind_app.blocks_view hb where hb.num = (f.block_num - 1)) as created_at, -- use time of previous block to match head_block_time behavior at given block + f.follower AS src, + f.following AS dst, 0 as dst_post_id, ''::character varying(16) AS community, ''::character varying AS community_title, ''::character varying AS payload - FROM hivemind_app.hive_follows hf - WHERE hf.state = 1 --only follow blog + FROM hivemind_app.follows f UNION ALL SELECT hr.block_num, -- GitLab From 2082fa5731da8d4129caecd704e26f7191f25feb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Tue, 21 Jan 2025 18:00:13 +0100 Subject: [PATCH 27/83] Convert get_post_view_by_id to new tables --- hive/db/sql_scripts/get_post_view_by_id.sql | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/hive/db/sql_scripts/get_post_view_by_id.sql b/hive/db/sql_scripts/get_post_view_by_id.sql index 5d56876d2..5292ac284 100644 --- a/hive/db/sql_scripts/get_post_view_by_id.sql +++ b/hive/db/sql_scripts/get_post_view_by_id.sql @@ -260,25 +260,24 @@ BEGIN RETURN QUERY WITH blacklisters AS MATERIALIZED --all blacklists followed by account ( - SELECT following as id FROM hivemind_app.hive_follows WHERE follow_blacklists AND follower = _observer_id -- hive_follows_follower_where_follow_blacklists_idx + SELECT following AS id FROM hivemind_app.follow_blacklisted WHERE follower = _observer_id -- follows_follower_idx ), indirects AS MATERIALIZED -- get all indirectly blacklisted accounts with the ids of their sources ( SELECT blacklister_follows.following AS blacklisted_id, blacklister_follows.follower AS blacklister_id FROM blacklisters - JOIN hivemind_app.hive_follows blacklister_follows ON blacklister_follows.follower = blacklisters.id -- need this to get all accounts blacklisted by blacklister - WHERE blacklister_follows.blacklisted --hive_follows_follower_where_blacklisted_idx + JOIN hivemind_app.blacklisted AS blacklister_follows ON blacklister_follows.follower = blacklisters.id -- need this to get all accounts blacklisted by blacklister ) SELECT following AS blacklisted_id, -- directly blacklisted accounts 'my blacklist'::text AS source - FROM hivemind_app.hive_follows - WHERE hive_follows.blacklisted AND hive_follows.follower = _observer_id --hive_follows_follower_where_blacklisted_idx + FROM hivemind_app.blacklisted + WHERE blacklisted.follower = _observer_id -- blacklisted_follower_idx UNION ALL SELECT indirects.blacklisted_id AS blacklisted_id, -- collapse duplicate indirectly blacklisted accounts and aggreagate their sources string_agg('blacklisted by '::text || blacklister_accounts.name::text, ','::text ORDER BY blacklister_accounts.name) AS source FROM indirects - JOIN hivemind_app.hive_accounts blacklister_accounts ON blacklister_accounts.id = indirects.blacklister_id -- need this to get name of blacklister, use hive_accounts_ux1 + JOIN hivemind_app.hive_accounts AS blacklister_accounts ON blacklister_accounts.id = indirects.blacklister_id -- need this to get name of blacklister, use hive_accounts_ux1 GROUP BY indirects.blacklisted_id; END IF; END; -- GitLab From 178bcf6efc61651498139c14c5942b0ce9745661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 22 Jan 2025 15:17:38 +0100 Subject: [PATCH 28/83] Convert get_profiles.sql to new tables --- .../postgrest/utilities/get_profiles.sql | 26 +++++++------------ .../get_profile/gtg_observer.pat.json | 3 ++- .../get_profile/hive_test_acc_001.pat.json | 3 ++- .../get_profile/ignoreall_alice.pat.json | 3 ++- .../observer_followed_true.pat.json | 3 ++- .../get_profiles/gtg_observer.pat.json | 3 ++- .../get_profiles/ignoreall_alice.pat.json | 3 ++- .../get_profiles/ignoreall_observer.pat.json | 3 ++- .../observer_followed_true.pat.json | 3 ++- 9 files changed, 26 insertions(+), 24 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/utilities/get_profiles.sql b/hive/db/sql_scripts/postgrest/utilities/get_profiles.sql index 892c6b064..f4eacffbe 100644 --- a/hive/db/sql_scripts/postgrest/utilities/get_profiles.sql +++ b/hive/db/sql_scripts/postgrest/utilities/get_profiles.sql @@ -62,21 +62,15 @@ BEGIN jsonb_set( account_row, '{context}', - COALESCE( - (SELECT - CASE - WHEN state = 2 THEN - jsonb_build_object('followed', false, 'muted', true) - WHEN state = 1 THEN - jsonb_build_object('followed', true) - ELSE - jsonb_build_object('followed', false) - END - FROM hivemind_app.hive_follows - WHERE follower = _observer_id - AND following = (account_row->>'id')::INT), - jsonb_build_object('followed', false) - ) + jsonb_build_object( + 'followed', (SELECT EXISTS (SELECT NULL + FROM hivemind_app.follows + WHERE follower = _observer_id + AND following = (account_row->>'id')::INT)), + 'muted', (SELECT EXISTS (SELECT NULL + FROM hivemind_app.muted + WHERE follower = _observer_id + AND following = (account_row->>'id')::INT))) ) ) FROM jsonb_array_elements(_result) account_row @@ -99,4 +93,4 @@ BEGIN RETURN _result; END $function$ -; \ No newline at end of file +; diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/gtg_observer.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/gtg_observer.pat.json index 4343e295d..a29e16caa 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/gtg_observer.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/gtg_observer.pat.json @@ -2,7 +2,8 @@ "active": "2016-09-15T19:46:21", "blacklists": [], "context": { - "followed": true + "followed": true, + "muted": false }, "created": "2016-06-30T17:22:18", "id": 14028, diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/hive_test_acc_001.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/hive_test_acc_001.pat.json index 79c7eb8fc..31661c204 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/hive_test_acc_001.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/hive_test_acc_001.pat.json @@ -2,7 +2,8 @@ "active": "2016-09-15T19:47:54", "blacklists": [], "context": { - "followed": false + "followed": false, + "muted": false }, "created": "2016-09-15T19:47:54", "id": 92535, diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/ignoreall_alice.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/ignoreall_alice.pat.json index 35e785016..1676e0fff 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/ignoreall_alice.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/ignoreall_alice.pat.json @@ -2,7 +2,8 @@ "active": "2016-09-15T18:02:03", "blacklists": [], "context": { - "followed": false + "followed": false, + "muted": false }, "created": "2016-09-15T18:01:30", "id": 92450, diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/observer_followed_true.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/observer_followed_true.pat.json index 3be89234b..fda8381c4 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/observer_followed_true.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profile/observer_followed_true.pat.json @@ -2,7 +2,8 @@ "active": "2016-09-15T19:07:00", "blacklists": [], "context": { - "followed": true + "followed": true, + "muted": false }, "created": "2016-03-24T17:00:06", "id": 11, diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/gtg_observer.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/gtg_observer.pat.json index 1af648071..2e4d0e107 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/gtg_observer.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/gtg_observer.pat.json @@ -3,7 +3,8 @@ "active": "2016-09-15T19:46:21", "blacklists": [], "context": { - "followed": true + "followed": true, + "muted": false }, "created": "2016-06-30T17:22:18", "id": 14028, diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/ignoreall_alice.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/ignoreall_alice.pat.json index 7260e9e2f..8265b21b1 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/ignoreall_alice.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/ignoreall_alice.pat.json @@ -3,7 +3,8 @@ "active": "2016-09-15T18:02:03", "blacklists": [], "context": { - "followed": false + "followed": false, + "muted": false }, "created": "2016-09-15T18:01:30", "id": 92451, diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/ignoreall_observer.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/ignoreall_observer.pat.json index e716967b4..019fd6bdc 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/ignoreall_observer.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/ignoreall_observer.pat.json @@ -63,7 +63,8 @@ "active": "2016-09-15T19:47:54", "blacklists": [], "context": { - "followed": false + "followed": false, + "muted": false }, "created": "2016-09-15T19:47:54", "id": 92535, diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/observer_followed_true.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/observer_followed_true.pat.json index 206cdc373..9541047d5 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/observer_followed_true.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_profiles/observer_followed_true.pat.json @@ -3,7 +3,8 @@ "active": "2016-09-15T19:07:00", "blacklists": [], "context": { - "followed": true + "followed": true, + "muted": false }, "created": "2016-03-24T17:00:06", "id": 11, -- GitLab From 06d98bc1f2ae14d2d38ad4b4615ed09ba46876fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 23 Jan 2025 12:15:58 +0100 Subject: [PATCH 29/83] Convert get_account_posts.sql to new tables --- .../postgrest/utilities/get_account_posts.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/utilities/get_account_posts.sql b/hive/db/sql_scripts/postgrest/utilities/get_account_posts.sql index 4cce599af..1e9b97566 100644 --- a/hive/db/sql_scripts/postgrest/utilities/get_account_posts.sql +++ b/hive/db/sql_scripts/postgrest/utilities/get_account_posts.sql @@ -204,8 +204,8 @@ BEGIN IF _post_id <> 0 THEN SELECT MIN(hfc.created_at) INTO _min_date FROM hivemind_app.hive_feed_cache hfc - JOIN hivemind_app.hive_follows hf ON hfc.account_id = hf.following - WHERE hf.state = 1 AND hf.follower = _account_id AND hfc.post_id = _post_id; + JOIN hivemind_app.follows f ON hfc.account_id = f.following + WHERE f.follower = _account_id AND hfc.post_id = _post_id; END IF; _cutoff = hivemind_app.block_before_head( '1 month' ); @@ -227,9 +227,9 @@ BEGIN MIN(hfc.created_at) as min_created, array_agg(DISTINCT(ha.name) ORDER BY ha.name) AS reblogged_by FROM hivemind_app.hive_feed_cache hfc - JOIN hivemind_app.hive_follows hf ON hfc.account_id = hf.following - JOIN hivemind_app.hive_accounts ha ON ha.id = hf.following - WHERE hfc.block_num > _cutoff AND hf.state = 1 AND hf.follower = _account_id + JOIN hivemind_app.follows f ON hfc.account_id = f.following + JOIN hivemind_app.hive_accounts ha ON ha.id = f.following + WHERE hfc.block_num > _cutoff AND f.follower = _account_id AND (_observer_id = 0 OR NOT EXISTS (SELECT 1 FROM hivemind_app.muted_accounts_by_id_view WHERE observer_id = _observer_id AND muted_id = hfc.account_id)) GROUP BY hfc.post_id HAVING (_post_id = 0 OR MIN(hfc.created_at) < _min_date OR ( MIN(hfc.created_at) = _min_date AND hfc.post_id < _post_id )) -- GitLab From 29a4a14785b7176767833aa36bd1d76691fe66ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 23 Jan 2025 12:19:09 +0100 Subject: [PATCH 30/83] Convert bridge_api_does_user_follow_any_lists.sql to new tables --- .../bridge_api/bridge_api_does_user_follow_any_lists.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_does_user_follow_any_lists.sql b/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_does_user_follow_any_lists.sql index 12aad2354..c5373897f 100644 --- a/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_does_user_follow_any_lists.sql +++ b/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_does_user_follow_any_lists.sql @@ -16,11 +16,11 @@ BEGIN hivemind_postgrest_utilities.parse_argument_from_json(_params, 'observer', True), True), True); - IF NOT EXISTS (SELECT ha.name FROM hivemind_app.hive_follows hf JOIN hivemind_app.hive_accounts ha ON ha.id = hf.following WHERE hf.follower = _observer_id AND hf.follow_blacklists LIMIT 1) THEN + IF NOT EXISTS (SELECT ha.name FROM hivemind_app.follow_blacklisted fb JOIN hivemind_app.hive_accounts ha ON ha.id = fb.following WHERE fb.follower = _observer_id LIMIT 1) THEN RETURN 'false'::jsonb; ELSE RETURN 'true'::jsonb; END IF; END $$ -; \ No newline at end of file +; -- GitLab From 4ef2b7bdfd4a0dcf807249a93fc8831aa989a514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 23 Jan 2025 13:11:00 +0100 Subject: [PATCH 31/83] Remove redundant if --- .../bridge_api/bridge_api_does_user_follow_any_lists.sql | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_does_user_follow_any_lists.sql b/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_does_user_follow_any_lists.sql index c5373897f..9796e04b4 100644 --- a/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_does_user_follow_any_lists.sql +++ b/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_does_user_follow_any_lists.sql @@ -16,11 +16,7 @@ BEGIN hivemind_postgrest_utilities.parse_argument_from_json(_params, 'observer', True), True), True); - IF NOT EXISTS (SELECT ha.name FROM hivemind_app.follow_blacklisted fb JOIN hivemind_app.hive_accounts ha ON ha.id = fb.following WHERE fb.follower = _observer_id LIMIT 1) THEN - RETURN 'false'::jsonb; - ELSE - RETURN 'true'::jsonb; - END IF; + RETURN (SELECT EXISTS (SELECT ha.name FROM hivemind_app.follow_blacklisted fb JOIN hivemind_app.hive_accounts ha ON ha.id = fb.following WHERE fb.follower = _observer_id LIMIT 1))::TEXT::jsonb; END $$ ; -- GitLab From d7cf85663463c7f68b152331c0c23b8556277e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 23 Jan 2025 15:08:40 +0100 Subject: [PATCH 32/83] Convert bridge_api_get_follow_list.sql to new tables --- .../bridge_api/bridge_api_get_follow_list.sql | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_get_follow_list.sql b/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_get_follow_list.sql index 99cf52ef0..eea267e9b 100644 --- a/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_get_follow_list.sql +++ b/hive/db/sql_scripts/postgrest/bridge_api/bridge_api_get_follow_list.sql @@ -42,16 +42,25 @@ BEGIN IF _get_blacklists THEN _result = ( WITH np AS ( -- bridge_api_get_follow_list with _get_blacklists - SELECT + SELECT ha.name, hivemind_postgrest_utilities.extract_profile_metadata(ha.json_metadata, ha.posting_json_metadata)->'profile' AS profile FROM - hivemind_app.hive_follows hf + hivemind_app.follow_muted AS fm JOIN - hivemind_app.hive_accounts ha ON ha.id = hf.following + hivemind_app.hive_accounts ha ON ha.id = fm.following WHERE - hf.follower = _observer_id AND - (CASE WHEN _follow_muted THEN hf.follow_muted ELSE hf.follow_blacklists END) + fm.follower = _observer_id AND _follow_muted + UNION ALL + SELECT + ha.name, + hivemind_postgrest_utilities.extract_profile_metadata(ha.json_metadata, ha.posting_json_metadata)->'profile' AS profile + FROM + hivemind_app.follow_blacklisted AS fb + JOIN + hivemind_app.hive_accounts ha ON ha.id = fb.following + WHERE + fb.follower = _observer_id AND NOT _follow_muted ) SELECT jsonb_agg( jsonb_build_object( @@ -70,16 +79,16 @@ BEGIN 'muted_list_description', to_jsonb(''::TEXT) ) ) FROM ( - SELECT - ha.name - FROM - hivemind_app.hive_follows hf - JOIN - hivemind_app.hive_accounts ha ON ha.id = hf.following - WHERE - hf.follower = _observer_id AND - (CASE WHEN _follow_muted THEN hf.state = 2 ELSE hf.blacklisted END) - ORDER BY ha.name + SELECT ha.name + FROM hivemind_app.muted AS m + JOIN hivemind_app.hive_accounts ha ON ha.id = m.following + WHERE m.follower = _observer_id AND _follow_muted + UNION ALL + SELECT ha.name + FROM hivemind_app.blacklisted AS b + JOIN hivemind_app.hive_accounts ha ON ha.id = b.following + WHERE b.follower = _observer_id AND NOT _follow_muted + ORDER BY name ) row ); END IF; @@ -87,4 +96,4 @@ BEGIN RETURN COALESCE(_result, '[]'::jsonb); END $$ -; \ No newline at end of file +; -- GitLab From 67e43027a79fd0d7d17359fd561997b35f6ba2ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Fri, 24 Jan 2025 17:06:00 +0100 Subject: [PATCH 33/83] Change condenser api get_followers and get_following to new tables --- .../condenser_api_get_followers.sql | 54 ++- .../condenser_api_get_following.sql | 70 ++- ...meters_for_get_following_and_followers.sql | 11 +- .../get_followers/blog/defaults.pat.json | 20 +- .../get_followers/ignore/defaults.pat.json | 32 +- .../get_followers/ignore/paginated.pat.json | 6 +- .../get_following/ignore/defaults.pat.json | 432 +++++++++--------- .../get_following/ignore/paginated.pat.json | 6 +- 8 files changed, 335 insertions(+), 296 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_followers.sql index 179b4e764..e49b2f77b 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_followers.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_followers.sql @@ -13,15 +13,24 @@ DECLARE BEGIN _params = hivemind_postgrest_utilities.extract_parameters_for_get_following_and_followers(_params, _called_from_condenser_api); _account_id = (_params->'account_id')::INT; - _state = (_params->'hive_follows_state')::SMALLINT; _limit = (_params->'limit')::INT; IF (_params->'start_id')::INT <> 0 THEN - _start_id = ( - SELECT hf.id - FROM hivemind_app.hive_follows hf - WHERE hf.following = (_params->'account_id')::INT AND hf.follower = (_params->'start_id')::INT - ); + IF (_params->'follows')::boolean THEN + _start_id = ( + SELECT f.hive_rowid + FROM hivemind_app.follows AS f + WHERE f.following = _account_id + AND f.follower = (_params->'start_id')::INT + ); + ELSIF (_params->'mutes')::boolean THEN + _start_id = ( + SELECT m.hive_rowid + FROM hivemind_app.muted AS m + WHERE m.following = _account_id + AND m.follower = (_params->'start_id')::INT + ); + END IF; END IF; RETURN COALESCE( @@ -32,26 +41,35 @@ BEGIN 'follower', row.name, 'what', jsonb_build_array(_params->'follow_type') ) - ORDER BY row.id DESC - ) + ORDER BY row.hive_rowid DESC + ) FROM ( WITH followers AS MATERIALIZED ( SELECT - hf.id, - hf.follower - FROM hivemind_app.hive_follows hf - WHERE hf.following = _account_id AND hf.state = _state -- hive_follows_following_state_id_idx - AND hf.id < _start_id - ORDER BY hf.id DESC + f.hive_rowid, + f.follower + FROM hivemind_app.follows AS f + WHERE f.following = _account_id + AND f.hive_rowid < _start_id + AND (_params->'follows')::boolean + UNION ALL + SELECT + m.hive_rowid, + m.follower + FROM hivemind_app.muted AS m + WHERE m.following = _account_id + AND m.hive_rowid < _start_id + AND (_params->'mutes')::boolean + ORDER BY hive_rowid DESC LIMIT _limit - ) + ) SELECT - followers.id, + followers.hive_rowid, ha.name FROM followers - JOIN hivemind_app.hive_accounts ha ON followers.follower = ha.id - ORDER BY followers.id DESC + JOIN hivemind_app.hive_accounts AS ha ON followers.follower = ha.id + ORDER BY followers.hive_rowid DESC LIMIT _limit ) row ), diff --git a/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_following.sql b/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_following.sql index 01512194b..d5f623eed 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_following.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_following.sql @@ -11,11 +11,21 @@ BEGIN _params = hivemind_postgrest_utilities.extract_parameters_for_get_following_and_followers(_params, _called_from_condenser_api); IF (_params->'start_id')::INT <> 0 THEN - _start_id = ( - SELECT hf.id - FROM hivemind_app.hive_follows hf - WHERE hf.follower = (_params->'account_id')::INT AND hf.following = (_params->'start_id')::INT - ); + IF (_params->'follows')::boolean THEN + _start_id = ( + SELECT f.hive_rowid + FROM hivemind_app.follows AS f + WHERE f.follower = (_params->'account_id')::INT + AND f.following = (_params->'start_id')::INT + ); + ELSIF (_params->'mutes')::boolean THEN + _start_id = ( + SELECT m.hive_rowid + FROM hivemind_app.muted AS m + WHERE m.follower = (_params->'account_id')::INT + AND m.following = (_params->'start_id')::INT + ); + END IF; END IF; RETURN COALESCE( @@ -26,37 +36,51 @@ BEGIN 'follower', _params->>'account', 'what', jsonb_build_array(_params->>'follow_type') ) - ORDER BY row.id DESC + ORDER BY row.hive_rowid DESC ) FROM ( - WITH - max_10k_following AS + WITH + max_10k_follows AS ( SELECT - hf.id, - hf.following - FROM hivemind_app.hive_follows hf - WHERE -- INDEX ONLY SCAN of hive_follows_follower_following_state_idx - hf.state = (_params->'hive_follows_state')::SMALLINT - AND hf.follower = (_params->'account_id')::INT + f.hive_rowid, + f.following + FROM hivemind_app.follows AS f + WHERE + f.follower = (_params->'account_id')::INT LIMIT 10000 -- if user follows more than 10K accounts, limit them - ), - following_page AS -- condenser_api_get_following + ), + max_10k_mutes AS ( SELECT - hf.id, - hf.following - FROM max_10k_following hf + m.hive_rowid, + m.following + FROM hivemind_app.muted AS m WHERE - (_start_id = 0 OR hf.id < _start_id) - ORDER BY hf.id DESC + m.follower = (_params->'account_id')::INT + LIMIT 10000 -- if user ignores more than 10K accounts, limit them + ), + following_page AS -- condenser_api_get_following + ( + SELECT + f.hive_rowid, + f.following + FROM max_10k_follows AS f + WHERE (_start_id = 0 OR f.hive_rowid < _start_id) AND (_params->'follows')::boolean + UNION ALL + SELECT + m.hive_rowid, + m.following + FROM max_10k_mutes AS m + WHERE (_start_id = 0 OR hive_rowid < _start_id) AND (_params->'mutes')::boolean + ORDER BY hive_rowid DESC LIMIT (_params->'limit')::INT ) SELECT - fs.id, + fs.hive_rowid, ha.name FROM following_page fs JOIN hivemind_app.hive_accounts ha ON fs.following = ha.id - ORDER BY fs.id DESC + ORDER BY fs.hive_rowid DESC LIMIT (_params->'limit')::INT ) row ), diff --git a/hive/db/sql_scripts/postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql index a229681ce..8efe9bfef 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql @@ -40,11 +40,7 @@ BEGIN _follow_type = COALESCE(hivemind_postgrest_utilities.parse_argument_from_json(_params, 'type', False), 'blog'); END IF; - IF _follow_type = 'blog' THEN - _hive_follows_state = 1; - ELSIF _follow_type = 'ignore' THEN - _hive_follows_state = 2; - ELSE + IF _follow_type NOT IN ('blog', 'ignore') THEN RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception('Unsupported follow type, valid types: blog, ignore'); END IF; @@ -59,8 +55,9 @@ BEGIN 'start_id', _start_id, 'limit', _limit, 'follow_type', _follow_type, - 'hive_follows_state', _hive_follows_state + 'follows', _follow_type = 'blog', + 'mutes', _follow_type = 'ignore' ); END $$ -; \ No newline at end of file +; diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/defaults.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/defaults.pat.json index 9d2b5b635..c45e1a11d 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/defaults.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/defaults.pat.json @@ -196,21 +196,21 @@ ] }, { - "follower": "sartistic", + "follower": "matrixdweller", "following": "steemit", "what": [ "blog" ] }, { - "follower": "stickman", + "follower": "sartistic", "following": "steemit", "what": [ "blog" ] }, { - "follower": "matrixdweller", + "follower": "stickman", "following": "steemit", "what": [ "blog" @@ -1014,6 +1014,13 @@ "blog" ] }, + { + "follower": "rd7783", + "following": "steemit", + "what": [ + "blog" + ] + }, { "follower": "arisromansyah88", "following": "steemit", @@ -1119,13 +1126,6 @@ "blog" ] }, - { - "follower": "rd7783", - "following": "steemit", - "what": [ - "blog" - ] - }, { "follower": "inertia", "following": "steemit", diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/defaults.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/defaults.pat.json index 1df726056..a877db61c 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/defaults.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/defaults.pat.json @@ -139,6 +139,13 @@ "ignore" ] }, + { + "follower": "elewarne", + "following": "cheetah", + "what": [ + "ignore" + ] + }, { "follower": "nudierudie", "following": "cheetah", @@ -216,6 +223,13 @@ "ignore" ] }, + { + "follower": "zebbra2014", + "following": "cheetah", + "what": [ + "ignore" + ] + }, { "follower": "comics", "following": "cheetah", @@ -357,14 +371,14 @@ ] }, { - "follower": "alexa.com", + "follower": "kevbonneau", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kevbonneau", + "follower": "alexa.com", "following": "cheetah", "what": [ "ignore" @@ -384,13 +398,6 @@ "ignore" ] }, - { - "follower": "elewarne", - "following": "cheetah", - "what": [ - "ignore" - ] - }, { "follower": "hanaiaha", "following": "cheetah", @@ -503,13 +510,6 @@ "ignore" ] }, - { - "follower": "zebbra2014", - "following": "cheetah", - "what": [ - "ignore" - ] - }, { "follower": "mudassar", "following": "cheetah", diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/paginated.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/paginated.pat.json index 73aa9a6cb..3b6d01bf9 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/paginated.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/paginated.pat.json @@ -1,20 +1,20 @@ [ { - "follower": "zebbra2014", + "follower": "mudassar", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "mudassar", + "follower": "ktbaeohana", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "ktbaeohana", + "follower": "osho.philosophy", "following": "cheetah", "what": [ "ignore" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/defaults.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/defaults.pat.json index 5efb2ac5a..94fcfe7a6 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/defaults.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/defaults.pat.json @@ -1,637 +1,637 @@ [ { "follower": "morganpearl", - "following": "digitalhound", + "following": "alex2016", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "goldstein", + "following": "crazymumzysa", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "reneenouveau", + "following": "fluffymelkii", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "adm", + "following": "litrbooh", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "proctologic", + "following": "stef", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fyrstikken", + "following": "ladypenelope1", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fingolfin", + "following": "blogmaster", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "dollarvigilante", + "following": "myfirst", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "afsoon", + "following": "takethecannoli", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "tomdking", + "following": "vinsanity50", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "matrix", + "following": "mrgrey", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "chuckleberry", + "following": "bridgetbunchy", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "desocrates", + "following": "moneymaker", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "instructor2121", + "following": "siren", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mynameisricky", + "following": "xiaokongcom", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mrlogic", + "following": "future24", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "crezyliza", + "following": "rainman", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rossenpavlov", + "following": "cryptogee", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "aidar88", + "following": "ats-david", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "persianqueen", + "following": "camilla", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "lee5", + "following": "brunopro", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "markrmorrisjr", + "following": "sweetsssj", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "halo", + "following": "letc", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "marius19", + "following": "ikigai", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bridgetbunchy", + "following": "dr2073", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "indigowaltz", + "following": "blakemiles84", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cryptogee", + "following": "soniaji", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jaxteller", + "following": "soroksem", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "victoria2002", + "following": "gavvet", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "daxon", + "following": "lee5", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jenniferskyler", + "following": "beanz", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gavvet", + "following": "jessica-miller", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "crazymumzysa", + "following": "dmilash", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ericvancewalton", + "following": "bonapetit", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "lifeisawesome", + "following": "gracewriter", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mrgrey", + "following": "dajohns1420", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "trisnawati", + "following": "magicmonk", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "peterz", + "following": "shla-rafia", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jeremyfromwi", + "following": "ozmaster", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "camilla", + "following": "smolalit", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "vermillion666", + "following": "aidar88", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mikebartolo", + "following": "vermillion666", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "levycore", + "following": "sirwinchester", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "zodiac", + "following": "cristi", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rwgunderson", + "following": "margot", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cloud1", + "following": "fat-like-buddha", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rich77", + "following": "gargon", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "joelbow", + "following": "krnel", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "xian22", + "following": "peterz", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cryptobro", + "following": "vippero", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "runaway-psyche", + "following": "anonymint", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "brave31", + "following": "ericvancewalton", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mammasitta", + "following": "teamsteem", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "logic", + "following": "ochnudemus", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "manthostsakirid", + "following": "sisters", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mariadianaelaine", + "following": "r4fken", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ciellonelle12", + "following": "jlwk0lb", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "sorath", + "following": "artist1989", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jjchic", + "following": "skum", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "shenanigator", + "following": "spiz0r", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "elena000", + "following": "movievertigo", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jonathanyoung", + "following": "kabei", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "the-future", + "following": "marius19", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "charlieshrem", + "following": "cripto", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "takethecannoli", + "following": "justinschwalm", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "steemcleaners", + "following": "ptmikesteem", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ivanba12", + "following": "elyaque", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "secpoint", + "following": "calaber24p", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "brunopro", + "following": "blow", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ikigai", + "following": "cryptos", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "blockchainblonde", + "following": "mar1978co", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "theyam", + "following": "nrpblack", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ozmaster", + "following": "keralv", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "blakemiles84", + "following": "knozaki2015", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "anonymint", + "following": "steembeast", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "falkvinge", + "following": "charlieshrem", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "sweetsssj", + "following": "demeterz01", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cristi", + "following": "theyam", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "margot", + "following": "gnoynui25", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fat-like-buddha", + "following": "shemthepenman", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jasmine-l", + "following": "kaylinart", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gargon", + "following": "taoteh1221", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "krnel", + "following": "chitty", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "artist1989", + "following": "m0se", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "themanualbot", + "following": "stepa", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "skum", + "following": "epiphany", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "spiz0r", + "following": "alktoni", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "movievertigo", + "following": "keithwillshine", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "shemthepenman", + "following": "jeremyfromwi", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "kafkanarchy84", + "following": "galim", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rxhector", + "following": "kafkanarchy84", "what": [ "ignore" ] @@ -673,875 +673,875 @@ }, { "follower": "morganpearl", - "following": "lostnuggett", + "following": "bitland", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "zzzzzzzzz", + "following": "persik", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "allmonitors", + "following": "markrmorrisjr", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "broadperspective", + "following": "crezyliza", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bubblefantasy", + "following": "steempower", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "chrisadventures", + "following": "thetasteemit", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "merlinscat", + "following": "infovore", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "roelandp", + "following": "trisnawati", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "team", + "following": "bubblefantasy", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "applecrisp", + "following": "chrisadventures", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "upsideofstress", + "following": "merlinscat", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "arcange", + "following": "broadperspective", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "elyaque", + "following": "daxon", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ptmikesteem", + "following": "allmonitors", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cryptos", + "following": "zzzzzzzzz", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "blow", + "following": "themonetaryfew", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "calaber24p", + "following": "lostnuggett", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "stepa", + "following": "kingdead", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "m0se", + "following": "hiokolop", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "chitty", + "following": "doze49", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "taoteh1221", + "following": "mikebartolo", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "hilarski", + "following": "levycore", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "daycrypter", + "following": "zodiac", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "craig-grant", + "following": "halo", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jamesc", + "following": "rwgunderson", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "sirwinchester", + "following": "cloud1", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "stef", + "following": "rich77", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "blogmaster", + "following": "jtrdertas", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "myfirst", + "following": "lifeisawesome", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "vinsanity50", + "following": "team", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "moneymaker", + "following": "applecrisp", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "siren", + "following": "upsideofstress", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "teamsteem", + "following": "jenniferskyler", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ochnudemus", + "following": "arcange", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "sisters", + "following": "roelandp", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "r4fken", + "following": "blockchainblonde", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jlwk0lb", + "following": "makov", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "feminism", + "following": "joelbow", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "msgivings", + "following": "digitalhound", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ydm6669", + "following": "afsoon", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "future24", + "following": "goldstein", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "adamt", + "following": "ines-f", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "xiaokongcom", + "following": "reneenouveau", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "theanubisrider", + "following": "condra", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jessica-miller", + "following": "adm", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "shadowspub", + "following": "proctologic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "beanz", + "following": "fyrstikken", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gracewriter", + "following": "fingolfin", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mrbastillio", + "following": "dollarvigilante", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bonapetit", + "following": "xian22", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "dmilash", + "following": "cryptobro", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "skyefox", + "following": "runaway-psyche", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "christiansenn", + "following": "brave31", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "perwest", + "following": "mammasitta", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "dajohns1420", + "following": "logic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "freebornangel", + "following": "thegoldencookie", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ines-f", + "following": "manthostsakirid", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bluestar", + "following": "mariadianaelaine", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "magicmonk", + "following": "malaiandrueth", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "steembeast", + "following": "ciellonelle12", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "nxtblg", + "following": "roy2016", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bullionstackers", + "following": "sorath", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "demeterz01", + "following": "gamerholic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bmcv001", + "following": "jjchic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "omarb", + "following": "jaxteller", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "pino", + "following": "galamirissa", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "stephen.king989", + "following": "shenanigator", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "themonetaryfew", + "following": "elena000", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "matthewtiii", + "following": "venkat", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "doze49", + "following": "metafzx", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "kingdead", + "following": "msgivings", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "inkha", + "following": "jonathanyoung", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "apollojae", + "following": "the-future", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "metafzx", + "following": "falkvinge", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "venkat", + "following": "inkha", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "galamirissa", + "following": "daycrypter", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "thegoldencookie", + "following": "jamesc", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "roy2016", + "following": "craig-grant", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "nate-atkins", + "following": "victoria2002", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gamerholic", + "following": "stephen.king989", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "penguinpablo", + "following": "mrlogic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "alktoni", + "following": "rxhector", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cripto", + "following": "indigowaltz", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "steemlinks", + "following": "hilarski", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "robok", + "following": "rossenpavlov", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "garri74", + "following": "liberosist", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "persik", + "following": "omarb", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "always1success", + "following": "bmcv001", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "liberosist", + "following": "bullionstackers", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "alex2016", + "following": "nxtblg", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gnoynui25", + "following": "arnoldwish", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "litrbooh", + "following": "aleksandrm", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "soniaji", + "following": "themanualbot", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ladypenelope1", + "following": "feminism", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "condra", + "following": "jasmine-l", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "thetasteemit", + "following": "desocrates", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rainman", + "following": "steemlinks", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "makov", + "following": "garri74", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "letc", + "following": "bluestar", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "galim", + "following": "freebornangel", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "dr2073", + "following": "perwest", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "smolalit", + "following": "christiansenn", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "nrpblack", + "following": "skyefox", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "aleksandrm", + "following": "mrbastillio", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "arnoldwish", + "following": "persianqueen", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mar1978co", + "following": "shadowspub", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "shla-rafia", + "following": "fluffy", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "kabei", + "following": "tomdking", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "keralv", + "following": "penguinpablo", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "soroksem", + "following": "ydm6669", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "hiokolop", + "following": "adamt", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jtrdertas", + "following": "theanubisrider", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "epiphany", + "following": "chuckleberry", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "malaiandrueth", + "following": "matrix", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "knozaki2015", + "following": "robok", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "kaylinart", + "following": "always1success", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "infovore", + "following": "mynameisricky", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "steempower", + "following": "pino", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fluffy", + "following": "ivanba12", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "justinschwalm", + "following": "matthewtiii", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ats-david", + "following": "instructor2121", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bitland", + "following": "nate-atkins", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "vippero", + "following": "apollojae", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "keithwillshine", + "following": "secpoint", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fluffymelkii", + "following": "steemcleaners", "what": [ "ignore" ] diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/paginated.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/paginated.pat.json index ff706a663..333cf35ee 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/paginated.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/paginated.pat.json @@ -1,21 +1,21 @@ [ { "follower": "morganpearl", - "following": "blow", + "following": "mar1978co", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "calaber24p", + "following": "nrpblack", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "stepa", + "following": "keralv", "what": [ "ignore" ] -- GitLab From 7e5ca87a9bbf9290adc50f2f84a984c1256b92de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 27 Jan 2025 16:45:24 +0100 Subject: [PATCH 34/83] Don't use hive_rowid Instead sort by account name. --- .../condenser_api_get_followers.sql | 46 +- .../condenser_api_get_following.sql | 48 +- ...meters_for_get_following_and_followers.sql | 13 +- .../blog/complete_result_set.pat.json | 4 +- .../get_followers/blog/defaults.pat.json | 346 +-- .../get_followers/blog/last.tavern.yaml | 2 +- .../get_followers/blog/paginated.pat.json | 6 +- .../get_followers/blog/pre_appbase.pat.json | 20 +- .../get_followers/blog/steemit.pat.json | 20 +- .../get_followers/ignore/cheetah.pat.json | 20 +- .../ignore/complete_result_set.pat.json | 9 +- .../ignore/complete_result_set.tavern.yaml | 2 +- .../get_followers/ignore/defaults.pat.json | 232 +- .../get_followers/ignore/last.tavern.yaml | 2 +- .../get_followers/ignore/paginated.pat.json | 6 +- .../get_followers/ignore/pre_appbase.pat.json | 20 +- .../get_followers/ignore/steemit.pat.json | 4 +- .../get_following/blog/defaults.pat.json | 2000 ++++++++--------- .../get_following/blog/last.tavern.yaml | 2 +- .../get_following/blog/paginated.pat.json | 1998 ++++++++-------- .../get_following/blog/pre_appbase.pat.json | 37 +- .../get_following/blog/proskynneo.pat.json | 18 +- .../blog/the_same_account_start.pat.json | 24 +- .../get_following/ignore/bing.com.pat.json | 20 +- .../ignore/complete_result_set.pat.json | 2 +- .../ignore/complete_result_set.tavern.yaml | 2 +- .../get_following/ignore/defaults.pat.json | 442 ++-- .../get_following/ignore/paginated.pat.json | 6 +- .../get_followers/blog.pat.json | 20 +- .../get_following/blog.pat.json | 18 +- .../mock_tests/get_followers/tester1.pat.json | 4 +- .../mock_tests/get_followers/tester2.pat.json | 4 +- .../mock_tests/get_followers/tester3.pat.json | 4 +- .../mock_tests/get_followers/tester4.pat.json | 4 +- .../mock_tests/get_following/tester2.pat.json | 4 +- .../mock_tests/get_following/tester5.pat.json | 4 +- 36 files changed, 2680 insertions(+), 2733 deletions(-) diff --git a/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_followers.sql index e49b2f77b..2c35a898b 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_followers.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_followers.sql @@ -6,7 +6,7 @@ STABLE AS $$ DECLARE - _start_id INT DEFAULT 2147483647; --default to max allowed INT value to get the latest followers if _start_id is set to 0 + _start TEXT DEFAULT ''; _account_id INT; _state SMALLINT; _limit INT; @@ -14,24 +14,7 @@ BEGIN _params = hivemind_postgrest_utilities.extract_parameters_for_get_following_and_followers(_params, _called_from_condenser_api); _account_id = (_params->'account_id')::INT; _limit = (_params->'limit')::INT; - - IF (_params->'start_id')::INT <> 0 THEN - IF (_params->'follows')::boolean THEN - _start_id = ( - SELECT f.hive_rowid - FROM hivemind_app.follows AS f - WHERE f.following = _account_id - AND f.follower = (_params->'start_id')::INT - ); - ELSIF (_params->'mutes')::boolean THEN - _start_id = ( - SELECT m.hive_rowid - FROM hivemind_app.muted AS m - WHERE m.following = _account_id - AND m.follower = (_params->'start_id')::INT - ); - END IF; - END IF; + _start = (_params->>'start')::TEXT; RETURN COALESCE( ( @@ -41,35 +24,30 @@ BEGIN 'follower', row.name, 'what', jsonb_build_array(_params->'follow_type') ) - ORDER BY row.hive_rowid DESC + ORDER BY row.name ) FROM ( WITH followers AS MATERIALIZED ( - SELECT - f.hive_rowid, - f.follower + SELECT ha.name FROM hivemind_app.follows AS f + JOIN hivemind_app.hive_accounts AS ha ON f.follower = ha.id WHERE f.following = _account_id - AND f.hive_rowid < _start_id + AND (_start = '' OR ha.name > _start) AND (_params->'follows')::boolean UNION ALL - SELECT - m.hive_rowid, - m.follower + SELECT ha.name FROM hivemind_app.muted AS m + JOIN hivemind_app.hive_accounts AS ha ON m.follower = ha.id WHERE m.following = _account_id - AND m.hive_rowid < _start_id + AND (_start = '' OR ha.name > _start) AND (_params->'mutes')::boolean - ORDER BY hive_rowid DESC + ORDER BY name LIMIT _limit ) - SELECT - followers.hive_rowid, - ha.name + SELECT name FROM followers - JOIN hivemind_app.hive_accounts AS ha ON followers.follower = ha.id - ORDER BY followers.hive_rowid DESC + ORDER BY name LIMIT _limit ) row ), diff --git a/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_following.sql b/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_following.sql index d5f623eed..a09183fe3 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_following.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/condenser_api_get_following.sql @@ -6,27 +6,10 @@ STABLE AS $$ DECLARE -_start_id INT DEFAULT 0; +_start TEXT DEFAULT ''; BEGIN _params = hivemind_postgrest_utilities.extract_parameters_for_get_following_and_followers(_params, _called_from_condenser_api); - - IF (_params->'start_id')::INT <> 0 THEN - IF (_params->'follows')::boolean THEN - _start_id = ( - SELECT f.hive_rowid - FROM hivemind_app.follows AS f - WHERE f.follower = (_params->'account_id')::INT - AND f.following = (_params->'start_id')::INT - ); - ELSIF (_params->'mutes')::boolean THEN - _start_id = ( - SELECT m.hive_rowid - FROM hivemind_app.muted AS m - WHERE m.follower = (_params->'account_id')::INT - AND m.following = (_params->'start_id')::INT - ); - END IF; - END IF; + _start = (_params->>'start')::TEXT; RETURN COALESCE( ( @@ -36,13 +19,12 @@ BEGIN 'follower', _params->>'account', 'what', jsonb_build_array(_params->>'follow_type') ) - ORDER BY row.hive_rowid DESC + ORDER BY row.name ) FROM ( WITH max_10k_follows AS ( SELECT - f.hive_rowid, f.following FROM hivemind_app.follows AS f WHERE @@ -52,7 +34,6 @@ BEGIN max_10k_mutes AS ( SELECT - m.hive_rowid, m.following FROM hivemind_app.muted AS m WHERE @@ -61,26 +42,21 @@ BEGIN ), following_page AS -- condenser_api_get_following ( - SELECT - f.hive_rowid, - f.following + SELECT ha.name FROM max_10k_follows AS f - WHERE (_start_id = 0 OR f.hive_rowid < _start_id) AND (_params->'follows')::boolean + JOIN hivemind_app.hive_accounts AS ha ON f.following = ha.id + WHERE (_start = '' OR ha.name > _start) AND (_params->'follows')::boolean UNION ALL - SELECT - m.hive_rowid, - m.following + SELECT ha.name FROM max_10k_mutes AS m - WHERE (_start_id = 0 OR hive_rowid < _start_id) AND (_params->'mutes')::boolean - ORDER BY hive_rowid DESC + JOIN hivemind_app.hive_accounts AS ha ON m.following = ha.id + WHERE (_start = '' OR ha.name > _start) AND (_params->'mutes')::boolean + ORDER BY name LIMIT (_params->'limit')::INT ) - SELECT - fs.hive_rowid, - ha.name + SELECT name FROM following_page fs - JOIN hivemind_app.hive_accounts ha ON fs.following = ha.id - ORDER BY fs.hive_rowid DESC + ORDER BY name LIMIT (_params->'limit')::INT ) row ), diff --git a/hive/db/sql_scripts/postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql index 8efe9bfef..7e8067f60 100644 --- a/hive/db/sql_scripts/postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql +++ b/hive/db/sql_scripts/postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql @@ -8,7 +8,7 @@ $$ DECLARE _account TEXT; _account_id INT; - _start_id INT; + _start TEXT; _limit INT; _follow_type TEXT; _hive_follows_state INT; @@ -27,12 +27,11 @@ BEGIN _account_id = hivemind_postgrest_utilities.find_account_id(_account, True); - _start_id = - hivemind_postgrest_utilities.find_account_id( - hivemind_postgrest_utilities.valid_account( - hivemind_postgrest_utilities.parse_argument_from_json(_params, 'start', False), - True), + _start = + hivemind_postgrest_utilities.valid_account( + hivemind_postgrest_utilities.parse_argument_from_json(_params, 'start', False), True); + PERFORM hivemind_postgrest_utilities.find_account_id(_start, True); -- make sure account exists IF _called_from_condenser_api THEN _follow_type = COALESCE(hivemind_postgrest_utilities.parse_argument_from_json(_params, 'follow_type', False), 'blog'); @@ -52,7 +51,7 @@ BEGIN RETURN jsonb_build_object( 'account', _account, 'account_id', _account_id, - 'start_id', _start_id, + 'start', COALESCE(_start, ''), 'limit', _limit, 'follow_type', _follow_type, 'follows', _follow_type = 'blog', diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/complete_result_set.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/complete_result_set.pat.json index cc20b77dd..7a845fdc2 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/complete_result_set.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/complete_result_set.pat.json @@ -1,13 +1,13 @@ [ { - "follower": "jessicca", + "follower": "duchuy", "following": "letritbt", "what": [ "blog" ] }, { - "follower": "duchuy", + "follower": "jessicca", "following": "letritbt", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/defaults.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/defaults.pat.json index c45e1a11d..6c5b581b4 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/defaults.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/defaults.pat.json @@ -1,111 +1,111 @@ [ { - "follower": "therajmahal", + "follower": "aaseb", "following": "steemit", "what": [ "blog" ] }, { - "follower": "mgibson", + "follower": "achim86", "following": "steemit", "what": [ "blog" ] }, { - "follower": "good-karma", + "follower": "afsane", "following": "steemit", "what": [ "blog" ] }, { - "follower": "blockcodes", + "follower": "alexoz", "following": "steemit", "what": [ "blog" ] }, { - "follower": "pjheinz", + "follower": "alitas", "following": "steemit", "what": [ "blog" ] }, { - "follower": "sergey44", + "follower": "always1success", "following": "steemit", "what": [ "blog" ] }, { - "follower": "afsane", + "follower": "alwayzgame", "following": "steemit", "what": [ "blog" ] }, { - "follower": "pawel-krawczyk", + "follower": "anamikasjain", "following": "steemit", "what": [ "blog" ] }, { - "follower": "buckland", + "follower": "anomaly", "following": "steemit", "what": [ "blog" ] }, { - "follower": "johnson.lukose", + "follower": "anwar78", "following": "steemit", "what": [ "blog" ] }, { - "follower": "expedition", + "follower": "applecrisp", "following": "steemit", "what": [ "blog" ] }, { - "follower": "l0k1", + "follower": "argsolver", "following": "steemit", "what": [ "blog" ] }, { - "follower": "standfan", + "follower": "arisromansyah88", "following": "steemit", "what": [ "blog" ] }, { - "follower": "wastedsoul", + "follower": "arjoona", "following": "steemit", "what": [ "blog" ] }, { - "follower": "goose", + "follower": "arnebolen", "following": "steemit", "what": [ "blog" ] }, { - "follower": "danbar", + "follower": "arnoldwish", "following": "steemit", "what": [ "blog" @@ -119,56 +119,56 @@ ] }, { - "follower": "q1248", + "follower": "aslammotala", "following": "steemit", "what": [ "blog" ] }, { - "follower": "ltm", + "follower": "ateam", "following": "steemit", "what": [ "blog" ] }, { - "follower": "achim86", + "follower": "augustinsong", "following": "steemit", "what": [ "blog" ] }, { - "follower": "puffin", + "follower": "ausbitbank", "following": "steemit", "what": [ "blog" ] }, { - "follower": "ratidor", + "follower": "beachbum", "following": "steemit", "what": [ "blog" ] }, { - "follower": "hms818", + "follower": "beanz", "following": "steemit", "what": [ "blog" ] }, { - "follower": "flyboyzombie", + "follower": "billbutler", "following": "steemit", "what": [ "blog" ] }, { - "follower": "romel", + "follower": "bitcoinmoney", "following": "steemit", "what": [ "blog" @@ -182,1043 +182,1043 @@ ] }, { - "follower": "michelle.gent", + "follower": "blockcodes", "following": "steemit", "what": [ "blog" ] }, { - "follower": "how2steemit", + "follower": "bornblazed", "following": "steemit", "what": [ "blog" ] }, { - "follower": "matrixdweller", + "follower": "brs", "following": "steemit", "what": [ "blog" ] }, { - "follower": "sartistic", + "follower": "buckland", "following": "steemit", "what": [ "blog" ] }, { - "follower": "stickman", + "follower": "catsmart", "following": "steemit", "what": [ "blog" ] }, { - "follower": "anomaly", + "follower": "chorlacher", "following": "steemit", "what": [ "blog" ] }, { - "follower": "damien-beverly", + "follower": "cian.dafe", "following": "steemit", "what": [ "blog" ] }, { - "follower": "steemswede", + "follower": "cjley", "following": "steemit", "what": [ "blog" ] }, { - "follower": "pkattera", + "follower": "cousteau", "following": "steemit", "what": [ "blog" ] }, { - "follower": "bornblazed", + "follower": "creemej", "following": "steemit", "what": [ "blog" ] }, { - "follower": "steembeast", + "follower": "cryptobiker", "following": "steemit", "what": [ "blog" ] }, { - "follower": "arnebolen", + "follower": "cuvi", "following": "steemit", "what": [ "blog" ] }, { - "follower": "peace9", + "follower": "damien-beverly", "following": "steemit", "what": [ "blog" ] }, { - "follower": "jianghao", + "follower": "danbar", "following": "steemit", "what": [ "blog" ] }, { - "follower": "trev", + "follower": "david.prochnow", "following": "steemit", "what": [ "blog" ] }, { - "follower": "persianqueen", + "follower": "demotruk", "following": "steemit", "what": [ "blog" ] }, { - "follower": "jimmco", + "follower": "denisdiaz", "following": "steemit", "what": [ "blog" ] }, { - "follower": "cuvi", + "follower": "dimabakumenko", "following": "steemit", "what": [ "blog" ] }, { - "follower": "dimabakumenko", + "follower": "discombobulated", "following": "steemit", "what": [ "blog" ] }, { - "follower": "unicorn16", + "follower": "dolov", "following": "steemit", "what": [ "blog" ] }, { - "follower": "nelyp", + "follower": "dras", "following": "steemit", "what": [ "blog" ] }, { - "follower": "cian.dafe", + "follower": "dryde", "following": "steemit", "what": [ "blog" ] }, { - "follower": "instructor2121", + "follower": "dvcoolster", "following": "steemit", "what": [ "blog" ] }, { - "follower": "catsmart", + "follower": "expedition", "following": "steemit", "what": [ "blog" ] }, { - "follower": "incomemonthly", + "follower": "felixxx", "following": "steemit", "what": [ "blog" ] }, { - "follower": "felixxx", + "follower": "fjccoin", "following": "steemit", "what": [ "blog" ] }, { - "follower": "roman-dikanev", + "follower": "flyboyzombie", "following": "steemit", "what": [ "blog" ] }, { - "follower": "demotruk", + "follower": "freebornangel", "following": "steemit", "what": [ "blog" ] }, { - "follower": "always1success", + "follower": "funthing", "following": "steemit", "what": [ "blog" ] }, { - "follower": "nippel66", + "follower": "gekko", "following": "steemit", "what": [ "blog" ] }, { - "follower": "anamikasjain", + "follower": "gilang-ramadhan", "following": "steemit", "what": [ "blog" ] }, { - "follower": "funthing", + "follower": "gmalhotra", "following": "steemit", "what": [ "blog" ] }, { - "follower": "melissag", + "follower": "good-karma", "following": "steemit", "what": [ "blog" ] }, { - "follower": "aslammotala", + "follower": "goose", "following": "steemit", "what": [ "blog" ] }, { - "follower": "jack8831", + "follower": "greenggc", "following": "steemit", "what": [ "blog" ] }, { - "follower": "koek-10", + "follower": "gribgo", "following": "steemit", "what": [ "blog" ] }, { - "follower": "mammasitta", + "follower": "halo", "following": "steemit", "what": [ "blog" ] }, { - "follower": "brs", + "follower": "harand", "following": "steemit", "what": [ "blog" ] }, { - "follower": "cousteau", + "follower": "hedge-x", "following": "steemit", "what": [ "blog" ] }, { - "follower": "applecrisp", + "follower": "hms818", "following": "steemit", "what": [ "blog" ] }, { - "follower": "z3r0d4yz", + "follower": "holzmichl", "following": "steemit", "what": [ "blog" ] }, { - "follower": "shanks", + "follower": "how2steemit", "following": "steemit", "what": [ "blog" ] }, { - "follower": "ladyclair", + "follower": "imarealboy777", "following": "steemit", "what": [ "blog" ] }, { - "follower": "arnoldwish", + "follower": "immortalking", "following": "steemit", "what": [ "blog" ] }, { - "follower": "mikemacintire", + "follower": "incomemonthly", "following": "steemit", "what": [ "blog" ] }, { - "follower": "thebeachedwhale", + "follower": "inertia", "following": "steemit", "what": [ "blog" ] }, { - "follower": "freebornangel", + "follower": "instructor2121", "following": "steemit", "what": [ "blog" ] }, { - "follower": "omarbitcoin", + "follower": "investing", "following": "steemit", "what": [ "blog" ] }, { - "follower": "rem870man", + "follower": "ivicaa", "following": "steemit", "what": [ "blog" ] }, { - "follower": "skyefox", + "follower": "jack8831", "following": "steemit", "what": [ "blog" ] }, { - "follower": "vip", + "follower": "jelloducky", "following": "steemit", "what": [ "blog" ] }, { - "follower": "alwayzgame", + "follower": "jianghao", "following": "steemit", "what": [ "blog" ] }, { - "follower": "arjoona", + "follower": "jillstein2016", "following": "steemit", "what": [ "blog" ] }, { - "follower": "tomoaki", + "follower": "jimmco", "following": "steemit", "what": [ "blog" ] }, { - "follower": "spethoscope", + "follower": "johnsarris", "following": "steemit", "what": [ "blog" ] }, { - "follower": "yongyoon", + "follower": "johnson.lukose", "following": "steemit", "what": [ "blog" ] }, { - "follower": "stepa", + "follower": "juvyjabian", "following": "steemit", "what": [ "blog" ] }, { - "follower": "saddampir", + "follower": "karchersmith", "following": "steemit", "what": [ "blog" ] }, { - "follower": "ausbitbank", + "follower": "keverw", "following": "steemit", "what": [ "blog" ] }, { - "follower": "ivicaa", + "follower": "koek-10", "following": "steemit", "what": [ "blog" ] }, { - "follower": "argsolver", + "follower": "kolyan31", "following": "steemit", "what": [ "blog" ] }, { - "follower": "ateam", + "follower": "l0k1", "following": "steemit", "what": [ "blog" ] }, { - "follower": "rhino", + "follower": "ladyclair", "following": "steemit", "what": [ "blog" ] }, { - "follower": "david.prochnow", + "follower": "lantto", "following": "steemit", "what": [ "blog" ] }, { - "follower": "alitas", + "follower": "liondani", "following": "steemit", "what": [ "blog" ] }, { - "follower": "dolov", + "follower": "love-spirit-nerd", "following": "steemit", "what": [ "blog" ] }, { - "follower": "nordland", + "follower": "ltm", "following": "steemit", "what": [ "blog" ] }, { - "follower": "keverw", + "follower": "luke490", "following": "steemit", "what": [ "blog" ] }, { - "follower": "augustinsong", + "follower": "macrochip", "following": "steemit", "what": [ "blog" ] }, { - "follower": "nubchai", + "follower": "magicmonk", "following": "steemit", "what": [ "blog" ] }, { - "follower": "tjpezlo", + "follower": "mammasitta", "following": "steemit", "what": [ "blog" ] }, { - "follower": "mydomain", + "follower": "marco-delsalto", "following": "steemit", "what": [ "blog" ] }, { - "follower": "me-tarzan", + "follower": "mashkovpro", "following": "steemit", "what": [ "blog" ] }, { - "follower": "denisdiaz", + "follower": "matrixdweller", "following": "steemit", "what": [ "blog" ] }, { - "follower": "xcode18", + "follower": "maui", "following": "steemit", "what": [ "blog" ] }, { - "follower": "maui", + "follower": "me-tarzan", "following": "steemit", "what": [ "blog" ] }, { - "follower": "nords", + "follower": "melissag", "following": "steemit", "what": [ "blog" ] }, { - "follower": "aaseb", + "follower": "mgibson", "following": "steemit", "what": [ "blog" ] }, { - "follower": "liondani", + "follower": "michelle.gent", "following": "steemit", "what": [ "blog" ] }, { - "follower": "halo", + "follower": "mikemacintire", "following": "steemit", "what": [ "blog" ] }, { - "follower": "ubg", + "follower": "mrweed", "following": "steemit", "what": [ "blog" ] }, { - "follower": "harand", + "follower": "mydomain", "following": "steemit", "what": [ "blog" ] }, { - "follower": "nunaioana", + "follower": "naturalista", "following": "steemit", "what": [ "blog" ] }, { - "follower": "gmalhotra", + "follower": "nelyp", "following": "steemit", "what": [ "blog" ] }, { - "follower": "steemit79", + "follower": "newb1", "following": "steemit", "what": [ "blog" ] }, { - "follower": "cryptobiker", + "follower": "nicolaennio", "following": "steemit", "what": [ "blog" ] }, { - "follower": "hedge-x", + "follower": "nippel66", "following": "steemit", "what": [ "blog" ] }, { - "follower": "oflyhigh", + "follower": "nordland", "following": "steemit", "what": [ "blog" ] }, { - "follower": "profitgenerator", + "follower": "nords", "following": "steemit", "what": [ "blog" ] }, { - "follower": "steemlinks", + "follower": "nubchai", "following": "steemit", "what": [ "blog" ] }, { - "follower": "marco-delsalto", + "follower": "nunaioana", "following": "steemit", "what": [ "blog" ] }, { - "follower": "lantto", + "follower": "oflyhigh", "following": "steemit", "what": [ "blog" ] }, { - "follower": "dvcoolster", + "follower": "omarbitcoin", "following": "steemit", "what": [ "blog" ] }, { - "follower": "rubenalexander", + "follower": "orm", "following": "steemit", "what": [ "blog" ] }, { - "follower": "dryde", + "follower": "patrick-g", "following": "steemit", "what": [ "blog" ] }, { - "follower": "chorlacher", + "follower": "pawel-krawczyk", "following": "steemit", "what": [ "blog" ] }, { - "follower": "william-noe", + "follower": "peace9", "following": "steemit", "what": [ "blog" ] }, { - "follower": "r4fken", + "follower": "persianqueen", "following": "steemit", "what": [ "blog" ] }, { - "follower": "mashkovpro", + "follower": "pjheinz", "following": "steemit", "what": [ "blog" ] }, { - "follower": "villainblack", + "follower": "pkattera", "following": "steemit", "what": [ "blog" ] }, { - "follower": "karchersmith", + "follower": "profitgenerator", "following": "steemit", "what": [ "blog" ] }, { - "follower": "dras", + "follower": "psc", "following": "steemit", "what": [ "blog" ] }, { - "follower": "steemgateway", + "follower": "puffin", "following": "steemit", "what": [ "blog" ] }, { - "follower": "anwar78", + "follower": "q1248", "following": "steemit", "what": [ "blog" ] }, { - "follower": "investing", + "follower": "r4fken", "following": "steemit", "what": [ "blog" ] }, { - "follower": "alexoz", + "follower": "ratidor", "following": "steemit", "what": [ "blog" ] }, { - "follower": "immortalking", + "follower": "rd7783", "following": "steemit", "what": [ "blog" ] }, { - "follower": "holzmichl", + "follower": "rem870man", "following": "steemit", "what": [ "blog" ] }, { - "follower": "magicmonk", + "follower": "renk", "following": "steemit", "what": [ "blog" ] }, { - "follower": "sunshinecrypto", + "follower": "rhino", "following": "steemit", "what": [ "blog" ] }, { - "follower": "juvyjabian", + "follower": "roman-dikanev", "following": "steemit", "what": [ "blog" ] }, { - "follower": "discombobulated", + "follower": "romel", "following": "steemit", "what": [ "blog" ] }, { - "follower": "billbutler", + "follower": "rubenalexander", "following": "steemit", "what": [ "blog" ] }, { - "follower": "cjley", + "follower": "runaway-psyche", "following": "steemit", "what": [ "blog" ] }, { - "follower": "varahfae", + "follower": "saddampir", "following": "steemit", "what": [ "blog" ] }, { - "follower": "newb1", + "follower": "sartistic", "following": "steemit", "what": [ "blog" ] }, { - "follower": "jelloducky", + "follower": "senseiteekay", "following": "steemit", "what": [ "blog" ] }, { - "follower": "love-spirit-nerd", + "follower": "sergey44", "following": "steemit", "what": [ "blog" ] }, { - "follower": "imarealboy777", + "follower": "shanks", "following": "steemit", "what": [ "blog" ] }, { - "follower": "rd7783", + "follower": "sirwinchester", "following": "steemit", "what": [ "blog" ] }, { - "follower": "arisromansyah88", + "follower": "skyefox", "following": "steemit", "what": [ "blog" ] }, { - "follower": "sirwinchester", + "follower": "spethoscope", "following": "steemit", "what": [ "blog" ] }, { - "follower": "psc", + "follower": "standfan", "following": "steemit", "what": [ "blog" ] }, { - "follower": "runaway-psyche", + "follower": "steembeast", "following": "steemit", "what": [ "blog" ] }, { - "follower": "beachbum", + "follower": "steemgateway", "following": "steemit", "what": [ "blog" ] }, { - "follower": "greenggc", + "follower": "steemit79", "following": "steemit", "what": [ "blog" ] }, { - "follower": "luke490", + "follower": "steemlinks", "following": "steemit", "what": [ "blog" ] }, { - "follower": "naturalista", + "follower": "steemswede", "following": "steemit", "what": [ "blog" ] }, { - "follower": "creemej", + "follower": "stepa", "following": "steemit", "what": [ "blog" ] }, { - "follower": "substance", + "follower": "stickman", "following": "steemit", "what": [ "blog" ] }, { - "follower": "johnsarris", + "follower": "substance", "following": "steemit", "what": [ "blog" ] }, { - "follower": "gilang-ramadhan", + "follower": "sunshinecrypto", "following": "steemit", "what": [ "blog" ] }, { - "follower": "bitcoinmoney", + "follower": "thebeachedwhale", "following": "steemit", "what": [ "blog" ] }, { - "follower": "nicolaennio", + "follower": "therajmahal", "following": "steemit", "what": [ "blog" ] }, { - "follower": "renk", + "follower": "tjpezlo", "following": "steemit", "what": [ "blog" ] }, { - "follower": "inertia", + "follower": "tomoaki", "following": "steemit", "what": [ "blog" ] }, { - "follower": "mrweed", + "follower": "trev", "following": "steemit", "what": [ "blog" ] }, { - "follower": "kolyan31", + "follower": "ubg", "following": "steemit", "what": [ "blog" ] }, { - "follower": "beanz", + "follower": "unicorn16", "following": "steemit", "what": [ "blog" ] }, { - "follower": "patrick-g", + "follower": "varahfae", "following": "steemit", "what": [ "blog" ] }, { - "follower": "wisehammer", + "follower": "villainblack", "following": "steemit", "what": [ "blog" ] }, { - "follower": "wesam", + "follower": "vip", "following": "steemit", "what": [ "blog" ] }, { - "follower": "gribgo", + "follower": "wastedsoul", "following": "steemit", "what": [ "blog" ] }, { - "follower": "gekko", + "follower": "wesam", "following": "steemit", "what": [ "blog" ] }, { - "follower": "jillstein2016", + "follower": "william-noe", "following": "steemit", "what": [ "blog" ] }, { - "follower": "orm", + "follower": "wisehammer", "following": "steemit", "what": [ "blog" ] }, { - "follower": "senseiteekay", + "follower": "xcode18", "following": "steemit", "what": [ "blog" ] }, { - "follower": "macrochip", + "follower": "yongyoon", "following": "steemit", "what": [ "blog" ] }, { - "follower": "fjccoin", + "follower": "z3r0d4yz", "following": "steemit", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/last.tavern.yaml b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/last.tavern.yaml index f8c098b79..9302d4e0e 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/last.tavern.yaml +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/last.tavern.yaml @@ -19,7 +19,7 @@ jsonrpc: "2.0" id: 1 method: "condenser_api.get_followers" - params: ["steemit","fjccoin","blog",1000] + params: ["steemit","z3r0d4yz","blog",1000] response: status_code: 200 verify_response_with: diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/paginated.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/paginated.pat.json index 2ebd6f9fb..5f9edc420 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/paginated.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/paginated.pat.json @@ -1,20 +1,20 @@ [ { - "follower": "marco-delsalto", + "follower": "steemswede", "following": "steemit", "what": [ "blog" ] }, { - "follower": "lantto", + "follower": "stepa", "following": "steemit", "what": [ "blog" ] }, { - "follower": "dvcoolster", + "follower": "stickman", "following": "steemit", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/pre_appbase.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/pre_appbase.pat.json index 64d1d7af9..e6bd345a6 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/pre_appbase.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/pre_appbase.pat.json @@ -1,69 +1,69 @@ [ { - "follower": "therajmahal", + "follower": "aaseb", "following": "steemit", "what": [ "blog" ] }, { - "follower": "mgibson", + "follower": "achim86", "following": "steemit", "what": [ "blog" ] }, { - "follower": "good-karma", + "follower": "afsane", "following": "steemit", "what": [ "blog" ] }, { - "follower": "blockcodes", + "follower": "alexoz", "following": "steemit", "what": [ "blog" ] }, { - "follower": "pjheinz", + "follower": "alitas", "following": "steemit", "what": [ "blog" ] }, { - "follower": "sergey44", + "follower": "always1success", "following": "steemit", "what": [ "blog" ] }, { - "follower": "afsane", + "follower": "alwayzgame", "following": "steemit", "what": [ "blog" ] }, { - "follower": "pawel-krawczyk", + "follower": "anamikasjain", "following": "steemit", "what": [ "blog" ] }, { - "follower": "buckland", + "follower": "anomaly", "following": "steemit", "what": [ "blog" ] }, { - "follower": "johnson.lukose", + "follower": "anwar78", "following": "steemit", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/steemit.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/steemit.pat.json index 64d1d7af9..e6bd345a6 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/steemit.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/blog/steemit.pat.json @@ -1,69 +1,69 @@ [ { - "follower": "therajmahal", + "follower": "aaseb", "following": "steemit", "what": [ "blog" ] }, { - "follower": "mgibson", + "follower": "achim86", "following": "steemit", "what": [ "blog" ] }, { - "follower": "good-karma", + "follower": "afsane", "following": "steemit", "what": [ "blog" ] }, { - "follower": "blockcodes", + "follower": "alexoz", "following": "steemit", "what": [ "blog" ] }, { - "follower": "pjheinz", + "follower": "alitas", "following": "steemit", "what": [ "blog" ] }, { - "follower": "sergey44", + "follower": "always1success", "following": "steemit", "what": [ "blog" ] }, { - "follower": "afsane", + "follower": "alwayzgame", "following": "steemit", "what": [ "blog" ] }, { - "follower": "pawel-krawczyk", + "follower": "anamikasjain", "following": "steemit", "what": [ "blog" ] }, { - "follower": "buckland", + "follower": "anomaly", "following": "steemit", "what": [ "blog" ] }, { - "follower": "johnson.lukose", + "follower": "anwar78", "following": "steemit", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/cheetah.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/cheetah.pat.json index 3e5f59bea..5807dd57d 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/cheetah.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/cheetah.pat.json @@ -1,69 +1,69 @@ [ { - "follower": "steembeast", + "follower": "activcat", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "followtest", + "follower": "alexa.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "attila-kalmar", + "follower": "allthoughts", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "artur1990", + "follower": "andrewrait", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kingofchaos", + "follower": "angeladavis17", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "persianqueen", + "follower": "antyivan", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "fraterralph", + "follower": "apidz09", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "ivangav5", + "follower": "arcaneinfo", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "champ333", + "follower": "armi2009", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "onesunbeingnow", + "follower": "arnerog2000", "following": "cheetah", "what": [ "ignore" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/complete_result_set.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/complete_result_set.pat.json index 8e69e2318..aa5eafc65 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/complete_result_set.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/complete_result_set.pat.json @@ -1,6 +1,13 @@ [ { - "follower": "ash", + "follower": "villainblack", + "following": "crumaner", + "what": [ + "ignore" + ] + }, + { + "follower": "yuji225", "following": "crumaner", "what": [ "ignore" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/complete_result_set.tavern.yaml b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/complete_result_set.tavern.yaml index f3f2b8dcd..32d9406c6 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/complete_result_set.tavern.yaml +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/complete_result_set.tavern.yaml @@ -19,7 +19,7 @@ jsonrpc: "2.0" id: 1 method: "condenser_api.get_followers" - params: {"account":"crumaner","start":"yuji225","follow_type":"ignore","limit":2} + params: {"account":"crumaner","start":"ash","follow_type":"ignore","limit":2} response: status_code: 200 verify_response_with: diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/defaults.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/defaults.pat.json index a877db61c..b73264c87 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/defaults.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/defaults.pat.json @@ -1,503 +1,503 @@ [ { - "follower": "steembeast", + "follower": "activcat", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "followtest", + "follower": "alexa.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "attila-kalmar", + "follower": "allthoughts", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "artur1990", + "follower": "andrewrait", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kingofchaos", + "follower": "angeladavis17", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "persianqueen", + "follower": "antyivan", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "fraterralph", + "follower": "apidz09", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "ivangav5", + "follower": "arcaneinfo", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "champ333", + "follower": "armi2009", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "onesunbeingnow", + "follower": "arnerog2000", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "bvova", + "follower": "artific", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "ivano", + "follower": "artur1990", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "andrewrait", + "follower": "attila-kalmar", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "allthoughts", + "follower": "augustinsong", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "yelosport", + "follower": "balamica", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "paradigma", + "follower": "bhavnapatel68", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "garretts87", + "follower": "bing.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "teodor", + "follower": "bitcoin-novosti", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "tamara1989", + "follower": "bithost99", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "skapaneas", + "follower": "bitrebel", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "elewarne", + "follower": "blogger.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "nudierudie", + "follower": "blogspot", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "augustinsong", + "follower": "blogspot.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "jaquelinamendes", + "follower": "boten", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "carlos-cabeza", + "follower": "bvova", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "moonman", + "follower": "carlos-cabeza", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "steemitlive", + "follower": "champ333", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "desocrates", + "follower": "cheftony", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "sponge-bob", + "follower": "coloured-content", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "soso.com", + "follower": "comics", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "soso", + "follower": "dante14k", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "blogger.com", + "follower": "desocrates", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "zebbra2014", + "follower": "dharmakirti", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "comics", + "follower": "donaldjtrump", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kakoywhich", + "follower": "dopezzz123", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "theprophet0", + "follower": "dropbox.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "dropbox.com", + "follower": "earnwithme", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "h2o", + "follower": "elewarne", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "blogspot.com", + "follower": "ethbull", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "blogspot", + "follower": "fabiocortes10", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "arnerog2000", + "follower": "followmetotravel", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "wordpress.com", + "follower": "followtest", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "microsoft.com", + "follower": "fraterralph", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "telegram.org", + "follower": "garretts87", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "pinterest.com", + "follower": "gatoso", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "translator", + "follower": "germa66", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "yandex.com", + "follower": "gracealyssa", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "imassakin", + "follower": "gripenfire", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "tolgasak", + "follower": "h2o", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "paypal.com", + "follower": "hanaiaha", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "qiwi.com", + "follower": "imassakin", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "live.com", + "follower": "instagram.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "bing.com", + "follower": "ivangav5", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kevbonneau", + "follower": "ivano", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "alexa.com", + "follower": "jakemccauley", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kasper", + "follower": "jaquelinamendes", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "weibo.com", + "follower": "jaypee-8343", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "hanaiaha", + "follower": "kakoywhich", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "instagram.com", + "follower": "kamasutra", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "warplat", + "follower": "kasper", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "activcat", + "follower": "kateadventure", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kamasutra", + "follower": "kevbonneau", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "rizze", + "follower": "kingofchaos", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "loser4liberty", + "follower": "kottai", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "lasseehlers", + "follower": "ktbaeohana", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "armi2009", + "follower": "lasoni", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "submit", + "follower": "lasseehlers", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "balamica", + "follower": "live.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kottai", + "follower": "lordaris", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "dopezzz123", + "follower": "loser4liberty", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "boten", + "follower": "lyn08", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "lasoni", + "follower": "marksman", "following": "cheetah", "what": [ "ignore" @@ -511,308 +511,308 @@ ] }, { - "follower": "mudassar", + "follower": "metu2222", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "ktbaeohana", + "follower": "microsoft.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "osho.philosophy", + "follower": "molinaworks", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "priyabrato", + "follower": "moonman", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "earnwithme", + "follower": "mudassar", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "jakemccauley", + "follower": "nabila-bestari", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "jaypee-8343", + "follower": "nudierudie", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "dharmakirti", + "follower": "onesunbeingnow", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "germa66", + "follower": "osho.philosophy", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "coloured-content", + "follower": "paradigma", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "fabiocortes10", + "follower": "paypal.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "bhavnapatel68", + "follower": "persianqueen", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "marksman", + "follower": "pinterest.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "metu2222", + "follower": "priyabrato", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "molinaworks", + "follower": "qiwi.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "dante14k", + "follower": "rednetwork", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "lyn08", + "follower": "rizze", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "tjpezlo", + "follower": "romangelsi", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "villainblack", + "follower": "septaphoto", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "artific", + "follower": "sergei", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "bitcoin-novosti", + "follower": "skapaneas", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "gracealyssa", + "follower": "somebody", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "sergei", + "follower": "soso", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "apidz09", + "follower": "soso.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "followmetotravel", + "follower": "splatterhaus", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "gatoso", + "follower": "sponge-bob", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "somebody", + "follower": "steembeast", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "romangelsi", + "follower": "steemitlive", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "cheftony", + "follower": "submit", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "ethbull", + "follower": "tamara1989", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "angeladavis17", + "follower": "telegram.org", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "splatterhaus", + "follower": "teodor", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "webokv", + "follower": "theprophet0", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "arcaneinfo", + "follower": "tjpezlo", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "donaldjtrump", + "follower": "tolgasak", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "rednetwork", + "follower": "translator", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "bitrebel", + "follower": "villainblack", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "septaphoto", + "follower": "warplat", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "gripenfire", + "follower": "webokv", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "nabila-bestari", + "follower": "weibo.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kateadventure", + "follower": "wordpress.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "lordaris", + "follower": "yandex.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "antyivan", + "follower": "yelosport", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "bithost99", + "follower": "zebbra2014", "following": "cheetah", "what": [ "ignore" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/last.tavern.yaml b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/last.tavern.yaml index b0d26591d..05aff82f9 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/last.tavern.yaml +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/last.tavern.yaml @@ -19,7 +19,7 @@ jsonrpc: "2.0" id: 1 method: "condenser_api.get_followers" - params: {"account":"cheetah","follow_type":"ignore","start":"bithost99","limit":1000} + params: {"account":"cheetah","follow_type":"ignore","start":"zebbra2014","limit":1000} response: status_code: 200 verify_response_with: diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/paginated.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/paginated.pat.json index 3b6d01bf9..8a0b789d9 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/paginated.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/paginated.pat.json @@ -1,20 +1,20 @@ [ { - "follower": "mudassar", + "follower": "metu2222", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "ktbaeohana", + "follower": "microsoft.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "osho.philosophy", + "follower": "molinaworks", "following": "cheetah", "what": [ "ignore" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/pre_appbase.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/pre_appbase.pat.json index 3e5f59bea..5807dd57d 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/pre_appbase.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/pre_appbase.pat.json @@ -1,69 +1,69 @@ [ { - "follower": "steembeast", + "follower": "activcat", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "followtest", + "follower": "alexa.com", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "attila-kalmar", + "follower": "allthoughts", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "artur1990", + "follower": "andrewrait", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "kingofchaos", + "follower": "angeladavis17", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "persianqueen", + "follower": "antyivan", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "fraterralph", + "follower": "apidz09", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "ivangav5", + "follower": "arcaneinfo", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "champ333", + "follower": "armi2009", "following": "cheetah", "what": [ "ignore" ] }, { - "follower": "onesunbeingnow", + "follower": "arnerog2000", "following": "cheetah", "what": [ "ignore" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/steemit.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/steemit.pat.json index 0f3df2753..1a3d91699 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/steemit.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_followers/ignore/steemit.pat.json @@ -1,13 +1,13 @@ [ { - "follower": "mutetester", + "follower": "brightnesssoulds", "following": "steemit", "what": [ "ignore" ] }, { - "follower": "brightnesssoulds", + "follower": "mutetester", "following": "steemit", "what": [ "ignore" diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/defaults.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/defaults.pat.json index 247def1ef..193d333e4 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/defaults.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/defaults.pat.json @@ -1,7000 +1,7000 @@ [ { "follower": "skyefox", - "following": "tim", + "following": "a007", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "veox", + "following": "a11at", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "coinartist", + "following": "a9inchcock", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "waqas1000", + "following": "aaboyles", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stansult", + "following": "aamiey", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "encetra", + "following": "aaramburu", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kicker27", + "following": "aarnold", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "schattenjaeger", + "following": "aaron29", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kellyjanderson", + "following": "aarond", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dshapiro7", + "following": "aaronfaulkner", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fast2future", + "following": "aaronh", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "daniel82", + "following": "aaronjwhite", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yusuf-putra", + "following": "aaronkoenig", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "you-know-nothing", + "following": "aaronmoody", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lightninggears", + "following": "aaronnelson", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "metalex", + "following": "aaronsuncamacho", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "leenaljabari", + "following": "aaronwebb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "figaro", + "following": "aartijohn20", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "motorscafell77", + "following": "aaseb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "neuro", + "following": "aavkc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "birkanosis", + "following": "ab94", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "janasmith4611", + "following": "abagendo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrzapatos", + "following": "abanks1000", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ingemar", + "following": "abarefootpoet", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "toriseltzer", + "following": "abbyboy18", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bearyfire", + "following": "abbybrown", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "timendainum", + "following": "abc1621043211", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "capehost", + "following": "abderus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ooohal9000", + "following": "abdosenni", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hex", + "following": "abduhalem", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "littenti", + "following": "abdul", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "superjett100", + "following": "abdulla", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "willloveyou", + "following": "abebablom", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "newgirl", + "following": "abelone", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "daniel-schwarz", + "following": "abharana", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nastya", + "following": "abhijit.sipani", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "darah", + "following": "abhiroop85", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iamron", + "following": "abit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "julia26", + "following": "aboundlessworld", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "andreeagarden", + "following": "abreding", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brakab", + "following": "abstractreminder", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "noor818", + "following": "abundance", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pak786", + "following": "aburridoflores", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nharnia", + "following": "acarya", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "todd1331", + "following": "acassity", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "margas6", + "following": "accdntlmagician", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ledzep1981", + "following": "accessvirus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "angelicasilva", + "following": "accripteau", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bradcalhoun", + "following": "ace108", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "svetlana12", + "following": "achim86", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "geraldine22", + "following": "acidraindrops", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexandro16", + "following": "acidsun", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gudel", + "following": "acidwarz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "matias16739", + "following": "acidyo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lifeisawesome", + "following": "acorvelli", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "unicorn16", + "following": "acoustickitty", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jams", + "following": "acquaviva", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nhads18", + "following": "activcat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blooalien", + "following": "activistnoise", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wastedsoul", + "following": "activistpost", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "greatdabu", + "following": "actricalian", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ikarp", + "following": "adam-richard", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hementhj", + "following": "adam-zettler", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etimarcus", + "following": "adam173", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jackercrackbox", + "following": "adamcleary", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "glennith", + "following": "adamhoisington", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marteany", + "following": "adamrohrbough", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "falco", + "following": "adamt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kitov", + "following": "adamwald10", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bitcrab", + "following": "adconner", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "accripteau", + "following": "addicted", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "erik-prestinary", + "following": "adela77", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "masongrey", + "following": "ademt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cats", + "following": "adges", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bryanpeters", + "following": "adi-pratama", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cybertubecc", + "following": "adianthony11", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "murderistic", + "following": "adm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hoenirsimon", + "following": "admc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ardzreil", + "following": "admin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bo-ro", + "following": "admin2017", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "crow-bar", + "following": "administrator", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "icfiedler", + "following": "admiral", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "waeil10", + "following": "admiral-nerf-gun", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lentus", + "following": "admiralbird", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "traser", + "following": "adnanefs", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ioc", + "following": "adneu", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cliper", + "following": "adoal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "megan-jennings", + "following": "adolphius", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "akhyad", + "following": "adonadar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lemops", + "following": "adora", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "boomhauer", + "following": "adowield", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "leoniestein3", + "following": "adozan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dscotese", + "following": "adozius", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemninja", + "following": "adrethink", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrgood4242", + "following": "adrevel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lamstock", + "following": "adrian-moore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wholefoods", + "following": "adrian-vox", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stringer", + "following": "adrianakgb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thr", + "following": "adrielnz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bitcoivnest", + "following": "adriendis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jackdraak", + "following": "adrienis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "justallen", + "following": "adrix", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tcwest", + "following": "adsactly", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexvidal", + "following": "adstudio", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ehabselem", + "following": "adverts", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "namira", + "following": "advinio", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jerical13", + "following": "adycoles", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mauliah-putri", + "following": "adz4life", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gekkonomics", + "following": "aeico", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zeitgo", + "following": "aem", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thepixelprincess", + "following": "aenor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nobreku", + "following": "afew", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rafaelzauner", + "following": "affordableweb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rjv", + "following": "afgannistan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vh770", + "following": "afilja", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "recurvez", + "following": "afoosh", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shiva76", + "following": "africa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xian22", + "following": "afrikanlib", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bblair", + "following": "afterdark", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptolex", + "following": "aftergut", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "deli", + "following": "afzalur", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mahilu", + "following": "agamagrinn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "barbara3000", + "following": "agamantrius", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "elmusic", + "following": "agamimnon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iambong03", + "following": "aganin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thegilty", + "following": "agartha", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rstafseth", + "following": "agentnick", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "adrix", + "following": "agentorange", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "procivilization", + "following": "aggroed", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rasenguy", + "following": "aglo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kingpin", + "following": "agm1984", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dogman", + "following": "agorist-cree", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrrk", + "following": "agoristfighter", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "this", + "following": "agoristgirl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cybernetic", + "following": "agrawalrohit1989", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wildwar", + "following": "agrophoto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fernando.valadez", + "following": "agussudaryanto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sasukeevil", + "following": "ahdree", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "carstairs", + "following": "ahenk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "elenadranovskaya", + "following": "ahmadfakhri", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "billymushet", + "following": "aholloway314", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "troller", + "following": "aiko", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "olias", + "following": "aimeeathome", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "peopleareawesome", + "following": "aine", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mizzbeerandi", + "following": "airatbagaviev", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "streak", + "following": "airbnb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "drkyac", + "following": "airtrader", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dinamitduo", + "following": "aish", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "outchemy", + "following": "aizensou", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bobandalice", + "following": "ajareselde", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mysterious", + "following": "ajaub1962", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "talrasha", + "following": "ajavajive", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "helminadia", + "following": "ajay555", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "simplyshad", + "following": "ajayseervi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "whocarescoins", + "following": "ajingalls", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eyecam", + "following": "ajnstajn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gaiashakes", + "following": "ajvest", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "quitothewalrus", + "following": "akaninyene-etuk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "angeline", + "following": "akareyon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kasperskov", + "following": "akhyad", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tiituskangas", + "following": "akigor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eyallior", + "following": "akigore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baracuda1971", + "following": "akilmaran", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "foych587", + "following": "akinogore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "saltox", + "following": "akinoramar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aaronwebb", + "following": "akipponn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cjlowery", + "following": "akiregor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sexe", + "following": "akit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "biggest", + "following": "akronte", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "elex-free", + "following": "aksteve907farm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "davidleithoff", + "following": "alainvangrauland", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "carlagericke", + "following": "alanc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ultimus", + "following": "alangardner74", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "traffic24", + "following": "alao", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "frk", + "following": "alaqrab", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "camanuel87", + "following": "alasti", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "riv", + "following": "alaynaspop", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mtlryk", + "following": "alaynaspop1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sorath", + "following": "albeit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "martmobi", + "following": "albertfall", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iranpsychology", + "following": "albertogm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xeniakessphoto", + "following": "albestro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ykchai", + "following": "albibert", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "greenwayoflife", + "following": "aldoclark", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oasisearth", + "following": "ale000", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lloydy", + "following": "alechahn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "propagandaagenda", + "following": "alecsinspace", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nivesh", + "following": "alefernandez", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "varoolga", + "following": "alejandradd", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cypherz", + "following": "aleksandraz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "waterfirepaper", + "following": "aleksandrm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "daneriksson", + "following": "alekschm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gyva02", + "following": "aleksei-filonov", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jacqueswoodcock", + "following": "alekst", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dw2", + "following": "aleskuder", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kalabaska", + "following": "alessandro-it", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "suezannemarie", + "following": "alex", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "firebat", + "following": "alex-34", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hupok", + "following": "alex-varabei", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "coinara", + "following": "alex.chien", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baljourn", + "following": "alex2649tw", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "masonmiler", + "following": "alex40nl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jesse5th", + "following": "alex7", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lordoftruth", + "following": "alex72", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "raposajackman", + "following": "alex90342fastn1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thedreamer", + "following": "alexalbert", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mischnick", + "following": "alexaledger", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "waleednotes", + "following": "alexander1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chris22622", + "following": "alexander255", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mulford", + "following": "alexander9", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jessica.tan", + "following": "alexandergorban", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "macsto", + "following": "alexandr", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scottermonkey", + "following": "alexandra-renee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sunshine", + "following": "alexandre", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "frederickdenton", + "following": "alexandro16", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "valentyn", + "following": "alexbafana", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "futurism-news", + "following": "alexbenjalbert", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "monkette", + "following": "alexbeyman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nikkim", + "following": "alexc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mg-nz", + "following": "alexfortin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stitchywitch", + "following": "alexft", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "creativeyoke", + "following": "alexgr", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "neworleansla", + "following": "alexgunderman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "feedexes", + "following": "alexica", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ostap", + "following": "alexlee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "moewensohn", + "following": "alexma3x", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hardy195", + "following": "alexndr", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dianedurden", + "following": "alexoz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "keithbroad", + "following": "alexriethmeier", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nhuberfeely", + "following": "alexscovnoart", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jmslee2016", + "following": "alexteytey", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mfiore1", + "following": "alexvidal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thatweare", + "following": "alfar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vividrange", + "following": "alfrech04", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "educacionfinan", + "following": "alfredfrit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mgunkel", + "following": "algimantas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "atmybakesale", + "following": "algo-rythm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mqtodd", + "following": "algorhythm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "asaule", + "following": "alibaba987", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dranko", + "following": "aliciaonline", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "spacekitt3n", + "following": "alienation", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "helle", + "following": "aliesa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "novagirl", + "following": "alifton", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bennybitcoin", + "following": "alikc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kefkius", + "following": "alinix", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jimjesus", + "following": "alioop", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dochouse", + "following": "alisavzazerkalje", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "silvergoldhub", + "following": "alisonleigh21", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "theabsolute", + "following": "alitas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "imsamvan", + "following": "alkemix", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "radioogaga", + "following": "alktoni", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "therealnivok", + "following": "all-of-us", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gates", + "following": "alladesria", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "edwardsabi8", + "following": "allandaemon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "haroldbrown", + "following": "allanrombro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "readlspooner", + "following": "allasyummyfood", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "astorm", + "following": "allbtc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "homemakinit", + "following": "allenmcp", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrisdunn", + "following": "alli45454", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrwang", + "following": "allmonitors", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "canhazlulz", + "following": "allmt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "maricote", + "following": "allrightsmatter", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gavinranis", + "following": "allycat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jeffer", + "following": "allycatt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "granilace", + "following": "allyouneedtoknow", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sgtechservices", + "following": "almiller", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rainfang", + "following": "alohajedi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "siclone23", + "following": "alona", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alechahn", + "following": "alphabet", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lanimal", + "following": "alphabeta", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scorpion130380", + "following": "alphafoxtrot", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "quoted", + "following": "alphian", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jimcorrao", + "following": "alrangers", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "capital", + "following": "alsardin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "trixiekiddo", + "following": "alsariel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aleksei-filonov", + "following": "alsprinting", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iskanderl1", + "following": "alternative", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bg3721", + "following": "alternativefeed", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tomz", + "following": "alternativefn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shopping", + "following": "altoz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "simonbuechi", + "following": "aluma", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fabiocortes10", + "following": "alvaro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "teeth", + "following": "always1success", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jackbot", + "following": "alwaysfelicia", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mazule", + "following": "alwayzgame", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bladeweaver", + "following": "alysyaa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "joshglen", + "following": "am-13l4ze", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "letc", + "following": "amagi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lolalila20", + "following": "amanarchymartin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lukewarm", + "following": "amandaintheworld", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cherryann", + "following": "amandak", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "canadianbeaver", + "following": "amantim", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blizzen", + "following": "amartinezque", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mafgwaf12", + "following": "amccabe116", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ganris", + "following": "amdpower", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "koko", + "following": "amerios", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "forgetthefallen", + "following": "amethystrosee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "flexcougar", + "following": "ameyuri", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rpf", + "following": "amgosser", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "coinhoarder", + "following": "amigo214", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "proto", + "following": "amirali", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "captainmorgan", + "following": "amirluq", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "margret-liman", + "following": "amirtaaki", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "taurus", + "following": "amitj", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ivebeencrawlin", + "following": "amor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "andreaalexandria", + "following": "amteague", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "indira-skyflower", + "following": "amy-goodrich", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dudu-hoffman", + "following": "amy-oestreicher", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lcekinci", + "following": "amyehya", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lykkeliten", + "following": "amykle", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dohsun7", + "following": "an-economist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mohn", + "following": "anado", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "juliarose", + "following": "analace", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "balyyu", + "following": "analisa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "testz", + "following": "anamikasjain", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "satoshi-nakamoto", + "following": "anantagupta", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrissyshunda", + "following": "anaradora", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "g-dubs", + "following": "anaragrinn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "btctoken", + "following": "anarahuginn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stompy", + "following": "anarasida", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sydroc", + "following": "anarath", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rainbowdash", + "following": "anarcharos", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bandith", + "following": "anarchic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jasondude324", + "following": "anarchic-logic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "michelledinelle", + "following": "anarchistbanker", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "georgemiller", + "following": "anarcho-prepper", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pump", + "following": "anarcho-taoist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "august-newbie", + "following": "anarcho7", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "coinables", + "following": "anarchoali", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lenar79", + "following": "anarchochristian", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kazirisar", + "following": "anarchodrew", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemgirl", + "following": "anarchojoe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jeffwood4office", + "following": "anarchojoe1986", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "juktilar", + "following": "anarchony", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hunaya", + "following": "anarchopluggy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jamiewynacht", + "following": "anarchotrader", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "victoryang", + "following": "anarchyeducation", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "denni", + "following": "anarchygumbo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nineteen84", + "following": "anarchyhasnogods", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rachelwd", + "following": "anarchylifter", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anantagupta", + "following": "anarchyphoenix", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bagogong", + "following": "anarchypory", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "infowarfare", + "following": "anarchystick", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tommyarnold", + "following": "anarkeylove", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stereolubov", + "following": "anarkokapitalist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "libtrian.outlet", + "following": "anarn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "btotherest", + "following": "anarquismo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jasonc", + "following": "anarquista", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "erath", + "following": "anarvol", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "roy.batty", + "following": "anastacia", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "raredan70", + "following": "anasya", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemlife", + "following": "anathis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "globalguy", + "following": "anathris", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ender", + "following": "anatoliy1997", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sircaptain", + "following": "anatolizm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nickynacky", + "following": "anaxy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nagichettyv", + "following": "anazar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "designers", + "following": "anca3drandom", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tocode", + "following": "ancap-rob", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "generalcornfish", + "following": "ancapfictionist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "androma", + "following": "ancis31", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dolov", + "following": "and030380", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gkramb", + "following": "andersonroth", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "trippedr", + "following": "andfich", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "grilv", + "following": "andrarchy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ghcc1932", + "following": "andre-ager", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "allmt", + "following": "andre62", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ronald0", + "following": "andreaalexandria", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kriborin", + "following": "andreaberlin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fatpunker", + "following": "andread", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "schrade", + "following": "andreas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "joeldalais", + "following": "andreasm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ashleymk", + "following": "andreb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alwayzgame", + "following": "andreeagarden", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "freegirl", + "following": "andrei", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dany", + "following": "andrej1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "daughter", + "following": "andressilvera", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "maui", + "following": "andrew-bernbeck", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dr2073", + "following": "andrew5775", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "narvallus", + "following": "andrewdemeter", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "plotbot2015", + "following": "andrewfoodist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anna.gooldy", + "following": "andrewnehring", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nknarula", + "following": "andrewrait", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brother-bob", + "following": "andrewsanderson", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "libertyminded", + "following": "andrewwhite666", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iaminchikov", + "following": "andreyk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "layl", + "following": "andreylevadnui", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "goode", + "following": "andreynoch", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bitbarrie", + "following": "andri-ghani", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "isafuchs", + "following": "andriyv", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mark.changelly", + "following": "andro19", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thorium2", + "following": "androma", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "domino", + "following": "andromalore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nekrozon", + "following": "androndis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "citizen", + "following": "andu", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemwhit", + "following": "anduweb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "quantumanomaly", + "following": "andy68107", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ravij", + "following": "andydrewie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tomabrams", + "following": "andyeken", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "petagaye", + "following": "andyfx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "end38erwig", + "following": "andygriff", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gmac", + "following": "andyinspace", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "durov", + "following": "andyk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "danilathemasta", + "following": "andymh51", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lizzie.kasp", + "following": "andyseo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "valerita2299", + "following": "ang3l", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "education", + "following": "angelast1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thirdstryker1", + "following": "angelheld", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chh1138", + "following": "angelicasilva", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrshade", + "following": "angelikisir", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mekongmonkey", + "following": "angeline", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mizilkree", + "following": "angelm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "leighburke", + "following": "angevel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tarakanchgik", + "following": "angiebeee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jolpolkil", + "following": "angielb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jenifive", + "following": "angor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thereisblue", + "following": "angryredbarber", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "agentnick", + "following": "angusleung100", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "redler", + "following": "animalrobot", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "matttheknife", + "following": "animus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shuttergirl", + "following": "anirban", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "coinz", + "following": "aniros", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "boris.pale", + "following": "anjamaria", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kajigul", + "following": "anjoke", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "natural", + "following": "ankontini", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "el-grimey", + "following": "anmuravjev", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aglo", + "following": "ann-j", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dvcoolster", + "following": "anna.gooldy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lindagittle", + "following": "anna8isidorovna", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blockcat", + "following": "annaha", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hankscott", + "following": "annasophia", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ralllfff", + "following": "annie-kim", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "caleb983", + "following": "annierider", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemcleaners", + "following": "annikaskywalker", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fkn", + "following": "annrhefn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "falzxx", + "following": "annrkee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vudobar", + "following": "anon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fenixanarchist", + "following": "anon.news", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "murrayvonhoppe", + "following": "anonauthor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "battlerap", + "following": "anonblog", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hotgirl", + "following": "anonimau5", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrculture", + "following": "anonymario", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sergrom", + "following": "anonymint", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "greenhatter", + "following": "anonymous", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bidoof", + "following": "anotherjoe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "venomspike", + "following": "anotherkris", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tombites", + "following": "anrodon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "darwin02", + "following": "antfield", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemid24", + "following": "anthemhayek", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fotoflares", + "following": "anthonyc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etheroll", + "following": "anthonycaprio", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ratisbonne", + "following": "anthonyj", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "din", + "following": "antiques", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jasonhommel", + "following": "antithesis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "malsaint", + "following": "antizvuk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cleta", + "following": "antoineoulevay", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nigroll", + "following": "antoinev", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eneismijmich", + "following": "antoniojunior", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rdwn", + "following": "antonireviews", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bige37", + "following": "antonrodenhauser", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ardina", + "following": "antyivan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "trung81", + "following": "anuarku", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemit-inga", + "following": "anwar78", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "algorhythm", + "following": "anwenbaumeister", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lil-g", + "following": "anxietymaven", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bonnie", + "following": "anyx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tesho", + "following": "ap2002", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ancis31", + "following": "apes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kylemensch", + "following": "aphrodite", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "awesoom", + "following": "apisme", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kateadventure", + "following": "apocaloptimisto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "necro", + "following": "apollojae", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pangur-ban", + "following": "appalachain", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scott.stevens", + "following": "apple", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aravotiname", + "following": "applecrisp", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ridz84", + "following": "applesayceanne", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aem", + "following": "aprilamb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ronnieb", + "following": "aprilbannister", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "surfingviolinist", + "following": "aprilrains", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "paul1", + "following": "apublisher", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dannyancap", + "following": "aqsa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kasink", + "following": "aquarious", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "soniaji", + "following": "aquazul", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "redwulf", + "following": "aracage", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "seraphim1838", + "following": "arahan1984", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "guywinfield", + "following": "aravedia", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "carlas10", + "following": "aravotiname", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yefet", + "following": "arazilkree", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zebas", + "following": "arcadecity", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bludweaver", + "following": "arcadius", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "creatr", + "following": "arcananumerorum", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tigerlily", + "following": "arcanefist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vorsseli", + "following": "arcaneinfo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "btctips", + "following": "arcange", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lukeracine93", + "following": "archangel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blakemscurr", + "following": "architecture", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "prucha", + "following": "arconite", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mazil", + "following": "arcticpara", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "golden", + "following": "arcurus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ralfson", + "following": "ardenyham", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tilse", + "following": "ardina", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eduardf", + "following": "ardogalen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dexter87", + "following": "ardzreil", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "carlpieper", + "following": "arellano408", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vudolmaran", + "following": "arethusa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "solavei", + "following": "areynolds", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "azzalaydying", + "following": "arfon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "soroksem", + "following": "argonaut", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "windeye", + "following": "argsolver", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemitdude", + "following": "arhag", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "daysmega", + "following": "arieledwards", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bjantigua", + "following": "arilak", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rahulsingh", + "following": "ariscreates", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "abduhalem", + "following": "arise", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "spaceghost", + "following": "arisromansyah88", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "changelly", + "following": "ariunn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iamjmgx", + "following": "ariziz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bloodfont", + "following": "arjoona", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "beylat", + "following": "arkanaprotego", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "balladorn", + "following": "armcore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chapper", + "following": "arnob", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "seamus1916", + "following": "arnoldwish", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "deloreas", + "following": "arnoldz61", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bls", + "following": "arosay", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "therainn", + "following": "arquaker", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnnykamikaze", + "following": "arrax", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "freemanmccoy", + "following": "arshakuny", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kana", + "following": "arta.rajabi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lynda-j-leonard", + "following": "artakan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "amethystrosee", + "following": "artensa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nicred", + "following": "artfulforce", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "florianv", + "following": "articlemaster", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "summersolstice", + "following": "artific", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kaykunoichi", + "following": "artificial", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tingaling", + "following": "artist1989", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "curls4life", + "following": "artistandchef", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "just1hundred", + "following": "artlav", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "btcshare7", + "following": "arto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "afrikanlib", + "following": "arts", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "overlord", + "following": "artsteemit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "goldstein", + "following": "arty", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "noxvis", + "following": "arush", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnnyringo", + "following": "asabovesobelow", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "erik93", + "following": "asaule", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "munillador", + "following": "ascares", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "juanmora", + "following": "asch", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "raybass", + "following": "aschatria", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "treverspade", + "following": "asdas18", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vladikras", + "following": "asdes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "unblogd", + "following": "ash", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "volgaleo", + "following": "ash9095", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "endlesstrax", + "following": "ashbyis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tahirazam", + "following": "ashe-oro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "goliath9", + "following": "ashikmiah", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dogh2o", + "following": "ashleigh", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lat-nayar", + "following": "ashley-toth", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "reaction", + "following": "ashleybeckwith", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tyallan", + "following": "ashleybr", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tyrannyunmasked", + "following": "ashleyepstein", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cheremet", + "following": "ashleymk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "klubnichni", + "following": "ashleyrombro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "radoslaw", + "following": "ashmich", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "coinidol", + "following": "ashold882015", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "naifaz", + "following": "ashpdx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cen236", + "following": "ashwim", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "efd5803", + "following": "asiancapitalists", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pjsmith", + "following": "asim", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "slumbermachine", + "following": "asimpleanarchist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baselini", + "following": "ask-not-please", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hellokitty", + "following": "asksteem", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "manokaus", + "following": "aslammotala", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rolf-kristian", + "following": "asmolokalo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jfallout", + "following": "aspacehuk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrhardy", + "following": "aspasius", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "leschied", + "following": "aspergerjoe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gamarin", + "following": "assisjadue", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnstath", + "following": "astorm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptoninja", + "following": "astouder", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bogart", + "following": "astralbat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "edgarsart", + "following": "asuna", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dusho", + "following": "asuran", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fukako", + "following": "ateam", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "smartblogger", + "following": "athenadruid", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "denisse", + "following": "athleteyoga", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bison015", + "following": "atkins", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "laytonjd", + "following": "atle-v", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "caborandy", + "following": "atmybakesale", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "turiar", + "following": "atomrigs", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "simonbastiani", + "following": "atrickpay", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mountaingirl", + "following": "attacheguevera", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cm-steem", + "following": "atwistedlime", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "welovelithuania", + "following": "audi786", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "waldencall", + "following": "audio23", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eclipse0", + "following": "audreyblake", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tommaor", + "following": "audreybp", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ludvigsart", + "following": "august-newbie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "abc1621043211", + "following": "augusta", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "simon.braki.love", + "following": "augustinsong", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stfn", + "following": "aujurus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bonapartegodard", + "following": "auntliberty", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "proady", + "following": "aureaalas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arahan1984", + "following": "aurimath", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "trudy-beerman", + "following": "ausbitbank", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tazouka", + "following": "aussiecryptoo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "unicornsalad", + "following": "austindean", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rikrdo", + "following": "austinjones", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "morpheustitania", + "following": "autoboy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thecaretaker", + "following": "autofic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hurtinalbertin", + "following": "automatedkings", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "redivivus", + "following": "autonomy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ottulo", + "following": "autonomygarden", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "megahertz", + "following": "autosmile13", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "amirali", + "following": "autumnal.equinox", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "astouder", + "following": "autumnalice", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "turkeon3", + "following": "auwebseries", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "michaelp", + "following": "avarith", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "madwallace", + "following": "avellana", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "andyk", + "following": "avemend", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lalalovehewit", + "following": "aviator", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "endshame", + "following": "avicennamusic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chillseeker", + "following": "avielhitchens", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cool", + "following": "avivkln", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "teia", + "following": "awaismuneeb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tlarsen2080", + "following": "awakealiveaware", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arconite", + "following": "awareness", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "screasey", + "following": "awesomer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rossco99", + "following": "awesoom", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "geovanne", + "following": "axel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mingzhou", + "following": "axestone", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kotamdickson", + "following": "axeweaver", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scottmacquarrie", + "following": "axiomprime", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "juniordelozier", + "following": "axolotl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "smanchbob", + "following": "ayanna", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mzie", + "following": "ayr", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "codar", + "following": "ayu-kartika", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lee5", + "following": "azaan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jojolkree", + "following": "azeroth", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jordanbradley", + "following": "azrael", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thisiscarlosm", + "following": "azurejasper", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zunris", + "following": "azzalaydying", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "crushedpenis", + "following": "b-free", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gainingsteem", + "following": "b0y2k", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "femmsanya", + "following": "b4bb4r-5h3r", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexica", + "following": "ba-boo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chainsaw1", + "following": "babandis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "richardeldredge", + "following": "babybear", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rafaelleonr", + "following": "bacchist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "peppa41", + "following": "backetri", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "laughcry", + "following": "baconwish", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tamijj", + "following": "badassmother", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "elxpanda", + "following": "bagogong", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anarcho-taoist", + "following": "bagore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sschulerr", + "following": "bagrinn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baron90", + "following": "bahaabibo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemitlove", + "following": "baharoba", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "samuran", + "following": "baj", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bchandler", + "following": "bakh-domalak", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anmuravjev", + "following": "balamica", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptosaga", + "following": "balamkut", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vidale", + "following": "baldsteve1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ash9095", + "following": "balen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrphilipp", + "following": "baljourn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kaj-huisman", + "following": "balladorn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baconwish", + "following": "ballatus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wan17", + "following": "balyyu", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pemipi", + "following": "balz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sahutsd", + "following": "bandith", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jack-mosel", + "following": "bangking", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anthonyc", + "following": "banis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "winsland2901", + "following": "baodog", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gubatron", + "following": "baracuda", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "madalieninvader", + "following": "baracuda1971", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "takenbtc", + "following": "barazeye", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rani", + "following": "barbara2", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dreamscapepro", + "following": "barbara3000", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tinnyhippo", + "following": "barbut", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "soft", + "following": "barlog", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kittyquinn", + "following": "baro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dedikin", + "following": "baron90", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "davechasejr", + "following": "baronofbitcoin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "muizianer", + "following": "baronvonboyce", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shibetan", + "following": "barrie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tess.tattoo", + "following": "barriexy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shiznit90", + "following": "barry101", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "windmaster", + "following": "barrycooper", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wisehammer", + "following": "barrydutton", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thecleangame", + "following": "basel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "freetobe", + "following": "baselini", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "power-of-life", + "following": "basicbeing", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lightsplasher", + "following": "basicstepnetwork", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bateman", + "following": "basti.kju", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pichuress", + "following": "bastiat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gsus", + "following": "bastol", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "garylachance", + "following": "batel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "paladin-4", + "following": "bateman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jms21y", + "following": "battleayzee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kajora", + "following": "battlerap", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tbpjr", + "following": "baul", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "andrew-bernbeck", + "following": "bayareacoins", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kylonius", + "following": "bazzaminxer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "syntecventures", + "following": "bbeamish", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "svenivte", + "following": "bblair", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iseektruth", + "following": "bbqbear", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "love-spirit-nerd", + "following": "bbrent", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jrick56", + "following": "bbrewer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemgrindr", + "following": "bbs", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "whiteflame", + "following": "bbsj", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dennygalindo", + "following": "bbw", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marcrapf", + "following": "bchandler", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fooblic", + "following": "bchandra", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etheom", + "following": "bdavid", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rich-oth-hegy", + "following": "bddoolin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sharim", + "following": "beachbum", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aslammotala", + "following": "beanhead", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jjefflorditch", + "following": "beanz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "parkus101", + "following": "bear8photo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fluffy", + "following": "bearus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gogal", + "following": "bearyfire", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hhdelosrios", + "following": "beastmastermason", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "phzuul", + "following": "beauboeye", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sacage", + "following": "beazezel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gibby-gib", + "following": "bebecitosfotos", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "snhrtknfbrn", + "following": "beckygee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mariajoe", + "following": "beckyhastings", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemian", + "following": "becomedeath", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "greenkobra", + "following": "becomingwhtur", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "malcolmjmr", + "following": "bee-tollworthy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ianlmeena", + "following": "beervangeer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "reaching999", + "following": "beforre", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chetlanin", + "following": "begstreets", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnchang", + "following": "behfar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ausbitbank", + "following": "beitasitmay", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "damnthatbanana", + "following": "bekou989", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steem42", + "following": "belfordz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "showerhead", + "following": "belgorogdmitriy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "haripetrov", + "following": "belkins", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "numbmonke", + "following": "bellafacefx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bytemaster", + "following": "bellphorion", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dashpaymagazine", + "following": "belohndichselbst", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cr3at0r-magi", + "following": "belovit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "selfsufficient", + "following": "belovruslan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jotaris", + "following": "ben", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "minris", + "following": "ben-errington", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "spellmaster", + "following": "ben.zimmerman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "babybear", + "following": "ben45", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "missrecipe", + "following": "ben99", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnsmartlive", + "following": "benaccept", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "crashthestuntman", + "following": "benadapt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brandonp", + "following": "benderstarshij", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrisdoogood", + "following": "bendix55", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "victor-smirnoff", + "following": "bendixen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemnow", + "following": "bendjmiller222", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "timer-the-teemer", + "following": "benerrington", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrisdunntv", + "following": "benita", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "michellek", + "following": "benjaminclifton", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "battleayzee", + "following": "benjiberigan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thepholosopher", + "following": "benjojo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "discordian", + "following": "benjy33", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "diego24", + "following": "bennash", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bluerthangreen", + "following": "bennybitcoin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "candy49", + "following": "bennytremble", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arcanefist", + "following": "benoneup", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "public-emily", + "following": "benslayton", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnerfx", + "following": "benthegameboy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jassyt91", + "following": "bentley", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zvonoistine", + "following": "benwoods", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rbialek", + "following": "bergy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hells.saints", + "following": "berid", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sagar", + "following": "berkut", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "murana", + "following": "berniesanders", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dikanevn", + "following": "bert0", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "markconstanza", + "following": "bespokeleo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "naomibee", + "following": "bestmalik", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "forextrader", + "following": "bestmz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alli45454", + "following": "betamusic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chad123", + "following": "bethanyspry", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brownbear", + "following": "bethemtay", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marion", + "following": "beto91", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gek70rus", + "following": "bettyanne", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "berid", + "following": "beylat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mafia", + "following": "beyondbitcoin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blankslatetheory", + "following": "beyondzero", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sijoittaja", + "following": "bezpo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pictorians", + "following": "bg3721", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lovetosteemit", + "following": "bgains", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iosif", + "following": "bhavnapatel68", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kcnickerson", + "following": "bhuz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sixshooter", + "following": "bialovely", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aftergut", + "following": "biancajordan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sminer86", + "following": "bidoof", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nestandartnii", + "following": "bigcash4ken", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thread", + "following": "bigcycler", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stanrizzo", + "following": "bigdatascience", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "goldbinder", + "following": "bige37", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptomental", + "following": "bigedude", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kenjiby", + "following": "biggdogg", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gerasim", + "following": "biggest", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "t-killa", + "following": "biggierotten", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shanks", + "following": "bigkush", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "autumnalice", + "following": "bigman100", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrisjohncox", + "following": "bigpzone", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kdtkaren", + "following": "bigrigbutters", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aviator", + "following": "bigsambucca", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "taktilar", + "following": "biito", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thelink225", + "following": "bilchuzhim", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brafyn", + "following": "biletskiy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jtoubia", + "following": "bill-kline", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marlowemechanism", + "following": "billbutler", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "itsnicoletv", + "following": "billc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rachelkhona", + "following": "billjam56", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "partyp", + "following": "billjoyce", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "montalbeats", + "following": "billstclair", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "asabovesobelow", + "following": "billykeed", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dobbydaba", + "following": "billymushet", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "agamantrius", + "following": "bimmerhead", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "joearnold", + "following": "binwah-de-rese", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mileymatmun", + "following": "biography", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "autumnal.equinox", + "following": "biomike", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "spivee", + "following": "biophil", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "perigra", + "following": "biotrue", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wendymcelroy", + "following": "biowealth", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "karmalive2die", + "following": "bipulbm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "voluntaryist", + "following": "birdcat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "miawright", + "following": "birdie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hugothepoet", + "following": "birkanosis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lailore", + "following": "bischbosch", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptotradersgm", + "following": "bison015", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "books", + "following": "bitacer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "paynode", + "following": "bitbag", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arise", + "following": "bitbarrie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scripted", + "following": "bitbutter", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "moonguy", + "following": "bitcalm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "compsci", + "following": "bitchplease", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "immortalking", + "following": "bitcoin1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zackcoburn", + "following": "bitcoin3d", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "beanz", + "following": "bitcoinaltcoin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sadochismo", + "following": "bitcoinboy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jvdb", + "following": "bitcoindevotee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "faerr", + "following": "bitcoiner", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "masi", + "following": "bitcoinerrorlog", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kajiran", + "following": "bitcoinfly", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "orm", + "following": "bitcoinireland16", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "breastsono", + "following": "bitcoinkev", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ragetomaster", + "following": "bitcoinmeetups", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gashakar", + "following": "bitcoinmeister", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pavledakic", + "following": "bitcoinmoney", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rickriley", + "following": "bitcoinnational", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "neter", + "following": "bitcoinparadise", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cmditch", + "following": "bitcoinrush", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemloto", + "following": "bitcoinryan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tamararch1961", + "following": "bitcoinsmut", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hadenmiles", + "following": "bitcoinsulting", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "misanthrope", + "following": "bitcointop", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jed78", + "following": "bitcoinuserx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "freedomrsa", + "following": "bitcoivnest", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ov1", + "following": "bitcrab", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jcar", + "following": "bitcube", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "desraben", + "following": "bitek", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "seriousnuts", + "following": "bitland", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sonarous", + "following": "bitmap", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "doompick", + "following": "bitmaxt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "saira", + "following": "bitminter", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "james1337", + "following": "bitnation", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sukijee", + "following": "bitnerd", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "breakfastchief", + "following": "bitrichdave", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yuhhans", + "following": "bitscape", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ethereumnews", + "following": "bitshares101", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mione", + "following": "bitsignal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lazelchaman", + "following": "bitspace", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "deanliu", + "following": "bitswift", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ferdousbhai", + "following": "bitterbeaner", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "petedaoust", + "following": "bittrex", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stanislove", + "following": "bittrex-bill", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "markjones", + "following": "bittrex-richie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "philipnbrown", + "following": "bixlives", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "choochoo", + "following": "bjantigua", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fintech-jesus", + "following": "bjones", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "karinanapoleon", + "following": "bkkshadow", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etcmike", + "following": "bkvolunarcho", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mogelv", + "following": "bl4nkcode01", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kegda", + "following": "blaci", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lemmyh2", + "following": "blackbeard", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gregman117", + "following": "blackcreek", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "smartguylabcoat", + "following": "blackeyed", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kareemaudi", + "following": "blackhunter", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "flamedarkmoon", + "following": "blackisodo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "temnotat", + "following": "blackjack", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "valen55", + "following": "blackjincrypto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "garrood", + "following": "blackmask", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "samujora", + "following": "blackstar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jaredd", + "following": "blackterror", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alex2649tw", + "following": "bladesmasher", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "paine8476", + "following": "bladeweaver", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oliv", + "following": "blained13", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hondeeer", + "following": "blairmx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stella-apple", + "following": "blakemiles84", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "guille", + "following": "blakemscurr", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "input", + "following": "blammo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gandang", + "following": "blankslatetheory", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sonyanka", + "following": "bledarus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "volum12v", + "following": "bleddur", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chainreaction", + "following": "bleepcoin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dubaicoin", + "following": "blindleaf", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kaicrypzen", + "following": "blinova", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gerimawol", + "following": "blite", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dolune", + "following": "blizzen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thejas", + "following": "blkcxa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kazza", + "following": "blocho", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etacarinae", + "following": "blockcat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mikeonfire", + "following": "blockchainbilly", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "theconnoisseur", + "following": "blockchainblonde", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexbafana", + "following": "blockchainbunker", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "philopseudes", + "following": "blockchaingirl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baj", + "following": "blockchainjen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "walternz", + "following": "blockcodes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tomaso88", + "following": "blockcore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "powmonkey", + "following": "blocks2517", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jayzeus", + "following": "blocktalk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "benita", + "following": "blocktrade", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zrc", + "following": "blocktrades", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cylonmaker2053", + "following": "blogger", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexandergorban", + "following": "bloggersclub", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ithinkbigcoins", + "following": "blogzandvlogz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lordjaba", + "following": "blokart", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kita", + "following": "blokzinciri", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "boner3000", + "following": "blooalien", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rossnoboss", + "following": "bloodfont", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kejurus", + "following": "blow", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wendymc", + "following": "bls", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eristoddle", + "following": "bludterror", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "peibol77", + "following": "bludweaver", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scorpion", + "following": "blue.cheese", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrkuujo", + "following": "blue1950", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "analace", + "following": "bluebell", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ppplant", + "following": "blueciruit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "norene", + "following": "blueeyedpunk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "uitumart", + "following": "blueeyes410", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptoprometheus", + "following": "bluehorseshoe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "daysmega1421", + "following": "blueorgy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "supershake", + "following": "bluerthangreen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steverino", + "following": "bluestar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexgunderman", + "following": "bmann", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "master360", + "following": "bmcv001", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "genejoe", + "following": "bmoar11", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "karvenn", + "following": "bmore-mary", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "helen.tan", + "following": "bmw", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "delusionist", + "following": "bmwclubshymkent", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chromereaper13", + "following": "bnheflin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "skeptic", + "following": "bnktothefuture", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "taxationistheft", + "following": "bo-ro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "agm1984", + "following": "boarddavid", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dartagnons", + "following": "boardwalk-steem", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mommyjay", + "following": "boatymcboatface", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shalmaran", + "following": "bob", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "taker", + "following": "bobandalice", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "doothewop", + "following": "bobbarker", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "skmart9", + "following": "bobbrasil", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blue.cheese", + "following": "bobcollier", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dims", + "following": "bobdownlov", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marketcrash", + "following": "bobkillaz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xeno999", + "following": "bobloblaw45", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bransonbig", + "following": "bobo012", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tlc", + "following": "bobrandolph", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "onionweb", + "following": "bodhi.agora", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dule2311", + "following": "bofym", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "msjennifer", + "following": "bogart", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jay-kopinski", + "following": "bogartgaming", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kwsteemit", + "following": "bohelm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "golden24", + "following": "bolnavioru", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bohelm", + "following": "boloyang", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tmaryfield", + "following": "bolseros", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "soupper1", + "following": "bolv", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pauls", + "following": "bonapartegodard", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eggsy", + "following": "bonapartist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yandra86", + "following": "bond007", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "garyjohntsv", + "following": "bondgirl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yanulyarus", + "following": "boner3000", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sanbir", + "following": "bones", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "its.batman", + "following": "bones261", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pointpresent", + "following": "bones555", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oopsimdead", + "following": "bonface", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "idefix", + "following": "bonita", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sfish", + "following": "bonitaoregon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kintao81", + "following": "bonnie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nettijoe96", + "following": "booble394", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lbtyf", + "following": "booja", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "grape", + "following": "books", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "votehumanity", + "following": "booky", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "maria.vincent", + "following": "boombastic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xplore74", + "following": "boomboom", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brunoscholz", + "following": "boomhauer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oliverb", + "following": "boris.pale", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "track", + "following": "borisheir", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jimpanzee", + "following": "bornlibre", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bhuz", + "following": "borntowin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "newhampshire", + "following": "borran", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tisenkovv", + "following": "bostan55", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "archangel", + "following": "bostonzek", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kevphanis", + "following": "bottai", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ajingalls", + "following": "boy", "what": [ "blog" ] diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/last.tavern.yaml b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/last.tavern.yaml index 60180cd6d..ca3895613 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/last.tavern.yaml +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/last.tavern.yaml @@ -19,7 +19,7 @@ jsonrpc: "2.0" id: 1 method: "condenser_api.get_following" - params: ["gtg","blocktrades","blog",1000] + params: ["gtg","thebluepanda","blog",1000] response: status_code: 200 verify_response_with: diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/paginated.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/paginated.pat.json index 5926e24d3..280d8af4c 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/paginated.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/paginated.pat.json @@ -1,3647 +1,3647 @@ [ { "follower": "skyefox", - "following": "mrhardy", + "following": "jgmplan6612", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "leschied", + "following": "jgraci78", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gamarin", + "following": "jhartleib1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnstath", + "following": "jhein", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptoninja", + "following": "jhermanbeans", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bogart", + "following": "jhizzle207", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "edgarsart", + "following": "jholaw", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dusho", + "following": "jholdsworthy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fukako", + "following": "jholmes91", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "smartblogger", + "following": "jholmesland", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "denisse", + "following": "jhonione", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bison015", + "following": "jhoule3186", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "laytonjd", + "following": "jiacyhb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "caborandy", + "following": "jianghao", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "turiar", + "following": "jiaoliu", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "simonbastiani", + "following": "jierdin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mountaingirl", + "following": "jiganomics", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cm-steem", + "following": "jikolecwer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "welovelithuania", + "following": "jillfeint", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "waldencall", + "following": "jillstein2016", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eclipse0", + "following": "jillwirt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tommaor", + "following": "jim-brown-ancap", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ludvigsart", + "following": "jim-young", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "abc1621043211", + "following": "jimbo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "simon.braki.love", + "following": "jimbobbill", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stfn", + "following": "jimcorrao", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bonapartegodard", + "following": "jimjesus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "proady", + "following": "jimlewis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arahan1984", + "following": "jimmco", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "trudy-beerman", + "following": "jimmyfallon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tazouka", + "following": "jimoneil", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "unicornsalad", + "following": "jimpanzee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rikrdo", + "following": "jimtohelpall", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "morpheustitania", + "following": "jinsku", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thecaretaker", + "following": "jirac", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hurtinalbertin", + "following": "jischinger", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "redivivus", + "following": "jj888", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ottulo", + "following": "jjabs", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "megahertz", + "following": "jjalvarado", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "amirali", + "following": "jjchic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "astouder", + "following": "jjefflorditch", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "turkeon3", + "following": "jjsteemit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "michaelp", + "following": "jkb358", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "madwallace", + "following": "jl777", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "andyk", + "following": "jlackey787", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lalalovehewit", + "following": "jlove", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "endshame", + "following": "jlwk0lb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chillseeker", + "following": "jlwkolb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cool", + "following": "jms21y", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "teia", + "following": "jmslee2016", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tlarsen2080", + "following": "jmurphpitt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arconite", + "following": "jnp", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "screasey", + "following": "jo-stonellord", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rossco99", + "following": "joan-zhai", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "geovanne", + "following": "joanstewart", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mingzhou", + "following": "jocelyn16", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kotamdickson", + "following": "jocelynrassah", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scottmacquarrie", + "following": "joearnold", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "juniordelozier", + "following": "joeba", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "smanchbob", + "following": "joedepalma", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mzie", + "following": "joelbow", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "codar", + "following": "joelbussard", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lee5", + "following": "joeld", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jojolkree", + "following": "joeldalais", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jordanbradley", + "following": "joele", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thisiscarlosm", + "following": "joelindenmann", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zunris", + "following": "joelinux", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "crushedpenis", + "following": "joelkatz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gainingsteem", + "following": "joemz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "femmsanya", + "following": "joesteem", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexica", + "following": "joewantsfreedom", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chainsaw1", + "following": "jofn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "richardeldredge", + "following": "johan-nygren", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rafaelleonr", + "following": "johanherman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "peppa41", + "following": "johann", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "laughcry", + "following": "johannaparker284", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tamijj", + "following": "johannawesterman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "elxpanda", + "following": "johanniellano", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anarcho-taoist", + "following": "johannjoseph", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sschulerr", + "following": "john-kimmel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baron90", + "following": "john.drefahl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemitlove", + "following": "johnaslan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "samuran", + "following": "johncalvinhall", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bchandler", + "following": "johnchang", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anmuravjev", + "following": "johndunn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptosaga", + "following": "johnerfx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vidale", + "following": "johngalt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ash9095", + "following": "johnguts", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrphilipp", + "following": "johnhill", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kaj-huisman", + "following": "johnhtims", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baconwish", + "following": "johnm862", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wan17", + "following": "johnnyb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pemipi", + "following": "johnnyd", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sahutsd", + "following": "johnnyhuman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jack-mosel", + "following": "johnnyhurley", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anthonyc", + "following": "johnnykamikaze", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "winsland2901", + "following": "johnnyringo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gubatron", + "following": "johnnyyash", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "madalieninvader", + "following": "johnpitchers", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "takenbtc", + "following": "johnsmartlive", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rani", + "following": "johnsmith", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dreamscapepro", + "following": "johnsnow", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tinnyhippo", + "following": "johnstath", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "soft", + "following": "johnster", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kittyquinn", + "following": "johnvibes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dedikin", + "following": "johnwall", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "davechasejr", + "following": "johnygt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "muizianer", + "following": "johsin28", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shibetan", + "following": "joiflores", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tess.tattoo", + "following": "joikolres", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shiznit90", + "following": "jojokazahn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "windmaster", + "following": "jojolar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wisehammer", + "following": "jojolkree", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thecleangame", + "following": "jojolrajas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "freetobe", + "following": "jojonris", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "power-of-life", + "following": "jojosan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lightsplasher", + "following": "jokerdarkknight", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bateman", + "following": "jokerpravis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pichuress", + "following": "jokes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gsus", + "following": "joking", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "garylachance", + "following": "joktan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "paladin-4", + "following": "jola", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jms21y", + "following": "jolindon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kajora", + "following": "jolpolkil", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tbpjr", + "following": "joma256", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "andrew-bernbeck", + "following": "jonasontheroof", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kylonius", + "following": "jonaswakefield", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "syntecventures", + "following": "jonathan-m-e", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "svenivte", + "following": "jonathan-tokki", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iseektruth", + "following": "jonathanlockwood", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "love-spirit-nerd", + "following": "jonathanyoung", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jrick56", + "following": "jonblack", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemgrindr", + "following": "jondeer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "whiteflame", + "following": "jones-wills", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dennygalindo", + "following": "jonis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marcrapf", + "following": "jonndena", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fooblic", + "following": "jonno-katz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etheom", + "following": "jonnybh", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rich-oth-hegy", + "following": "jonnybitcoin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sharim", + "following": "jonnydubowsky", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aslammotala", + "following": "jonnyheggheim", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jjefflorditch", + "following": "jonnyrevolution", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "parkus101", + "following": "jonnyrock3t", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fluffy", + "following": "joramo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gogal", + "following": "jordan-rockwell", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hhdelosrios", + "following": "jordanbradley", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "phzuul", + "following": "jordandenison", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sacage", + "following": "jordanpagemusic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gibby-gib", + "following": "jordanthurt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "snhrtknfbrn", + "following": "jorge1337", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mariajoe", + "following": "jorgefar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemian", + "following": "jorrian", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "greenkobra", + "following": "jorych", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "malcolmjmr", + "following": "jos.denmark", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ianlmeena", + "following": "josch", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "reaching999", + "following": "joscha", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chetlanin", + "following": "jose22", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnchang", + "following": "josegtz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ausbitbank", + "following": "joseph", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "damnthatbanana", + "following": "joseph.kalu", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steem42", + "following": "josephcraig289", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "showerhead", + "following": "josephina", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "haripetrov", + "following": "josepimpo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "numbmonke", + "following": "josereyero", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bytemaster", + "following": "joseywales", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dashpaymagazine", + "following": "joshatwal91", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cr3at0r-magi", + "following": "joshbowens", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "selfsufficient", + "following": "joshbreslauer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jotaris", + "following": "joshf", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "minris", + "following": "joshglen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "spellmaster", + "following": "joshmak2", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "babybear", + "following": "joshspicer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "missrecipe", + "following": "joshua", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnsmartlive", + "following": "joshualawhorn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "crashthestuntman", + "following": "josy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brandonp", + "following": "jotaris", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrisdoogood", + "following": "joujou666", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "victor-smirnoff", + "following": "joybran", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemnow", + "following": "joythewanderer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "timer-the-teemer", + "following": "jozo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrisdunntv", + "following": "jparty", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "michellek", + "following": "jpdimensions", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "battleayzee", + "following": "jphamer1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thepholosopher", + "following": "jpiper20", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "discordian", + "following": "jpkealing", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "diego24", + "following": "jpof", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bluerthangreen", + "following": "jr5star", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "candy49", + "following": "jrcornel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arcanefist", + "following": "jrd", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "public-emily", + "following": "jrd8526", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnerfx", + "following": "jrfantasma", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jassyt91", + "following": "jrick56", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zvonoistine", + "following": "jrmontenegro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rbialek", + "following": "jrmoreau", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hells.saints", + "following": "jru", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sagar", + "following": "jsantana", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "murana", + "following": "jsc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dikanevn", + "following": "jshii", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "markconstanza", + "following": "jsiegler", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "naomibee", + "following": "jsmne", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "forextrader", + "following": "jsnfwlr", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alli45454", + "following": "jstuartbrock", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chad123", + "following": "jthej70", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brownbear", + "following": "jtoubia", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marion", + "following": "jtpthe3rd", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gek70rus", + "following": "jtrdertas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "berid", + "following": "jtstreetman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mafia", + "following": "jttheat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blankslatetheory", + "following": "jtv135954", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sijoittaja", + "following": "jtyrrell", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pictorians", + "following": "juanlaart", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lovetosteemit", + "following": "juanlibertad", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iosif", + "following": "juanmora", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kcnickerson", + "following": "juansgalt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sixshooter", + "following": "judasz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aftergut", + "following": "judeperl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sminer86", + "following": "judyd100", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nestandartnii", + "following": "judyhopps", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thread", + "following": "juergen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stanrizzo", + "following": "juktilar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "goldbinder", + "following": "julesatwork", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptomental", + "following": "julia26", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kenjiby", + "following": "juliannapier", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gerasim", + "following": "julianoca", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "t-killa", + "following": "juliap4", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shanks", + "following": "juliarose", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "autumnalice", + "following": "julienmier", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrisjohncox", + "following": "juliensoula", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kdtkaren", + "following": "julrajas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aviator", + "following": "juma", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "taktilar", + "following": "jumpman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thelink225", + "following": "juneaugoldbuyer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brafyn", + "following": "junginit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jtoubia", + "following": "junglepancake", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marlowemechanism", + "following": "junior2wnw", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "itsnicoletv", + "following": "junior888", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rachelkhona", + "following": "juniordelozier", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "partyp", + "following": "jupiter.zeus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "montalbeats", + "following": "jupiter00000", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "asabovesobelow", + "following": "jurisnaturalist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dobbydaba", + "following": "jusan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "agamantrius", + "following": "just-me-nobody", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "joearnold", + "following": "just-some-guy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mileymatmun", + "following": "just1hundred", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "autumnal.equinox", + "following": "justalazystudent", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "spivee", + "following": "justallen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "perigra", + "following": "justanhuman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wendymcelroy", + "following": "justapolishman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "karmalive2die", + "following": "justaregularjoe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "voluntaryist", + "following": "justbc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "miawright", + "following": "justicepirate", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hugothepoet", + "following": "justiciar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lailore", + "following": "justin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptotradersgm", + "following": "justin74", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "books", + "following": "justinbair97", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "paynode", + "following": "justing", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arise", + "following": "justingauthier", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scripted", + "following": "justinlaak", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "moonguy", + "following": "justinoconnell", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "compsci", + "following": "justinschwalm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "immortalking", + "following": "justtryme90", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zackcoburn", + "following": "justyna", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "beanz", + "following": "justysqa25", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sadochismo", + "following": "juvashi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jvdb", + "following": "juvyjabian", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "faerr", + "following": "jvdb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "masi", + "following": "jvper", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kajiran", + "following": "jwaser", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "orm", + "following": "jwest40", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "breastsono", + "following": "jwood27", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ragetomaster", + "following": "jyoti", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gashakar", + "following": "jza", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pavledakic", + "following": "k-rapper", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rickriley", + "following": "k471", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "neter", + "following": "kabayah", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cmditch", + "following": "kabei", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemloto", + "following": "kaderleha", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tamararch1961", + "following": "kafkanarchy84", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hadenmiles", + "following": "kagal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "misanthrope", + "following": "kagalmaran", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jed78", + "following": "kagami", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "freedomrsa", + "following": "kagetoki-1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ov1", + "following": "kaicrypzen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jcar", + "following": "kain", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "desraben", + "following": "kain-jc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "seriousnuts", + "following": "kainmarx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sonarous", + "following": "kaj-huisman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "doompick", + "following": "kajalpats", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "saira", + "following": "kajigul", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "james1337", + "following": "kajiran", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sukijee", + "following": "kajirn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "breakfastchief", + "following": "kajora", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yuhhans", + "following": "kakasa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ethereumnews", + "following": "kakashideidara", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mione", + "following": "kakinos", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lazelchaman", + "following": "kakkapatakka", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "deanliu", + "following": "kakoywhich", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ferdousbhai", + "following": "kakradetome", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "petedaoust", + "following": "kalabaska", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stanislove", + "following": "kalimor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "markjones", + "following": "kalleone", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "philipnbrown", + "following": "kalyan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "choochoo", + "following": "kam1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fintech-jesus", + "following": "kamall28", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "karinanapoleon", + "following": "kamasutra", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etcmike", + "following": "kamauabayomi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mogelv", + "following": "kamil5", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kegda", + "following": "kamirus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lemmyh2", + "following": "kamuro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gregman117", + "following": "kamvreto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "smartguylabcoat", + "following": "kana", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kareemaudi", + "following": "kanabis420pm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "flamedarkmoon", + "following": "kanders", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "temnotat", + "following": "kaneen74", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "valen55", + "following": "kanoptx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "garrood", + "following": "kansasdirt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "samujora", + "following": "kaospilot", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jaredd", + "following": "kapitaalicom", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alex2649tw", + "following": "kapp", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "paine8476", + "following": "kaptainkrayola", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oliv", + "following": "karaelizabeth", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hondeeer", + "following": "karama", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stella-apple", + "following": "karask", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "guille", + "following": "karatmaster", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "input", + "following": "karchersmith", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gandang", + "following": "kareemaudi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sonyanka", + "following": "kareldonk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "volum12v", + "following": "karen13", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chainreaction", + "following": "karenb54", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dubaicoin", + "following": "karenmckersie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kaicrypzen", + "following": "kariannemunch", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gerimawol", + "following": "karinanapoleon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dolune", + "following": "karinanov", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thejas", + "following": "karins", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kazza", + "following": "karisa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etacarinae", + "following": "karlmueller", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mikeonfire", + "following": "karlonnee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "theconnoisseur", + "following": "karmacoma", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexbafana", + "following": "karmalive2die", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "philopseudes", + "following": "karnal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baj", + "following": "karolynfaith", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "walternz", + "following": "karvenn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tomaso88", + "following": "kasecucuzza", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "powmonkey", + "following": "kashioboy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jayzeus", + "following": "kasia", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "benita", + "following": "kasink", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zrc", + "following": "kasperskov", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cylonmaker2053", + "following": "kat-scratch", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexandergorban", + "following": "katarina8chud", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ithinkbigcoins", + "following": "kateadventure", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lordjaba", + "following": "katecloud", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kita", + "following": "katejackson", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "boner3000", + "following": "katerina", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rossnoboss", + "following": "kathigentle", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kejurus", + "following": "kathise", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wendymc", + "following": "kathriron", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eristoddle", + "following": "katie-chowne", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "peibol77", + "following": "katiebell", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scorpion", + "following": "katiep", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrkuujo", + "following": "katii", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "analace", + "following": "kato", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ppplant", + "following": "katyakov", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "norene", + "following": "katyjones", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "uitumart", + "following": "katz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptoprometheus", + "following": "kawaiidinosaur", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "daysmega1421", + "following": "kawal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "supershake", + "following": "kayana", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steverino", + "following": "kaykunoichi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexgunderman", + "following": "kaylinart", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "master360", + "following": "kazigami", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "genejoe", + "following": "kazirisar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "karvenn", + "following": "kazphoto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "helen.tan", + "following": "kazrabei", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "delusionist", + "following": "kazragore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chromereaper13", + "following": "kazralabar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "skeptic", + "following": "kazralrajas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "taxationistheft", + "following": "kazumba", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "agm1984", + "following": "kazumi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dartagnons", + "following": "kazza", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mommyjay", + "following": "kbe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shalmaran", + "following": "kblamo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "taker", + "following": "kbpealo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "doothewop", + "following": "kbradsha", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "skmart9", + "following": "kchester3", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blue.cheese", + "following": "kcnickerson", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dims", + "following": "kdawes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marketcrash", + "following": "kdllac", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xeno999", + "following": "kdnolan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bransonbig", + "following": "kdoresky", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tlc", + "following": "kdtkaren", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "onionweb", + "following": "kdugar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dule2311", + "following": "keating", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "msjennifer", + "following": "keding", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jay-kopinski", + "following": "kedora", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kwsteemit", + "following": "keela226", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "golden24", + "following": "keepdoodling", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bohelm", + "following": "kefkius", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tmaryfield", + "following": "kegas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "soupper1", + "following": "kegda", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pauls", + "following": "keirb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eggsy", + "following": "keithbroad", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yandra86", + "following": "keithsmih", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "garyjohntsv", + "following": "keithwillshine", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yanulyarus", + "following": "kejurus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sanbir", + "following": "kekoacoaching", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "its.batman", + "following": "kektilar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pointpresent", + "following": "kel-henriques", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oopsimdead", + "following": "keledwyn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "idefix", + "following": "kelemath", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sfish", + "following": "kell234", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kintao81", + "following": "kelly", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nettijoe96", + "following": "kellyjanderson", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lbtyf", + "following": "kellystone6", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "grape", + "following": "kellywin21", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "votehumanity", + "following": "kelvin-martinez", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "maria.vincent", + "following": "kencode", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xplore74", + "following": "kendewitt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brunoscholz", + "following": "kendoc911", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oliverb", + "following": "kenfitz3", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "track", + "following": "kenistyles", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jimpanzee", + "following": "kenj", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bhuz", + "following": "kenjiby", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "newhampshire", + "following": "kenny-crane", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tisenkovv", + "following": "kennykwong", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "archangel", + "following": "kennyrowe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kevphanis", + "following": "kennyskitchen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ajingalls", + "following": "kenshiro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tinaom111", + "following": "kensy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kareldonk", + "following": "kental", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "solidgold", + "following": "kentbarrett", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mauibrownskin", + "following": "kentdenns", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blkcxa", + "following": "kenw2", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "trimpy", + "following": "kepo777", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etz", + "following": "keralv", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "crazynotned", + "following": "kerismatic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bipulbm", + "following": "kern", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cryptosteem", + "following": "keron", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "coliraver", + "following": "ket", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alifton", + "following": "ketchash", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lcb", + "following": "kev7000", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "abebablom", + "following": "kevanbalmer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steel", + "following": "kevbonneau", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jiaoliu", + "following": "keverw", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alanc", + "following": "kevinhaskins", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "persona-dynamo", + "following": "kevinpham20", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "adriendis", + "following": "kevintruong", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "andriyv", + "following": "kevinwong", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "peteclark", + "following": "kevphanis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wayward", + "following": "kewde", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kekoacoaching", + "following": "kewpiedoll", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shiri", + "following": "keyser", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ceviche", + "following": "kharmastrong", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ltndd1", + "following": "khizar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "activistpost", + "following": "khusairy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "erkan", + "following": "kibela", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "saintbitts", + "following": "kickb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blinova", + "following": "kicker27", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "citizens", + "following": "kiddarko", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kat-scratch", + "following": "kidrock", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wrightlabs", + "following": "kids", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ollakolla", + "following": "kidsysco", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "intangibl3", + "following": "kidtubu", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "horsewell", + "following": "kielsky", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kabayah", + "following": "kierkeguardian", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lanaru", + "following": "kigatilar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "renijra", + "following": "kijov", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "firinne", + "following": "kikoman24", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mhillebregt", + "following": "kikora", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dmitlex", + "following": "kiligirl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "travieso", + "following": "killerstorm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gobar", + "following": "killswitch", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "signalandnoise", + "following": "kilopaven", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "btbrokerss", + "following": "kilpolp", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "miceanmen", + "following": "kilrathi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aarnold", + "following": "kimal73", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jholmesland", + "following": "kimbo-spice", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gmalhotra", + "following": "kimmar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fourfingerz", + "following": "kimmydora", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ramveerapratap", + "following": "kimziv", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marta-zaidel", + "following": "king.pin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sjshah91", + "following": "king310", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jojolrajas", + "following": "kingarbinv", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kshalash", + "following": "kingdead", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "josy", + "following": "kingjohal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "maradeo", + "following": "kingkrawdad", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brebrooou", + "following": "kingofchaos", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "walkingmage", + "following": "kingofcoin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "foginn", + "following": "kingofthexiled", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dorinalanza", + "following": "kingpin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blairmx", + "following": "kingscrown", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rob253", + "following": "kingsjack123", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "caly", + "following": "kingtylervvs", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mikeaust", + "following": "kintao81", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "filmcriticism", + "following": "kiopolokin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "recursive70", + "following": "kirby1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "d-cheney", + "following": "kirbyruff", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cahuillan", + "following": "kiribor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bmwclubshymkent", + "following": "kirinn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "carajonesspeaks", + "following": "kiriron", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "akigor", + "following": "kirkwuk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baronvonboyce", + "following": "kirov", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "carlhunt", + "following": "kirreall", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "conductor123", + "following": "kirtash85", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ottobox", + "following": "kissmybutt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jonasontheroof", + "following": "kita", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ned4sed", + "following": "kitov", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brittnipg", + "following": "kitperez", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "psn", + "following": "kittyquinn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "trader999", + "following": "kiwi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemsunny", + "following": "kiwideb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "satch", + "following": "kiwiscorner", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lisa3vol", + "following": "kjartan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alternativefeed", + "following": "kjedwards", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anarcho7", + "following": "kl3indeurf", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "miltersen", + "following": "klaartje", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "straw2", + "following": "klausj", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yassinebentour", + "following": "klexaelm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jepeto", + "following": "kliner", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "plasticpainter", + "following": "klozz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kozmanov", + "following": "klubnichni", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sergei", + "following": "klye", "what": [ "blog" ] @@ -3655,3346 +3655,3346 @@ }, { "follower": "skyefox", - "following": "buriril", + "following": "kngbsn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "irishvoluntary", + "following": "knircky", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "the.ender", + "following": "knoble", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bert0", + "following": "knozaki2015", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vapeit", + "following": "knyaz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ramta", + "following": "knyggajames", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "moditus", + "following": "kobur", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemgirls", + "following": "kocthuchit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tarek", + "following": "koko", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "help-yourself", + "following": "kolineraser", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrisabat", + "following": "kolyan31", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "totosky", + "following": "komar4ik", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dagdatus", + "following": "kommienezuspadt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "younlong", + "following": "komolova19", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kidrock", + "following": "kondor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dawnbringer", + "following": "kondrat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nxsofsobrieties", + "following": "konelectric", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kazralabar", + "following": "koningsbruggen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "watershed", + "following": "konti", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "asdas18", + "following": "koolaidssss", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "siti", + "following": "korbant", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "perky", + "following": "korben", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "moonmission", + "following": "korose", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "robertorenteria", + "following": "korpzhe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "magz8716", + "following": "korran", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mazzaneo", + "following": "kosmatimuc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "verelst", + "following": "kotamdickson", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "deicida", + "following": "kottai", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "francofromottawa", + "following": "kovaiensko", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "local", + "following": "kovatelj", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shadowmane", + "following": "kozmanov", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vee.kay", + "following": "kozmik", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "idan4326", + "following": "krabapka", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "foodwhale", + "following": "krabgat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "regeneration", + "following": "kranga", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexander1", + "following": "krassvs", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "newland", + "following": "kravchenkopo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "benerrington", + "following": "krazy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "etherin", + "following": "kreativ", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "metasintactic", + "following": "kremer9189", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marcelhattingh", + "following": "kremlinup", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "billykeed", + "following": "krgaurav", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xn00byx", + "following": "kriborin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shovelling-coal", + "following": "krishbas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "emeraldandroid", + "following": "krishtopa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yorg", + "following": "krispy123", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "avivkln", + "following": "krissrage", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "polyball", + "following": "kristalkoh", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "slojas1", + "following": "kristaloveslife", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jones-wills", + "following": "kristina", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kondrat", + "following": "kristina011891", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "toshakar", + "following": "kristylynn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "indah-rahayu", + "following": "krnel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "albertfall", + "following": "krockit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "argonaut", + "following": "krtliv", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "delfinachristi", + "following": "krushing", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "leprechaun", + "following": "kruzhochek", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dujas", + "following": "kryptik", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "airbnb", + "following": "krypto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "automatedkings", + "following": "kryshen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "voxxe", + "following": "krystle", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "appalachain", + "following": "krystox", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lasoni", + "following": "kryuchin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "annasophia", + "following": "ksena", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aracage", + "following": "kshalash", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sanam", + "following": "kstolorz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "speedway4charity", + "following": "ktbaeohana", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "macintyre", + "following": "kubrickkk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "robhustle", + "following": "kuhard", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fairider", + "following": "kulalace", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ben45", + "following": "kumaqi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "buddha", + "following": "kurtbeil", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brightstar", + "following": "kurtrohlandt", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rogerver", + "following": "kus-knee", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lilli", + "following": "kushed", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "places", + "following": "kushfreeman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "drlindathenurse", + "following": "kvithai", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "napwest", + "following": "kvollick", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ninjace", + "following": "kwonjs77", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stone1", + "following": "kwsteemit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "realituii", + "following": "kylark", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eagleflash", + "following": "kyle.lapo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "angielb", + "following": "kyleb15", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "greasemonkey", + "following": "kylegibson", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vespasky", + "following": "kylemensch", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vis4voluntary", + "following": "kylenator", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "angelm", + "following": "kyletorpey", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "got", + "following": "kylonius", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sammy007", + "following": "kymera", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mdkshareef", + "following": "kyriacos", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "radium", + "following": "kyusho", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ruscle", + "following": "l0k1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tanju", + "following": "labradorsem", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "frostwind", + "following": "lachoneous007", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nloplutonij", + "following": "laconicflow", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "culain", + "following": "ladnar64", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dasfarm", + "following": "ladora", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gord0b", + "following": "ladox123", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zonpower", + "following": "ladyboss", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "clevans", + "following": "ladyclair", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arkanaprotego", + "following": "ladydoe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mikebennett", + "following": "ladypenelope1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anarchopluggy", + "following": "ladywelder", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chedder21", + "following": "lafona", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aphrodite", + "following": "lafona-miner2", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fiddleflapper", + "following": "lafter", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "robelneo", + "following": "lahbil", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hapakal", + "following": "lailore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "judyhopps", + "following": "laivi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "coldsteam", + "following": "lakiridi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "maladar", + "following": "lalalovehewit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arcananumerorum", + "following": "lalikaponay", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "whitedefender", + "following": "lamadog", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eclecticity", + "following": "lambot", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chuckwilliams37", + "following": "lamech-m", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "diaphanous", + "following": "lamouthe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "curranwood", + "following": "lamstock", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "twiceuponatime", + "following": "lanaru", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ghoge", + "following": "lancem", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gabbans", + "following": "landa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ibringawareness", + "following": "landaswyn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "libertyism", + "following": "langly", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "quicksilv3r", + "following": "lanimal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yobaa", + "following": "lantto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vtmdmd", + "following": "laonie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "popper", + "following": "laoyao", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tocos", + "following": "lapants", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "richardjaquish", + "following": "lapochka", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "c15k0", + "following": "lapointechloe99", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vazcarefree", + "following": "larkenrose", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "odakan", + "following": "larrylegendary", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexaledger", + "following": "larsvestman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brockton", + "following": "lasoni", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shonzr", + "following": "lasseehlers", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "solaresssellka", + "following": "lasvegasgirl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ccm702", + "following": "lat-nayar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yoopercharged", + "following": "laughcry", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bigcycler", + "following": "laurafs22", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stoneybrooks", + "following": "lauralemons", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "term8", + "following": "laurelmaiatroy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "itsrandy", + "following": "laurengrace", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "shax", + "following": "laurenh", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "joshf", + "following": "laurenoe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ozzy-vega", + "following": "laurenrumpler", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mjgrae", + "following": "layl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "uuuhha", + "following": "laytonjd", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dilmacoin", + "following": "lazan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dcsignals", + "following": "lazelchaman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vivianupman", + "following": "lazergreen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arjoona", + "following": "lbtyf", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stijn", + "following": "lcb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "plantbasedjunkie", + "following": "lcekinci", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "free7dollars", + "following": "lchow14", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "buyselltrade", + "following": "ldbkat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "olozzalap", + "following": "lead", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bmw", + "following": "leadanini", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sharon540", + "following": "leagueoflamps", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chickee", + "following": "leahmchenry", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "julrajas", + "following": "lechiffre", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lomiruuun", + "following": "lecochonvert", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tjfire", + "following": "lecrazycanuckeh", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nobodyishome", + "following": "ledzep1981", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "blockcore", + "following": "lee5", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "buyttr", + "following": "leenah", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rznag", + "following": "leenaljabari", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lovegepl", + "following": "leesunmoo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gottahaveit", + "following": "legio", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jorgefar", + "following": "legion", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brands", + "following": "lehard", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kawal", + "following": "leighburke", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnhill", + "following": "lekemat", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "firdausislamiah", + "following": "leksimus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rhysday", + "following": "lelis", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bekou989", + "following": "lemmyh2", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "boy", + "following": "lemops", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "phoebenix", + "following": "lemouth", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kanabis420pm", + "following": "lenar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "curving", + "following": "lenar79", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jeffkiestler", + "following": "leneg", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sminer88", + "following": "lenerdie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arquaker", + "following": "lenovook", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bobkillaz", + "following": "lensessions", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "joesteem", + "following": "lentus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kottai", + "following": "leoincali", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "techemist", + "following": "leojen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cognoscere", + "following": "leon-fu", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "breanna.may", + "following": "leoniestein3", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lightningeyes", + "following": "leonirkl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "randolphrope", + "following": "leopold", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "garri74", + "following": "leoszilard", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gumer", + "following": "leprechaun", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fodar", + "following": "lepstick", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fenelona", + "following": "les-peters", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ethbull", + "following": "leschied", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jhein", + "following": "lescraig", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rarepepe", + "following": "lesliestarrohara", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "insidevfx", + "following": "leta-blake", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "viktor.phuket", + "following": "letc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "iraniansteem", + "following": "leticiapink", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kagami", + "following": "lets-roll", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "madhayday", + "following": "letsevolve", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "adrianakgb", + "following": "letsgetlost", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mikaila", + "following": "lettera", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kakashideidara", + "following": "letuchka", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "malyshew1973", + "following": "leviathan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jumpman", + "following": "levycore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemithelper1", + "following": "lex22", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hyper", + "following": "lexinferno", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "irradiance", + "following": "lexus083", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "klausj", + "following": "leylar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arto", + "following": "leynatural", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "niklasappelquist", + "following": "lfcdragon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "changby", + "following": "lgm-1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nakolochkii", + "following": "liamtkane", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anarchodrew", + "following": "liber", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "painwalker", + "following": "liberalismo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mikeyg1977", + "following": "liberosist", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "voloshchuk", + "following": "libertarianarts", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "madodel", + "following": "libertarismo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yocoins", + "following": "libertas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "serrys", + "following": "libertyisforall", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrbud", + "following": "libertyism", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vkcom", + "following": "libertyminded", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jeffersonian", + "following": "libertyprime", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tctravis", + "following": "libertyrocks", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anon", + "following": "liborty", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chad1775", + "following": "library", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "maxsullivanlive", + "following": "libtrian.outlet", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "timd", + "following": "lichtblick", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "romanvanree", + "following": "lief", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "daoine-sidhe", + "following": "lieweheksie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lucas.wild", + "following": "lifeisawesome", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "recury", + "following": "lifelovesme", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "villainblack", + "following": "lifestyle", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "volunterri", + "following": "lifeworship", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ukrainian", + "following": "lightdefender", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "angryredbarber", + "following": "lightningeyes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "minic", + "following": "lightninggears", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "buran", + "following": "lightsinger", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "getonthetrain", + "following": "lightskin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "michal", + "following": "lightsplasher", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gravelseeker", + "following": "lightstein", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anjoke", + "following": "lihabenicht", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alfar", + "following": "lihua", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "littleboo", + "following": "lil-g", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "accdntlmagician", + "following": "lilac", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "johnnyb", + "following": "lilbit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ridji", + "following": "lilli", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "albestro", + "following": "lillianjones", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "opikelv", + "following": "lillistration", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "entheos", + "following": "lilmisjenn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "boatymcboatface", + "following": "lily-da-vine", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexander255", + "following": "liman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "imassakin", + "following": "limitless", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "michelvec", + "following": "limitlesschris", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "baodog", + "following": "limpoplar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gribgo", + "following": "linda-correia", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oakstone", + "following": "linda-hardesty", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "stevekenny", + "following": "lindab", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tommyp7485", + "following": "lindagittle", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "princesscutexx", + "following": "lindalangerak", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lovenugz", + "following": "lindasteel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "christophersmith", + "following": "lindseylambz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cherish", + "following": "linktype", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "specreman", + "following": "linnie", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nooz", + "following": "linouxis9", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mdoolsky", + "following": "linvictor88", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dgarsan", + "following": "lioliomir", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dryde", + "following": "liondani", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "markgriffith", + "following": "lionelmessi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xpilar", + "following": "lionnnnnnnnn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aiko", + "following": "lionofthedesert", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ameyuri", + "following": "lipshaybiz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sylvie", + "following": "liqdmetal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jelloducky", + "following": "liquidrainbowx", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "krtliv", + "following": "lisa3vol", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rushd", + "following": "lisaegan", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "effectstocause", + "following": "lisafaye11", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jdesalvo", + "following": "lisajohn", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "unclecanon", + "following": "lisamenning", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jnp", + "following": "litali", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pdavid000", + "following": "litecoinplus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fabioferrari", + "following": "litrbooh", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "viebie", + "following": "littenti", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "paulskye", + "following": "littleboo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "imp", + "following": "littleghost", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dtbahoney", + "following": "litvintech", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "coss", + "following": "livefree", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "randr10", + "following": "livefreenow83", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ragini00", + "following": "livetofly", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "martinallien", + "following": "living-freedom", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "timclarke", + "following": "living-man", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "derek.smith", + "following": "livingfree", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "martijnbolt", + "following": "livingtotem", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yosi", + "following": "liz-wolfe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oyot30", + "following": "lizaemilsova", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mdlugopolski", + "following": "lizasoberano", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brandontom", + "following": "lizik", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rosevard", + "following": "lizzie.kasp", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lookinthemirror", + "following": "ljglug", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "the5kyliner", + "following": "lkong87", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tony.digicoinpro", + "following": "llama46", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "palombi-ale", + "following": "llawen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dalinofx", + "following": "llmadrid", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "magebringer", + "following": "lloydy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sarahlohre", + "following": "lmaonade80", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sunnywalker", + "following": "lmar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "marieireland", + "following": "lobstree", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "campbell1978", + "following": "local", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "loperasef", + "following": "localether-com", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jru", + "following": "locke", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xtar", + "following": "locosxelasado", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "adrienis", + "following": "loddy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemy", + "following": "lodockcafe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cactus", + "following": "logan-king", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "loveofprofit", + "following": "loganarchy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "techprezz", + "following": "loganmaster144", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jasstar2012", + "following": "logic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rampantdigitalis", + "following": "logicwins", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lothifa", + "following": "lohomb", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "carbon7dna", + "following": "lokdocandd", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dragon93", + "following": "lolalila20", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "dashakar", + "following": "loly", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "h0r0s", + "following": "lomawertu", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kazumi", + "following": "lomiruuun", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "catlike", + "following": "london2013", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "vojora", + "following": "lonechristianman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "anonymous", + "following": "lonewulfe", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "treek", + "following": "lontong", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wise-brain", + "following": "lookinthemirror", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "greenmanalishi", + "following": "loperasef", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "melaniekon", + "following": "lopitayaio", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "splus", + "following": "loq", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "feedyourbank", + "following": "lordemau", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "elec365", + "following": "lordjaba", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "backetri", + "following": "lordkusa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "elt", + "following": "lordoftruth", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wesleybeckza", + "following": "lordroccodesign", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zizelevak", + "following": "lordvader", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "chrisd", + "following": "lorenza", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "s5044726", + "following": "lorm227", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "perfectsolutions", + "following": "losos", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fleuri", + "following": "lostnuggett", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tausari", + "following": "lothifa", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ankontini", + "following": "louemham", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "captainpicard", + "following": "loum", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gregjeffries", + "following": "lourenc", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wenden", + "following": "love-spirit-nerd", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "desbloke", + "following": "loveangel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "schnabelstefan", + "following": "lovegepl", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cynthiaantigua", + "following": "lovejoy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "laurenh", + "following": "lovelace", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "admiral-nerf-gun", + "following": "lovelylaura", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ihashfury", + "following": "lovenugz", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mrmike3rd7", + "following": "loveofprofit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "arosay", + "following": "lovetosteemit", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "raulfer", + "following": "lovinglorax", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jofn", + "following": "lowrence777", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "smolalit", + "following": "loyhogg", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "worldlytrader", + "following": "loytarika", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thriceblessed", + "following": "lpb8733", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "pleckie", + "following": "lpfaust", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "camille1234", + "following": "lpigott33", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "theturtle", + "following": "lpninja", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mobios", + "following": "lrock", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "worldfamous", + "following": "lrod1992", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alfredfrit", + "following": "lsc9999", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "becomedeath", + "following": "lsd123452", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "zetazgr", + "following": "lsparrish", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lasseehlers", + "following": "lsully311", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "soupernerd", + "following": "ltndd1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fminerten1", + "following": "lucas.wild", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bellafacefx", + "following": "lucasgibson", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "seafood", + "following": "lucaspecina", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "davikhale", + "following": "lucaspowell", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "slavenomore", + "following": "luckyday", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thegrimm", + "following": "luckylogger", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cilibdr", + "following": "ludvigsart", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hereisflaco", + "following": "ludwigliberty", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "folis", + "following": "luigimendi89", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "davehitt", + "following": "luisavitor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "conspiracy-guy", + "following": "luision", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "himalayanguru", + "following": "luisqp66", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "partymeiker", + "following": "luisstone", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jacksteem", + "following": "luisucv34", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "eyass", + "following": "luisulfr", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "adrielnz", + "following": "luiz-marchi", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "survivalguy", + "following": "lukasiewicz365", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "starbuck", + "following": "luke-crowley", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kilopaven", + "following": "luke490", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bespokeleo", + "following": "lukempire", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "beauboeye", + "following": "lukeofkondor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "joemz", + "following": "lukeracine93", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "scramblebot.com", + "following": "lukeskywalker", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nealfox", + "following": "lukestokes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "krabapka", + "following": "lukethompson", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "siver", + "following": "lukewarm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "meteor78", + "following": "lukewearechange", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nicoleta", + "following": "lukewrites", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "gazm", + "following": "lukie257", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "decrypt", + "following": "lukmanreyes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kryuchin", + "following": "lukmarcus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "joshatwal91", + "following": "lulu43", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steffen", + "following": "lulupon", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kaderleha", + "following": "lumbridgecity", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "lordkusa", + "following": "luminarycrush", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "wolfbitzster", + "following": "luminousvisions", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jehova", + "following": "luminutten", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "oliver-janich", + "following": "lunamoonuh", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thelibertryforge", + "following": "lungta", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yocoinnana", + "following": "luxiano-valdez", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mee", + "following": "lvleternity", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bruce1337", + "following": "lyd848me", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "widto", + "following": "lydiacolbert91", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "unchainedio", + "following": "lyj", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "ducage", + "following": "lykkeliten", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "harrym", + "following": "lynchiandream", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nurik", + "following": "lynda-j-leonard", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fishappear", + "following": "lyndieontheroad", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kamvreto", + "following": "lysander", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "globe", + "following": "lysandervenible", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "andrew5775", + "following": "lyubovbar", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tojaran", + "following": "lyubovnam", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "twoshots", + "following": "m0n0lithic", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jamthedude", + "following": "m0se", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "subliminally", + "following": "m1ch4ls", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sminer89", + "following": "ma3", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "hfh777", + "following": "maarnio", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "profit-chaser", + "following": "mabiturm", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tastemaker", + "following": "mac-o", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "brownsgreens", + "following": "macaronikazoo", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "whitefist", + "following": "macartem", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "balz", + "following": "macetas", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sendico", + "following": "maceytomlin", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "snorkymn", + "following": "machinelearning", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "yggsius", + "following": "machinery", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "tasteless-funny", + "following": "macintyre", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "fuksanahgi", + "following": "macksby", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "denman", + "following": "macrochip", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "rexwind", + "following": "macsto", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "avielhitchens", + "following": "mada", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "judyd100", + "following": "madalieninvader", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "aksteve907farm", + "following": "madbitcoins", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "cyjambo", + "following": "madchef1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "moneykicks", + "following": "madcubano1", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "diego-dumalo", + "following": "maddoge", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "justbc", + "following": "madhatting", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "platonicsironic", + "following": "madhayday", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nessacute", + "following": "madillorama", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "leesunmoo", + "following": "madmax", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nataxe", + "following": "madmovond", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "seekingliberty", + "following": "madnation", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mikeoverstreet", + "following": "madodel", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "amdpower", + "following": "madoff", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jazzka", + "following": "mads0808", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "faberium", + "following": "madsam58", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bethemtay", + "following": "madschemes", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "recursive61", + "following": "madwallace", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "kids", + "following": "maestro", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xyrzbest", + "following": "mafgwaf12", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "transpotime21bus", + "following": "mafia", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "nameena", + "following": "magdalen", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "bofym", + "following": "magdalena", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "laoyao", + "following": "magdalenaruth", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "jojokazahn", + "following": "mageant", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "thegaltmines", + "following": "magebringer", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "laurelmaiatroy", + "following": "magicmodus", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "showmethecoinz", + "following": "magicmonk", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "steemreporter", + "following": "magnaniman", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "millennialhue", + "following": "magor", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "xav", + "following": "magore", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "trifelo", + "following": "magpieguy", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "financialfreedom", + "following": "magralex", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "mahekg", + "following": "magz8716", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "alexscovnoart", + "following": "mahal", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sheenkid", + "following": "mahekg", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "sven.hennes", + "following": "mahikaru", "what": [ "blog" ] }, { "follower": "skyefox", - "following": "niffiner", + "following": "mahilu", "what": [ "blog" ] diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/pre_appbase.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/pre_appbase.pat.json index 948451303..bd3fbc32e 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/pre_appbase.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/pre_appbase.pat.json @@ -1,42 +1,7 @@ [ { "follower": "gtg", - "following": "celebr1ty", - "what": [ - "blog" - ] - }, - { - "follower": "gtg", - "following": "phoenixmaid", - "what": [ - "blog" - ] - }, - { - "follower": "gtg", - "following": "gavvet", - "what": [ - "blog" - ] - }, - { - "follower": "gtg", - "following": "bravenewcoin", - "what": [ - "blog" - ] - }, - { - "follower": "gtg", - "following": "grittenald", - "what": [ - "blog" - ] - }, - { - "follower": "gtg", - "following": "blocktrades", + "following": "thebluepanda", "what": [ "blog" ] diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/proskynneo.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/proskynneo.pat.json index 2e61cccdd..db284299c 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/proskynneo.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/proskynneo.pat.json @@ -1,28 +1,28 @@ [ { "follower": "proskynneo", - "following": "webosfritos", + "following": "charlieshrem", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "peerplays", + "following": "dan", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "charlieshrem", + "following": "dantheman", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "tlc", + "following": "dragonslayer109", "what": [ "blog" ] @@ -36,35 +36,35 @@ }, { "follower": "proskynneo", - "following": "theoretical", + "following": "katecloud", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "steemitblog", + "following": "ned", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "ned", + "following": "peerplays", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "dan", + "following": "steemitblog", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "katecloud", + "following": "stellabelle", "what": [ "blog" ] diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/the_same_account_start.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/the_same_account_start.pat.json index fe51488c7..22b70d386 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/the_same_account_start.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/blog/the_same_account_start.pat.json @@ -1 +1,23 @@ -[] +[ + { + "follower": "robrigo", + "following": "roadscape", + "what": [ + "blog" + ] + }, + { + "follower": "roelandp", + "following": "roadscape", + "what": [ + "blog" + ] + }, + { + "follower": "romanskv", + "following": "roadscape", + "what": [ + "blog" + ] + } +] diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/bing.com.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/bing.com.pat.json index f61cbe2a5..ff2268b49 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/bing.com.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/bing.com.pat.json @@ -1,70 +1,70 @@ [ { "follower": "bing.com", - "following": "cheetah79", + "following": "cheetah", "what": [ "ignore" ] }, { "follower": "bing.com", - "following": "cheetah93", + "following": "cheetah08", "what": [ "ignore" ] }, { "follower": "bing.com", - "following": "cheetah95", + "following": "cheetah15", "what": [ "ignore" ] }, { "follower": "bing.com", - "following": "cheetah46", + "following": "cheetah16", "what": [ "ignore" ] }, { "follower": "bing.com", - "following": "cheetah94", + "following": "cheetah17", "what": [ "ignore" ] }, { "follower": "bing.com", - "following": "cheetah15", + "following": "cheetah18", "what": [ "ignore" ] }, { "follower": "bing.com", - "following": "cheetah65", + "following": "cheetah20", "what": [ "ignore" ] }, { "follower": "bing.com", - "following": "cheetah70", + "following": "cheetah22", "what": [ "ignore" ] }, { "follower": "bing.com", - "following": "cheetah68", + "following": "cheetah23", "what": [ "ignore" ] }, { "follower": "bing.com", - "following": "cheetah17", + "following": "cheetah46", "what": [ "ignore" ] diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/complete_result_set.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/complete_result_set.pat.json index f1308357c..9dba6311b 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/complete_result_set.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/complete_result_set.pat.json @@ -1,7 +1,7 @@ [ { "follower": "shadowspub", - "following": "fintech-jesus", + "following": "foxkoit", "what": [ "ignore" ] diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/complete_result_set.tavern.yaml b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/complete_result_set.tavern.yaml index acb3341fb..210cb5e29 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/complete_result_set.tavern.yaml +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/complete_result_set.tavern.yaml @@ -19,7 +19,7 @@ jsonrpc: "2.0" id: 1 method: "condenser_api.get_following" - params: {"account":"shadowspub","start":"foxkoit","follow_type":"ignore","limit":2} + params: {"account":"shadowspub","start":"fintech-jesus","follow_type":"ignore","limit":2} response: status_code: 200 verify_response_with: diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/defaults.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/defaults.pat.json index 94fcfe7a6..2162ad095 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/defaults.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/defaults.pat.json @@ -1,1547 +1,1547 @@ [ { "follower": "morganpearl", - "following": "alex2016", + "following": "adamt", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "crazymumzysa", + "following": "adm", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fluffymelkii", + "following": "afsoon", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "litrbooh", + "following": "aidar88", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "stef", + "following": "aleksandrm", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ladypenelope1", + "following": "alex2016", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "blogmaster", + "following": "alktoni", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "myfirst", + "following": "allmonitors", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "takethecannoli", + "following": "always1success", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "vinsanity50", + "following": "anonymint", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mrgrey", + "following": "apollojae", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bridgetbunchy", + "following": "applecrisp", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "moneymaker", + "following": "arcange", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "siren", + "following": "arnoldwish", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "xiaokongcom", + "following": "artist1989", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "future24", + "following": "ats-david", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rainman", + "following": "beanz", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cryptogee", + "following": "bitland", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ats-david", + "following": "blakemiles84", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "camilla", + "following": "bleepcoin", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "brunopro", + "following": "blockchainblonde", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "sweetsssj", + "following": "blogmaster", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "letc", + "following": "blow", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ikigai", + "following": "bluestar", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "dr2073", + "following": "bmcv001", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "blakemiles84", + "following": "bobo012", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "soniaji", + "following": "bonapetit", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "soroksem", + "following": "brave31", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gavvet", + "following": "brazine", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "lee5", + "following": "bridgetbunchy", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "beanz", + "following": "broadperspective", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jessica-miller", + "following": "brunopro", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "dmilash", + "following": "bubblefantasy", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bonapetit", + "following": "bullionstackers", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gracewriter", + "following": "calaber24p", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "dajohns1420", + "following": "camilla", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "magicmonk", + "following": "charlieshrem", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "shla-rafia", + "following": "chitty", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ozmaster", + "following": "chrisadventures", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "smolalit", + "following": "christiansenn", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "aidar88", + "following": "chuckleberry", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "vermillion666", + "following": "ciellonelle12", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "sirwinchester", + "following": "cloud1", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cristi", + "following": "condra", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "margot", + "following": "craig-grant", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fat-like-buddha", + "following": "crazymumzysa", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gargon", + "following": "crezyliza", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "krnel", + "following": "cripto", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "peterz", + "following": "cristi", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "vippero", + "following": "cryptobro", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "anonymint", + "following": "cryptogee", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ericvancewalton", + "following": "cryptos", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "teamsteem", + "following": "cryptosi", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ochnudemus", + "following": "dajohns1420", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "sisters", + "following": "daxon", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "r4fken", + "following": "daycrypter", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jlwk0lb", + "following": "demeterz01", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "artist1989", + "following": "desocrates", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "skum", + "following": "digitalhound", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "spiz0r", + "following": "dmilash", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "movievertigo", + "following": "dollarvigilante", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "kabei", + "following": "doze49", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "marius19", + "following": "dr2073", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cripto", + "following": "elena000", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "justinschwalm", + "following": "elyaque", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ptmikesteem", + "following": "epiphany", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "elyaque", + "following": "ericvancewalton", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "calaber24p", + "following": "falkvinge", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "blow", + "following": "fat-like-buddha", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cryptos", + "following": "feminism", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mar1978co", + "following": "fingolfin", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "nrpblack", + "following": "fluffy", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "keralv", + "following": "fluffymelkii", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "knozaki2015", + "following": "freebornangel", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "steembeast", + "following": "future24", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "charlieshrem", + "following": "fyrstikken", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "demeterz01", + "following": "galamirissa", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "theyam", + "following": "galim", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gnoynui25", + "following": "gamerholic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "shemthepenman", + "following": "gargon", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "kaylinart", + "following": "garri74", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "taoteh1221", + "following": "gavvet", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "chitty", + "following": "gnoynui25", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "m0se", + "following": "goldstein", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "stepa", + "following": "gracewriter", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "epiphany", + "following": "halo", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "alktoni", + "following": "hilarski", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "keithwillshine", + "following": "hiokolop", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jeremyfromwi", + "following": "ikigai", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "galim", + "following": "indigowaltz", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "kafkanarchy84", + "following": "ines-f", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "brazine", + "following": "infovore", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bobo012", + "following": "inkha", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bleepcoin", + "following": "instructor2121", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cryptosi", + "following": "ivanba12", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "malxdrakon", + "following": "jamesc", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bitland", + "following": "jasmine-l", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "persik", + "following": "jaxteller", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "markrmorrisjr", + "following": "jenniferskyler", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "crezyliza", + "following": "jeremyfromwi", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "steempower", + "following": "jessica-miller", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "thetasteemit", + "following": "jjchic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "infovore", + "following": "jlwk0lb", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "trisnawati", + "following": "joelbow", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bubblefantasy", + "following": "jonathanyoung", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "chrisadventures", + "following": "jtrdertas", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "merlinscat", + "following": "justinschwalm", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "broadperspective", + "following": "kabei", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "daxon", + "following": "kafkanarchy84", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "allmonitors", + "following": "kaylinart", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "zzzzzzzzz", + "following": "keithwillshine", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "themonetaryfew", + "following": "keralv", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "lostnuggett", + "following": "kingdead", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "kingdead", + "following": "knozaki2015", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "hiokolop", + "following": "krnel", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "doze49", + "following": "ladypenelope1", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mikebartolo", + "following": "lee5", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "levycore", + "following": "letc", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "zodiac", + "following": "levycore", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "halo", + "following": "liberosist", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rwgunderson", + "following": "lifeisawesome", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cloud1", + "following": "litrbooh", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rich77", + "following": "logic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jtrdertas", + "following": "lostnuggett", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "lifeisawesome", + "following": "m0se", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "team", + "following": "magicmonk", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "applecrisp", + "following": "makov", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "upsideofstress", + "following": "malaiandrueth", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jenniferskyler", + "following": "malxdrakon", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "arcange", + "following": "mammasitta", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "roelandp", + "following": "manthostsakirid", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "blockchainblonde", + "following": "mar1978co", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "makov", + "following": "margot", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "joelbow", + "following": "mariadianaelaine", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "digitalhound", + "following": "marius19", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "afsoon", + "following": "markrmorrisjr", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "goldstein", + "following": "matrix", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ines-f", + "following": "matthewtiii", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "reneenouveau", + "following": "merlinscat", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "condra", + "following": "metafzx", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "adm", + "following": "mikebartolo", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "proctologic", + "following": "moneymaker", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fyrstikken", + "following": "movievertigo", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fingolfin", + "following": "mrbastillio", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "dollarvigilante", + "following": "mrgrey", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "xian22", + "following": "mrlogic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "cryptobro", + "following": "msgivings", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "runaway-psyche", + "following": "myfirst", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "brave31", + "following": "mynameisricky", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mammasitta", + "following": "nate-atkins", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "logic", + "following": "nrpblack", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "thegoldencookie", + "following": "nxtblg", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "manthostsakirid", + "following": "ochnudemus", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mariadianaelaine", + "following": "omarb", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "malaiandrueth", + "following": "ozmaster", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ciellonelle12", + "following": "penguinpablo", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "roy2016", + "following": "persianqueen", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "sorath", + "following": "persik", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "gamerholic", + "following": "perwest", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jjchic", + "following": "peterz", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jaxteller", + "following": "pino", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "galamirissa", + "following": "proctologic", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "shenanigator", + "following": "ptmikesteem", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "elena000", + "following": "r4fken", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "venkat", + "following": "rainman", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "metafzx", + "following": "reneenouveau", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "msgivings", + "following": "rich77", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jonathanyoung", + "following": "robok", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "the-future", + "following": "roelandp", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "falkvinge", + "following": "rossenpavlov", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "inkha", + "following": "roy2016", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "daycrypter", + "following": "runaway-psyche", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jamesc", + "following": "rwgunderson", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "craig-grant", + "following": "rxhector", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "victoria2002", + "following": "secpoint", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "stephen.king989", + "following": "shadowspub", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mrlogic", + "following": "shemthepenman", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rxhector", + "following": "shenanigator", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "indigowaltz", + "following": "shla-rafia", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "hilarski", + "following": "siren", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "rossenpavlov", + "following": "sirwinchester", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "liberosist", + "following": "sisters", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "omarb", + "following": "skum", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bmcv001", + "following": "skyefox", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bullionstackers", + "following": "smolalit", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "nxtblg", + "following": "soniaji", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "arnoldwish", + "following": "sorath", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "aleksandrm", + "following": "soroksem", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "themanualbot", + "following": "spiz0r", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "feminism", + "following": "steembeast", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "jasmine-l", + "following": "steemcleaners", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "desocrates", + "following": "steemlinks", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "steemlinks", + "following": "steempower", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "garri74", + "following": "stef", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "bluestar", + "following": "stepa", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "freebornangel", + "following": "stephen.king989", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "perwest", + "following": "sweetsssj", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "christiansenn", + "following": "takethecannoli", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "skyefox", + "following": "taoteh1221", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mrbastillio", + "following": "team", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "persianqueen", + "following": "teamsteem", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "shadowspub", + "following": "the-future", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "fluffy", + "following": "theanubisrider", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "tomdking", + "following": "thegoldencookie", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "penguinpablo", + "following": "themanualbot", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ydm6669", + "following": "themonetaryfew", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "adamt", + "following": "thetasteemit", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "theanubisrider", + "following": "theyam", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "chuckleberry", + "following": "tomdking", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "matrix", + "following": "trisnawati", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "robok", + "following": "upsideofstress", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "always1success", + "following": "venkat", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "mynameisricky", + "following": "vermillion666", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "pino", + "following": "victoria2002", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "ivanba12", + "following": "vinsanity50", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "matthewtiii", + "following": "vippero", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "instructor2121", + "following": "xian22", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "nate-atkins", + "following": "xiaokongcom", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "apollojae", + "following": "ydm6669", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "secpoint", + "following": "zodiac", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "steemcleaners", + "following": "zzzzzzzzz", "what": [ "ignore" ] diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/paginated.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/paginated.pat.json index 333cf35ee..e3942a2af 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/paginated.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_following/ignore/paginated.pat.json @@ -1,21 +1,21 @@ [ { "follower": "morganpearl", - "following": "mar1978co", + "following": "cryptosi", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "nrpblack", + "following": "dajohns1420", "what": [ "ignore" ] }, { "follower": "morganpearl", - "following": "keralv", + "following": "daxon", "what": [ "ignore" ] diff --git a/tests/api_tests/hivemind/tavern/follow_api_patterns/get_followers/blog.pat.json b/tests/api_tests/hivemind/tavern/follow_api_patterns/get_followers/blog.pat.json index 64d1d7af9..e6bd345a6 100644 --- a/tests/api_tests/hivemind/tavern/follow_api_patterns/get_followers/blog.pat.json +++ b/tests/api_tests/hivemind/tavern/follow_api_patterns/get_followers/blog.pat.json @@ -1,69 +1,69 @@ [ { - "follower": "therajmahal", + "follower": "aaseb", "following": "steemit", "what": [ "blog" ] }, { - "follower": "mgibson", + "follower": "achim86", "following": "steemit", "what": [ "blog" ] }, { - "follower": "good-karma", + "follower": "afsane", "following": "steemit", "what": [ "blog" ] }, { - "follower": "blockcodes", + "follower": "alexoz", "following": "steemit", "what": [ "blog" ] }, { - "follower": "pjheinz", + "follower": "alitas", "following": "steemit", "what": [ "blog" ] }, { - "follower": "sergey44", + "follower": "always1success", "following": "steemit", "what": [ "blog" ] }, { - "follower": "afsane", + "follower": "alwayzgame", "following": "steemit", "what": [ "blog" ] }, { - "follower": "pawel-krawczyk", + "follower": "anamikasjain", "following": "steemit", "what": [ "blog" ] }, { - "follower": "buckland", + "follower": "anomaly", "following": "steemit", "what": [ "blog" ] }, { - "follower": "johnson.lukose", + "follower": "anwar78", "following": "steemit", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/follow_api_patterns/get_following/blog.pat.json b/tests/api_tests/hivemind/tavern/follow_api_patterns/get_following/blog.pat.json index 2e61cccdd..db284299c 100644 --- a/tests/api_tests/hivemind/tavern/follow_api_patterns/get_following/blog.pat.json +++ b/tests/api_tests/hivemind/tavern/follow_api_patterns/get_following/blog.pat.json @@ -1,28 +1,28 @@ [ { "follower": "proskynneo", - "following": "webosfritos", + "following": "charlieshrem", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "peerplays", + "following": "dan", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "charlieshrem", + "following": "dantheman", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "tlc", + "following": "dragonslayer109", "what": [ "blog" ] @@ -36,35 +36,35 @@ }, { "follower": "proskynneo", - "following": "theoretical", + "following": "katecloud", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "steemitblog", + "following": "ned", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "ned", + "following": "peerplays", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "dan", + "following": "steemitblog", "what": [ "blog" ] }, { "follower": "proskynneo", - "following": "katecloud", + "following": "stellabelle", "what": [ "blog" ] diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester1.pat.json index 467340c36..755bd718d 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester1.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester1.pat.json @@ -1,13 +1,13 @@ [ { - "follower": "tester5", + "follower": "tester4", "following": "tester1", "what": [ "blog" ] }, { - "follower": "tester4", + "follower": "tester5", "following": "tester1", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester2.pat.json index e9cde2ecf..bb26b3058 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester2.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester2.pat.json @@ -1,13 +1,13 @@ [ { - "follower": "tester5", + "follower": "tester1", "following": "tester2", "what": [ "blog" ] }, { - "follower": "tester1", + "follower": "tester5", "following": "tester2", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester3.pat.json index 0f54ea845..5b8d1ddc9 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester3.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester3.pat.json @@ -1,13 +1,13 @@ [ { - "follower": "tester5", + "follower": "tester2", "following": "tester3", "what": [ "blog" ] }, { - "follower": "tester2", + "follower": "tester5", "following": "tester3", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester4.pat.json index 09f7cdf04..eb2cdf89e 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester4.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/tester4.pat.json @@ -1,13 +1,13 @@ [ { - "follower": "tester3", + "follower": "tester2", "following": "tester4", "what": [ "blog" ] }, { - "follower": "tester2", + "follower": "tester3", "following": "tester4", "what": [ "blog" diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/tester2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/tester2.pat.json index e7fffbb63..0f907a65b 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_following/tester2.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/tester2.pat.json @@ -1,14 +1,14 @@ [ { "follower": "tester2", - "following": "tester4", + "following": "tester3", "what": [ "blog" ] }, { "follower": "tester2", - "following": "tester3", + "following": "tester4", "what": [ "blog" ] diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/tester5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/tester5.pat.json index b5f1390de..be6d9916d 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_following/tester5.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/tester5.pat.json @@ -1,7 +1,7 @@ [ { "follower": "tester5", - "following": "tester3", + "following": "tester1", "what": [ "blog" ] @@ -15,7 +15,7 @@ }, { "follower": "tester5", - "following": "tester1", + "following": "tester3", "what": [ "blog" ] -- GitLab From 977447e72c53a718e83e260b6e85e7ea59355a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 29 Jan 2025 14:40:20 +0100 Subject: [PATCH 35/83] Don't use hive_rowid in hivemind_app.hive_raw_notifications_as_view --- hive/db/sql_scripts/notifications_view.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index 31835ac3d..5c75d759e 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -118,7 +118,7 @@ CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view WHERE m.follower = hpv.parent_author_id AND m.following = hpv.author_id) UNION ALL SELECT f.block_num, - hivemind_app.notification_id(f.block_num, 15, f.hive_rowid::integer) AS id, + hivemind_app.notification_id(f.block_num, 15, (row_number() OVER ())::INTEGER) AS id, 0 AS post_id, 15 AS type_id, (select hb.created_at from hivemind_app.blocks_view hb where hb.num = (f.block_num - 1)) as created_at, -- use time of previous block to match head_block_time behavior at given block -- GitLab From 4765d20e539db6a21c4781e6aa9877ded153e589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 29 Jan 2025 15:31:14 +0100 Subject: [PATCH 36/83] Convert hivemind_app.update_follow_count to new tables --- hive/db/sql_scripts/update_follow_count.sql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hive/db/sql_scripts/update_follow_count.sql b/hive/db/sql_scripts/update_follow_count.sql index 1fc577c1e..ebcb578f9 100644 --- a/hive/db/sql_scripts/update_follow_count.sql +++ b/hive/db/sql_scripts/update_follow_count.sql @@ -15,14 +15,14 @@ SET FROM ( WITH data_cfe(user_id) AS ( - SELECT DISTINCT following FROM hivemind_app.hive_follows WHERE block_num BETWEEN _first_block AND _last_block - UNION - SELECT DISTINCT follower FROM hivemind_app.hive_follows WHERE block_num BETWEEN _first_block AND _last_block + SELECT DISTINCT following FROM hivemind_app.follows WHERE block_num BETWEEN _first_block AND _last_block + UNION + SELECT DISTINCT follower FROM hivemind_app.follows WHERE block_num BETWEEN _first_block AND _last_block ) SELECT data_cfe.user_id AS user_id, - (SELECT COUNT(1) FROM hivemind_app.hive_follows hf1 WHERE hf1.following = data_cfe.user_id AND hf1.state = 1) AS followers_count, - (SELECT COUNT(1) FROM hivemind_app.hive_follows hf2 WHERE hf2.follower = data_cfe.user_id AND hf2.state = 1) AS following_count + (SELECT COUNT(1) FROM hivemind_app.follows AS hf1 WHERE hf1.following = data_cfe.user_id) AS followers_count, + (SELECT COUNT(1) FROM hivemind_app.follows AS hf2 WHERE hf2.follower = data_cfe.user_id) AS following_count FROM data_cfe ) AS data_set(user_id, followers_count, following_count) @@ -30,4 +30,4 @@ WHERE ha.id = data_set.user_id; END $BODY$ -; \ No newline at end of file +; -- GitLab From d0c5e558fedc6505bff10f7abdb64a609a736d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 29 Jan 2025 15:59:17 +0100 Subject: [PATCH 37/83] Convert hivemind_app.muted_accounts_by_id_view to new tables --- .../hive_muted_accounts_by_id_view.sql | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/hive/db/sql_scripts/hive_muted_accounts_by_id_view.sql b/hive/db/sql_scripts/hive_muted_accounts_by_id_view.sql index 5a1611e4d..0c72e9ebd 100644 --- a/hive/db/sql_scripts/hive_muted_accounts_by_id_view.sql +++ b/hive/db/sql_scripts/hive_muted_accounts_by_id_view.sql @@ -1,12 +1,12 @@ DROP VIEW IF EXISTS hivemind_app.muted_accounts_by_id_view CASCADE; CREATE OR REPLACE VIEW hivemind_app.muted_accounts_by_id_view AS - SELECT hive_follows.follower AS observer_id, - hive_follows.following AS muted_id - FROM hivemind_app.hive_follows - WHERE hive_follows.state = 2 +SELECT + follower AS observer_id, + following AS muted_id +FROM hivemind_app.muted UNION - SELECT hive_follows_direct.follower AS observer_id, - hive_follows_indirect.following AS muted_id - FROM hivemind_app.hive_follows hive_follows_direct - JOIN hivemind_app.hive_follows hive_follows_indirect ON hive_follows_direct.following = hive_follows_indirect.follower - WHERE hive_follows_direct.follow_muted AND hive_follows_indirect.state = 2; +SELECT + muted_direct.follower AS observer_id, + muted_indirect.following AS muted_id +FROM hivemind_app.follow_muted AS muted_direct +JOIN hivemind_app.muted AS muted_indirect ON muted_direct.following = muted_indirect.follower; -- GitLab From 21ec02d4cc8c886f16c2722bccb99ae713e88b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 29 Jan 2025 16:07:02 +0100 Subject: [PATCH 38/83] Remove indices on hive_follows --- .../upgrade/upgrade_runtime_migration.sql | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/hive/db/sql_scripts/upgrade/upgrade_runtime_migration.sql b/hive/db/sql_scripts/upgrade/upgrade_runtime_migration.sql index c3db9c2ff..dfdaab8d5 100644 --- a/hive/db/sql_scripts/upgrade/upgrade_runtime_migration.sql +++ b/hive/db/sql_scripts/upgrade/upgrade_runtime_migration.sql @@ -38,33 +38,6 @@ END $$ ; ---- https://gitlab.syncad.com/hive/hivemind/-/merge_requests/686/ - -CREATE INDEX IF NOT EXISTS hive_follows_follower_where_blacklisted_idx - ON hivemind_app.hive_follows USING btree - (follower ASC NULLS LAST) - TABLESPACE haf_tablespace - WHERE blacklisted; - -CREATE INDEX IF NOT EXISTS hive_follows_follower_where_follow_blacklists_idx - ON hivemind_app.hive_follows USING btree - (follower ASC NULLS LAST) - TABLESPACE haf_tablespace - WHERE follow_blacklists; - -CREATE INDEX IF NOT EXISTS hive_follows_follower_where_follow_muted_idx - ON hivemind_app.hive_follows USING btree - (follower ASC NULLS LAST) - TABLESPACE haf_tablespace - WHERE follow_muted; - -CREATE INDEX IF NOT EXISTS hive_follows_following_state_id_idx - ON hivemind_app.hive_follows USING btree - (following ASC NULLS LAST, state ASC NULLS LAST, id ASC NULLS LAST) - TABLESPACE haf_tablespace; - -DROP INDEX IF EXISTS hivemind_app.hive_follows_following_state_idx; - --- Must be at the end TRUNCATE TABLE hivemind_app.hive_db_data_migration; -- GitLab From 9ec74b82d94bec4316a4ad56204eaa02d538434f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 29 Jan 2025 17:25:41 +0100 Subject: [PATCH 39/83] Remove old follow indexer --- hive/db/schema.py | 1 - hive/db/sql_scripts/follows.sql | 107 ---------- hive/indexer/blocks.py | 4 - hive/indexer/custom_op.py | 2 - hive/indexer/follow.py | 366 -------------------------------- 5 files changed, 480 deletions(-) delete mode 100644 hive/db/sql_scripts/follows.sql delete mode 100644 hive/indexer/follow.py diff --git a/hive/db/schema.py b/hive/db/schema.py index 3ca25ea96..8d162f66e 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -623,7 +623,6 @@ def setup_runtime_code(db): "update_hive_post_root_id.sql", "update_follow_count.sql", "delete_reblog_feed_cache.sql", - "follows.sql", "is_superuser.sql", "update_hive_blocks_consistency_flag.sql", "postgrest/home.sql", diff --git a/hive/db/sql_scripts/follows.sql b/hive/db/sql_scripts/follows.sql deleted file mode 100644 index 02602ceff..000000000 --- a/hive/db/sql_scripts/follows.sql +++ /dev/null @@ -1,107 +0,0 @@ -DROP FUNCTION IF EXISTS hivemind_app.follow_reset_blacklist(character varying, integer) -; -CREATE OR REPLACE FUNCTION hivemind_app.follow_reset_blacklist(in _follower hivemind_app.hive_accounts.name%TYPE, in _block_num hivemind_app.hive_follows.block_num%TYPE) -RETURNS VOID -LANGUAGE plpgsql -AS -$function$ -DECLARE - __account_id INT; -BEGIN - __account_id = hivemind_app.find_account_id( _follower, False ); - UPDATE hivemind_app.hive_follows hf -- follow_reset_blacklist - SET blacklisted = false, block_num = _block_num - WHERE hf.follower = __account_id AND hf.blacklisted; -END -$function$ -; - -DROP FUNCTION IF EXISTS hivemind_app.follow_reset_following_list(character varying, integer) -; -CREATE OR REPLACE FUNCTION hivemind_app.follow_reset_following_list(in _follower hivemind_app.hive_accounts.name%TYPE, in _block_num hivemind_app.hive_follows.block_num%TYPE) -RETURNS VOID -LANGUAGE plpgsql -AS -$function$ -DECLARE - __account_id INT; -BEGIN - __account_id = hivemind_app.find_account_id( _follower, False ); - UPDATE hivemind_app.hive_follows hf -- follow_reset_following_list - SET state = 0, block_num = _block_num - WHERE hf.follower = __account_id AND hf.state = 1; -END -$function$ -; - -DROP FUNCTION IF EXISTS hivemind_app.follow_reset_muted_list(character varying, integer) -; -CREATE OR REPLACE FUNCTION hivemind_app.follow_reset_muted_list(in _follower hivemind_app.hive_accounts.name%TYPE, in _block_num hivemind_app.hive_follows.block_num%TYPE) -RETURNS VOID -LANGUAGE plpgsql -AS -$function$ -DECLARE - __account_id INT; -BEGIN - __account_id = hivemind_app.find_account_id( _follower, False ); - UPDATE hivemind_app.hive_follows hf -- follow_reset_muted_list - SET state = 0, block_num = _block_num - WHERE hf.follower = __account_id AND hf.state = 2; -END -$function$ -; - -DROP FUNCTION IF EXISTS hivemind_app.follow_reset_follow_blacklist(character varying, integer) -; -CREATE OR REPLACE FUNCTION hivemind_app.follow_reset_follow_blacklist(in _follower hivemind_app.hive_accounts.name%TYPE, in _block_num hivemind_app.hive_follows.block_num%TYPE) -RETURNS VOID -LANGUAGE plpgsql -AS -$function$ -DECLARE - __account_id INT; -BEGIN - __account_id = hivemind_app.find_account_id( _follower, False ); - UPDATE hivemind_app.hive_follows hf -- follow_reset_follow_blacklist - SET follow_blacklists = false, block_num = _block_num - WHERE hf.follower = __account_id AND hf.follow_blacklists; -END -$function$ -; - -DROP FUNCTION IF EXISTS hivemind_app.follow_reset_follow_muted_list(character varying, integer) -; -CREATE OR REPLACE FUNCTION hivemind_app.follow_reset_follow_muted_list(in _follower hivemind_app.hive_accounts.name%TYPE, in _block_num hivemind_app.hive_follows.block_num%TYPE) -RETURNS VOID -LANGUAGE plpgsql -AS -$function$ -DECLARE - __account_id INT; -BEGIN - __account_id = hivemind_app.find_account_id( _follower, False ); - UPDATE hivemind_app.hive_follows hf -- follow_reset_follow_muted_list - SET follow_muted = false, block_num = _block_num - WHERE hf.follower = __account_id AND hf.follow_muted; -END -$function$ -; - -DROP FUNCTION IF EXISTS hivemind_app.follow_reset_all_lists(character varying, integer) -; -CREATE OR REPLACE FUNCTION hivemind_app.follow_reset_all_lists(in _follower hivemind_app.hive_accounts.name%TYPE, in _block_num hivemind_app.hive_follows.block_num%TYPE) -RETURNS VOID -LANGUAGE plpgsql -AS -$function$ -DECLARE - __account_id INT; -BEGIN - __account_id = hivemind_app.find_account_id( _follower, False ); - UPDATE hivemind_app.hive_follows hf -- follow_reset_all_lists - SET blacklisted = false, follow_blacklists = false, follow_muted = false, state = 0, block_num = _block_num - WHERE hf.follower = __account_id; -END -$function$ -; diff --git a/hive/indexer/blocks.py b/hive/indexer/blocks.py index edcb815fa..b572e475e 100644 --- a/hive/indexer/blocks.py +++ b/hive/indexer/blocks.py @@ -15,7 +15,6 @@ from hive.indexer.hive_db.massive_blocks_data_provider import MassiveBlocksDataP from hive.indexer.accounts import Accounts from hive.indexer.block import Block, Operation, OperationType, Transaction, VirtualOperationType from hive.indexer.custom_op import CustomOp -from hive.indexer.follow import Follow from hive.indexer.new_follow import NewFollow from hive.indexer.hive_db.block import BlockHiveDb from hive.indexer.notify import Notify @@ -54,7 +53,6 @@ class Blocks: ('Posts', Posts.flush, Posts), ('PostDataCache', PostDataCache.flush, PostDataCache), ('Votes', Votes.flush, Votes), - ('Follow', Follow.flush, Follow), ('NewFollow', NewFollow.flush, NewFollow), ('Reblog', Reblog.flush, Reblog), ('Notify', Notify.flush, Notify), @@ -81,7 +79,6 @@ class Blocks: PostDataCache.setup_own_db_access(shared_db_adapter, "PostDataCache") Votes.setup_own_db_access(shared_db_adapter, "Votes") - Follow.setup_own_db_access(shared_db_adapter, "Follow") NewFollow.setup_own_db_access(shared_db_adapter, "NewFollow") Posts.setup_own_db_access(shared_db_adapter, "Posts") Reblog.setup_own_db_access(shared_db_adapter, "Reblog") @@ -95,7 +92,6 @@ class Blocks: PostDataCache.close_own_db_access() Votes.close_own_db_access() - Follow.close_own_db_access() NewFollow.close_own_db_access() Posts.close_own_db_access() Reblog.close_own_db_access() diff --git a/hive/indexer/custom_op.py b/hive/indexer/custom_op.py index 2e6c99ff5..ac1363512 100644 --- a/hive/indexer/custom_op.py +++ b/hive/indexer/custom_op.py @@ -6,7 +6,6 @@ from funcy.seqs import first, second from hive.db.adapter import Db from hive.indexer.community import Community, process_json_community_op -from hive.indexer.follow import Follow from hive.indexer.notify import Notify from hive.indexer.reblog import Reblog from hive.utils.json import valid_command, valid_date, valid_keys, valid_op_json @@ -112,7 +111,6 @@ class CustomOp: cmd, op_json = op_json # ['follow', {data...}] if cmd == 'follow': - Follow.follow_op(account, op_json, block_date, block_num) NewFollow.process_new_follow_op(account, op_json, block_num) elif cmd == 'reblog': Reblog.reblog_op(account, op_json, block_date, block_num) diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py deleted file mode 100644 index 47ac03343..000000000 --- a/hive/indexer/follow.py +++ /dev/null @@ -1,366 +0,0 @@ -"""Handles follow operations.""" - -import enum -import logging - -from funcy.seqs import first - -from hive.conf import SCHEMA_NAME -from hive.indexer.accounts import Accounts -from hive.indexer.db_adapter_holder import DbAdapterHolder -from hive.utils.normalize import escape_characters - -log = logging.getLogger(__name__) - - -class Action(enum.IntEnum): - Nothing = 0 # cancel existing Blog/Ignore - Blog = 1 # follow - Ignore = 2 # mute - Blacklist = 3 - Follow_blacklist = 4 - Unblacklist = 5 # cancel existing Blacklist - Unfollow_blacklist = 6 # cancel existing Follow_blacklist - Follow_muted = 7 - Unfollow_muted = 8 # cancel existing Follow_muted - Reset_blacklist = 9 # cancel all existing records of Blacklist type - Reset_following_list = 10 # cancel all existing records of Blog type - Reset_muted_list = 11 # cancel all existing records of Ignore type - Reset_follow_blacklist = 12 # cancel all existing records of Follow_blacklist type - Reset_follow_muted_list = 13 # cancel all existing records of Follow_muted type - Reset_all_lists = 14 # cancel all existing records of ??? types - - -class Follow(DbAdapterHolder): - """Handles processing of incoming follow ups and flushing to db.""" - - follow_items_to_flush = dict() - list_resets_to_flush = [] - - idx = 0 - - @classmethod - def _reset_blacklist(cls, data, op): - data['idx'] = cls.idx - data['blacklisted'] = False - data['block_num'] = op['block_num'] - - @classmethod - def _reset_following_list(cls, data, op): - if data['state'] == 1: - data['idx'] = cls.idx - data['state'] = 0 - data['block_num'] = op['block_num'] - - @classmethod - def _reset_muted_list(cls, data, op): - if data['state'] == 2: - data['idx'] = cls.idx - data['state'] = 0 - data['block_num'] = op['block_num'] - - @classmethod - def _reset_follow_blacklist(cls, data, op): - data['idx'] = cls.idx - data['follow_blacklists'] = False - data['block_num'] = op['block_num'] - - @classmethod - def _reset_follow_muted_list(cls, data, op): - data['idx'] = cls.idx - data['follow_muted'] = False - data['block_num'] = op['block_num'] - - @classmethod - def _reset_all_lists(cls, data, op): - data['idx'] = cls.idx - data['state'] = 0 - data['blacklisted'] = False - data['follow_blacklists'] = False - data['follow_muted'] = False - data['block_num'] = op['block_num'] - - @classmethod - def _follow_single( - cls, - follower, - following, - at, - block_num, - new_state=None, - new_blacklisted=None, - new_follow_blacklists=None, - new_follow_muted=None, - ): - # add or update single record in flush cache - k = f'{follower}/{following}' - if k not in cls.follow_items_to_flush: - # fresh follow item (note that db might have that pair already) - cls.follow_items_to_flush[k] = dict( - idx=cls.idx, - follower=follower, - following=following, - state=new_state if new_state is not None else 'NULL', - blacklisted=new_blacklisted if new_blacklisted is not None else 'NULL', - follow_blacklists=new_follow_blacklists if new_follow_blacklists is not None else 'NULL', - follow_muted=new_follow_muted if new_follow_muted is not None else 'NULL', - at=at, - block_num=block_num, - ) - else: - # follow item already in cache - just overwrite previous value where applicable - cls.follow_items_to_flush[k]['idx'] = cls.idx - if new_state is not None: - cls.follow_items_to_flush[k]['state'] = new_state - if new_blacklisted is not None: - cls.follow_items_to_flush[k]['blacklisted'] = new_blacklisted - if new_follow_blacklists is not None: - cls.follow_items_to_flush[k]['follow_blacklists'] = new_follow_blacklists - if new_follow_muted is not None: - cls.follow_items_to_flush[k]['follow_muted'] = new_follow_muted - # ABW: at not updated for some reason - will therefore always point at time of first relation between accounts - cls.follow_items_to_flush[k]['block_num'] = block_num - cls.idx += 1 - - @classmethod - def follow_op(cls, account, op_json, date, block_num): - """Process an incoming follow op.""" - - def true_false_none(state, to_true, to_false): - if state == to_true: - return True - if state == to_false: - return False - return None - - op = cls._validated_op(account, op_json, date) - if not op: - return - op['block_num'] = block_num - state = int(op['state']) - follower = op['follower'] - # log.info("follow_op accepted as %s", op) - - if state >= Action.Reset_blacklist: - # choose action specific to requested list resetting - add_null_blacklist = False - add_null_muted = False - if state == Action.Reset_blacklist: - reset_list = Follow._reset_blacklist - cls.list_resets_to_flush.append( - dict(follower=follower, reset_call='follow_reset_blacklist', block_num=block_num) - ) - elif state == Action.Reset_following_list: - reset_list = Follow._reset_following_list - cls.list_resets_to_flush.append( - dict(follower=follower, reset_call='follow_reset_following_list', block_num=block_num) - ) - elif state == Action.Reset_muted_list: - reset_list = Follow._reset_muted_list - cls.list_resets_to_flush.append( - dict(follower=follower, reset_call='follow_reset_muted_list', block_num=block_num) - ) - elif state == Action.Reset_follow_blacklist: - reset_list = Follow._reset_follow_blacklist - cls.list_resets_to_flush.append( - dict(follower=follower, reset_call='follow_reset_follow_blacklist', block_num=block_num) - ) - add_null_blacklist = True - elif state == Action.Reset_follow_muted_list: - reset_list = Follow._reset_follow_muted_list - cls.list_resets_to_flush.append( - dict(follower=follower, reset_call='follow_reset_follow_muted_list', block_num=block_num) - ) - add_null_muted = True - elif state == Action.Reset_all_lists: - reset_list = Follow._reset_all_lists - cls.list_resets_to_flush.append( - dict(follower=follower, reset_call='follow_reset_all_lists', block_num=block_num) - ) - add_null_blacklist = True - add_null_muted = True - else: - assert False, 'Unhandled follow state' - # apply action to existing cached data as well as to database (ABW: with expected frequency of list resetting - # there is no point in grouping such operations from group of blocks - we can just execute them one by one - # in order of appearance) - for k, data in cls.follow_items_to_flush.items(): - if data['follower'] == follower: - reset_list(data, op) - if add_null_blacklist or add_null_muted: - # since 'null' account can't have its blacklist/mute list, following such list is only used - # as an indicator for frontend to no longer bother user with proposition of following predefined - # lists (since that user is already choosing his own lists) - cls._follow_single( - follower, - escape_characters('null'), - op['at'], - op['block_num'], - None, - None, - add_null_blacklist, - add_null_muted, - ) - else: - # set new state/flags to be applied to each pair with changing 'following' - new_state = state if state in (Action.Nothing, Action.Blog, Action.Ignore) else None - new_blacklisted = true_false_none(state, Action.Blacklist, Action.Unblacklist) - new_follow_blacklists = true_false_none(state, Action.Follow_blacklist, Action.Unfollow_blacklist) - new_follow_muted = true_false_none(state, Action.Follow_muted, Action.Unfollow_muted) - - for following in op['following']: - cls._follow_single( - follower, - following, - op['at'], - block_num, - new_state, - new_blacklisted, - new_follow_blacklists, - new_follow_muted, - ) - - @classmethod - def _validated_op(cls, account, op, date): - """Validate and normalize the operation.""" - if not 'what' in op or not isinstance(op['what'], list) or not 'follower' in op or not 'following' in op: - log.info("follow_op %s ignored due to basic errors", op) - return None - - what = first(op['what']) or '' - # ABW: the empty 'what' is used to clear existing 'blog' or 'ignore' state, however it can also be used to - # introduce new empty relation record in hive_follows adding unnecessary data (it might become a problem - # only if we wanted to immediately remove empty records) - # we could add aliases for '' - 'unfollow' and 'unignore'/'unmute' - # we could add alias for 'ignore' - 'mute' - defs = { - '': Action.Nothing, - 'blog': Action.Blog, - 'follow': Action.Blog, - 'ignore': Action.Ignore, - 'blacklist': Action.Blacklist, - 'follow_blacklist': Action.Follow_blacklist, - 'unblacklist': Action.Unblacklist, - 'unfollow_blacklist': Action.Unfollow_blacklist, - 'follow_muted': Action.Follow_muted, - 'unfollow_muted': Action.Unfollow_muted, - 'reset_blacklist': Action.Reset_blacklist, - 'reset_following_list': Action.Reset_following_list, - 'reset_muted_list': Action.Reset_muted_list, - 'reset_follow_blacklist': Action.Reset_follow_blacklist, - 'reset_follow_muted_list': Action.Reset_follow_muted_list, - 'reset_all_lists': Action.Reset_all_lists, - } - if not isinstance(what, str) or what not in defs: - log.info("follow_op %s ignored due to unknown type of follow", op) - return None - - # follower is empty or follower account does not exist, or it wasn't that account that authorized operation - if not op['follower'] or not Accounts.exists(op['follower']) or op['follower'] != account: - log.info("follow_op %s ignored due to invalid follower", op) - return None - - # normalize following to list - op['following'] = op['following'] if isinstance(op['following'], list) else [op['following']] - - # if following name does not exist do not process it: basically equal to drop op for single following entry - op['following'] = [ - following - for following in op['following'] - if following and Accounts.exists(following) and following != op['follower'] - ] - # ABW: note that since you could make 'following' list empty anyway by supplying nonexisting account - # there was no point in excluding follow_op with provided empty list/empty string - such call actually - # makes sense for state > 8 when 'following' is ignored - state = defs[what] - if not op['following'] and state < Action.Reset_blacklist: - log.info("follow_op %s is void due to effectively empty list of following", op) - return None - - return dict( - follower=escape_characters(op['follower']), - following=[escape_characters(following) for following in op['following']], - state=state, - at=date, - ) - - @classmethod - def flush(cls): - n = 0 - if cls.follow_items_to_flush or cls.list_resets_to_flush: - cls.beginTx() - - for reset_list in cls.list_resets_to_flush: - sql = f"SELECT {SCHEMA_NAME}.{reset_list['reset_call']}({reset_list['follower']}::VARCHAR, {reset_list['block_num']}::INT)" - cls.db.query_no_return(sql) - - cls.list_resets_to_flush.clear() - - sql = f""" - INSERT INTO {SCHEMA_NAME}.hive_follows as hf (follower, following, created_at, state, blacklisted, follow_blacklists, follow_muted, block_num) - SELECT - ds.follower_id, - ds.following_id, - ds.created_at, - COALESCE(ds.state, hfs.state, 0), - COALESCE(ds.blacklisted, hfs.blacklisted, FALSE), - COALESCE(ds.follow_blacklists, hfs.follow_blacklists, FALSE), - COALESCE(ds.follow_muted, hfs.follow_muted, FALSE), - ds.block_num - FROM - ( - SELECT - t.id, - ha_flr.id as follower_id, - ha_flg.id as following_id, - t.created_at, - t.state, - t.blacklisted, - t.follow_blacklists, - t.follow_muted, - t.block_num - FROM - ( - VALUES - {{}} - ) as T (id, follower, following, created_at, state, blacklisted, follow_blacklists, follow_muted, block_num) - INNER JOIN {SCHEMA_NAME}.hive_accounts ha_flr ON ha_flr.name = T.follower - INNER JOIN {SCHEMA_NAME}.hive_accounts ha_flg ON ha_flg.name = T.following - ) AS ds(id, follower_id, following_id, created_at, state, blacklisted, follow_blacklists, follow_muted, block_num) - LEFT JOIN {SCHEMA_NAME}.hive_follows hfs ON hfs.follower = ds.follower_id AND hfs.following = ds.following_id - ORDER BY ds.id ASC - ON CONFLICT ON CONSTRAINT hive_follows_ux1 DO UPDATE - SET - state = EXCLUDED.state, - blacklisted = EXCLUDED.blacklisted, - follow_blacklists = EXCLUDED.follow_blacklists, - follow_muted = EXCLUDED.follow_muted, - block_num = EXCLUDED.block_num - WHERE hf.following = EXCLUDED.following AND hf.follower = EXCLUDED.follower - """ - values = [] - limit = 1000 - count = 0 - - for _, follow_item in cls.follow_items_to_flush.items(): - values.append( - f"({follow_item['idx']}, {follow_item['follower']}, {follow_item['following']}, '{follow_item['at']}'::timestamp, {follow_item['state']}::smallint, {follow_item['blacklisted']}::boolean, {follow_item['follow_blacklists']}::boolean, {follow_item['follow_muted']}::boolean, {follow_item['block_num']})" - ) - count = count + 1 - if count >= limit: - query = str(sql).format(",".join(values)) - cls.db.query_prepared(query) - values.clear() - count = 0 - n += 1 - - if len(values) > 0: - query = str(sql).format(",".join(values)) - cls.db.query_prepared(query) - values.clear() - - cls.follow_items_to_flush.clear() - - cls.commitTx() - cls.idx = 0 - return n -- GitLab From ab3e1433dec68b8e43e35cc9ebad34dbe6040ecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 29 Jan 2025 18:14:21 +0100 Subject: [PATCH 40/83] Rename NewFollow to Follow --- hive/indexer/blocks.py | 8 +-- hive/indexer/custom_op.py | 4 +- hive/indexer/{new_follow.py => follow.py} | 76 +++++++++++------------ 3 files changed, 44 insertions(+), 44 deletions(-) rename hive/indexer/{new_follow.py => follow.py} (88%) diff --git a/hive/indexer/blocks.py b/hive/indexer/blocks.py index b572e475e..ac7227263 100644 --- a/hive/indexer/blocks.py +++ b/hive/indexer/blocks.py @@ -15,7 +15,7 @@ from hive.indexer.hive_db.massive_blocks_data_provider import MassiveBlocksDataP from hive.indexer.accounts import Accounts from hive.indexer.block import Block, Operation, OperationType, Transaction, VirtualOperationType from hive.indexer.custom_op import CustomOp -from hive.indexer.new_follow import NewFollow +from hive.indexer.follow import Follow from hive.indexer.hive_db.block import BlockHiveDb from hive.indexer.notify import Notify from hive.indexer.post_data_cache import PostDataCache @@ -53,7 +53,7 @@ class Blocks: ('Posts', Posts.flush, Posts), ('PostDataCache', PostDataCache.flush, PostDataCache), ('Votes', Votes.flush, Votes), - ('NewFollow', NewFollow.flush, NewFollow), + ('Follow', Follow.flush, Follow), ('Reblog', Reblog.flush, Reblog), ('Notify', Notify.flush, Notify), ('Accounts', Accounts.flush, Accounts), @@ -79,7 +79,7 @@ class Blocks: PostDataCache.setup_own_db_access(shared_db_adapter, "PostDataCache") Votes.setup_own_db_access(shared_db_adapter, "Votes") - NewFollow.setup_own_db_access(shared_db_adapter, "NewFollow") + Follow.setup_own_db_access(shared_db_adapter, "Follow") Posts.setup_own_db_access(shared_db_adapter, "Posts") Reblog.setup_own_db_access(shared_db_adapter, "Reblog") Notify.setup_own_db_access(shared_db_adapter, "Notify") @@ -92,7 +92,7 @@ class Blocks: PostDataCache.close_own_db_access() Votes.close_own_db_access() - NewFollow.close_own_db_access() + Follow.close_own_db_access() Posts.close_own_db_access() Reblog.close_own_db_access() Notify.close_own_db_access() diff --git a/hive/indexer/custom_op.py b/hive/indexer/custom_op.py index ac1363512..2cbc014f4 100644 --- a/hive/indexer/custom_op.py +++ b/hive/indexer/custom_op.py @@ -10,7 +10,7 @@ from hive.indexer.notify import Notify from hive.indexer.reblog import Reblog from hive.utils.json import valid_command, valid_date, valid_keys, valid_op_json from hive.utils.normalize import load_json_key -from hive.indexer.new_follow import NewFollow # Import NewFollow +from hive.indexer.follow import Follow log = logging.getLogger(__name__) @@ -111,6 +111,6 @@ class CustomOp: cmd, op_json = op_json # ['follow', {data...}] if cmd == 'follow': - NewFollow.process_new_follow_op(account, op_json, block_num) + Follow.process_follow_op(account, op_json, block_num) elif cmd == 'reblog': Reblog.reblog_op(account, op_json, block_date, block_num) diff --git a/hive/indexer/new_follow.py b/hive/indexer/follow.py similarity index 88% rename from hive/indexer/new_follow.py rename to hive/indexer/follow.py index bebccc473..55007764e 100644 --- a/hive/indexer/new_follow.py +++ b/hive/indexer/follow.py @@ -10,7 +10,7 @@ from funcy.seqs import first # Ensure 'first' is imported log = logging.getLogger(__name__) -class NewFollowAction(enum.IntEnum): +class FollowAction(enum.IntEnum): Nothing = 0 Mute = 1 Blacklist = 2 @@ -28,8 +28,8 @@ class NewFollowAction(enum.IntEnum): ResetAllLists = 16 # cancel all existing records of all types -class NewFollow(DbAdapterHolder): - """Handles processing of new follow-related operations.""" +class Follow(DbAdapterHolder): + """Handles processing of follow-related operations.""" items_to_flush = [] unique_names = set() @@ -51,7 +51,7 @@ class NewFollow(DbAdapterHolder): @classmethod def _validate_op(cls, account, op): - """Validate and normalize the new follow-related operation.""" + """Validate and normalize the follow-related operation.""" if 'what' not in op or not isinstance(op['what'], list) or 'follower' not in op or 'following' not in op: log.info("follow_op %s ignored due to basic errors", op) return None @@ -59,22 +59,22 @@ class NewFollow(DbAdapterHolder): what = first(op['what']) or '' # the empty 'what' is used to clear existing 'blog' or 'ignore' state, however it can also be used to defs = { - '': NewFollowAction.Nothing, - 'blog': NewFollowAction.Follow, - 'follow': NewFollowAction.Follow, - 'ignore': NewFollowAction.Mute, - 'blacklist': NewFollowAction.Blacklist, - 'follow_blacklist': NewFollowAction.FollowBlacklisted, - 'unblacklist': NewFollowAction.Unblacklist, - 'unfollow_blacklist': NewFollowAction.UnFollowBlacklisted, - 'follow_muted': NewFollowAction.FollowMuted, - 'unfollow_muted': NewFollowAction.UnfollowMuted, - 'reset_blacklist': NewFollowAction.ResetBlacklist, - 'reset_following_list': NewFollowAction.ResetFollowingList, - 'reset_muted_list': NewFollowAction.ResetMutedList, - 'reset_follow_blacklist': NewFollowAction.ResetFollowBlacklist, - 'reset_follow_muted_list': NewFollowAction.ResetFollowMutedList, - 'reset_all_lists': NewFollowAction.ResetAllLists, + '': FollowAction.Nothing, + 'blog': FollowAction.Follow, + 'follow': FollowAction.Follow, + 'ignore': FollowAction.Mute, + 'blacklist': FollowAction.Blacklist, + 'follow_blacklist': FollowAction.FollowBlacklisted, + 'unblacklist': FollowAction.Unblacklist, + 'unfollow_blacklist': FollowAction.UnFollowBlacklisted, + 'follow_muted': FollowAction.FollowMuted, + 'unfollow_muted': FollowAction.UnfollowMuted, + 'reset_blacklist': FollowAction.ResetBlacklist, + 'reset_following_list': FollowAction.ResetFollowingList, + 'reset_muted_list': FollowAction.ResetMutedList, + 'reset_follow_blacklist': FollowAction.ResetFollowBlacklist, + 'reset_follow_muted_list': FollowAction.ResetFollowMutedList, + 'reset_all_lists': FollowAction.ResetAllLists, } if not isinstance(what, str) or what not in defs: log.info("follow_op %s ignored due to unknown type of follow", op) @@ -103,8 +103,8 @@ class NewFollow(DbAdapterHolder): } @classmethod - def process_new_follow_op(cls, account, op_json, block_num): - """Process an incoming new follow-related operation.""" + def process_follow_op(cls, account, op_json, block_num): + """Process an incoming follow-related operation.""" op = cls._validate_op(account, op_json) if not op: @@ -116,7 +116,7 @@ class NewFollow(DbAdapterHolder): follower = op['follower'] cls.unique_names.add(follower) action = op['action'] - if action in [NewFollowAction.ResetBlacklist, NewFollowAction.ResetFollowingList, NewFollowAction.ResetMutedList, NewFollowAction.ResetFollowBlacklist, NewFollowAction.ResetFollowMutedList, NewFollowAction.ResetAllLists]: + if action in [FollowAction.ResetBlacklist, FollowAction.ResetFollowingList, FollowAction.ResetMutedList, FollowAction.ResetFollowBlacklist, FollowAction.ResetFollowMutedList, FollowAction.ResetAllLists]: cls.items_to_flush.append((follower, None, op)) cls.idx += 1 else: @@ -147,7 +147,7 @@ class NewFollow(DbAdapterHolder): follower_id = name_to_id.get(follower) following_id = name_to_id.get(following) null_id = name_to_id.get('null') - if action == NewFollowAction.Follow: + if action == FollowAction.Follow: if not follower_id or not following_id: log.warning(f"Cannot insert follow record: missing IDs for follower '{follower}' or following '{following}'.") continue @@ -170,7 +170,7 @@ class NewFollow(DbAdapterHolder): following_id=following_id, block_num=op['block_num'] ) - elif action == NewFollowAction.Mute: + elif action == FollowAction.Mute: if not follower_id or not following_id: log.warning(f"Cannot insert mute record: missing IDs for follower '{follower}' or following '{following}'.") continue @@ -193,7 +193,7 @@ class NewFollow(DbAdapterHolder): follower_id=follower_id, following_id=following_id ) - elif action == NewFollowAction.Nothing: + elif action == FollowAction.Nothing: if not follower_id or not following_id: log.warning(f"Cannot remove mute/follow record: missing IDs for follower '{follower}' or following '{following}'.") continue @@ -213,7 +213,7 @@ class NewFollow(DbAdapterHolder): follower_id=follower_id, following_id=following_id ) - elif action == NewFollowAction.Blacklist: + elif action == FollowAction.Blacklist: if not follower_id or not following_id: log.warning(f"Cannot insert blacklist record: missing IDs for follower '{follower}' or following '{following}'.") continue @@ -228,7 +228,7 @@ class NewFollow(DbAdapterHolder): following_id=following_id, block_num=op['block_num'] ) - elif action == NewFollowAction.Unblacklist: + elif action == FollowAction.Unblacklist: if not follower_id or not following_id: log.warning(f"Cannot delete unblacklist record: missing IDs for follower '{follower}' or following '{following}'.") continue @@ -240,7 +240,7 @@ class NewFollow(DbAdapterHolder): follower_id=follower_id, following_id=following_id ) - elif action == NewFollowAction.FollowMuted: + elif action == FollowAction.FollowMuted: if not follower_id or not following_id: log.warning(f"Cannot insert follow_muted record: missing IDs for follower '{follower}' or following '{following}'.") continue @@ -255,7 +255,7 @@ class NewFollow(DbAdapterHolder): following_id=following_id, block_num=op['block_num'] ) - elif action == NewFollowAction.UnfollowMuted: + elif action == FollowAction.UnfollowMuted: if not follower_id or not following_id: log.warning(f"Cannot delete unfollow_muted record: missing IDs for follower '{follower}' or following '{following}'.") continue @@ -267,7 +267,7 @@ class NewFollow(DbAdapterHolder): follower_id=follower_id, following_id=following_id ) - elif action == NewFollowAction.FollowBlacklisted: + elif action == FollowAction.FollowBlacklisted: if not follower_id or not following_id: log.warning(f"Cannot insert follow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") continue @@ -282,7 +282,7 @@ class NewFollow(DbAdapterHolder): following_id=following_id, block_num=op['block_num'] ) - elif action == NewFollowAction.UnFollowBlacklisted: + elif action == FollowAction.UnFollowBlacklisted: if not follower_id or not following_id: log.warning(f"Cannot delete unfollow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") continue @@ -294,7 +294,7 @@ class NewFollow(DbAdapterHolder): follower_id=follower_id, following_id=following_id ) - elif action == NewFollowAction.ResetFollowingList: + elif action == FollowAction.ResetFollowingList: if not follower_id: log.warning("Cannot reset follow records: missing ID for follower.") continue @@ -305,7 +305,7 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) - elif action == NewFollowAction.ResetMutedList: + elif action == FollowAction.ResetMutedList: if not follower_id: log.warning("Cannot reset muted list records: missing ID for follower.") continue @@ -316,7 +316,7 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) - elif action == NewFollowAction.ResetBlacklist: + elif action == FollowAction.ResetBlacklist: if not follower_id: log.warning("Cannot reset blacklist records: missing ID for follower.") continue @@ -327,7 +327,7 @@ class NewFollow(DbAdapterHolder): """, follower_id=follower_id ) - elif action == NewFollowAction.ResetFollowMutedList: + elif action == FollowAction.ResetFollowMutedList: if not follower_id: log.warning("Cannot reset follow muted list records: missing ID for follower.") continue @@ -349,7 +349,7 @@ class NewFollow(DbAdapterHolder): following_id=null_id, block_num=op['block_num'] ) - elif action == NewFollowAction.ResetFollowBlacklist: + elif action == FollowAction.ResetFollowBlacklist: if not follower_id: log.warning("Cannot reset follow blacklist records: missing ID for follower.") continue @@ -371,7 +371,7 @@ class NewFollow(DbAdapterHolder): following_id=null_id, block_num=op['block_num'] ) - elif action == NewFollowAction.ResetAllLists: + elif action == FollowAction.ResetAllLists: if not follower_id: log.warning("Cannot reset all follow list records: missing ID for follower.") continue -- GitLab From 32305f5c7e3018e0334364b88cae4dbc6bcc237d Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Wed, 29 Jan 2025 14:17:07 -0500 Subject: [PATCH 41/83] Remove unused notification id --- hive/db/sql_scripts/hive_posts_base_view.sql | 4 +-- hive/db/sql_scripts/notifications_view.sql | 30 ++++++-------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/hive/db/sql_scripts/hive_posts_base_view.sql b/hive/db/sql_scripts/hive_posts_base_view.sql index cce078523..22f506898 100644 --- a/hive/db/sql_scripts/hive_posts_base_view.sql +++ b/hive/db/sql_scripts/hive_posts_base_view.sql @@ -13,9 +13,9 @@ SELECT FROM hivemind_app.hive_posts hp ; -DROP VIEW IF EXISTS hivemind_app.hive_posts_pp_view CASCADE; +DROP VIEW IF EXISTS hivemind_app.hive_posts_parent_view CASCADE; -CREATE OR REPLACE VIEW hivemind_app.hive_posts_pp_view +CREATE OR REPLACE VIEW hivemind_app.hive_posts_parent_view AS SELECT hp.id, hp.community_id, diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index 5c75d759e..f3476af78 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -78,11 +78,11 @@ $BODY$; -- View: hivemind_app.hive_raw_notifications_as_view +-- hive_posts, hive_follows, hive_reblogs, hive_subscriptions, hive_mentions (these are scored by the src account's rank) DROP VIEW IF EXISTS hivemind_app.hive_raw_notifications_as_view CASCADE; CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view AS SELECT notifs.block_num, - notifs.id, notifs.post_id, notifs.type_id, notifs.created_at, @@ -94,11 +94,6 @@ CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view notifs.payload, harv.score FROM ( SELECT hpv.block_num, - hivemind_app.notification_id(hpv.block_num, - CASE hpv.depth - WHEN 1 THEN 12 - ELSE 13 - END, hpv.id) AS id, hpv.id AS post_id, CASE hpv.depth WHEN 1 THEN 12 @@ -111,14 +106,13 @@ CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view ''::character varying(16) AS community, ''::character varying AS community_title, ''::character varying AS payload - FROM hivemind_app.hive_posts_pp_view hpv + FROM hivemind_app.hive_posts_parent_view hpv WHERE hpv.depth > 0 AND NOT EXISTS (SELECT NULL::text FROM hivemind_app.muted AS m WHERE m.follower = hpv.parent_author_id AND m.following = hpv.author_id) UNION ALL SELECT f.block_num, - hivemind_app.notification_id(f.block_num, 15, (row_number() OVER ())::INTEGER) AS id, 0 AS post_id, 15 AS type_id, (select hb.created_at from hivemind_app.blocks_view hb where hb.num = (f.block_num - 1)) as created_at, -- use time of previous block to match head_block_time behavior at given block @@ -132,7 +126,6 @@ UNION ALL UNION ALL SELECT hr.block_num, - hivemind_app.notification_id(hr.block_num, 14, hr.id) AS id, hp.id AS post_id, 14 AS type_id, hr.created_at, @@ -142,11 +135,10 @@ UNION ALL ''::character varying(16) AS community, ''::character varying AS community_title, ''::character varying AS payload - FROM hivemind_app.hive_reblogs hr + FROM hivemind_app.hive_reblogs hr -- reblogs JOIN hivemind_app.hive_posts hp ON hr.post_id = hp.id UNION ALL SELECT hs.block_num, - hivemind_app.notification_id(hs.block_num, 11, hs.id) AS id, 0 AS post_id, 11 AS type_id, hs.created_at, @@ -156,11 +148,10 @@ UNION ALL hc.name AS community, hc.title AS community_title, ''::character varying AS payload - FROM hivemind_app.hive_subscriptions hs + FROM hivemind_app.hive_subscriptions hs -- subscriptions JOIN hivemind_app.hive_communities hc ON hs.community_id = hc.id UNION ALL SELECT hm.block_num, - hivemind_app.notification_id(hm.block_num, 16, hm.id) AS id, hm.post_id, 16 AS type_id, (select hb.created_at from hivemind_app.blocks_view hb where hb.num = (hm.block_num - 1)) as created_at, -- use time of previous block to match head_block_time behavior at given block @@ -170,18 +161,18 @@ UNION ALL ''::character varying(16) AS community, ''::character varying AS community_title, ''::character varying AS payload - FROM hivemind_app.hive_mentions hm + FROM hivemind_app.hive_mentions hm -- mentions JOIN hivemind_app.hive_posts hp ON hm.post_id = hp.id ) notifs JOIN hivemind_app.hive_accounts_rank_view harv ON harv.id = notifs.src ; -DROP VIEW IF EXISTS hivemind_app.hive_raw_notifications_view_noas cascade; -CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_view_noas +--vote has own score, new communities score as 35 (magic number), persistent notifications are already scored +DROP VIEW IF EXISTS hivemind_app.hive_raw_notifications_view_no_account_score cascade; +CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_view_no_account_score AS SELECT -- votes vn.block_num - , vn.id , vn.post_id , vn.type_id , vn.created_at @@ -199,7 +190,6 @@ FROM ( SELECT hv1.block_num - , hivemind_app.notification_id(hv1.block_num, 17, hv1.id::integer) AS id , hpv.id AS post_id , 17 AS type_id , hv1.last_update AS created_at @@ -229,7 +219,6 @@ FROM UNION ALL SELECT -- new community hc.block_num as block_num - , hivemind_app.notification_id(hc.block_num, 11, hc.id) as id , 0 as post_id , 1 as type_id , hc.created_at as created_at @@ -245,7 +234,6 @@ UNION ALL UNION ALL SELECT --persistent notifs hn.block_num - , hivemind_app.notification_id(hn.block_num, hn.type_id, CAST( hn.id as INT) ) as id , hn.post_id as post_id , hn.type_id as type_id , hn.created_at as created_at @@ -268,6 +256,6 @@ FROM ( SELECT * FROM hivemind_app.hive_raw_notifications_as_view UNION ALL - SELECT * FROM hivemind_app.hive_raw_notifications_view_noas + SELECT * FROM hivemind_app.hive_raw_notifications_view_no_account_score ) as notifs WHERE notifs.score >= 0 AND notifs.src IS DISTINCT FROM notifs.dst; -- GitLab From f8a232797f167c09df410874b2853342844db943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 30 Jan 2025 13:19:45 +0100 Subject: [PATCH 42/83] Remove hive_follows table --- hive/db/db_state.py | 7 ------- hive/db/schema.py | 23 ----------------------- 2 files changed, 30 deletions(-) diff --git a/hive/db/db_state.py b/hive/db/db_state.py index 5c8f4c7a5..b2b00ccf2 100644 --- a/hive/db/db_state.py +++ b/hive/db/db_state.py @@ -109,13 +109,6 @@ class DbState: 'hive_feed_cache_created_at_idx', 'hive_feed_cache_post_id_idx', 'hive_feed_cache_account_id_created_at_post_id_idx', - 'hive_follows_following_state_id_idx', # (following, state, id) - 'hive_follows_follower_state_idx', # (follower, state, created_at, following) - 'hive_follows_follower_following_state_idx', - 'hive_follows_block_num_idx', - 'hive_follows_follower_where_blacklisted_idx', - 'hive_follows_follower_where_follow_muted_idx', - 'hive_follows_follower_where_follow_blacklists_idx', 'hive_posts_parent_id_id_idx', 'hive_posts_depth_idx', 'hive_posts_root_id_id_idx', diff --git a/hive/db/schema.py b/hive/db/schema.py index 8d162f66e..8ca6ba114 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -240,28 +240,6 @@ def build_metadata(): sa.UniqueConstraint('tag', name='hive_tag_data_ux1'), ) - sa.Table( - 'hive_follows', - metadata, - sa.Column('id', sa.Integer, primary_key=True), - sa.Column('follower', sa.Integer, nullable=False), - sa.Column('following', sa.Integer, nullable=False), - sa.Column('state', SMALLINT, nullable=False, server_default='1'), - sa.Column('created_at', sa.DateTime, nullable=False), - sa.Column('blacklisted', sa.Boolean, nullable=False, server_default='0'), - sa.Column('follow_blacklists', sa.Boolean, nullable=False, server_default='0'), - sa.Column('follow_muted', BOOLEAN, nullable=False, server_default='0'), - sa.Column('block_num', sa.Integer, nullable=False), - sa.UniqueConstraint('following', 'follower', name='hive_follows_ux1'), # core - sa.Index('hive_follows_following_state_id_idx', 'following', 'state', 'id'), # index used by condenser_get_followers - sa.Index('hive_follows_follower_state_idx', 'follower', 'state'), - sa.Index('hive_follows_follower_following_state_idx', 'follower', 'following', 'state'), - sa.Index('hive_follows_block_num_idx', 'block_num'), - sa.Index('hive_follows_follower_where_blacklisted_idx', 'follower', postgresql_where=sql_text('blacklisted')), - sa.Index('hive_follows_follower_where_follow_muted_idx', 'follower', postgresql_where=sql_text('follow_muted')), - sa.Index('hive_follows_follower_where_follow_blacklists_idx', 'follower', postgresql_where=sql_text('follow_blacklists')), - ) - sa.Table( 'hive_reblogs', metadata, @@ -788,7 +766,6 @@ def reset_autovac(db): 'hive_accounts': (50000, 100000), 'hive_posts': (2500, 10000), 'hive_post_tags': (5000, 10000), - 'hive_follows': (5000, 5000), # 'hive_feed_cache': (5000, 5000), # 'hive_reblogs': (5000, 5000), } -- GitLab From e8ff5f30974105087f9bfb44fc8e2a237136061a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 30 Jan 2025 16:42:02 +0100 Subject: [PATCH 43/83] Add new indices to disableable_indexes --- hive/db/db_state.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hive/db/db_state.py b/hive/db/db_state.py index b2b00ccf2..c9063e388 100644 --- a/hive/db/db_state.py +++ b/hive/db/db_state.py @@ -133,6 +133,16 @@ class DbState: 'hive_votes_post_id_voter_id_idx', 'hive_notification_cache_block_num_idx', 'hive_notification_cache_dst_score_idx', + 'follows_follower_idx', + 'follows_following_idx', + 'muted_follower_idx', + 'muted_following_idx', + 'blacklisted_follower_idx', + 'blacklisted_following_idx', + 'follow_muted_follower_idx', + 'follow_muted_following_idx', + 'follow_blacklisted_follower_idx', + 'follow_blacklisted_following_idx', ] to_return = {} -- GitLab From eea93c64c84f8407a47db71a2e0c245add1e74af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Fri, 31 Jan 2025 11:10:17 +0100 Subject: [PATCH 44/83] Remove hivemind_endpoints.new_condenser_api_get_followers Seems to be unused. --- hive/db/schema.py | 1 - .../new_condenser_api_get_followers.sql | 71 ------------------- 2 files changed, 72 deletions(-) delete mode 100644 hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql diff --git a/hive/db/schema.py b/hive/db/schema.py index 8ca6ba114..120b985c5 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -683,7 +683,6 @@ def setup_runtime_code(db): "postgrest/bridge_api/bridge_api_list_pop_communities.sql", "postgrest/condenser_api/extract_parameters_for_get_following_and_followers.sql", "postgrest/condenser_api/condenser_api_get_followers.sql", - "postgrest/condenser_api/new_condenser_api_get_followers.sql", "postgrest/condenser_api/condenser_api_get_following.sql", "postgrest/utilities/find_subscription_id.sql", "postgrest/bridge_api/bridge_api_get_profiles.sql", diff --git a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql b/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql deleted file mode 100644 index af6ea5ec8..000000000 --- a/hive/db/sql_scripts/postgrest/condenser_api/new_condenser_api_get_followers.sql +++ /dev/null @@ -1,71 +0,0 @@ -DROP FUNCTION IF EXISTS hivemind_endpoints.new_condenser_api_get_followers; -CREATE FUNCTION hivemind_endpoints.new_condenser_api_get_followers(IN _params JSONB) -RETURNS JSONB -LANGUAGE 'plpgsql' -STABLE -AS -$$ -DECLARE - _account TEXT; - _account_id INT; - _start TEXT; - _start_id INT; - _follow_type TEXT; - _limit INT; - _result JSONB; -BEGIN - _params := hivemind_postgrest_utilities.validate_json_arguments( _params, '{"account": "string", "start" : "string", "type" : "string", "limit" : "number"}', 4, NULL ); - - _account := _params->'account'; - _account_id := hivemind_postgrest_utilities.find_account_id( _account, TRUE ); - if (_account_id = 0) then - RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception('Invalid account'); - end if; - - _start := _params->'start'; - _start_id := hivemind_postgrest_utilities.find_account_id( _start, TRUE ); - if (_start_id = 0) then - RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception('Invalid start account'); - end if; - - _follow_type := hivemind_postgrest_utilities.parse_argument_from_json(_params, 'type', FALSE); - _limit := (_params->'limit')::INT; - - IF _follow_type = 'blog' THEN - _result := ( - SELECT jsonb_agg( - jsonb_build_object( - 'following', _account, - 'follower', ha.name, - 'what', '[blog]' - ) - ) - FROM hivemind_app.follows f - JOIN hivemind_app.hive_accounts ha ON ha.id = f.follower - WHERE f.following = _account_id AND ha.id < _start_id - ORDER BY f.follower DESC - LIMIT _limit - ); -ELSIF _follow_type = 'ignore' THEN - _result := ( - SELECT jsonb_agg( - jsonb_build_object( - 'following', _account, - 'follower', ha.name, - 'what', '[ignore]' - ) - ) - FROM hivemind_app.muted m - JOIN hivemind_app.hive_accounts ha ON ha.id = m.follower - WHERE m.following = _account_id AND ha.id < _start_id - ORDER BY m.follower DESC - LIMIT _limit - ); - ELSE - RAISE EXCEPTION '%', hivemind_postgrest_utilities.raise_parameter_validation_exception('Unsupported follow_type, valid values: blog, ignore'); - END IF; - - RETURN COALESCE(_result, '[]'::jsonb); -END -$$ -; -- GitLab From c83c20c5f53de36f12d8c63daf01083c7d940cf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Fri, 31 Jan 2025 11:42:27 +0100 Subject: [PATCH 45/83] Remove references to hive_follows --- hive/db/sql_scripts/notifications_view.sql | 2 +- .../get_discussions_by_feed/_readme.txt | 22 ------------------- .../most_follow_blacklists.tavern.yaml | 4 +--- .../most_follow_muted.tavern.yaml | 4 +--- .../most_blog_followers.tavern.yaml | 1 - .../get_followers/most_ignored.tavern.yaml | 3 +-- .../most_blog_following.tavern.yaml | 3 +-- .../most_blog_following_page_2.tavern.yaml | 3 +-- .../most_ignore_following.tavern.yaml | 3 +-- .../most_ignore_following_page_2.tavern.yaml | 3 +-- 10 files changed, 8 insertions(+), 40 deletions(-) diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index f3476af78..c7bcb937f 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -78,7 +78,7 @@ $BODY$; -- View: hivemind_app.hive_raw_notifications_as_view --- hive_posts, hive_follows, hive_reblogs, hive_subscriptions, hive_mentions (these are scored by the src account's rank) +-- hive_posts, follows, hive_reblogs, hive_subscriptions, hive_mentions (these are scored by the src account's rank) DROP VIEW IF EXISTS hivemind_app.hive_raw_notifications_as_view CASCADE; CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view AS diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_discussions_by_feed/_readme.txt b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_discussions_by_feed/_readme.txt index da6b343ff..a65c06e5f 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_discussions_by_feed/_readme.txt +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_discussions_by_feed/_readme.txt @@ -45,25 +45,3 @@ b) Find post's id for given author and permlink SELECT id FROM hive_posts WHERE author = 'michelle.gent' AND permlink = 'dusty-the-demon-hunter-part-4' found: `711172` ------------ -Following query is taken from 0.23 version( for 5 million blocks ). -c) Put calculated values instead of _ID_ACCOUNT, _POST_ID, _LIMIT. ------------ -select hpc.post_id, hpc.author, hpc.permlink -FROM hive_posts_cache hpc -JOIN -( -SELECT post_id -FROM hive_feed_cache -JOIN hive_follows ON account_id = hive_follows.following AND state = 1 -JOIN hive_accounts ON hive_follows.following = hive_accounts.id -WHERE hive_follows.follower = _ID_ACCOUNT(here 441) - AND hive_feed_cache.created_at > ( '2016-09-15 19:47:15.0'::timestamp - interval '1 month' ) -GROUP BY post_id - HAVING MIN(hive_feed_cache.created_at) <= ( - SELECT MIN(created_at) FROM hive_feed_cache WHERE post_id = _POST_ID(here 711172) - AND account_id IN (SELECT following FROM hive_follows - WHERE follower = _ID_ACCOUNT(here 441) AND state = 1)) -ORDER BY MIN(hive_feed_cache.created_at) DESC -) T ON hpc.post_id = T.post_id -ORDER BY post_id DESC -LIMIT _LIMIT(here 10) diff --git a/tests/api_tests/hivemind/tavern_full_sync/bridge_api_patterns/get_follow_list/most_follow_blacklists.tavern.yaml b/tests/api_tests/hivemind/tavern_full_sync/bridge_api_patterns/get_follow_list/most_follow_blacklists.tavern.yaml index f42dab064..ad2c42db4 100644 --- a/tests/api_tests/hivemind/tavern_full_sync/bridge_api_patterns/get_follow_list/most_follow_blacklists.tavern.yaml +++ b/tests/api_tests/hivemind/tavern_full_sync/bridge_api_patterns/get_follow_list/most_follow_blacklists.tavern.yaml @@ -1,7 +1,5 @@ --- test_name: Hivemind bridge.get_follow_list most follow blacklists - # new function - SQL can be used to get freshest most follow blacklists - # SELECT COUNT(id) as record_count, follower FROM hive_follows WHERE follow_blacklists GROUP BY(follower) ORDER BY record_count DESC LIMIT 3; marks: - fullsynctest @@ -26,4 +24,4 @@ function: validate_response:has_valid_response extra_kwargs: method: "most_follow_blacklists" - directory: "bridge_api_patterns/get_follow_list" \ No newline at end of file + directory: "bridge_api_patterns/get_follow_list" diff --git a/tests/api_tests/hivemind/tavern_full_sync/bridge_api_patterns/get_follow_list/most_follow_muted.tavern.yaml b/tests/api_tests/hivemind/tavern_full_sync/bridge_api_patterns/get_follow_list/most_follow_muted.tavern.yaml index d301e546f..5d306d887 100644 --- a/tests/api_tests/hivemind/tavern_full_sync/bridge_api_patterns/get_follow_list/most_follow_muted.tavern.yaml +++ b/tests/api_tests/hivemind/tavern_full_sync/bridge_api_patterns/get_follow_list/most_follow_muted.tavern.yaml @@ -1,7 +1,5 @@ --- test_name: Hivemind bridge.get_follow_list most follow muted - # new function - SQL can be used to get freshest most follow muted - # SELECT COUNT(id) as record_count, follower FROM hive_follows WHERE follow_muted GROUP BY(follower) ORDER BY record_count DESC LIMIT 5; marks: - fullsynctest @@ -26,4 +24,4 @@ function: validate_response:has_valid_response extra_kwargs: method: "most_follow_muted" - directory: "bridge_api_patterns/get_follow_list" \ No newline at end of file + directory: "bridge_api_patterns/get_follow_list" diff --git a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_followers/most_blog_followers.tavern.yaml b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_followers/most_blog_followers.tavern.yaml index 28ebe32dc..2d09655b8 100644 --- a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_followers/most_blog_followers.tavern.yaml +++ b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_followers/most_blog_followers.tavern.yaml @@ -1,6 +1,5 @@ --- test_name: Hivemind condenser_api.get_followers most blog followers - # SELECT COUNT(id) as record_count, following FROM hive_follows WHERE state=1 GROUP BY(following) ORDER BY record_count DESC LIMIT 10; marks: - fullsynctest diff --git a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_followers/most_ignored.tavern.yaml b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_followers/most_ignored.tavern.yaml index 5935e2c61..8cbd62729 100644 --- a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_followers/most_ignored.tavern.yaml +++ b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_followers/most_ignored.tavern.yaml @@ -1,6 +1,5 @@ --- test_name: Hivemind condenser_api.get_followers most ignored - # SELECT COUNT(id) as record_count, following FROM hive_follows WHERE state=2 GROUP BY(following) ORDER BY record_count DESC LIMIT 10; marks: - fullsynctest @@ -25,4 +24,4 @@ function: validate_response:has_valid_response extra_kwargs: method: "most_ignored" - directory: "condenser_api_patterns/get_followers" \ No newline at end of file + directory: "condenser_api_patterns/get_followers" diff --git a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_blog_following.tavern.yaml b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_blog_following.tavern.yaml index ff63fb1e8..21ba461c9 100644 --- a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_blog_following.tavern.yaml +++ b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_blog_following.tavern.yaml @@ -1,6 +1,5 @@ --- test_name: Hivemind condenser_api.get_following most blog following - #SELECT COUNT(id) as record_count, follower FROM hive_follows WHERE state=1 GROUP BY(follower) ORDER BY record_count DESC LIMIT 3;; marks: - fullsynctest @@ -25,4 +24,4 @@ function: validate_response:has_valid_response extra_kwargs: method: "most_blog_following" - directory: "condenser_api_patterns/get_following" \ No newline at end of file + directory: "condenser_api_patterns/get_following" diff --git a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_blog_following_page_2.tavern.yaml b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_blog_following_page_2.tavern.yaml index b789450d0..51bd5693b 100644 --- a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_blog_following_page_2.tavern.yaml +++ b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_blog_following_page_2.tavern.yaml @@ -1,6 +1,5 @@ --- test_name: Hivemind condenser_api.get_following most blog following page 2 - #SELECT COUNT(id) as record_count, follower FROM hive_follows WHERE state=1 GROUP BY(follower) ORDER BY record_count DESC LIMIT 3;; marks: - fullsynctest @@ -25,4 +24,4 @@ function: validate_response:has_valid_response extra_kwargs: method: "most_blog_following_page_2" - directory: "condenser_api_patterns/get_following" \ No newline at end of file + directory: "condenser_api_patterns/get_following" diff --git a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_ignore_following.tavern.yaml b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_ignore_following.tavern.yaml index 67cfa3b7e..5730f9abe 100644 --- a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_ignore_following.tavern.yaml +++ b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_ignore_following.tavern.yaml @@ -1,6 +1,5 @@ --- test_name: Hivemind condenser_api.get_following most ignore following - #SELECT COUNT(id) as record_count, follower FROM hive_follows WHERE state=2 GROUP BY(follower) ORDER BY record_count DESC LIMIT 3; marks: - fullsynctest @@ -26,4 +25,4 @@ function: validate_response:has_valid_response extra_kwargs: method: "most_ignore_following" - directory: "condenser_api_patterns/get_following" \ No newline at end of file + directory: "condenser_api_patterns/get_following" diff --git a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_ignore_following_page_2.tavern.yaml b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_ignore_following_page_2.tavern.yaml index 4e5a1ac06..1880ef402 100644 --- a/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_ignore_following_page_2.tavern.yaml +++ b/tests/api_tests/hivemind/tavern_full_sync/condenser_api_patterns/get_following/most_ignore_following_page_2.tavern.yaml @@ -1,6 +1,5 @@ --- test_name: Hivemind condenser_api.get_following most ignore following page 2 - #SELECT COUNT(id) as record_count, follower FROM hive_follows WHERE state=2 GROUP BY(follower) ORDER BY record_count DESC LIMIT 3; marks: - fullsynctest @@ -26,4 +25,4 @@ function: validate_response:has_valid_response extra_kwargs: method: "most_ignore_following_page_2" - directory: "condenser_api_patterns/get_following" \ No newline at end of file + directory: "condenser_api_patterns/get_following" -- GitLab From a5a3666ea2b41a4924b1ee99c4c638f8e3b18bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 5 Feb 2025 11:05:31 +0100 Subject: [PATCH 46/83] Send queries in batches of 1000 This speeds up processing of follows. --- hive/db/schema.py | 1 + hive/db/sql_scripts/follow_ops.sql | 130 ++++++++++++++ hive/indexer/follow.py | 273 ++++------------------------- 3 files changed, 166 insertions(+), 238 deletions(-) create mode 100644 hive/db/sql_scripts/follow_ops.sql diff --git a/hive/db/schema.py b/hive/db/schema.py index 120b985c5..8f658de8a 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -579,6 +579,7 @@ def setup(db, admin_db): def setup_runtime_code(db): sql_scripts = [ "utility_functions.sql", + "follow_ops.sql", "hive_accounts_view.sql", "hive_accounts_info_view.sql", "hive_posts_base_view.sql", diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql new file mode 100644 index 000000000..99e14e00f --- /dev/null +++ b/hive/db/sql_scripts/follow_ops.sql @@ -0,0 +1,130 @@ +DROP PROCEDURE IF EXISTS hivemind_app.insert_follows CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.insert_follows(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) +LANGUAGE 'sql' +AS $$ + INSERT INTO hivemind_app.follows(follower, following, block_num) + VALUES (_follower_id, _following_id, _block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.delete_follows CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.delete_follows(_follower_id INTEGER, _following_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.follows + WHERE follower = _follower_id AND following = _following_id +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.insert_muted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.insert_muted(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) +LANGUAGE 'sql' +AS $$ + INSERT INTO hivemind_app.muted(follower, following, block_num) + VALUES (_follower_id, _following_id, _block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.delete_muted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.delete_muted(_follower_id INTEGER, _following_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.muted + WHERE follower = _follower_id AND following = _following_id +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.insert_blacklisted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.insert_blacklisted(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) +LANGUAGE 'sql' +AS $$ + INSERT INTO hivemind_app.blacklisted(follower, following, block_num) + VALUES (_follower_id, _following_id, _block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.delete_blacklisted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.delete_blacklisted(_follower_id INTEGER, _following_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.blacklisted + WHERE follower = _follower_id AND following = _following_id +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.insert_follow_muted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.insert_follow_muted(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) +LANGUAGE 'sql' +AS $$ + INSERT INTO hivemind_app.follow_muted(follower, following, block_num) + VALUES (_follower_id, _following_id, _block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.delete_follow_muted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.delete_follow_muted(_follower_id INTEGER, _following_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.follow_muted + WHERE follower = _follower_id AND following = _following_id +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.insert_follow_blacklisted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.insert_follow_blacklisted(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) +LANGUAGE 'sql' +AS $$ + INSERT INTO hivemind_app.follow_blacklisted(follower, following, block_num) + VALUES (_follower_id, _following_id, _block_num) + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.delete_follow_blacklisted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.delete_follow_blacklisted(_follower_id INTEGER, _following_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.follow_blacklisted + WHERE follower = _follower_id AND following = _following_id +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.reset_follows CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.reset_follows(_follower_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.follows + WHERE follower=_follower_id +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.reset_muted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.reset_muted(_follower_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.muted + WHERE follower=_follower_id +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.reset_blacklisted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.reset_blacklisted(_follower_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.blacklisted + WHERE follower=_follower_id +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.reset_follow_muted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.reset_follow_muted(_follower_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.follow_muted + WHERE follower=_follower_id +$$; + +DROP PROCEDURE IF EXISTS hivemind_app.reset_follow_blacklisted CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.reset_follow_blacklisted(_follower_id INTEGER) +LANGUAGE 'sql' +AS $$ + DELETE FROM hivemind_app.follow_blacklisted + WHERE follower=_follower_id +$$; + diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py index 55007764e..338b9940a 100644 --- a/hive/indexer/follow.py +++ b/hive/indexer/follow.py @@ -28,24 +28,16 @@ class FollowAction(enum.IntEnum): ResetAllLists = 16 # cancel all existing records of all types +def chunk(lst, n): + for i in range(0, len(lst), n): + yield lst[i:i + n] + + class Follow(DbAdapterHolder): """Handles processing of follow-related operations.""" items_to_flush = [] unique_names = set() - nothing_items_to_flush = {} - blacklisted_items_to_flush = {} - follow_muted_items_to_flush = {} - follow_blacklisted_items_to_flush = {} - unblacklist_items_to_flush = {} - unfollow_blacklisted_items_to_flush = {} - unfollow_muted_items_to_flush = {} - reset_blacklists_to_flush = {} - reset_followinglists_to_flush = {} - reset_mutedlists_to_flush = {} - reset_follow_blacklists_to_flush = {} - reset_follow_mutedlists_to_flush = {} - reset_all_lists_to_flush = {} idx = 0 @@ -142,6 +134,7 @@ class Follow(DbAdapterHolder): if missing_accounts: log.warning(f"Missing account IDs for names: {missing_accounts}") + queries = [] for (follower, following, op) in cls.items_to_flush: action = op['action'] follower_id = name_to_id.get(follower) @@ -151,290 +144,94 @@ class Follow(DbAdapterHolder): if not follower_id or not following_id: log.warning(f"Cannot insert follow record: missing IDs for follower '{follower}' or following '{following}'.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) + queries.append(f"CALL {SCHEMA_NAME}.delete_muted({follower_id}, {following_id})") + queries.append(f"CALL {SCHEMA_NAME}.insert_follows({follower_id}, {following_id}, {op['block_num']})") elif action == FollowAction.Mute: if not follower_id or not following_id: log.warning(f"Cannot insert mute record: missing IDs for follower '{follower}' or following '{following}'.") continue - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) + queries.append(f"CALL {SCHEMA_NAME}.insert_muted({follower_id}, {following_id}, {op['block_num']})") + queries.append(f"CALL {SCHEMA_NAME}.delete_follows({follower_id}, {following_id})") elif action == FollowAction.Nothing: if not follower_id or not following_id: log.warning(f"Cannot remove mute/follow record: missing IDs for follower '{follower}' or following '{following}'.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) + queries.append(f"CALL {SCHEMA_NAME}.delete_follows({follower_id}, {following_id})") + queries.append(f"CALL {SCHEMA_NAME}.delete_muted({follower_id}, {following_id})") elif action == FollowAction.Blacklist: if not follower_id or not following_id: log.warning(f"Cannot insert blacklist record: missing IDs for follower '{follower}' or following '{following}'.") continue - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) + queries.append(f"CALL {SCHEMA_NAME}.insert_blacklisted({follower_id}, {following_id}, {op['block_num']})") elif action == FollowAction.Unblacklist: if not follower_id or not following_id: log.warning(f"Cannot delete unblacklist record: missing IDs for follower '{follower}' or following '{following}'.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.blacklisted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) + queries.append(f"CALL {SCHEMA_NAME}.delete_blacklisted({follower_id}, {following_id})") elif action == FollowAction.FollowMuted: if not follower_id or not following_id: log.warning(f"Cannot insert follow_muted record: missing IDs for follower '{follower}' or following '{following}'.") continue - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) + queries.append(f"CALL {SCHEMA_NAME}.insert_follow_muted({follower_id}, {following_id}, {op['block_num']})") elif action == FollowAction.UnfollowMuted: if not follower_id or not following_id: log.warning(f"Cannot delete unfollow_muted record: missing IDs for follower '{follower}' or following '{following}'.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_muted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) + queries.append(f"CALL {SCHEMA_NAME}.delete_follow_muted({follower_id}, {following_id})") elif action == FollowAction.FollowBlacklisted: if not follower_id or not following_id: log.warning(f"Cannot insert follow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") continue - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=following_id, - block_num=op['block_num'] - ) + queries.append(f"CALL {SCHEMA_NAME}.insert_follow_blacklisted({follower_id}, {following_id}, {op['block_num']})") elif action == FollowAction.UnFollowBlacklisted: if not follower_id or not following_id: log.warning(f"Cannot delete unfollow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted - WHERE follower = :follower_id AND following = :following_id - """, - follower_id=follower_id, - following_id=following_id - ) + queries.append(f"CALL {SCHEMA_NAME}.delete_follow_blacklisted({follower_id}, {following_id})") elif action == FollowAction.ResetFollowingList: if not follower_id: log.warning("Cannot reset follow records: missing ID for follower.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower=:follower_id - """, - follower_id=follower_id - ) + queries.append(f"CALL {SCHEMA_NAME}.reset_follows({follower_id})") elif action == FollowAction.ResetMutedList: if not follower_id: log.warning("Cannot reset muted list records: missing ID for follower.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) + queries.append(f"CALL {SCHEMA_NAME}.reset_muted({follower_id})") elif action == FollowAction.ResetBlacklist: if not follower_id: log.warning("Cannot reset blacklist records: missing ID for follower.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.blacklisted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) + queries.append(f"CALL {SCHEMA_NAME}.reset_blacklisted({follower_id})") elif action == FollowAction.ResetFollowMutedList: if not follower_id: log.warning("Cannot reset follow muted list records: missing ID for follower.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_muted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=null_id, - block_num=op['block_num'] - ) + queries.append(f"CALL {SCHEMA_NAME}.reset_follow_muted({follower_id})") + queries.append(f"CALL {SCHEMA_NAME}.insert_follow_muted({follower_id}, {null_id}, {op['block_num']})") elif action == FollowAction.ResetFollowBlacklist: if not follower_id: log.warning("Cannot reset follow blacklist records: missing ID for follower.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=null_id, - block_num=op['block_num'] - ) + queries.append(f"CALL {SCHEMA_NAME}.reset_follow_blacklisted({follower_id})") + queries.append(f"CALL {SCHEMA_NAME}.insert_follow_blacklisted({follower_id}, {null_id}, {op['block_num']})") elif action == FollowAction.ResetAllLists: if not follower_id: log.warning("Cannot reset all follow list records: missing ID for follower.") continue - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.blacklisted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_muted - WHERE follower=:follower_id - """, - follower_id=follower_id - ) - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=null_id, - block_num=op['block_num'] - ) - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) - VALUES (:follower_id, :following_id, :block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """, - follower_id=follower_id, - following_id=null_id, - block_num=op['block_num'] - ) + queries.append(f"CALL {SCHEMA_NAME}.reset_blacklisted({follower_id})") + queries.append(f"CALL {SCHEMA_NAME}.reset_follows({follower_id})") + queries.append(f"CALL {SCHEMA_NAME}.reset_muted({follower_id})") + queries.append(f"CALL {SCHEMA_NAME}.reset_follow_blacklisted({follower_id})") + queries.append(f"CALL {SCHEMA_NAME}.reset_follow_muted({follower_id})") + queries.append(f"CALL {SCHEMA_NAME}.insert_follow_muted({follower_id}, {null_id}, {op['block_num']})") + queries.append(f"CALL {SCHEMA_NAME}.insert_follow_blacklisted({follower_id}, {null_id}, {op['block_num']})") else: raise Exception(f"Invalid action {action}") + for q in chunk(queries, 1000): + cls.db.query_no_return(';\n'.join(q)) + cls.items_to_flush.clear() cls.unique_names.clear() cls.commitTx() -- GitLab From 8ef0f05ed6f5e8f92c1b91f93c610ebcb49a4922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 10 Feb 2025 13:37:56 +0100 Subject: [PATCH 47/83] Batch related queries Also, remove name to id map. --- hive/db/schema.py | 1 - hive/db/sql_scripts/follow_ops.sql | 130 -------- hive/indexer/follow.py | 464 +++++++++++++++++++++-------- 3 files changed, 338 insertions(+), 257 deletions(-) delete mode 100644 hive/db/sql_scripts/follow_ops.sql diff --git a/hive/db/schema.py b/hive/db/schema.py index 8f658de8a..120b985c5 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -579,7 +579,6 @@ def setup(db, admin_db): def setup_runtime_code(db): sql_scripts = [ "utility_functions.sql", - "follow_ops.sql", "hive_accounts_view.sql", "hive_accounts_info_view.sql", "hive_posts_base_view.sql", diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql deleted file mode 100644 index 99e14e00f..000000000 --- a/hive/db/sql_scripts/follow_ops.sql +++ /dev/null @@ -1,130 +0,0 @@ -DROP PROCEDURE IF EXISTS hivemind_app.insert_follows CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.insert_follows(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) -LANGUAGE 'sql' -AS $$ - INSERT INTO hivemind_app.follows(follower, following, block_num) - VALUES (_follower_id, _following_id, _block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.delete_follows CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.delete_follows(_follower_id INTEGER, _following_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.follows - WHERE follower = _follower_id AND following = _following_id -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.insert_muted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.insert_muted(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) -LANGUAGE 'sql' -AS $$ - INSERT INTO hivemind_app.muted(follower, following, block_num) - VALUES (_follower_id, _following_id, _block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.delete_muted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.delete_muted(_follower_id INTEGER, _following_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.muted - WHERE follower = _follower_id AND following = _following_id -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.insert_blacklisted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.insert_blacklisted(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) -LANGUAGE 'sql' -AS $$ - INSERT INTO hivemind_app.blacklisted(follower, following, block_num) - VALUES (_follower_id, _following_id, _block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.delete_blacklisted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.delete_blacklisted(_follower_id INTEGER, _following_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.blacklisted - WHERE follower = _follower_id AND following = _following_id -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.insert_follow_muted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.insert_follow_muted(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) -LANGUAGE 'sql' -AS $$ - INSERT INTO hivemind_app.follow_muted(follower, following, block_num) - VALUES (_follower_id, _following_id, _block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.delete_follow_muted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.delete_follow_muted(_follower_id INTEGER, _following_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.follow_muted - WHERE follower = _follower_id AND following = _following_id -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.insert_follow_blacklisted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.insert_follow_blacklisted(_follower_id INTEGER, _following_id INTEGER, _block_num INTEGER) -LANGUAGE 'sql' -AS $$ - INSERT INTO hivemind_app.follow_blacklisted(follower, following, block_num) - VALUES (_follower_id, _following_id, _block_num) - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.delete_follow_blacklisted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.delete_follow_blacklisted(_follower_id INTEGER, _following_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.follow_blacklisted - WHERE follower = _follower_id AND following = _following_id -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.reset_follows CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.reset_follows(_follower_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.follows - WHERE follower=_follower_id -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.reset_muted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.reset_muted(_follower_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.muted - WHERE follower=_follower_id -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.reset_blacklisted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.reset_blacklisted(_follower_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.blacklisted - WHERE follower=_follower_id -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.reset_follow_muted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.reset_follow_muted(_follower_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.follow_muted - WHERE follower=_follower_id -$$; - -DROP PROCEDURE IF EXISTS hivemind_app.reset_follow_blacklisted CASCADE; -CREATE OR REPLACE PROCEDURE hivemind_app.reset_follow_blacklisted(_follower_id INTEGER) -LANGUAGE 'sql' -AS $$ - DELETE FROM hivemind_app.follow_blacklisted - WHERE follower=_follower_id -$$; - diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py index 338b9940a..7509518c7 100644 --- a/hive/indexer/follow.py +++ b/hive/indexer/follow.py @@ -28,16 +28,61 @@ class FollowAction(enum.IntEnum): ResetAllLists = 16 # cancel all existing records of all types -def chunk(lst, n): - for i in range(0, len(lst), n): - yield lst[i:i + n] +def insert_or_update(items, follower, following, block_num): + for (n, (itfollower, itfollowing, itblock_num)) in enumerate(items): + if follower == itfollower and following == itfollowing: + items[n] = (follower, following, block_num) + break + else: + items.append((follower, following, block_num)) + + +class Batch(): + + def __init__(self): + self.data = [('', [])] + + def iter(self): + return iter(self.data) + + def new(self, mode): + self.data.append((mode, [])) + + def mode(self): + (mode, _) = self.data[-1] + return mode + + def add_insert(self, follower, following, block_num): + if self.mode() != 'insert': + self.new('insert') + insert_or_update(self.data[-1][1], follower, following, block_num) + + def add_delete(self, follower, following, block_num): + if self.mode() != 'delete': + self.new('delete') + insert_or_update(self.data[-1][1], follower, following, block_num) + + def add_reset(self, follower, following, block_num): + if self.mode() != 'reset': + self.new('reset') + insert_or_update(self.data[-1][1], follower, following, block_num) + + def len(self): + return len(self.data) + + def clear(self): + self.data.clear() + self.new('') class Follow(DbAdapterHolder): """Handles processing of follow-related operations.""" - items_to_flush = [] - unique_names = set() + follows_batches_to_flush = Batch() + muted_batches_to_flush = Batch() + blacklisted_batches_to_flush = Batch() + follow_muted_batches_to_flush = Batch() + follow_blacklisted_batches_to_flush = Batch() idx = 0 @@ -89,8 +134,8 @@ class Follow(DbAdapterHolder): ] return { - 'follower': op['follower'], # Removed escape_characters - 'following': [following for following in op['following']], # Removed escape_characters + 'follower': escape_characters(op['follower']), + 'following': [escape_characters(following) for following in op['following']], 'action': defs[what] } @@ -103,136 +148,303 @@ class Follow(DbAdapterHolder): log.warning("Invalid operation: %s", op_json) return - op['block_num'] = block_num - follower = op['follower'] - cls.unique_names.add(follower) action = op['action'] - if action in [FollowAction.ResetBlacklist, FollowAction.ResetFollowingList, FollowAction.ResetMutedList, FollowAction.ResetFollowBlacklist, FollowAction.ResetFollowMutedList, FollowAction.ResetAllLists]: - cls.items_to_flush.append((follower, None, op)) - cls.idx += 1 - else: + if action == FollowAction.Nothing: + for following in op.get('following', []): + cls.follows_batches_to_flush.add_delete(follower, following, block_num) + cls.muted_batches_to_flush.add_delete(follower, following, block_num) + cls.idx += 1 + elif action == FollowAction.Follow: + for following in op.get('following', []): + cls.follows_batches_to_flush.add_insert(follower, following, block_num) + cls.muted_batches_to_flush.add_delete(follower, following, block_num) + cls.idx += 1 + elif action == FollowAction.Mute: + for following in op.get('following', []): + cls.muted_batches_to_flush.add_insert(follower, following, block_num) + cls.follows_batches_to_flush.add_delete(follower, following, block_num) + cls.idx += 1 + elif action == FollowAction.Blacklist: + for following in op.get('following', []): + cls.blacklisted_batches_to_flush.add_insert(follower, following, block_num) + cls.idx += 1 + elif action == FollowAction.Unblacklist: for following in op.get('following', []): - cls.items_to_flush.append((follower, following, op)) - cls.unique_names.add(following) + cls.blacklisted_batches_to_flush.add_delete(follower, following, block_num) cls.idx += 1 + elif action == FollowAction.FollowBlacklisted: + for following in op.get('following', []): + cls.follow_blacklisted_batches_to_flush.add_insert(follower, following, block_num) + cls.idx += 1 + elif action == FollowAction.UnFollowBlacklisted: + for following in op.get('following', []): + cls.follow_blacklisted_batches_to_flush.add_delete(follower, following, block_num) + cls.idx += 1 + elif action == FollowAction.FollowMuted: + for following in op.get('following', []): + cls.follow_muted_batches_to_flush.add_insert(follower, following, block_num) + cls.idx += 1 + elif action == FollowAction.UnfollowMuted: + for following in op.get('following', []): + cls.follow_muted_batches_to_flush.add_delete(follower, following, block_num) + cls.idx += 1 + elif action == FollowAction.ResetBlacklist: + cls.blacklisted_batches_to_flush.add_reset(follower, None, block_num) + cls.idx += 1 + elif action == FollowAction.ResetFollowingList: + cls.follows_batches_to_flush.add_reset(follower, None, block_num) + cls.idx += 1 + elif action == FollowAction.ResetMutedList: + cls.muted_batches_to_flush.add_reset(follower, None, block_num) + cls.idx += 1 + elif action == FollowAction.ResetFollowBlacklist: + cls.follow_blacklisted_batches_to_flush.add_reset(follower, None, block_num) + cls.follow_blacklisted_batches_to_flush.add_insert(follower, "'null'", block_num) + cls.idx += 1 + elif action == FollowAction.ResetFollowMutedList: + cls.follow_muted_batches_to_flush.add_reset(follower, None, block_num) + cls.follow_muted_batches_to_flush.add_insert(follower, "'null'", block_num) + cls.idx += 1 + elif action == FollowAction.ResetAllLists: + cls.blacklisted_batches_to_flush.add_reset(follower, None, block_num) + cls.follows_batches_to_flush.add_reset(follower, None, block_num) + cls.muted_batches_to_flush.add_reset(follower, None, block_num) + cls.follow_blacklisted_batches_to_flush.add_reset(follower, None, block_num) + cls.follow_muted_batches_to_flush.add_reset(follower, None, block_num) + cls.follow_blacklisted_batches_to_flush.add_insert(follower, "'null'", block_num) + cls.follow_muted_batches_to_flush.add_insert(follower, "'null'", block_num) + cls.idx += 1 @classmethod def flush(cls): """Flush accumulated follow operations to the database in batches.""" - if not cls.items_to_flush: + n = ( + cls.follows_batches_to_flush.len() + + cls.muted_batches_to_flush.len() + + cls.blacklisted_batches_to_flush.len() + + cls.follow_muted_batches_to_flush.len() + + cls.follow_blacklisted_batches_to_flush.len() + ) + if n == 0: return 0 - n = len(cls.items_to_flush) - cls.beginTx() - name_to_id_records = cls.db.query_all(f"""SELECT name, id FROM {SCHEMA_NAME}.hive_accounts WHERE name IN :names""", names=tuple(cls.unique_names | set(['null']))) - name_to_id = {record['name']: record['id'] for record in name_to_id_records} - - missing_accounts = cls.unique_names - set(name_to_id.keys()) - if missing_accounts: - log.warning(f"Missing account IDs for names: {missing_accounts}") - - queries = [] - for (follower, following, op) in cls.items_to_flush: - action = op['action'] - follower_id = name_to_id.get(follower) - following_id = name_to_id.get(following) - null_id = name_to_id.get('null') - if action == FollowAction.Follow: - if not follower_id or not following_id: - log.warning(f"Cannot insert follow record: missing IDs for follower '{follower}' or following '{following}'.") - continue - queries.append(f"CALL {SCHEMA_NAME}.delete_muted({follower_id}, {following_id})") - queries.append(f"CALL {SCHEMA_NAME}.insert_follows({follower_id}, {following_id}, {op['block_num']})") - elif action == FollowAction.Mute: - if not follower_id or not following_id: - log.warning(f"Cannot insert mute record: missing IDs for follower '{follower}' or following '{following}'.") - continue - queries.append(f"CALL {SCHEMA_NAME}.insert_muted({follower_id}, {following_id}, {op['block_num']})") - queries.append(f"CALL {SCHEMA_NAME}.delete_follows({follower_id}, {following_id})") - elif action == FollowAction.Nothing: - if not follower_id or not following_id: - log.warning(f"Cannot remove mute/follow record: missing IDs for follower '{follower}' or following '{following}'.") - continue - queries.append(f"CALL {SCHEMA_NAME}.delete_follows({follower_id}, {following_id})") - queries.append(f"CALL {SCHEMA_NAME}.delete_muted({follower_id}, {following_id})") - elif action == FollowAction.Blacklist: - if not follower_id or not following_id: - log.warning(f"Cannot insert blacklist record: missing IDs for follower '{follower}' or following '{following}'.") - continue - queries.append(f"CALL {SCHEMA_NAME}.insert_blacklisted({follower_id}, {following_id}, {op['block_num']})") - elif action == FollowAction.Unblacklist: - if not follower_id or not following_id: - log.warning(f"Cannot delete unblacklist record: missing IDs for follower '{follower}' or following '{following}'.") - continue - queries.append(f"CALL {SCHEMA_NAME}.delete_blacklisted({follower_id}, {following_id})") - elif action == FollowAction.FollowMuted: - if not follower_id or not following_id: - log.warning(f"Cannot insert follow_muted record: missing IDs for follower '{follower}' or following '{following}'.") - continue - queries.append(f"CALL {SCHEMA_NAME}.insert_follow_muted({follower_id}, {following_id}, {op['block_num']})") - elif action == FollowAction.UnfollowMuted: - if not follower_id or not following_id: - log.warning(f"Cannot delete unfollow_muted record: missing IDs for follower '{follower}' or following '{following}'.") - continue - queries.append(f"CALL {SCHEMA_NAME}.delete_follow_muted({follower_id}, {following_id})") - elif action == FollowAction.FollowBlacklisted: - if not follower_id or not following_id: - log.warning(f"Cannot insert follow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") - continue - queries.append(f"CALL {SCHEMA_NAME}.insert_follow_blacklisted({follower_id}, {following_id}, {op['block_num']})") - elif action == FollowAction.UnFollowBlacklisted: - if not follower_id or not following_id: - log.warning(f"Cannot delete unfollow_blacklisted record: missing IDs for follower '{follower}' or following '{following}'.") - continue - queries.append(f"CALL {SCHEMA_NAME}.delete_follow_blacklisted({follower_id}, {following_id})") - elif action == FollowAction.ResetFollowingList: - if not follower_id: - log.warning("Cannot reset follow records: missing ID for follower.") - continue - queries.append(f"CALL {SCHEMA_NAME}.reset_follows({follower_id})") - elif action == FollowAction.ResetMutedList: - if not follower_id: - log.warning("Cannot reset muted list records: missing ID for follower.") - continue - queries.append(f"CALL {SCHEMA_NAME}.reset_muted({follower_id})") - elif action == FollowAction.ResetBlacklist: - if not follower_id: - log.warning("Cannot reset blacklist records: missing ID for follower.") - continue - queries.append(f"CALL {SCHEMA_NAME}.reset_blacklisted({follower_id})") - elif action == FollowAction.ResetFollowMutedList: - if not follower_id: - log.warning("Cannot reset follow muted list records: missing ID for follower.") - continue - queries.append(f"CALL {SCHEMA_NAME}.reset_follow_muted({follower_id})") - queries.append(f"CALL {SCHEMA_NAME}.insert_follow_muted({follower_id}, {null_id}, {op['block_num']})") - elif action == FollowAction.ResetFollowBlacklist: - if not follower_id: - log.warning("Cannot reset follow blacklist records: missing ID for follower.") - continue - queries.append(f"CALL {SCHEMA_NAME}.reset_follow_blacklisted({follower_id})") - queries.append(f"CALL {SCHEMA_NAME}.insert_follow_blacklisted({follower_id}, {null_id}, {op['block_num']})") - elif action == FollowAction.ResetAllLists: - if not follower_id: - log.warning("Cannot reset all follow list records: missing ID for follower.") - continue - queries.append(f"CALL {SCHEMA_NAME}.reset_blacklisted({follower_id})") - queries.append(f"CALL {SCHEMA_NAME}.reset_follows({follower_id})") - queries.append(f"CALL {SCHEMA_NAME}.reset_muted({follower_id})") - queries.append(f"CALL {SCHEMA_NAME}.reset_follow_blacklisted({follower_id})") - queries.append(f"CALL {SCHEMA_NAME}.reset_follow_muted({follower_id})") - queries.append(f"CALL {SCHEMA_NAME}.insert_follow_muted({follower_id}, {null_id}, {op['block_num']})") - queries.append(f"CALL {SCHEMA_NAME}.insert_follow_blacklisted({follower_id}, {null_id}, {op['block_num']})") - else: - raise Exception(f"Invalid action {action}") - - for q in chunk(queries, 1000): - cls.db.query_no_return(';\n'.join(q)) - - cls.items_to_flush.clear() - cls.unique_names.clear() + for (mode, batch) in cls.follows_batches_to_flush.iter(): + if mode == 'insert': + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM ( + VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} + ) + AS v(follower, following, block_num) + JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name + JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """ + ) + elif mode == 'delete': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + {SCHEMA_NAME}.hive_accounts following_acc, + (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) + AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name; + """ + ) + elif mode == 'reset': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follows f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) + AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + """ + ) + + for (mode, batch) in cls.muted_batches_to_flush.iter(): + if mode == 'insert': + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM ( + VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} + ) + AS v(follower, following, block_num) + JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name + JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """ + ) + elif mode == 'delete': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + {SCHEMA_NAME}.hive_accounts following_acc, + (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) + AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name; + """ + ) + elif mode == 'reset': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.muted f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) + AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + """ + ) + + for (mode, batch) in cls.blacklisted_batches_to_flush.iter(): + if mode == 'insert': + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM ( + VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} + ) + AS v(follower, following, block_num) + JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name + JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """ + ) + elif mode == 'delete': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.blacklisted f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + {SCHEMA_NAME}.hive_accounts following_acc, + (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) + AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name; + """ + ) + elif mode == 'reset': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.blacklisted f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) + AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + """ + ) + + for (mode, batch) in cls.follow_muted_batches_to_flush.iter(): + if mode == 'insert': + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM ( + VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} + ) + AS v(follower, following, block_num) + JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name + JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """ + ) + elif mode == 'delete': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_muted f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + {SCHEMA_NAME}.hive_accounts following_acc, + (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) + AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name; + """ + ) + elif mode == 'reset': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_muted f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) + AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + """ + ) + + for (mode, batch) in cls.follow_blacklisted_batches_to_flush.iter(): + if mode == 'insert': + cls.db.query_no_return( + f""" + INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM ( + VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} + ) + AS v(follower, following, block_num) + JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name + JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + """ + ) + elif mode == 'delete': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + {SCHEMA_NAME}.hive_accounts following_acc, + (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) + AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name; + """ + ) + elif mode == 'reset': + cls.db.query_no_return( + f""" + DELETE FROM {SCHEMA_NAME}.follow_blacklisted f + USING {SCHEMA_NAME}.hive_accounts follower_acc, + (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) + AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + """ + ) + + cls.follows_batches_to_flush.clear() + cls.muted_batches_to_flush.clear() + cls.blacklisted_batches_to_flush.clear() + cls.follow_muted_batches_to_flush.clear() + cls.follow_blacklisted_batches_to_flush.clear() cls.commitTx() return n -- GitLab From 3df1a9ec59cc43c824e93a9bf78c2b36f23a75f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 10 Feb 2025 10:40:10 +0100 Subject: [PATCH 48/83] Add indices on block_num --- hive/db/db_state.py | 5 +++++ hive/db/schema.py | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/hive/db/db_state.py b/hive/db/db_state.py index c9063e388..f55e6b1e6 100644 --- a/hive/db/db_state.py +++ b/hive/db/db_state.py @@ -143,6 +143,11 @@ class DbState: 'follow_muted_following_idx', 'follow_blacklisted_follower_idx', 'follow_blacklisted_following_idx', + 'follows_block_num_idx', + 'muted_block_num_idx', + 'blacklisted_block_num_idx', + 'follow_muted_block_num_idx', + 'follow_blacklisted_block_num_idx', ] to_return = {} diff --git a/hive/db/schema.py b/hive/db/schema.py index 120b985c5..0114c82cc 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -302,6 +302,7 @@ def build_metadata(): sa.Column('block_num', sa.Integer, nullable=False), sa.Index('follows_follower_idx', 'follower'), sa.Index('follows_following_idx', 'following'), + sa.Index('follows_block_num_idx', 'block_num'), schema=SCHEMA_NAME ) @@ -312,6 +313,7 @@ def build_metadata(): sa.Column('block_num', sa.Integer, nullable=False), sa.Index('muted_follower_idx', 'follower'), sa.Index('muted_following_idx', 'following'), + sa.Index('muted_block_num_idx', 'block_num'), schema=SCHEMA_NAME ) @@ -322,6 +324,7 @@ def build_metadata(): sa.Column('block_num', sa.Integer, nullable=False), sa.Index('blacklisted_follower_idx', 'follower'), sa.Index('blacklisted_following_idx', 'following'), + sa.Index('blacklisted_block_num_idx', 'block_num'), schema=SCHEMA_NAME ) @@ -332,6 +335,7 @@ def build_metadata(): sa.Column('block_num', sa.Integer, nullable=False), sa.Index('follow_muted_follower_idx', 'follower'), sa.Index('follow_muted_following_idx', 'following'), + sa.Index('follow_muted_block_num_idx', 'block_num'), schema=SCHEMA_NAME ) @@ -342,6 +346,7 @@ def build_metadata(): sa.Column('block_num', sa.Integer, nullable=False), sa.Index('follow_blacklisted_follower_idx', 'follower'), sa.Index('follow_blacklisted_following_idx', 'following'), + sa.Index('follow_blacklisted_block_num_idx', 'block_num'), schema=SCHEMA_NAME ) -- GitLab From 389d4170765b99808a4e579ac9402ac554ca5a16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Fri, 14 Feb 2025 12:08:07 +0100 Subject: [PATCH 49/83] Reduce round trips to the database when updating follows --- hive/db/schema.py | 1 + hive/db/sql_scripts/follow_ops.sql | 358 +++++++++++++++++++++++++++++ hive/indexer/follow.py | 256 ++++----------------- 3 files changed, 406 insertions(+), 209 deletions(-) create mode 100644 hive/db/sql_scripts/follow_ops.sql diff --git a/hive/db/schema.py b/hive/db/schema.py index 0114c82cc..36c2ff8d8 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -584,6 +584,7 @@ def setup(db, admin_db): def setup_runtime_code(db): sql_scripts = [ "utility_functions.sql", + "follow_ops.sql", "hive_accounts_view.sql", "hive_accounts_info_view.sql", "hive_posts_base_view.sql", diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql new file mode 100644 index 000000000..3c7882c06 --- /dev/null +++ b/hive/db/sql_scripts/follow_ops.sql @@ -0,0 +1,358 @@ +DROP TYPE IF EXISTS hivemind_app.follow CASCADE; +CREATE TYPE hivemind_app.follow AS ( + follower TEXT, + following TEXT, + block_num INT +); +DROP TYPE IF EXISTS hivemind_app.follow_updates CASCADE; +CREATE TYPE hivemind_app.follow_updates AS ( + id INTEGER, + mode TEXT, + changes hivemind_app.follow[] +); +DROP TYPE IF EXISTS hivemind_app.mute CASCADE; +CREATE TYPE hivemind_app.mute AS ( + follower TEXT, + following TEXT, + block_num INT +); +DROP TYPE IF EXISTS hivemind_app.mute_updates CASCADE; +CREATE TYPE hivemind_app.mute_updates AS ( + id INTEGER, + mode TEXT, + changes hivemind_app.mute[] +); +DROP TYPE IF EXISTS hivemind_app.blacklist CASCADE; +CREATE TYPE hivemind_app.blacklist AS ( + follower TEXT, + following TEXT, + block_num INT +); +DROP TYPE IF EXISTS hivemind_app.blacklist_updates CASCADE; +CREATE TYPE hivemind_app.blacklist_updates AS ( + id INTEGER, + mode TEXT, + changes hivemind_app.blacklist[] +); +DROP TYPE IF EXISTS hivemind_app.follow_mute CASCADE; +CREATE TYPE hivemind_app.follow_mute AS ( + follower TEXT, + following TEXT, + block_num INT +); +DROP TYPE IF EXISTS hivemind_app.follow_mute_updates CASCADE; +CREATE TYPE hivemind_app.follow_mute_updates AS ( + id INTEGER, + mode TEXT, + changes hivemind_app.follow_mute[] +); +DROP TYPE IF EXISTS hivemind_app.follow_blacklist CASCADE; +CREATE TYPE hivemind_app.follow_blacklist AS ( + follower TEXT, + following TEXT, + block_num INT +); +DROP TYPE IF EXISTS hivemind_app.follow_blacklist_updates CASCADE; +CREATE TYPE hivemind_app.follow_blacklist_updates AS ( + id INTEGER, + mode TEXT, + changes hivemind_app.follow_blacklist[] +); + +DROP FUNCTION IF EXISTS hivemind_app.insert_follows; +CREATE OR REPLACE FUNCTION hivemind_app.insert_follows(_changes hivemind_app.follow[]) +RETURNS INTEGER AS $$ + INSERT INTO hivemind_app.follows (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM UNNEST(_changes) AS v(follower, following, block_num) + JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name + JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.delete_follows; +CREATE OR REPLACE FUNCTION hivemind_app.delete_follows(_changes hivemind_app.follow[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.follows f + USING hivemind_app.hive_accounts AS follower_acc, + hivemind_app.hive_accounts AS following_acc, + UNNEST(_changes) AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.reset_follows; +CREATE OR REPLACE FUNCTION hivemind_app.reset_follows(_changes TEXT[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.follows f + USING hivemind_app.hive_accounts AS follower_acc, + UNNEST(_changes) AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.insert_muted; +CREATE OR REPLACE FUNCTION hivemind_app.insert_muted(_changes hivemind_app.mute[]) +RETURNS INTEGER AS $$ + INSERT INTO hivemind_app.muted (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM UNNEST(_changes) AS v(follower, following, block_num) + JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name + JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.delete_muted; +CREATE OR REPLACE FUNCTION hivemind_app.delete_muted(_changes hivemind_app.mute[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.muted f + USING hivemind_app.hive_accounts AS follower_acc, + hivemind_app.hive_accounts AS following_acc, + UNNEST(_changes) AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.reset_muted; +CREATE OR REPLACE FUNCTION hivemind_app.reset_muted(_changes TEXT[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.muted f + USING hivemind_app.hive_accounts AS follower_acc, + UNNEST(_changes) AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.insert_blacklisted; +CREATE OR REPLACE FUNCTION hivemind_app.insert_blacklisted(_changes hivemind_app.blacklist[]) +RETURNS INTEGER AS $$ + INSERT INTO hivemind_app.blacklisted (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM UNNEST(_changes) AS v(follower, following, block_num) + JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name + JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.delete_blacklisted; +CREATE OR REPLACE FUNCTION hivemind_app.delete_blacklisted(_changes hivemind_app.blacklist[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.blacklisted f + USING hivemind_app.hive_accounts AS follower_acc, + hivemind_app.hive_accounts AS following_acc, + UNNEST(_changes) AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.reset_blacklisted; +CREATE OR REPLACE FUNCTION hivemind_app.reset_blacklisted(_changes TEXT[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.blacklisted f + USING hivemind_app.hive_accounts AS follower_acc, + UNNEST(_changes) AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.insert_follow_muted; +CREATE OR REPLACE FUNCTION hivemind_app.insert_follow_muted(_changes hivemind_app.follow_mute[]) +RETURNS INTEGER AS $$ + INSERT INTO hivemind_app.follow_muted (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM UNNEST(_changes) AS v(follower, following, block_num) + JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name + JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.delete_follow_muted; +CREATE OR REPLACE FUNCTION hivemind_app.delete_follow_muted(_changes hivemind_app.follow_mute[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.follow_muted f + USING hivemind_app.hive_accounts AS follower_acc, + hivemind_app.hive_accounts AS following_acc, + UNNEST(_changes) AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.reset_follow_muted; +CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_muted(_changes TEXT[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.follow_muted f + USING hivemind_app.hive_accounts AS follower_acc, + UNNEST(_changes) AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.insert_follow_blacklisted; +CREATE OR REPLACE FUNCTION hivemind_app.insert_follow_blacklisted(_changes hivemind_app.follow_blacklist[]) +RETURNS INTEGER AS $$ + INSERT INTO hivemind_app.follow_blacklisted (follower, following, block_num) + SELECT r.id, g.id, v.block_num + FROM UNNEST(_changes) AS v(follower, following, block_num) + JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name + JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + ON CONFLICT (follower, following) DO UPDATE + SET block_num = EXCLUDED.block_num + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.delete_follow_blacklisted; +CREATE OR REPLACE FUNCTION hivemind_app.delete_follow_blacklisted(_changes hivemind_app.follow_blacklist[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.follow_blacklisted f + USING hivemind_app.hive_accounts AS follower_acc, + hivemind_app.hive_accounts AS following_acc, + UNNEST(_changes) AS v(follower_name, following_name) + WHERE f.follower = follower_acc.id + AND f.following = following_acc.id + AND follower_acc.name = v.follower_name + AND following_acc.name = v.following_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP FUNCTION IF EXISTS hivemind_app.reset_follow_blacklisted; +CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_blacklisted(_changes TEXT[]) +RETURNS INTEGER AS $$ + DELETE FROM hivemind_app.follow_blacklisted f + USING hivemind_app.hive_accounts AS follower_acc, + UNNEST(_changes) AS v(follower_name) + WHERE f.follower = follower_acc.id + AND follower_acc.name = v.follower_name + RETURNING 1; +$$ LANGUAGE sql; + +DROP PROCEDURE IF EXISTS hivemind_app.flush_follows CASCADE; +CREATE OR REPLACE PROCEDURE hivemind_app.flush_follows(_follow_updates hivemind_app.follow_updates[], _muted_updates hivemind_app.mute_updates[], _blacklisted_updates hivemind_app.blacklist_updates[], _follow_muted_updates hivemind_app.follow_mute_updates[], _follow_blacklisted_updates hivemind_app.follow_blacklist_updates[], _impacted_accounts TEXT[]) +LANGUAGE 'plpgsql' +AS $BODY$ +DECLARE + _dummy INTEGER; +BEGIN + WITH accounts_id AS MATERIALIZED ( + SELECT ha.name, ha.id + FROM hivemind_app.hive_accounts ha + JOIN ( SELECT UNNEST( _impacted_accounts ) AS name ) AS im ON im.name = ha.name + ), + change_follows AS ( + SELECT + CASE upd.mode + WHEN 'insert' THEN ( + SELECT hivemind_app.insert_follows(upd.changes) + ) + WHEN 'delete' THEN ( + SELECT hivemind_app.delete_follows(upd.changes) + ) + WHEN 'reset' THEN ( + SELECT hivemind_app.reset_follows(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + ) + END + FROM unnest(_follow_updates) AS upd + ORDER BY upd.id + ), + change_muted AS ( + SELECT + CASE upd.mode + WHEN 'insert' THEN ( + SELECT hivemind_app.insert_muted(upd.changes) + ) + WHEN 'delete' THEN ( + SELECT hivemind_app.delete_muted(upd.changes) + ) + WHEN 'reset' THEN ( + SELECT hivemind_app.reset_muted(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + ) + END + FROM unnest(_muted_updates) AS upd + ORDER BY upd.id + ), + change_blacklisted AS ( + SELECT + CASE upd.mode + WHEN 'insert' THEN ( + SELECT hivemind_app.insert_blacklisted(upd.changes) + ) + WHEN 'delete' THEN ( + SELECT hivemind_app.delete_blacklisted(upd.changes) + ) + WHEN 'reset' THEN ( + SELECT hivemind_app.reset_blacklisted(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + ) + END + FROM unnest(_blacklisted_updates) AS upd + ORDER BY upd.id + ), + change_follow_muted AS ( + SELECT + CASE upd.mode + WHEN 'insert' THEN ( + SELECT hivemind_app.insert_follow_muted(upd.changes) + ) + WHEN 'delete' THEN ( + SELECT hivemind_app.delete_follow_muted(upd.changes) + ) + WHEN 'reset' THEN ( + SELECT hivemind_app.reset_follow_muted(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + ) + END + FROM unnest(_follow_muted_updates) AS upd + ORDER BY upd.id + ), + change_follow_blacklisted AS ( + SELECT + CASE upd.mode + WHEN 'insert' THEN ( + SELECT hivemind_app.insert_follow_blacklisted(upd.changes) + ) + WHEN 'delete' THEN ( + SELECT hivemind_app.delete_follow_blacklisted(upd.changes) + ) + WHEN 'reset' THEN ( + SELECT hivemind_app.reset_follow_blacklisted(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + ) + END + FROM unnest(_follow_blacklisted_updates) AS upd + ORDER BY upd.id + ) + SELECT COUNT(1) INTO _dummy + FROM ( + SELECT * FROM change_follows + UNION ALL + SELECT * FROM change_muted + UNION ALL + SELECT * FROM change_blacklisted + UNION ALL + SELECT * FROM change_follow_muted + UNION ALL + SELECT * FROM change_follow_blacklisted + ) AS x(val) + GROUP BY val; +END +$BODY$; diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py index 7509518c7..697ee86e0 100644 --- a/hive/indexer/follow.py +++ b/hive/indexer/follow.py @@ -83,7 +83,7 @@ class Follow(DbAdapterHolder): blacklisted_batches_to_flush = Batch() follow_muted_batches_to_flush = Batch() follow_blacklisted_batches_to_flush = Batch() - + affected_accounts = set() idx = 0 @classmethod @@ -150,44 +150,54 @@ class Follow(DbAdapterHolder): follower = op['follower'] action = op['action'] + cls.affected_accounts.add(follower) if action == FollowAction.Nothing: for following in op.get('following', []): cls.follows_batches_to_flush.add_delete(follower, following, block_num) cls.muted_batches_to_flush.add_delete(follower, following, block_num) + cls.affected_accounts.add(following) cls.idx += 1 elif action == FollowAction.Follow: for following in op.get('following', []): cls.follows_batches_to_flush.add_insert(follower, following, block_num) cls.muted_batches_to_flush.add_delete(follower, following, block_num) + cls.affected_accounts.add(following) cls.idx += 1 elif action == FollowAction.Mute: for following in op.get('following', []): cls.muted_batches_to_flush.add_insert(follower, following, block_num) cls.follows_batches_to_flush.add_delete(follower, following, block_num) + cls.affected_accounts.add(following) cls.idx += 1 elif action == FollowAction.Blacklist: for following in op.get('following', []): cls.blacklisted_batches_to_flush.add_insert(follower, following, block_num) + cls.affected_accounts.add(following) cls.idx += 1 elif action == FollowAction.Unblacklist: for following in op.get('following', []): cls.blacklisted_batches_to_flush.add_delete(follower, following, block_num) + cls.affected_accounts.add(following) cls.idx += 1 elif action == FollowAction.FollowBlacklisted: for following in op.get('following', []): cls.follow_blacklisted_batches_to_flush.add_insert(follower, following, block_num) + cls.affected_accounts.add(following) cls.idx += 1 elif action == FollowAction.UnFollowBlacklisted: for following in op.get('following', []): cls.follow_blacklisted_batches_to_flush.add_delete(follower, following, block_num) + cls.affected_accounts.add(following) cls.idx += 1 elif action == FollowAction.FollowMuted: for following in op.get('following', []): cls.follow_muted_batches_to_flush.add_insert(follower, following, block_num) + cls.affected_accounts.add(following) cls.idx += 1 elif action == FollowAction.UnfollowMuted: for following in op.get('following', []): cls.follow_muted_batches_to_flush.add_delete(follower, following, block_num) + cls.affected_accounts.add(following) cls.idx += 1 elif action == FollowAction.ResetBlacklist: cls.blacklisted_batches_to_flush.add_reset(follower, None, block_num) @@ -201,10 +211,12 @@ class Follow(DbAdapterHolder): elif action == FollowAction.ResetFollowBlacklist: cls.follow_blacklisted_batches_to_flush.add_reset(follower, None, block_num) cls.follow_blacklisted_batches_to_flush.add_insert(follower, "'null'", block_num) + cls.affected_accounts.add('null') cls.idx += 1 elif action == FollowAction.ResetFollowMutedList: cls.follow_muted_batches_to_flush.add_reset(follower, None, block_num) cls.follow_muted_batches_to_flush.add_insert(follower, "'null'", block_num) + cls.affected_accounts.add('null') cls.idx += 1 elif action == FollowAction.ResetAllLists: cls.blacklisted_batches_to_flush.add_reset(follower, None, block_num) @@ -214,6 +226,7 @@ class Follow(DbAdapterHolder): cls.follow_muted_batches_to_flush.add_reset(follower, None, block_num) cls.follow_blacklisted_batches_to_flush.add_insert(follower, "'null'", block_num) cls.follow_muted_batches_to_flush.add_insert(follower, "'null'", block_num) + cls.affected_accounts.add('null') cls.idx += 1 @classmethod @@ -231,216 +244,41 @@ class Follow(DbAdapterHolder): cls.beginTx() - for (mode, batch) in cls.follows_batches_to_flush.iter(): - if mode == 'insert': - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follows (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM ( - VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} - ) - AS v(follower, following, block_num) - JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name - JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """ - ) - elif mode == 'delete': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - {SCHEMA_NAME}.hive_accounts following_acc, - (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) - AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name; - """ - ) - elif mode == 'reset': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follows f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) - AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name - """ - ) - - for (mode, batch) in cls.muted_batches_to_flush.iter(): - if mode == 'insert': - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.muted (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM ( - VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} - ) - AS v(follower, following, block_num) - JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name - JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """ - ) - elif mode == 'delete': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - {SCHEMA_NAME}.hive_accounts following_acc, - (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) - AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name; - """ - ) - elif mode == 'reset': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.muted f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) - AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name - """ - ) - - for (mode, batch) in cls.blacklisted_batches_to_flush.iter(): - if mode == 'insert': - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.blacklisted (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM ( - VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} + follows = [] + muted = [] + blacklisted = [] + follow_muted = [] + follow_blacklisted = [] + for (n, (mode, batch)) in enumerate(cls.follows_batches_to_flush.iter()): + if mode!= '': + follows.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.follow" for r,g,b in batch])}])::hivemind_app.follow_updates""") + for (n, (mode, batch)) in enumerate(cls.muted_batches_to_flush.iter()): + if mode!= '': + muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.mute" for r,g,b in batch])}])::hivemind_app.mute_updates""") + for (n, (mode, batch)) in enumerate(cls.blacklisted_batches_to_flush.iter()): + if mode!= '': + blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.blacklist" for r,g,b in batch])}])::hivemind_app.blacklist_updates""") + for (n, (mode, batch)) in enumerate(cls.follow_muted_batches_to_flush.iter()): + if mode!= '': + follow_muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.follow_mute" for r,g,b in batch])}])::hivemind_app.follow_mute_updates""") + for (n, (mode, batch)) in enumerate(cls.follow_blacklisted_batches_to_flush.iter()): + if mode!= '': + follow_blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.follow_blacklist" for r,g,b in batch])}])::hivemind_app.follow_blacklist_updates""") + if follows or muted or blacklisted or follow_muted or follow_blacklisted: + cls.db.query_no_return( + f""" + CALL hivemind_app.flush_follows( + array[{','.join(follows)}]::hivemind_app.follow_updates[], + array[{','.join(muted)}]::hivemind_app.mute_updates[], + array[{','.join(blacklisted)}]::hivemind_app.blacklist_updates[], + array[{','.join(follow_muted)}]::hivemind_app.follow_mute_updates[], + array[{','.join(follow_blacklisted)}]::hivemind_app.follow_blacklist_updates[], + array[{','.join(cls.affected_accounts)}] ) - AS v(follower, following, block_num) - JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name - JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """ - ) - elif mode == 'delete': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.blacklisted f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - {SCHEMA_NAME}.hive_accounts following_acc, - (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) - AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name; - """ - ) - elif mode == 'reset': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.blacklisted f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) - AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name - """ - ) - - for (mode, batch) in cls.follow_muted_batches_to_flush.iter(): - if mode == 'insert': - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_muted (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM ( - VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} - ) - AS v(follower, following, block_num) - JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name - JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """ - ) - elif mode == 'delete': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_muted f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - {SCHEMA_NAME}.hive_accounts following_acc, - (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) - AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name; - """ - ) - elif mode == 'reset': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_muted f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) - AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name - """ - ) - - for (mode, batch) in cls.follow_blacklisted_batches_to_flush.iter(): - if mode == 'insert': - cls.db.query_no_return( - f""" - INSERT INTO {SCHEMA_NAME}.follow_blacklisted (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM ( - VALUES {', '.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in batch)} - ) - AS v(follower, following, block_num) - JOIN {SCHEMA_NAME}.hive_accounts AS r ON v.follower = r.name - JOIN {SCHEMA_NAME}.hive_accounts AS g ON v.following = g.name - ON CONFLICT (follower, following) DO UPDATE - SET block_num = EXCLUDED.block_num - """ - ) - elif mode == 'delete': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - {SCHEMA_NAME}.hive_accounts following_acc, - (VALUES {', '.join(f"({follower}, {following})" for (follower, following, _) in batch)}) - AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name; - """ - ) - elif mode == 'reset': - cls.db.query_no_return( - f""" - DELETE FROM {SCHEMA_NAME}.follow_blacklisted f - USING {SCHEMA_NAME}.hive_accounts follower_acc, - (VALUES {', '.join(f"({follower})" for (follower, _, _) in batch)}) - AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name - """ - ) + """ + ) + cls.affected_accounts.clear() cls.follows_batches_to_flush.clear() cls.muted_batches_to_flush.clear() cls.blacklisted_batches_to_flush.clear() -- GitLab From 9add67791e4ab8b8a70f13674b358c34a0970756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Fri, 14 Feb 2025 13:27:52 +0100 Subject: [PATCH 50/83] Do not add follow on null account on reset follow list --- hive/indexer/follow.py | 17 +++++------------ .../3xnull.pat.json | 4 ++-- .../5xnull.pat.json | 2 +- .../6xnull.pat.json | 2 +- .../7xnull.pat.json | 2 +- .../8xnull.pat.json | 2 +- .../9xnull.pat.json | 2 +- 7 files changed, 12 insertions(+), 19 deletions(-) diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py index 697ee86e0..2cd54a9ef 100644 --- a/hive/indexer/follow.py +++ b/hive/indexer/follow.py @@ -210,13 +210,9 @@ class Follow(DbAdapterHolder): cls.idx += 1 elif action == FollowAction.ResetFollowBlacklist: cls.follow_blacklisted_batches_to_flush.add_reset(follower, None, block_num) - cls.follow_blacklisted_batches_to_flush.add_insert(follower, "'null'", block_num) - cls.affected_accounts.add('null') cls.idx += 1 elif action == FollowAction.ResetFollowMutedList: cls.follow_muted_batches_to_flush.add_reset(follower, None, block_num) - cls.follow_muted_batches_to_flush.add_insert(follower, "'null'", block_num) - cls.affected_accounts.add('null') cls.idx += 1 elif action == FollowAction.ResetAllLists: cls.blacklisted_batches_to_flush.add_reset(follower, None, block_num) @@ -224,9 +220,6 @@ class Follow(DbAdapterHolder): cls.muted_batches_to_flush.add_reset(follower, None, block_num) cls.follow_blacklisted_batches_to_flush.add_reset(follower, None, block_num) cls.follow_muted_batches_to_flush.add_reset(follower, None, block_num) - cls.follow_blacklisted_batches_to_flush.add_insert(follower, "'null'", block_num) - cls.follow_muted_batches_to_flush.add_insert(follower, "'null'", block_num) - cls.affected_accounts.add('null') cls.idx += 1 @classmethod @@ -251,19 +244,19 @@ class Follow(DbAdapterHolder): follow_blacklisted = [] for (n, (mode, batch)) in enumerate(cls.follows_batches_to_flush.iter()): if mode!= '': - follows.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.follow" for r,g,b in batch])}])::hivemind_app.follow_updates""") + follows.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.follow" for r,g,b in batch])}])::hivemind_app.follow_updates""") for (n, (mode, batch)) in enumerate(cls.muted_batches_to_flush.iter()): if mode!= '': - muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.mute" for r,g,b in batch])}])::hivemind_app.mute_updates""") + muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.mute" for r,g,b in batch])}])::hivemind_app.mute_updates""") for (n, (mode, batch)) in enumerate(cls.blacklisted_batches_to_flush.iter()): if mode!= '': - blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.blacklist" for r,g,b in batch])}])::hivemind_app.blacklist_updates""") + blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.blacklist" for r,g,b in batch])}])::hivemind_app.blacklist_updates""") for (n, (mode, batch)) in enumerate(cls.follow_muted_batches_to_flush.iter()): if mode!= '': - follow_muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.follow_mute" for r,g,b in batch])}])::hivemind_app.follow_mute_updates""") + follow_muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.follow_mute" for r,g,b in batch])}])::hivemind_app.follow_mute_updates""") for (n, (mode, batch)) in enumerate(cls.follow_blacklisted_batches_to_flush.iter()): if mode!= '': - follow_blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'null'},{b})::hivemind_app.follow_blacklist" for r,g,b in batch])}])::hivemind_app.follow_blacklist_updates""") + follow_blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.follow_blacklist" for r,g,b in batch])}])::hivemind_app.follow_blacklist_updates""") if follows or muted or blacklisted or follow_muted or follow_blacklisted: cls.db.query_no_return( f""" diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3xnull.pat.json index 6811e2096..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/3xnull.pat.json @@ -1,7 +1,7 @@ { "blacklists": false, "follows": false, - "follows_blacklists": true, - "follows_muted": true, + "follows_blacklists": false, + "follows_muted": false, "ignores": false } diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5xnull.pat.json index ce88655e7..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/5xnull.pat.json @@ -2,6 +2,6 @@ "blacklists": false, "follows": false, "follows_blacklists": false, - "follows_muted": true, + "follows_muted": false, "ignores": false } diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6xnull.pat.json index d8216a702..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/6xnull.pat.json @@ -1,7 +1,7 @@ { "blacklists": false, "follows": false, - "follows_blacklists": true, + "follows_blacklists": false, "follows_muted": false, "ignores": false } diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7xnull.pat.json index ce88655e7..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/7xnull.pat.json @@ -2,6 +2,6 @@ "blacklists": false, "follows": false, "follows_blacklists": false, - "follows_muted": true, + "follows_muted": false, "ignores": false } diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8xnull.pat.json index d8216a702..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/8xnull.pat.json @@ -1,7 +1,7 @@ { "blacklists": false, "follows": false, - "follows_blacklists": true, + "follows_blacklists": false, "follows_muted": false, "ignores": false } diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9xnull.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9xnull.pat.json index ce88655e7..1f5f4c2a2 100644 --- a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9xnull.pat.json +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/9xnull.pat.json @@ -2,6 +2,6 @@ "blacklists": false, "follows": false, "follows_blacklists": false, - "follows_muted": true, + "follows_muted": false, "ignores": false } -- GitLab From cce46eec4e52321f2dd9d2e1f5d6aee2fad40e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Tue, 18 Feb 2025 10:58:04 +0100 Subject: [PATCH 51/83] Reduce joins against hivemind_app.hive_accounts --- hive/db/sql_scripts/follow_ops.sql | 316 +++++++++++++++++------------ 1 file changed, 182 insertions(+), 134 deletions(-) diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql index 3c7882c06..f83ee6c10 100644 --- a/hive/db/sql_scripts/follow_ops.sql +++ b/hive/db/sql_scripts/follow_ops.sql @@ -4,54 +4,88 @@ CREATE TYPE hivemind_app.follow AS ( following TEXT, block_num INT ); +DROP TYPE IF EXISTS hivemind_app.follow_ids CASCADE; +CREATE TYPE hivemind_app.follow_ids AS ( + follower_id INTEGER, + following_id INTEGER, + block_num INTEGER +); DROP TYPE IF EXISTS hivemind_app.follow_updates CASCADE; CREATE TYPE hivemind_app.follow_updates AS ( id INTEGER, mode TEXT, changes hivemind_app.follow[] ); + DROP TYPE IF EXISTS hivemind_app.mute CASCADE; CREATE TYPE hivemind_app.mute AS ( follower TEXT, following TEXT, block_num INT ); +DROP TYPE IF EXISTS hivemind_app.mute_ids CASCADE; +CREATE TYPE hivemind_app.mute_ids AS ( + follower_id INTEGER, + following_id INTEGER, + block_num INTEGER +); DROP TYPE IF EXISTS hivemind_app.mute_updates CASCADE; CREATE TYPE hivemind_app.mute_updates AS ( id INTEGER, mode TEXT, changes hivemind_app.mute[] ); + DROP TYPE IF EXISTS hivemind_app.blacklist CASCADE; CREATE TYPE hivemind_app.blacklist AS ( follower TEXT, following TEXT, block_num INT ); +DROP TYPE IF EXISTS hivemind_app.blacklist_ids CASCADE; +CREATE TYPE hivemind_app.blacklist_ids AS ( + follower_id INTEGER, + following_id INTEGER, + block_num INTEGER +); DROP TYPE IF EXISTS hivemind_app.blacklist_updates CASCADE; CREATE TYPE hivemind_app.blacklist_updates AS ( id INTEGER, mode TEXT, changes hivemind_app.blacklist[] ); + DROP TYPE IF EXISTS hivemind_app.follow_mute CASCADE; CREATE TYPE hivemind_app.follow_mute AS ( follower TEXT, following TEXT, block_num INT ); +DROP TYPE IF EXISTS hivemind_app.follow_mute_ids CASCADE; +CREATE TYPE hivemind_app.follow_mute_ids AS ( + follower_id INTEGER, + following_id INTEGER, + block_num INTEGER +); DROP TYPE IF EXISTS hivemind_app.follow_mute_updates CASCADE; CREATE TYPE hivemind_app.follow_mute_updates AS ( id INTEGER, mode TEXT, changes hivemind_app.follow_mute[] ); + DROP TYPE IF EXISTS hivemind_app.follow_blacklist CASCADE; CREATE TYPE hivemind_app.follow_blacklist AS ( follower TEXT, following TEXT, block_num INT ); +DROP TYPE IF EXISTS hivemind_app.follow_blacklist_ids CASCADE; +CREATE TYPE hivemind_app.follow_blacklist_ids AS ( + follower_id INTEGER, + following_id INTEGER, + block_num INTEGER +); DROP TYPE IF EXISTS hivemind_app.follow_blacklist_updates CASCADE; CREATE TYPE hivemind_app.follow_blacklist_updates AS ( id INTEGER, @@ -60,192 +94,151 @@ CREATE TYPE hivemind_app.follow_blacklist_updates AS ( ); DROP FUNCTION IF EXISTS hivemind_app.insert_follows; -CREATE OR REPLACE FUNCTION hivemind_app.insert_follows(_changes hivemind_app.follow[]) +CREATE OR REPLACE FUNCTION hivemind_app.insert_follows(_changes hivemind_app.follow_ids[]) RETURNS INTEGER AS $$ INSERT INTO hivemind_app.follows (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM UNNEST(_changes) AS v(follower, following, block_num) - JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name - JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + SELECT v.follower_id, v.following_id, v.block_num + FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.delete_follows; -CREATE OR REPLACE FUNCTION hivemind_app.delete_follows(_changes hivemind_app.follow[]) +CREATE OR REPLACE FUNCTION hivemind_app.delete_follows(_changes hivemind_app.follow_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.follows f - USING hivemind_app.hive_accounts AS follower_acc, - hivemind_app.hive_accounts AS following_acc, - UNNEST(_changes) AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name + USING UNNEST(_changes) AS v(follower_id, following_id) + WHERE f.follower = v.follower_id + AND f.following = v.following_id RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_follows; -CREATE OR REPLACE FUNCTION hivemind_app.reset_follows(_changes TEXT[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_follows(_changes INTEGER[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.follows f - USING hivemind_app.hive_accounts AS follower_acc, - UNNEST(_changes) AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name + USING UNNEST(_changes) AS v(follower_id) + WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.insert_muted; -CREATE OR REPLACE FUNCTION hivemind_app.insert_muted(_changes hivemind_app.mute[]) +CREATE OR REPLACE FUNCTION hivemind_app.insert_muted(_changes hivemind_app.mute_ids[]) RETURNS INTEGER AS $$ INSERT INTO hivemind_app.muted (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM UNNEST(_changes) AS v(follower, following, block_num) - JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name - JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + SELECT v.follower_id, v.following_id, v.block_num + FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.delete_muted; -CREATE OR REPLACE FUNCTION hivemind_app.delete_muted(_changes hivemind_app.mute[]) +CREATE OR REPLACE FUNCTION hivemind_app.delete_muted(_changes hivemind_app.mute_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.muted f - USING hivemind_app.hive_accounts AS follower_acc, - hivemind_app.hive_accounts AS following_acc, - UNNEST(_changes) AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name + USING UNNEST(_changes) AS v(follower_id, following_id) + WHERE f.follower = v.follower_id + AND f.following = v.following_id RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_muted; -CREATE OR REPLACE FUNCTION hivemind_app.reset_muted(_changes TEXT[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_muted(_changes INTEGER[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.muted f - USING hivemind_app.hive_accounts AS follower_acc, - UNNEST(_changes) AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name + USING UNNEST(_changes) AS v(follower_id) + WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.insert_blacklisted; -CREATE OR REPLACE FUNCTION hivemind_app.insert_blacklisted(_changes hivemind_app.blacklist[]) +CREATE OR REPLACE FUNCTION hivemind_app.insert_blacklisted(_changes hivemind_app.blacklist_ids[]) RETURNS INTEGER AS $$ INSERT INTO hivemind_app.blacklisted (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM UNNEST(_changes) AS v(follower, following, block_num) - JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name - JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + SELECT v.follower_id, v.following_id, v.block_num + FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.delete_blacklisted; -CREATE OR REPLACE FUNCTION hivemind_app.delete_blacklisted(_changes hivemind_app.blacklist[]) +CREATE OR REPLACE FUNCTION hivemind_app.delete_blacklisted(_changes hivemind_app.blacklist_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.blacklisted f - USING hivemind_app.hive_accounts AS follower_acc, - hivemind_app.hive_accounts AS following_acc, - UNNEST(_changes) AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name + USING UNNEST(_changes) AS v(follower_id) + WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_blacklisted; -CREATE OR REPLACE FUNCTION hivemind_app.reset_blacklisted(_changes TEXT[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_blacklisted(_changes INTEGER[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.blacklisted f - USING hivemind_app.hive_accounts AS follower_acc, - UNNEST(_changes) AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name + USING UNNEST(_changes) AS v(follower_id) + WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.insert_follow_muted; -CREATE OR REPLACE FUNCTION hivemind_app.insert_follow_muted(_changes hivemind_app.follow_mute[]) +CREATE OR REPLACE FUNCTION hivemind_app.insert_follow_muted(_changes hivemind_app.follow_mute_ids[]) RETURNS INTEGER AS $$ INSERT INTO hivemind_app.follow_muted (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM UNNEST(_changes) AS v(follower, following, block_num) - JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name - JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + SELECT v.follower_id, v.following_id, v.block_num + FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.delete_follow_muted; -CREATE OR REPLACE FUNCTION hivemind_app.delete_follow_muted(_changes hivemind_app.follow_mute[]) +CREATE OR REPLACE FUNCTION hivemind_app.delete_follow_muted(_changes hivemind_app.follow_mute_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.follow_muted f - USING hivemind_app.hive_accounts AS follower_acc, - hivemind_app.hive_accounts AS following_acc, - UNNEST(_changes) AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name + USING UNNEST(_changes) AS v(follower_id, following_id) + WHERE f.follower = v.follower_id + AND f.following = v.following_id RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_follow_muted; -CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_muted(_changes TEXT[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_muted(_changes INTEGER[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.follow_muted f - USING hivemind_app.hive_accounts AS follower_acc, - UNNEST(_changes) AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name + USING UNNEST(_changes) AS v(follower_id) + WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.insert_follow_blacklisted; -CREATE OR REPLACE FUNCTION hivemind_app.insert_follow_blacklisted(_changes hivemind_app.follow_blacklist[]) +CREATE OR REPLACE FUNCTION hivemind_app.insert_follow_blacklisted(_changes hivemind_app.follow_blacklist_ids[]) RETURNS INTEGER AS $$ INSERT INTO hivemind_app.follow_blacklisted (follower, following, block_num) - SELECT r.id, g.id, v.block_num - FROM UNNEST(_changes) AS v(follower, following, block_num) - JOIN hivemind_app.hive_accounts AS r ON v.follower = r.name - JOIN hivemind_app.hive_accounts AS g ON v.following = g.name + SELECT v.follower_id, v.following_id, v.block_num + FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.delete_follow_blacklisted; -CREATE OR REPLACE FUNCTION hivemind_app.delete_follow_blacklisted(_changes hivemind_app.follow_blacklist[]) +CREATE OR REPLACE FUNCTION hivemind_app.delete_follow_blacklisted(_changes hivemind_app.follow_blacklist_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.follow_blacklisted f - USING hivemind_app.hive_accounts AS follower_acc, - hivemind_app.hive_accounts AS following_acc, - UNNEST(_changes) AS v(follower_name, following_name) - WHERE f.follower = follower_acc.id - AND f.following = following_acc.id - AND follower_acc.name = v.follower_name - AND following_acc.name = v.following_name + USING UNNEST(_changes) AS v(follower_id, following_id) + WHERE f.follower = v.follower_id + AND f.following = v.following_id RETURNING 1; $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_follow_blacklisted; -CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_blacklisted(_changes TEXT[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_blacklisted(_changes INTEGER[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.follow_blacklisted f - USING hivemind_app.hive_accounts AS follower_acc, - UNNEST(_changes) AS v(follower_name) - WHERE f.follower = follower_acc.id - AND follower_acc.name = v.follower_name + USING UNNEST(_changes) AS v(follower_id) + WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; @@ -263,96 +256,151 @@ BEGIN ), change_follows AS ( SELECT - CASE upd.mode + CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_follows(upd.changes) + SELECT hivemind_app.insert_follows(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_follows(upd.changes) + SELECT hivemind_app.delete_follows(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_follows(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + SELECT hivemind_app.reset_follows(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) ) END - FROM unnest(_follow_updates) AS upd - ORDER BY upd.id + FROM ( + SELECT + upd.id, + upd.mode, + ARRAY_AGG( ROW(r.id, g.id, ch.block_num)::hivemind_app.follow_ids) AS changes + FROM UNNEST(_follow_updates) AS upd + CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) + JOIN accounts_id AS r ON ch.follower = r.name + JOIN accounts_id AS g ON ch.following = g.name + GROUP BY upd.id, upd.mode + ORDER BY upd.id + ) AS upd_with_ids + ORDER BY upd_with_ids.id ), change_muted AS ( SELECT - CASE upd.mode + CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_muted(upd.changes) + SELECT hivemind_app.insert_muted(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_muted(upd.changes) + SELECT hivemind_app.delete_muted(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_muted(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + SELECT hivemind_app.reset_muted(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) ) END - FROM unnest(_muted_updates) AS upd - ORDER BY upd.id + FROM ( + SELECT + upd.id, + upd.mode, + ARRAY_AGG( ROW(r.id, g.id, ch.block_num)::hivemind_app.mute_ids) AS changes + FROM UNNEST(_muted_updates) AS upd + CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) + JOIN accounts_id AS r ON ch.follower = r.name + JOIN accounts_id AS g ON ch.following = g.name + GROUP BY upd.id, upd.mode + ORDER BY upd.id + ) AS upd_with_ids + ORDER BY upd_with_ids.id ), change_blacklisted AS ( SELECT - CASE upd.mode + CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_blacklisted(upd.changes) + SELECT hivemind_app.insert_blacklisted(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_blacklisted(upd.changes) + SELECT hivemind_app.delete_blacklisted(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_blacklisted(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + SELECT hivemind_app.reset_blacklisted(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) ) END - FROM unnest(_blacklisted_updates) AS upd - ORDER BY upd.id + FROM ( + SELECT + upd.id, + upd.mode, + ARRAY_AGG( ROW(r.id, g.id, ch.block_num)::hivemind_app.blacklist_ids) AS changes + FROM UNNEST(_blacklisted_updates) AS upd + CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) + JOIN accounts_id AS r ON ch.follower = r.name + JOIN accounts_id AS g ON ch.following = g.name + GROUP BY upd.id, upd.mode + ORDER BY upd.id + ) AS upd_with_ids + ORDER BY upd_with_ids.id ), change_follow_muted AS ( SELECT - CASE upd.mode + CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_follow_muted(upd.changes) + SELECT hivemind_app.insert_follow_muted(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_follow_muted(upd.changes) + SELECT hivemind_app.delete_follow_muted(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_follow_muted(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + SELECT hivemind_app.reset_follow_muted(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) ) END - FROM unnest(_follow_muted_updates) AS upd - ORDER BY upd.id + FROM ( + SELECT + upd.id, + upd.mode, + ARRAY_AGG( ROW(r.id, g.id, ch.block_num)::hivemind_app.follow_mute_ids) AS changes + FROM UNNEST(_follow_muted_updates) AS upd + CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) + JOIN accounts_id AS r ON ch.follower = r.name + JOIN accounts_id AS g ON ch.following = g.name + GROUP BY upd.id, upd.mode + ORDER BY upd.id + ) AS upd_with_ids + ORDER BY upd_with_ids.id ), change_follow_blacklisted AS ( SELECT - CASE upd.mode + CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_follow_blacklisted(upd.changes) + SELECT hivemind_app.insert_follow_blacklisted(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_follow_blacklisted(upd.changes) + SELECT hivemind_app.delete_follow_blacklisted(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_follow_blacklisted(ARRAY(SELECT v.follower FROM UNNEST(upd.changes) AS v(follower, following, block_num))) + SELECT hivemind_app.reset_follow_blacklisted(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) ) END - FROM unnest(_follow_blacklisted_updates) AS upd - ORDER BY upd.id - ) - SELECT COUNT(1) INTO _dummy - FROM ( - SELECT * FROM change_follows - UNION ALL - SELECT * FROM change_muted - UNION ALL - SELECT * FROM change_blacklisted - UNION ALL - SELECT * FROM change_follow_muted - UNION ALL - SELECT * FROM change_follow_blacklisted - ) AS x(val) - GROUP BY val; + FROM ( + SELECT + upd.id, + upd.mode, + ARRAY_AGG( ROW(r.id, g.id, ch.block_num)::hivemind_app.follow_blacklist_ids) AS changes + FROM UNNEST(_follow_blacklisted_updates) AS upd + CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) + JOIN accounts_id AS r ON ch.follower = r.name + JOIN accounts_id AS g ON ch.following = g.name + GROUP BY upd.id, upd.mode + ORDER BY upd.id + ) AS upd_with_ids + ORDER BY upd_with_ids.id +) +SELECT COUNT(1) INTO _dummy +FROM ( + SELECT * FROM change_follows + UNION ALL + SELECT * FROM change_muted + UNION ALL + SELECT * FROM change_blacklisted + UNION ALL + SELECT * FROM change_follow_muted + UNION ALL + SELECT * FROM change_follow_blacklisted +) AS x(val) +GROUP BY val; END $BODY$; -- GitLab From 21c19c99d236a5f62147a66cd6cce5400c3e41e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 20 Feb 2025 17:09:12 +0100 Subject: [PATCH 52/83] Order inserts --- hive/db/sql_scripts/follow_ops.sql | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql index f83ee6c10..79808767e 100644 --- a/hive/db/sql_scripts/follow_ops.sql +++ b/hive/db/sql_scripts/follow_ops.sql @@ -99,6 +99,7 @@ RETURNS INTEGER AS $$ INSERT INTO hivemind_app.follows (follower, following, block_num) SELECT v.follower_id, v.following_id, v.block_num FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) + ORDER BY v.block_num ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; @@ -129,6 +130,7 @@ RETURNS INTEGER AS $$ INSERT INTO hivemind_app.muted (follower, following, block_num) SELECT v.follower_id, v.following_id, v.block_num FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) + ORDER BY v.block_num ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; @@ -159,6 +161,7 @@ RETURNS INTEGER AS $$ INSERT INTO hivemind_app.blacklisted (follower, following, block_num) SELECT v.follower_id, v.following_id, v.block_num FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) + ORDER BY v.block_num ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; @@ -188,6 +191,7 @@ RETURNS INTEGER AS $$ INSERT INTO hivemind_app.follow_muted (follower, following, block_num) SELECT v.follower_id, v.following_id, v.block_num FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) + ORDER BY v.block_num ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; @@ -218,6 +222,7 @@ RETURNS INTEGER AS $$ INSERT INTO hivemind_app.follow_blacklisted (follower, following, block_num) SELECT v.follower_id, v.following_id, v.block_num FROM UNNEST(_changes) AS v(follower_id, following_id, block_num) + ORDER BY v.block_num ON CONFLICT (follower, following) DO UPDATE SET block_num = EXCLUDED.block_num RETURNING 1; -- GitLab From 62dc3c9cd62734bf8df6f038d6d29e5eeb78cddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 20 Feb 2025 17:12:42 +0100 Subject: [PATCH 53/83] Change reset functions to have the same signature as insert/delete functions --- hive/db/sql_scripts/follow_ops.sql | 50 +++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql index 79808767e..42ef42cc5 100644 --- a/hive/db/sql_scripts/follow_ops.sql +++ b/hive/db/sql_scripts/follow_ops.sql @@ -116,10 +116,10 @@ RETURNS INTEGER AS $$ $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_follows; -CREATE OR REPLACE FUNCTION hivemind_app.reset_follows(_changes INTEGER[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_follows(_changes hivemind_app.follow_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.follows f - USING UNNEST(_changes) AS v(follower_id) + USING UNNEST(_changes) AS v(follower_id, following_id, block_num) WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; @@ -147,10 +147,10 @@ RETURNS INTEGER AS $$ $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_muted; -CREATE OR REPLACE FUNCTION hivemind_app.reset_muted(_changes INTEGER[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_muted(_changes hivemind_app.mute_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.muted f - USING UNNEST(_changes) AS v(follower_id) + USING UNNEST(_changes) AS v(follower_id, following_id, block_num) WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; @@ -177,10 +177,10 @@ RETURNS INTEGER AS $$ $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_blacklisted; -CREATE OR REPLACE FUNCTION hivemind_app.reset_blacklisted(_changes INTEGER[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_blacklisted(_changes hivemind_app.blacklist_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.blacklisted f - USING UNNEST(_changes) AS v(follower_id) + USING UNNEST(_changes) AS v(follower_id, following_id, block_num) WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; @@ -208,10 +208,10 @@ RETURNS INTEGER AS $$ $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_follow_muted; -CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_muted(_changes INTEGER[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_muted(_changes hivemind_app.follow_mute_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.follow_muted f - USING UNNEST(_changes) AS v(follower_id) + USING UNNEST(_changes) AS v(follower_id, following_id, block_num) WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; @@ -239,10 +239,10 @@ RETURNS INTEGER AS $$ $$ LANGUAGE sql; DROP FUNCTION IF EXISTS hivemind_app.reset_follow_blacklisted; -CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_blacklisted(_changes INTEGER[]) +CREATE OR REPLACE FUNCTION hivemind_app.reset_follow_blacklisted(_changes hivemind_app.follow_blacklist_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.follow_blacklisted f - USING UNNEST(_changes) AS v(follower_id) + USING UNNEST(_changes) AS v(follower_id, following_id, block_num) WHERE f.follower = v.follower_id RETURNING 1; $$ LANGUAGE sql; @@ -263,13 +263,13 @@ BEGIN SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_follows(upd_with_ids.changes) + hivemind_app.insert_follows(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_follows(upd_with_ids.changes) + hivemind_app.delete_follows(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_follows(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) + hivemind_app.reset_follows(upd_with_ids.changes) ) END FROM ( @@ -290,13 +290,13 @@ BEGIN SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_muted(upd_with_ids.changes) + hivemind_app.insert_muted(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_muted(upd_with_ids.changes) + hivemind_app.delete_muted(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_muted(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) + hivemind_app.reset_muted(upd_with_ids.changes) ) END FROM ( @@ -317,13 +317,13 @@ BEGIN SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_blacklisted(upd_with_ids.changes) + hivemind_app.insert_blacklisted(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_blacklisted(upd_with_ids.changes) + hivemind_app.delete_blacklisted(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_blacklisted(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) + hivemind_app.reset_blacklisted(upd_with_ids.changes) ) END FROM ( @@ -344,13 +344,13 @@ BEGIN SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_follow_muted(upd_with_ids.changes) + hivemind_app.insert_follow_muted(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_follow_muted(upd_with_ids.changes) + hivemind_app.delete_follow_muted(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_follow_muted(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) + hivemind_app.reset_follow_muted(upd_with_ids.changes) ) END FROM ( @@ -371,13 +371,13 @@ BEGIN SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( - SELECT hivemind_app.insert_follow_blacklisted(upd_with_ids.changes) + hivemind_app.insert_follow_blacklisted(upd_with_ids.changes) ) WHEN 'delete' THEN ( - SELECT hivemind_app.delete_follow_blacklisted(upd_with_ids.changes) + hivemind_app.delete_follow_blacklisted(upd_with_ids.changes) ) WHEN 'reset' THEN ( - SELECT hivemind_app.reset_follow_blacklisted(ARRAY(SELECT v.follower FROM UNNEST(upd_with_ids.changes) AS v(follower, following, block_num))) + hivemind_app.reset_follow_blacklisted(upd_with_ids.changes) ) END FROM ( -- GitLab From c1615e4d9fb5469c5b5d731c9c1a5434872d438e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 20 Feb 2025 17:14:42 +0100 Subject: [PATCH 54/83] Fix hivemind_app.delete_blacklisted The functions was deleting too many records, because of missing check on following column. --- hive/db/sql_scripts/follow_ops.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql index 42ef42cc5..9d9f11e6c 100644 --- a/hive/db/sql_scripts/follow_ops.sql +++ b/hive/db/sql_scripts/follow_ops.sql @@ -171,8 +171,9 @@ DROP FUNCTION IF EXISTS hivemind_app.delete_blacklisted; CREATE OR REPLACE FUNCTION hivemind_app.delete_blacklisted(_changes hivemind_app.blacklist_ids[]) RETURNS INTEGER AS $$ DELETE FROM hivemind_app.blacklisted f - USING UNNEST(_changes) AS v(follower_id) + USING UNNEST(_changes) AS v(follower_id, following_id) WHERE f.follower = v.follower_id + AND f.following = v.following_id RETURNING 1; $$ LANGUAGE sql; -- GitLab From 146cb229f0ae8ece26bb9e200e0ec94721ee61d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 20 Feb 2025 17:26:26 +0100 Subject: [PATCH 55/83] Change hivemind_app.flush_follows to be sql function --- hive/db/sql_scripts/follow_ops.sql | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql index 9d9f11e6c..d2e14313b 100644 --- a/hive/db/sql_scripts/follow_ops.sql +++ b/hive/db/sql_scripts/follow_ops.sql @@ -250,11 +250,8 @@ $$ LANGUAGE sql; DROP PROCEDURE IF EXISTS hivemind_app.flush_follows CASCADE; CREATE OR REPLACE PROCEDURE hivemind_app.flush_follows(_follow_updates hivemind_app.follow_updates[], _muted_updates hivemind_app.mute_updates[], _blacklisted_updates hivemind_app.blacklist_updates[], _follow_muted_updates hivemind_app.follow_mute_updates[], _follow_blacklisted_updates hivemind_app.follow_blacklist_updates[], _impacted_accounts TEXT[]) -LANGUAGE 'plpgsql' +LANGUAGE sql AS $BODY$ -DECLARE - _dummy INTEGER; -BEGIN WITH accounts_id AS MATERIALIZED ( SELECT ha.name, ha.id FROM hivemind_app.hive_accounts ha @@ -395,7 +392,7 @@ BEGIN ) AS upd_with_ids ORDER BY upd_with_ids.id ) -SELECT COUNT(1) INTO _dummy +SELECT COUNT(*) FROM ( SELECT * FROM change_follows UNION ALL @@ -408,5 +405,4 @@ FROM ( SELECT * FROM change_follow_blacklisted ) AS x(val) GROUP BY val; -END $BODY$; -- GitLab From d96921977aecedee2eb806e226f03f362af14bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 20 Feb 2025 17:27:18 +0100 Subject: [PATCH 56/83] Left joins on following columns The issue was that resets were not effective and were not deleting rows. This is because following is set to NULL in the incoming data. So, when the query was joining against accounts table, the resets rows were skipped, because there was no matching account. To fix this the JOIN on the following column needs to be LEFT JOIN. --- hive/db/sql_scripts/follow_ops.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql index d2e14313b..2609d41f3 100644 --- a/hive/db/sql_scripts/follow_ops.sql +++ b/hive/db/sql_scripts/follow_ops.sql @@ -278,7 +278,7 @@ AS $BODY$ FROM UNNEST(_follow_updates) AS upd CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) JOIN accounts_id AS r ON ch.follower = r.name - JOIN accounts_id AS g ON ch.following = g.name + LEFT JOIN accounts_id AS g ON ch.following = g.name GROUP BY upd.id, upd.mode ORDER BY upd.id ) AS upd_with_ids @@ -305,7 +305,7 @@ AS $BODY$ FROM UNNEST(_muted_updates) AS upd CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) JOIN accounts_id AS r ON ch.follower = r.name - JOIN accounts_id AS g ON ch.following = g.name + LEFT JOIN accounts_id AS g ON ch.following = g.name GROUP BY upd.id, upd.mode ORDER BY upd.id ) AS upd_with_ids @@ -332,7 +332,7 @@ AS $BODY$ FROM UNNEST(_blacklisted_updates) AS upd CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) JOIN accounts_id AS r ON ch.follower = r.name - JOIN accounts_id AS g ON ch.following = g.name + LEFT JOIN accounts_id AS g ON ch.following = g.name GROUP BY upd.id, upd.mode ORDER BY upd.id ) AS upd_with_ids @@ -359,7 +359,7 @@ AS $BODY$ FROM UNNEST(_follow_muted_updates) AS upd CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) JOIN accounts_id AS r ON ch.follower = r.name - JOIN accounts_id AS g ON ch.following = g.name + LEFT JOIN accounts_id AS g ON ch.following = g.name GROUP BY upd.id, upd.mode ORDER BY upd.id ) AS upd_with_ids @@ -386,7 +386,7 @@ AS $BODY$ FROM UNNEST(_follow_blacklisted_updates) AS upd CROSS JOIN LATERAL UNNEST(upd.changes) AS ch(follower, following, block_num) JOIN accounts_id AS r ON ch.follower = r.name - JOIN accounts_id AS g ON ch.following = g.name + LEFT JOIN accounts_id AS g ON ch.following = g.name GROUP BY upd.id, upd.mode ORDER BY upd.id ) AS upd_with_ids -- GitLab From 26703c148df09c6386762105ebfc388834c6010a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 20 Feb 2025 18:14:43 +0100 Subject: [PATCH 57/83] Add materialized to CTEs --- hive/db/sql_scripts/follow_ops.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hive/db/sql_scripts/follow_ops.sql b/hive/db/sql_scripts/follow_ops.sql index 2609d41f3..635e7fb4b 100644 --- a/hive/db/sql_scripts/follow_ops.sql +++ b/hive/db/sql_scripts/follow_ops.sql @@ -257,7 +257,7 @@ AS $BODY$ FROM hivemind_app.hive_accounts ha JOIN ( SELECT UNNEST( _impacted_accounts ) AS name ) AS im ON im.name = ha.name ), - change_follows AS ( + change_follows AS MATERIALIZED ( SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( @@ -284,7 +284,7 @@ AS $BODY$ ) AS upd_with_ids ORDER BY upd_with_ids.id ), - change_muted AS ( + change_muted AS MATERIALIZED ( SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( @@ -311,7 +311,7 @@ AS $BODY$ ) AS upd_with_ids ORDER BY upd_with_ids.id ), - change_blacklisted AS ( + change_blacklisted AS MATERIALIZED ( SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( @@ -338,7 +338,7 @@ AS $BODY$ ) AS upd_with_ids ORDER BY upd_with_ids.id ), - change_follow_muted AS ( + change_follow_muted AS MATERIALIZED ( SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( @@ -365,7 +365,7 @@ AS $BODY$ ) AS upd_with_ids ORDER BY upd_with_ids.id ), - change_follow_blacklisted AS ( + change_follow_blacklisted AS MATERIALIZED ( SELECT CASE upd_with_ids.mode WHEN 'insert' THEN ( -- GitLab From 4a77987e36c74fec4bcb211b59f36296f2a95756 Mon Sep 17 00:00:00 2001 From: asuch <asuch@syncad.com> Date: Wed, 19 Feb 2025 13:44:38 +0100 Subject: [PATCH 58/83] Prepare another tests for following operations --- docs/follows.md | 341 ++ .../follow_op/mock_block_data_follow.json | 3281 +++++++++++++++++ .../blacklisttest1-follow.pat.json | 9 + .../blacklisttest1-follow.tavern.yaml | 26 + .../blacklisttest1-ignore.pat.json | 9 + .../blacklisttest1-ignore.tavern.yaml | 26 + .../blacklisttest2-follow.pat.json | 9 + .../blacklisttest2-follow.tavern.yaml | 26 + .../blacklisttest2-ignore.pat.json | 9 + .../blacklisttest2-ignore.tavern.yaml | 26 + .../get_followers/fb-test-1-follow.pat.json | 9 + .../fb-test-1-follow.tavern.yaml | 26 + .../get_followers/fb-test-1-ignore.pat.json | 9 + .../fb-test-1-ignore.tavern.yaml | 26 + .../get_followers/fb-test-2-follow.pat.json | 9 + .../fb-test-2-follow.tavern.yaml | 26 + .../get_followers/fb-test-2-ignore.pat.json | 9 + .../fb-test-2-ignore.tavern.yaml | 26 + .../get_followers/fm-test-1-follow.pat.json | 9 + .../fm-test-1-follow.tavern.yaml | 26 + .../get_followers/fm-test-1-ignore.pat.json | 9 + .../fm-test-1-ignore.tavern.yaml | 26 + .../get_followers/fm-test-2-follow.pat.json | 9 + .../fm-test-2-follow.tavern.yaml | 26 + .../get_followers/fm-test-2-ignore.pat.json | 9 + .../fm-test-2-ignore.tavern.yaml | 26 + .../get_followers/follows-test1.pat.json | 9 + .../get_followers/follows-test1.tavern.yaml | 26 + .../get_followers/follows-test2.pat.json | 16 + .../get_followers/follows-test2.tavern.yaml | 26 + .../follows-test3-ignore.pat.json | 9 + .../follows-test3-ignore.tavern.yaml | 26 + .../get_followers/follows-test3.pat.json | 16 + .../get_followers/follows-test3.tavern.yaml | 26 + .../get_followers/ignore-test1.pat.json | 9 + .../get_followers/ignore-test1.tavern.yaml | 26 + .../ignore-test2-follow.pat.json | 9 + .../ignore-test2-follow.tavern.yaml | 26 + .../get_followers/ignore-test2.pat.json | 9 + .../get_followers/ignore-test2.tavern.yaml | 26 + .../get_followers/ral-test-follow.pat.json | 9 + .../get_followers/ral-test-follow.tavern.yaml | 26 + .../get_followers/ral-test-ignore.pat.json | 9 + .../get_followers/ral-test-ignore.tavern.yaml | 26 + .../get_followers/rfb-test-follow.pat.json | 9 + .../get_followers/rfb-test-follow.tavern.yaml | 26 + .../get_followers/rfb-test-ignore.pat.json | 9 + .../get_followers/rfb-test-ignore.tavern.yaml | 26 + .../get_followers/rfm-test-follow.pat.json | 9 + .../get_followers/rfm-test-follow.tavern.yaml | 26 + .../get_followers/rfm-test-ignore.pat.json | 9 + .../get_followers/rfm-test-ignore.tavern.yaml | 26 + .../blacklisttest1-follow.pat.json | 1 + .../blacklisttest1-follow.tavern.yaml | 26 + .../blacklisttest1-ignore.pat.json | 1 + .../blacklisttest1-ignore.tavern.yaml | 26 + .../blacklisttest2-follow.pat.json | 9 + .../blacklisttest2-follow.tavern.yaml | 26 + .../blacklisttest2-ignore.pat.json | 9 + .../blacklisttest2-ignore.tavern.yaml | 26 + .../get_following/fb-test-2-follow.pat.json | 9 + .../fb-test-2-follow.tavern.yaml | 26 + .../get_following/fb-test-2-ignore.pat.json | 9 + .../fb-test-2-ignore.tavern.yaml | 26 + .../get_following/fm-test-1-follow.pat.json | 1 + .../fm-test-1-follow.tavern.yaml | 26 + .../get_following/fm-test-1-ignore.pat.json | 1 + .../fm-test-1-ignore.tavern.yaml | 26 + .../get_following/fm-test-2-follow.pat.json | 9 + .../fm-test-2-follow.tavern.yaml | 26 + .../get_following/fm-test-2-ignore.pat.json | 9 + .../fm-test-2-ignore.tavern.yaml | 26 + .../get_following/follows-test1.pat.json | 37 + .../get_following/follows-test1.tavern.yaml | 26 + .../get_following/follows-test2.pat.json | 23 + .../get_following/follows-test2.tavern.yaml | 26 + .../follows-test3-ignore.pat.json | 9 + .../follows-test3-ignore.tavern.yaml | 26 + .../get_following/follows-test3.pat.json | 1 + .../get_following/follows-test3.tavern.yaml | 26 + .../get_following/ignore-test1.pat.json | 23 + .../get_following/ignore-test1.tavern.yaml | 26 + .../ignore-test2-follow.pat.json | 9 + .../ignore-test2-follow.tavern.yaml | 26 + .../get_following/ignore-test2.pat.json | 1 + .../get_following/ignore-test2.tavern.yaml | 26 + .../get_following/ral-test-follow.pat.json | 1 + .../get_following/ral-test-follow.tavern.yaml | 26 + .../get_following/ral-test-ignore.pat.json | 1 + .../get_following/ral-test-ignore.tavern.yaml | 26 + .../get_following/rfb-test-follow.pat.json | 9 + .../get_following/rfb-test-follow.tavern.yaml | 26 + .../get_following/rfb-test-ignore.pat.json | 9 + .../get_following/rfb-test-ignore.tavern.yaml | 26 + .../get_following/rfm-test-follow.pat.json | 9 + .../get_following/rfm-test-follow.tavern.yaml | 26 + .../get_following/rfm-test-ignore.pat.json | 9 + .../get_following/rfm-test-ignore.tavern.yaml | 26 + .../blacklisttest1_A1.pat.json | 7 + .../blacklisttest1_A1.tavern.yaml | 26 + .../blacklisttest1_A2.pat.json | 7 + .../blacklisttest1_A2.tavern.yaml | 26 + .../blacklisttest1_A3.pat.json | 7 + .../blacklisttest1_A3.tavern.yaml | 26 + .../blacklisttest1_A4.pat.json | 7 + .../blacklisttest1_A4.tavern.yaml | 26 + .../blacklisttest1_A5.pat.json | 7 + .../blacklisttest1_A5.tavern.yaml | 26 + .../blacklisttest1_B1.pat.json | 7 + .../blacklisttest1_B1.tavern.yaml | 26 + .../blacklisttest1_B2.pat.json | 7 + .../blacklisttest1_B2.tavern.yaml | 26 + .../blacklisttest1_B3.pat.json | 7 + .../blacklisttest1_B3.tavern.yaml | 26 + .../blacklisttest1_B4.pat.json | 7 + .../blacklisttest1_B4.tavern.yaml | 26 + .../blacklisttest1_B5.pat.json | 7 + .../blacklisttest1_B5.tavern.yaml | 26 + .../blacklisttest2_A1.pat.json | 7 + .../blacklisttest2_A1.tavern.yaml | 26 + .../blacklisttest2_A2.pat.json | 7 + .../blacklisttest2_A2.tavern.yaml | 26 + .../blacklisttest2_A3.pat.json | 7 + .../blacklisttest2_A3.tavern.yaml | 26 + .../blacklisttest2_A4.pat.json | 7 + .../blacklisttest2_A4.tavern.yaml | 26 + .../blacklisttest2_A5.pat.json | 7 + .../blacklisttest2_A5.tavern.yaml | 26 + .../blacklisttest2_B1.pat.json | 7 + .../blacklisttest2_B1.tavern.yaml | 26 + .../blacklisttest2_B2.pat.json | 7 + .../blacklisttest2_B2.tavern.yaml | 26 + .../blacklisttest2_B3.pat.json | 7 + .../blacklisttest2_B3.tavern.yaml | 26 + .../blacklisttest2_B4.pat.json | 7 + .../blacklisttest2_B4.tavern.yaml | 26 + .../blacklisttest2_B5.pat.json | 7 + .../blacklisttest2_B5.tavern.yaml | 26 + .../blacklisttest2_C1.pat.json | 7 + .../blacklisttest2_C1.tavern.yaml | 26 + .../blacklisttest2_C2.pat.json | 7 + .../blacklisttest2_C2.tavern.yaml | 26 + .../fb-test-1_C1.pat.json | 7 + .../fb-test-1_C1.tavern.yaml | 26 + .../fb-test-1_C2.pat.json | 7 + .../fb-test-1_C2.tavern.yaml | 26 + .../fb-test-1_C3.pat.json | 7 + .../fb-test-1_C3.tavern.yaml | 26 + .../fb-test-1_C4.pat.json | 7 + .../fb-test-1_C4.tavern.yaml | 26 + .../fb-test-1_C5.pat.json | 7 + .../fb-test-1_C5.tavern.yaml | 26 + .../fb-test-1_fb-fake-1.pat.json | 7 + .../fb-test-1_fb-fake-1.tavern.yaml | 26 + .../fb-test-1_fb-fake-2.pat.json | 7 + .../fb-test-1_fb-fake-2.tavern.yaml | 26 + .../fb-test-2_A1.pat.json | 7 + .../fb-test-2_A1.tavern.yaml | 26 + .../fb-test-2_A2.pat.json | 7 + .../fb-test-2_A2.tavern.yaml | 26 + .../fb-test-2_A3.pat.json | 7 + .../fb-test-2_A3.tavern.yaml | 26 + .../fb-test-2_A4.pat.json | 7 + .../fb-test-2_A4.tavern.yaml | 26 + .../fb-test-2_C1.pat.json | 7 + .../fb-test-2_C1.tavern.yaml | 26 + .../fb-test-2_C2.pat.json | 7 + .../fb-test-2_C2.tavern.yaml | 26 + .../fb-test-2_C3.pat.json | 7 + .../fb-test-2_C3.tavern.yaml | 26 + .../fb-test-2_C4.pat.json | 7 + .../fb-test-2_C4.tavern.yaml | 26 + .../fb-test-2_C5.pat.json | 7 + .../fb-test-2_C5.tavern.yaml | 26 + .../fb-test-2_fb-fake-1.pat.json | 7 + .../fb-test-2_fb-fake-1.tavern.yaml | 26 + .../fb-test-2_fb-fake-2.pat.json | 7 + .../fb-test-2_fb-fake-2.tavern.yaml | 26 + .../fm-test-1_C1.pat.json | 7 + .../fm-test-1_C1.tavern.yaml | 26 + .../fm-test-1_C2.pat.json | 7 + .../fm-test-1_C2.tavern.yaml | 26 + .../fm-test-1_C3.pat.json | 7 + .../fm-test-1_C3.tavern.yaml | 26 + .../fm-test-1_C4.pat.json | 7 + .../fm-test-1_C4.tavern.yaml | 26 + .../fm-test-1_C5.pat.json | 7 + .../fm-test-1_C5.tavern.yaml | 26 + .../fm-test-1_fm-fake-1.pat.json | 7 + .../fm-test-1_fm-fake-1.tavern.yaml | 26 + .../fm-test-1_fm-fake-2.pat.json | 7 + .../fm-test-1_fm-fake-2.tavern.yaml | 26 + .../fm-test-2_A1.pat.json | 7 + .../fm-test-2_A1.tavern.yaml | 26 + .../fm-test-2_A2.pat.json | 7 + .../fm-test-2_A2.tavern.yaml | 26 + .../fm-test-2_A3.pat.json | 7 + .../fm-test-2_A3.tavern.yaml | 26 + .../fm-test-2_A4.pat.json | 7 + .../fm-test-2_A4.tavern.yaml | 26 + .../fm-test-2_C1.pat.json | 7 + .../fm-test-2_C1.tavern.yaml | 26 + .../fm-test-2_C2.pat.json | 7 + .../fm-test-2_C2.tavern.yaml | 26 + .../fm-test-2_C3.pat.json | 7 + .../fm-test-2_C3.tavern.yaml | 26 + .../fm-test-2_C4.pat.json | 7 + .../fm-test-2_C4.tavern.yaml | 26 + .../fm-test-2_C5.pat.json | 7 + .../fm-test-2_C5.tavern.yaml | 26 + .../fm-test-2_fm-fake-1.pat.json | 7 + .../fm-test-2_fm-fake-1.tavern.yaml | 26 + .../fm-test-2_fm-fake-2.pat.json | 7 + .../fm-test-2_fm-fake-2.tavern.yaml | 26 + .../follows-test1_A1.pat.json | 7 + .../follows-test1_A1.tavern.yaml | 26 + .../follows-test1_A2.pat.json | 7 + .../follows-test1_A2.tavern.yaml | 26 + .../follows-test1_A3.pat.json | 7 + .../follows-test1_A3.tavern.yaml | 26 + .../follows-test1_A4.pat.json | 7 + .../follows-test1_A4.tavern.yaml | 26 + .../follows-test1_A5.pat.json | 7 + .../follows-test1_A5.tavern.yaml | 26 + .../follows-test1_B1.pat.json | 7 + .../follows-test1_B1.tavern.yaml | 26 + .../follows-test1_B2.pat.json | 7 + .../follows-test1_B2.tavern.yaml | 26 + .../follows-test1_B3.pat.json | 7 + .../follows-test1_B3.tavern.yaml | 26 + .../follows-test1_B4.pat.json | 7 + .../follows-test1_B4.tavern.yaml | 26 + .../follows-test1_B5.pat.json | 7 + .../follows-test1_B5.tavern.yaml | 26 + .../follows-test2_A1.pat.json | 7 + .../follows-test2_A1.tavern.yaml | 26 + .../follows-test2_A2.pat.json | 7 + .../follows-test2_A2.tavern.yaml | 26 + .../follows-test2_A3.pat.json | 7 + .../follows-test2_A3.tavern.yaml | 26 + .../follows-test2_A4.pat.json | 7 + .../follows-test2_A4.tavern.yaml | 26 + .../follows-test2_B1.pat.json | 7 + .../follows-test2_B1.tavern.yaml | 26 + .../follows-test2_B2.pat.json | 7 + .../follows-test2_B2.tavern.yaml | 26 + .../follows-test2_B3.pat.json | 7 + .../follows-test2_B3.tavern.yaml | 26 + .../follows-test2_B4.pat.json | 7 + .../follows-test2_B4.tavern.yaml | 26 + .../follows-test2_B5.pat.json | 7 + .../follows-test2_B5.tavern.yaml | 26 + .../follows-test3_A1.pat.json | 7 + .../follows-test3_A1.tavern.yaml | 26 + .../follows-test3_A2.pat.json | 7 + .../follows-test3_A2.tavern.yaml | 26 + .../follows-test3_A3.pat.json | 7 + .../follows-test3_A3.tavern.yaml | 26 + .../follows-test3_A4.pat.json | 7 + .../follows-test3_A4.tavern.yaml | 26 + .../follows-test3_B1.pat.json | 7 + .../follows-test3_B1.tavern.yaml | 26 + .../follows-test3_B2.pat.json | 7 + .../follows-test3_B2.tavern.yaml | 26 + .../follows-test3_B3.pat.json | 7 + .../follows-test3_B3.tavern.yaml | 26 + .../follows-test3_B4.pat.json | 7 + .../follows-test3_B4.tavern.yaml | 26 + .../follows-test3_B5.pat.json | 7 + .../follows-test3_B5.tavern.yaml | 26 + .../follows-test3_C1.pat.json | 7 + .../follows-test3_C1.tavern.yaml | 26 + .../follows-test3_C2.pat.json | 7 + .../follows-test3_C2.tavern.yaml | 26 + .../follows-test3_C3.pat.json | 7 + .../follows-test3_C3.tavern.yaml | 26 + .../follows-test3_C4.pat.json | 7 + .../follows-test3_C4.tavern.yaml | 26 + .../ignore-test1_A1.pat.json | 7 + .../ignore-test1_A1.tavern.yaml | 26 + .../ignore-test1_A2.pat.json | 7 + .../ignore-test1_A2.tavern.yaml | 26 + .../ignore-test1_A3.pat.json | 7 + .../ignore-test1_A3.tavern.yaml | 26 + .../ignore-test1_A4.pat.json | 7 + .../ignore-test1_A4.tavern.yaml | 26 + .../ignore-test1_A5.pat.json | 7 + .../ignore-test1_A5.tavern.yaml | 26 + .../ignore-test1_B1.pat.json | 7 + .../ignore-test1_B1.tavern.yaml | 26 + .../ignore-test1_B2.pat.json | 7 + .../ignore-test1_B2.tavern.yaml | 26 + .../ignore-test1_B3.pat.json | 7 + .../ignore-test1_B3.tavern.yaml | 26 + .../ignore-test1_B4.pat.json | 7 + .../ignore-test1_B4.tavern.yaml | 26 + .../ignore-test1_B5.pat.json | 7 + .../ignore-test1_B5.tavern.yaml | 26 + .../ignore-test2_A1.pat.json | 7 + .../ignore-test2_A1.tavern.yaml | 26 + .../ignore-test2_A2.pat.json | 7 + .../ignore-test2_A2.tavern.yaml | 26 + .../ignore-test2_A3.pat.json | 7 + .../ignore-test2_A3.tavern.yaml | 26 + .../ignore-test2_A4.pat.json | 7 + .../ignore-test2_A4.tavern.yaml | 26 + .../ignore-test2_A5.pat.json | 7 + .../ignore-test2_A5.tavern.yaml | 26 + .../ignore-test2_B1.pat.json | 7 + .../ignore-test2_B1.tavern.yaml | 26 + .../ignore-test2_B2.pat.json | 7 + .../ignore-test2_B2.tavern.yaml | 26 + .../ignore-test2_B3.pat.json | 7 + .../ignore-test2_B3.tavern.yaml | 26 + .../ignore-test2_B4.pat.json | 7 + .../ignore-test2_B4.tavern.yaml | 26 + .../ignore-test2_B5.pat.json | 7 + .../ignore-test2_B5.tavern.yaml | 26 + .../ignore-test2_C3.pat.json | 7 + .../ignore-test2_C3.tavern.yaml | 26 + .../ignore-test2_C4.pat.json | 7 + .../ignore-test2_C4.tavern.yaml | 26 + .../ral-test_ral-A1.pat.json | 7 + .../ral-test_ral-A1.tavern.yaml | 26 + .../ral-test_ral-A2.pat.json | 7 + .../ral-test_ral-A2.tavern.yaml | 26 + .../ral-test_ral-A3.pat.json | 7 + .../ral-test_ral-A3.tavern.yaml | 26 + .../ral-test_ral-C1.pat.json | 7 + .../ral-test_ral-C1.tavern.yaml | 26 + .../ral-test_ral-C2.pat.json | 7 + .../ral-test_ral-C2.tavern.yaml | 26 + .../ral-test_ral-C3.pat.json | 7 + .../ral-test_ral-C3.tavern.yaml | 26 + .../ral-test_ral-C4.pat.json | 7 + .../ral-test_ral-C4.tavern.yaml | 26 + .../ral-test_ral-C5.pat.json | 7 + .../ral-test_ral-C5.tavern.yaml | 26 + .../ral-test_ral-fake-b.pat.json | 7 + .../ral-test_ral-fake-b.tavern.yaml | 26 + .../ral-test_ral-fake-m.pat.json | 7 + .../ral-test_ral-fake-m.tavern.yaml | 26 + .../rfb-test_A1.pat.json | 7 + .../rfb-test_A1.tavern.yaml | 26 + .../rfb-test_A2.pat.json | 7 + .../rfb-test_A2.tavern.yaml | 26 + .../rfb-test_A3.pat.json | 7 + .../rfb-test_A3.tavern.yaml | 26 + .../rfb-test_C1.pat.json | 7 + .../rfb-test_C1.tavern.yaml | 26 + .../rfb-test_C2.pat.json | 7 + .../rfb-test_C2.tavern.yaml | 26 + .../rfb-test_C3.pat.json | 7 + .../rfb-test_C3.tavern.yaml | 26 + .../rfb-test_C4.pat.json | 7 + .../rfb-test_C4.tavern.yaml | 26 + .../rfb-test_C5.pat.json | 7 + .../rfb-test_C5.tavern.yaml | 26 + .../rfb-test_fb-fake-1.pat.json | 7 + .../rfb-test_fb-fake-1.tavern.yaml | 26 + .../rfb-test_fm-fake-2.pat.json | 7 + .../rfb-test_fm-fake-2.tavern.yaml | 26 + .../rfm-test_A1.pat.json | 7 + .../rfm-test_A1.tavern.yaml | 26 + .../rfm-test_A2.pat.json | 7 + .../rfm-test_A2.tavern.yaml | 26 + .../rfm-test_A3.pat.json | 7 + .../rfm-test_A3.tavern.yaml | 26 + .../rfm-test_C1.pat.json | 7 + .../rfm-test_C1.tavern.yaml | 26 + .../rfm-test_C2.pat.json | 7 + .../rfm-test_C2.tavern.yaml | 26 + .../rfm-test_C3.pat.json | 7 + .../rfm-test_C3.tavern.yaml | 26 + .../rfm-test_C4.pat.json | 7 + .../rfm-test_C4.tavern.yaml | 26 + .../rfm-test_C5.pat.json | 7 + .../rfm-test_C5.tavern.yaml | 26 + .../rfm-test_fb-fake-2.pat.json | 7 + .../rfm-test_fb-fake-2.tavern.yaml | 26 + .../rfm-test_fm-fake-1.pat.json | 7 + .../rfm-test_fm-fake-1.tavern.yaml | 26 + 382 files changed, 9994 insertions(+) create mode 100644 docs/follows.md create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-follow.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-follow.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-ignore.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-ignore.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-b.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-b.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-m.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-m.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fb-fake-1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fb-fake-1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fm-fake-2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fm-fake-2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C1.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C3.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C3.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C4.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C4.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C5.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C5.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fb-fake-2.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fb-fake-2.tavern.yaml create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fm-fake-1.pat.json create mode 100644 tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fm-fake-1.tavern.yaml diff --git a/docs/follows.md b/docs/follows.md new file mode 100644 index 000000000..981760853 --- /dev/null +++ b/docs/follows.md @@ -0,0 +1,341 @@ +# Hive Follows Design + +## Overview + +All accounts are able to perform follow action on another account in order to: +- stay up to date with posts by the author you are interested in +- isolate posts by authors that the user is not interested in +- put user on blacklist and mark posts created by him + +It is also possible to follow other account blacklists and mutes. So if user want to have the same mutes or/and blacklists as another user, there is such possibility. + +#### Follow Actions + +There are 16 follow actions: +1. **blog** - user follows another user +2. **follow** - the same as **blog** +3. **ignore** - user mutes another user, what results with hiding posts created by muted user, in some cases these posts can be grayed. +4. **blacklist** - marks user as blacklisted and his posts will be marked with 'my blacklist' +5. **follow_blacklist** - user follows another user's list of blacklisted users and will see 'blacklisted by <user>' if someone post is blacklisted by one of user who's blacklist is followed +6. **unblacklist** - removes user from own blacklist +7. **unfollow_blacklist** - stop following another user's list of blacklisted users. +8. **follow_muted** - user follows another user's list of muted users and posts created by these users will be hidden or grayed like be muted by user. +9. **unfollow_muted** - user stops follow another user's list of muted users. +10. **reset_blacklist** - Removes all users from user's list of blacklisted users. +11. **reset_following_list** - Removes all users from user's list of following users. +12. **reset_muted_list** - Removes all users from user's list of muted users. +13. **reset_follow_blacklist** - Removes all users from user's list of following another users blacklisted users. +14. **reset_follow_muted_list** - Removes all users from user's list of following another users muted users. +15. **reset_all_lists** - User will not follow, ignore or blacklist anyone, like new created user. + +#### Follow Operation + +To create follow operation, you need to user `custom_json_operation`. Field `id` have to be set to `follow`, in`required_posting_auths` you need to put `follower` name. +Field `json` have to be a list, first element must be a string value - `follow` and second has to be a json, which has to contains 3 keys: +- `follower` - user on which action will be performed. +- `following` - user on which another user will perform follow operation (when using one of resets action, this field is ignored, can be set to null or whatever). This field can be a string or a list. In case of list, specific follow action will be performed on every user from list. +- `what` - has to be a list and it has to contain one of follow actions. In case when we want to unfollow ir cancel ignore on specific user, list should be empty or we can action to empty string - `""` (be aware, removing user from blacklist needs `unblacklist` action) + +Example follow operation: +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"cool-user\",\"what\":[\"follow\"]}]" + } +} +``` + +Example follow operation where user performs follow action on many users. +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":[\"cool-user\",\"cleverguy\"]\"what\":[\"follow\"]}]" + } +} +``` + +### Example Follow Operations + +1. Follow user or users. + +In this follow operation, user follows another user. + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"cool-user\",\"what\":[\"blog\"]}]" + } +} +``` +If we want to set follow on multiple users in one operation, here is an example. + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":[\"cool-user\", \"clever-guy\", \"info-bot\"],\"what\":[\"follow\"]}]" + } +} +``` + +2. Ignore/mute user or users. + +Example follow operation which mutes another user: + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"spamer\",\"what\":[\"ignore\"]}]" + } +} +``` + +3. Canceling follow or ignore from specific user. + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"someone\",\"what\":[]}]" + } +} +``` + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"someone\",\"what\":[\"\"]}]" + } +} +``` + +4. Putting user on blacklist +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"suspected-guy\",\"what\":[\"blacklist\"]}]" + } +} +``` + +5. Removing user from blacklist + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"good-guy\",\"what\":[\"unblacklist\"]}]" + } +} +``` + +5. Following another user's list of blacklisted users + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"guy-who-knowns\",\"what\":[\"follow_blacklist\"]}]" + } +} +``` + +5. Stoping follow another user's list of blacklisted users + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"guywithfakeinfo\",\"what\":[\"unfollow_blacklist\"]}]" + } +} +``` + +6. Following another user's list of muted users + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"guyignorescommunity\",\"what\":[\"follow_muted\"]}]" + } +} +``` + +7. Stoping follow another user's list of muted users + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"guywithfakeinfo\",\"what\":[\"unfollow_muted\"]}]" + } +} +``` + +8. Reset user's list of blacklisted users + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"\",\"what\":[\"reset_blacklist\"]}]" + } +} +``` + +9. Reset user's list of following users + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":\"!@#$%^&*()_\",\"what\":[\"reset_following_list\"]}]" + } +} +``` + +10. Reset user's list of muted users + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":[\"!@#$%^&*()_\"],\"what\":[\"reset_muted_list\"]}]" + } +} +``` + +11. Reset user's list of following another users blacklisted users. + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":[\"!@#$%^&*()_\", \"fdsafsadf\"],\"what\":[\"reset_follow_blacklist\"]}]" + } +} +``` + +12. Reset user's list of following another users muted users. + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":[],\"what\":[\"reset_follow_muted_list\"]}]" + } +} +``` + +13. Clear user's all lists + +``` +{ + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "user-follower" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"user-follower\",\"following\":null,\"what\":[\"reset_all_lists\"]}]" + } +} +``` diff --git a/mock_data/block_data/follow_op/mock_block_data_follow.json b/mock_data/block_data/follow_op/mock_block_data_follow.json index 18d3e3f65..c66a84c91 100644 --- a/mock_data/block_data/follow_op/mock_block_data_follow.json +++ b/mock_data/block_data/follow_op/mock_block_data_follow.json @@ -1464,5 +1464,3286 @@ ] } ] + }, + "5000015": { + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-a1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-a2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-a3", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-a4", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-a5", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-b1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-b2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-b3", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-b4", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-b5", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-c1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-c2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-c3", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-c4", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follow-fake-c5", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow, mutes and blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follows-test1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow mechanism, scenario 1, he follows 5 accounts and 4 accounts follows him\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[\"follow-fake-b1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[\"follow-fake-b2\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[\"follow-fake-b3\"],\"what\":[\"\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[\"follow-fake-b4\"],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[\"follow-fake-b5\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[\"follow-fake-b3\"],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[\"follow-fake-b2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[\"follow-fake-b1\"],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[\"follow-fake-b5\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a1\",\"following\":[\"follows-test1\"],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a2\",\"following\":[\"follows-test1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a3\",\"following\":[\"follows-test1\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a4\",\"following\":[\"follows-test1\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a5\",\"following\":[\"follows-test1\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[],\"what\":[\"reset_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[],\"what\":[\"reset_muted_list\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[],\"what\":[\"reset_follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test1\",\"following\":[],\"what\":[\"reset_follow_muted_list\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follows-test2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow mechanism, scenario 2, he followed 5 accounts, but canceled follows on 2 accounts and 4 accounts followed him but 2 cancelled.\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test2\",\"following\":[\"follow-fake-b1\", \"follow-fake-b2\", \"follow-fake-b3\", \"follow-fake-b4\", \"follow-fake-b5\"],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test2\",\"following\":[\"follow-fake-b1\", \"follow-fake-b4\"],\"what\":[]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a1\",\"following\":[\"follows-test2\"],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a2\",\"following\":[\"follows-test2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a3\",\"following\":[\"follows-test2\"],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a4\",\"following\":[\"follows-test2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a1\",\"following\":[\"follows-test2\"],\"what\":[\"\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a2\",\"following\":[\"follows-test2\"],\"what\":[\"\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "follows-test3", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow mechanism, scenario 3, reseting following list.\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test3\",\"following\":[\"follow-fake-b1\", \"follow-fake-b2\", \"follow-fake-b3\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test3\",\"following\":[\"follow-fake-b4\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test3\",\"following\":[\"follow-fake-b5\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a1\",\"following\":[\"follows-test3\"],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a2\",\"following\":[\"follows-test3\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a3\",\"following\":[\"follows-test3\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a4\",\"following\":[\"follows-test3\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c1\",\"following\":[\"follows-test3\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c2\",\"following\":[\"follows-test3\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test3\",\"following\":[\"follow-fake-c3\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test3\",\"following\":[\"follow-fake-c4\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follows-test3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follows-test3\",\"following\":\"\",\"what\":[\"reset_following_list\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "ignore-test1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing mute mechanism, scenario 1, muting 5 accounts, cancel one mute, 2 accounts mutes him and one cancel,\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test1\",\"following\":[\"follow-fake-b1\", \"follow-fake-b2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test1\",\"following\":[\"follow-fake-b3\"],\"what\":[\"\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test1\",\"following\":[\"follow-fake-b1\", \"follow-fake-b2\", \"follow-fake-b3\", \"follow-fake-b4\", \"follow-fake-b5\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test1\",\"following\":[\"follow-fake-b4\", \"follow-fake-b2\"],\"what\":[]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a1\",\"following\":[\"ignore-test1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a1\",\"following\":[\"ignore-test1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a2\",\"following\":[\"ignore-test1\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a3\",\"following\":[\"ignore-test1\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a4\",\"following\":[\"ignore-test1\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a5\",\"following\":[\"ignore-test1\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test1\",\"following\":[],\"what\":[\"reset_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test1\",\"following\":[],\"what\":[\"reset_following_list\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test1\",\"following\":[],\"what\":[\"reset_follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test1\",\"following\":[],\"what\":[\"reset_follow_muted_list\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "ignore-test2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing mute mechanism, scenario 2, reset mutes list,\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test2\",\"following\":[\"follow-fake-b1\", \"follow-fake-b3\", \"follow-fake-b5\" ],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test2\",\"following\":[\"follow-fake-b2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test2\",\"following\":[\"follow-fake-b4\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test2\",\"following\":[\"follow-fake-b4\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a1\",\"following\":[\"ignore-test2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a2\",\"following\":[\"ignore-test2\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a3\",\"following\":[\"ignore-test2\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a4\",\"following\":[\"ignore-test2\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a5\",\"following\":[\"ignore-test2\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test2\",\"following\":[\"follow-fake-c3\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test2\",\"following\":[\"follow-fake-c4\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ignore-test2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ignore-test2\",\"following\":[\"follow-fake-b5\"],\"what\":[\"reset_muted_list\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "blacklisttest1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing blacklist mechanism, scenario 1, blacklist 5 accounts, remove 2 accounts from blacklist,\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest1\",\"following\":[\"follow-fake-b1\", \"follow-fake-b2\", \"follow-fake-b3\", \"follow-fake-b4\", \"follow-fake-b5\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a1\",\"following\":[\"blacklisttest1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a2\",\"following\":[\"blacklisttest1\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a3\",\"following\":[\"blacklisttest1\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a4\",\"following\":[\"blacklisttest1\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a5\",\"following\":[\"blacklisttest1\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest1\",\"following\":[\"follow-fake-b3\"],\"what\":[]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest1\",\"following\":[\"follow-fake-b2\"],\"what\":[\"unblacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest1\",\"following\":[],\"what\":[\"reset_following_list\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest1\",\"following\":[],\"what\":[\"reset_muted_list\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest1\",\"following\":[],\"what\":[\"reset_follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest1\",\"following\":[],\"what\":[\"reset_follow_muted_list\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "blacklisttest2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing blacklist mechanism, scenario 2, reset blacklist,\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest2\",\"following\":[\"follow-fake-b1\", \"follow-fake-b2\", \"follow-fake-b3\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest2\",\"following\":[\"follow-fake-b5\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest2\",\"following\":[\"follow-fake-b4\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a1\",\"following\":[\"blacklisttest2\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a2\",\"following\":[\"blacklisttest2\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a3\",\"following\":[\"blacklisttest2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a4\",\"following\":[\"blacklisttest2\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-a5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-a5\",\"following\":[\"blacklisttest2\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest2\",\"following\":[\"follow-fake-c1\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest2\",\"following\":[\"follow-fake-c2\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "blacklisttest2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"blacklisttest2\",\"following\":[\"follow-fake-b3\",\"w23qer342ar\"],\"what\":[\"reset_blacklist\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "fb-test-1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow_blacklist mechanism, scenario 1\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "fb-fake-1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Fake Account for testing follow_blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "fb-fake-2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Fake Account for testing follow_blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-fake-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-fake-1\",\"following\":[\"follow-fake-b1\",\"follow-fake-b2\", \"follow-fake-b3\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-fake-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-fake-2\",\"following\":[\"follow-fake-b4\", \"follow-fake-b5\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-1\",\"following\":[\"fb-fake-1\",\"fb-fake-2\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-fake-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-fake-1\",\"following\":[\"follow-fake-b2\"],\"what\":[\"unblacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c1\",\"following\":[\"fb-test-1\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c2\",\"following\":[\"fb-test-1\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c3\",\"following\":[\"fb-test-1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c4\",\"following\":[\"fb-test-1\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c5\",\"following\":[\"fb-test-1\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-1\",\"following\":[],\"what\":[\"reset_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-1\",\"following\":[],\"what\":[\"reset_following_list\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-1\",\"following\":[],\"what\":[\"reset_muted_list\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-1\",\"following\":[],\"what\":[\"reset_follow_muted_list\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "fb-test-2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow_blacklist mechanism, scenario 2\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-2\",\"following\":[\"fb-fake-1\",\"fb-fake-2\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-2\",\"following\":[\"follow-fake-a1\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-2\",\"following\":[\"follow-fake-a2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-2\",\"following\":[\"follow-fake-a3\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-2\",\"following\":[\"follow-fake-a4\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c1\",\"following\":[\"fb-test-2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c2\",\"following\":[\"fb-test-2\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c3\",\"following\":[\"fb-test-2\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c4\",\"following\":[\"fb-test-2\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c5\",\"following\":[\"fb-test-2\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fb-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fb-test-2\",\"following\":[\"fb-fake-1\"],\"what\":[\"unfollow_blacklist\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "fm-fake-1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Fake account for testing follow_muted mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "fm-fake-2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Fake account for testing follow_muted mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "fm-test-1", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow_muted mechanism, scenario 1\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-fake-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-fake-1\",\"following\":[\"follow-fake-b1\",\"follow-fake-b2\", \"follow-fake-b3\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-fake-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-fake-2\",\"following\":[\"follow-fake-b4\", \"follow-fake-b5\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-1\",\"following\":[\"fm-fake-1\",\"fm-fake-2\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-fake-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-fake-1\",\"following\":[\"follow-fake-b2\"],\"what\":[]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c1\",\"following\":[\"fm-test-1\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c2\",\"following\":[\"fm-test-1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c3\",\"following\":[\"fm-test-1\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c4\",\"following\":[\"fm-test-1\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c5\",\"following\":[\"fm-test-1\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-1\",\"following\":[],\"what\":[\"reset_muted_list\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-1\",\"following\":[],\"what\":[\"reset_following_list\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-1\",\"following\":[],\"what\":[\"reset_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-1\",\"following\":[],\"what\":[\"reset_follow_blacklist\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "fm-test-2", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing follow_muted mechanism, scenario 2\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-2\",\"following\":[\"fm-fake-1\",\"fm-fake-2\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-2\",\"following\":[\"follow-fake-a1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-2\",\"following\":[\"follow-fake-a2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-2\",\"following\":[\"follow-fake-a3\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-2\",\"following\":[\"follow-fake-a4\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c1\",\"following\":[\"fm-test-2\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c2\",\"following\":[\"fm-test-2\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c3\",\"following\":[\"fm-test-2\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c4\",\"following\":[\"fm-test-2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c5\",\"following\":[\"fm-test-2\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "fm-test-2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"fm-test-2\",\"following\":[\"fm-fake-1\"],\"what\":[\"unfollow_muted\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "rfb-test", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing reset_follow_blacklist mechanism\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfb-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfb-test\",\"following\":[\"fb-fake-1\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfb-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfb-test\",\"following\":[\"fm-fake-2\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfb-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfb-test\",\"following\":[\"follow-fake-a1\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfb-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfb-test\",\"following\":[\"follow-fake-a2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfb-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfb-test\",\"following\":[\"follow-fake-a3\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c1\",\"following\":[\"rfb-test\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c2\",\"following\":[\"rfb-test\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c3\",\"following\":[\"rfb-test\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c4\",\"following\":[\"rfb-test\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c5\",\"following\":[\"rfb-test\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfb-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfb-test\",\"following\":\"\",\"what\":[\"reset_follow_blacklist\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "rfm-test", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing reset_follow_muted mechanism\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfm-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfm-test\",\"following\":[\"fm-fake-1\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfm-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfm-test\",\"following\":[\"fb-fake-2\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfm-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfm-test\",\"following\":[\"follow-fake-a1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfm-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfm-test\",\"following\":[\"follow-fake-a2\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfm-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfm-test\",\"following\":[\"follow-fake-a3\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c1\",\"following\":\"rfm-test\",\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c2\",\"following\":\"rfm-test\",\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c3\",\"following\":\"rfm-test\",\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c4\",\"following\":\"rfm-test\",\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c5\",\"following\":\"rfm-test\",\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "rfm-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"rfm-test\",\"following\": null,\"what\":[\"reset_follow_muted_list\"]}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "ral-test", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Account for testing reset_all_lists mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "ral-fake-m", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Fake account for testing reset_all_lists mechanism\"}}", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "gtg", + "new_account_name": "ral-fake-b", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + 1 + ] + ] + }, + "memo_key": "STM8JH4fTJr73FQimysjmXCEh2UvRwZsG6ftjxsVTmYCeEehZgh25", + "json_metadata": "{\"profile\":{\"about\":\"Fake account for testing reset_all_lists mechanism\"}}", + "extensions": [] + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ral-fake-m" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ral-fake-m\",\"following\":[\"follow-fake-b1\", \"follow-fake-b2\", \"follow-fake-b3\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ral-fake-b" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ral-fake-b\",\"following\":[\"follow-fake-b4\", \"follow-fake-b5\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ral-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ral-test\",\"following\":[\"follow-fake-a1\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ral-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ral-test\",\"following\":[\"follow-fake-a2\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ral-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ral-test\",\"following\":[\"follow-fake-a3\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ral-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ral-test\",\"following\":[\"ral-fake-m\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ral-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ral-test\",\"following\":[\"ral-fake-b\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c1\",\"following\":[\"ral-test\"],\"what\":[\"ignore\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c2" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c2\",\"following\":[\"ral-test\"],\"what\":[\"follow\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c3" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c3\",\"following\":[\"ral-test\"],\"what\":[\"blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c4" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c4\",\"following\":[\"ral-test\"],\"what\":[\"follow_muted\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "follow-fake-c5" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"follow-fake-c5\",\"following\":[\"ral-test\"],\"what\":[\"follow_blacklist\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "ral-test" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"ral-test\",\"following\":[],\"what\":[\"reset_all_lists\"]}]" + } + } + ] + } + ] } } \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-follow.pat.json new file mode 100644 index 000000000..5d30b9fb1 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-a2", + "following": "blacklisttest1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-follow.tavern.yaml new file mode 100644 index 000000000..deb785f42 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"blacklisttest1","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-ignore.pat.json new file mode 100644 index 000000000..b0703e44f --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-a1", + "following": "blacklisttest1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-ignore.tavern.yaml new file mode 100644 index 000000000..a45f0055e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest1-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"blacklisttest1","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-follow.pat.json new file mode 100644 index 000000000..2870ef152 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-a3", + "following": "blacklisttest2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-follow.tavern.yaml new file mode 100644 index 000000000..9efd4be2d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"blacklisttest2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-ignore.pat.json new file mode 100644 index 000000000..a54b0043d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-a2", + "following": "blacklisttest2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-ignore.tavern.yaml new file mode 100644 index 000000000..d31cf9ba5 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/blacklisttest2-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"blacklisttest2","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-follow.pat.json new file mode 100644 index 000000000..c1717e2dc --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-c1", + "following": "fb-test-1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-follow.tavern.yaml new file mode 100644 index 000000000..d8d28ff98 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"fb-test-1","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-ignore.pat.json new file mode 100644 index 000000000..78e7039c9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-c3", + "following": "fb-test-1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-ignore.tavern.yaml new file mode 100644 index 000000000..abbec59dc --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-1-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"fb-test-1","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-follow.pat.json new file mode 100644 index 000000000..d926b4193 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-c1", + "following": "fb-test-2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-follow.tavern.yaml new file mode 100644 index 000000000..5bb79793d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"fb-test-2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-ignore.pat.json new file mode 100644 index 000000000..6d4be7aa9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-c2", + "following": "fb-test-2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-ignore.tavern.yaml new file mode 100644 index 000000000..ac11b312f --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fb-test-2-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"fb-test-2","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-follow.pat.json new file mode 100644 index 000000000..88ad4b4dc --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-c1", + "following": "fm-test-1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-follow.tavern.yaml new file mode 100644 index 000000000..c1061d963 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"fm-test-1","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-ignore.pat.json new file mode 100644 index 000000000..f938672ff --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-c2", + "following": "fm-test-1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-ignore.tavern.yaml new file mode 100644 index 000000000..332c9c58e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-1-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"fm-test-1","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-follow.pat.json new file mode 100644 index 000000000..b1af337b1 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-c4", + "following": "fm-test-2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-follow.tavern.yaml new file mode 100644 index 000000000..42f8ad1db --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"fm-test-2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-ignore.pat.json new file mode 100644 index 000000000..fdc92ef36 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-c3", + "following": "fm-test-2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-ignore.tavern.yaml new file mode 100644 index 000000000..144486f61 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/fm-test-2-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"fm-test-2","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test1.pat.json new file mode 100644 index 000000000..71d0e351f --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test1.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-a1", + "following": "follows-test1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test1.tavern.yaml new file mode 100644 index 000000000..ebfba8a80 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"follows-test1","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test2.pat.json new file mode 100644 index 000000000..9accfd1ba --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test2.pat.json @@ -0,0 +1,16 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-a3", + "following": "follows-test2" + }, + { + "what": [ + "blog" + ], + "follower": "follow-fake-a4", + "following": "follows-test2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test2.tavern.yaml new file mode 100644 index 000000000..485d77cf3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"follows-test2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3-ignore.pat.json new file mode 100644 index 000000000..759319dff --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-a3", + "following": "follows-test3" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3-ignore.tavern.yaml new file mode 100644 index 000000000..5ed3ca78b --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"follows-test3","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3.pat.json new file mode 100644 index 000000000..154146d6e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3.pat.json @@ -0,0 +1,16 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-a1", + "following": "follows-test3" + }, + { + "what": [ + "blog" + ], + "follower": "follow-fake-a2", + "following": "follows-test3" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3.tavern.yaml new file mode 100644 index 000000000..fff434041 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/follows-test3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"follows-test3","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test1.pat.json new file mode 100644 index 000000000..93d604ee7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test1.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-a1", + "following": "ignore-test1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test1.tavern.yaml new file mode 100644 index 000000000..2fd656ca2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"ignore-test1","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2-follow.pat.json new file mode 100644 index 000000000..1e69a8f52 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-a1", + "following": "ignore-test2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2-follow.tavern.yaml new file mode 100644 index 000000000..8577b47e2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"ignore-test2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2.pat.json new file mode 100644 index 000000000..b4661d6b3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-a2", + "following": "ignore-test2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2.tavern.yaml new file mode 100644 index 000000000..fff9fb669 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ignore-test2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"ignore-test2","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-follow.pat.json new file mode 100644 index 000000000..bc7800a6e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-c2", + "following": "ral-test" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-follow.tavern.yaml new file mode 100644 index 000000000..180885a4d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"ral-test","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-ignore.pat.json new file mode 100644 index 000000000..80d9a37db --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-c1", + "following": "ral-test" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-ignore.tavern.yaml new file mode 100644 index 000000000..01cb20591 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/ral-test-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"ral-test","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-follow.pat.json new file mode 100644 index 000000000..98b8e9a3e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-c2", + "following": "rfb-test" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-follow.tavern.yaml new file mode 100644 index 000000000..e4b9c61d5 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"rfb-test","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-ignore.pat.json new file mode 100644 index 000000000..8fa145cbc --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-c1", + "following": "rfb-test" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-ignore.tavern.yaml new file mode 100644 index 000000000..93a33f381 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfb-test-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"rfb-test","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-follow.pat.json new file mode 100644 index 000000000..42cee24c1 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follow-fake-c2", + "following": "rfm-test" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-follow.tavern.yaml new file mode 100644 index 000000000..6a118fa3d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"rfm-test","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-ignore.pat.json new file mode 100644 index 000000000..71e951b2d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follow-fake-c1", + "following": "rfm-test" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-ignore.tavern.yaml new file mode 100644 index 000000000..f0650cc34 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_followers/rfm-test-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_followers" + params: {"account":"rfm-test","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-follow.pat.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-follow.pat.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-follow.tavern.yaml new file mode 100644 index 000000000..398bd67a6 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"blacklisttest1","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-ignore.pat.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-ignore.pat.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-ignore.tavern.yaml new file mode 100644 index 000000000..0b90c8c2c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest1-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"blacklisttest1","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-follow.pat.json new file mode 100644 index 000000000..5b360a9c7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "blacklisttest2", + "following": "follow-fake-b4" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-follow.tavern.yaml new file mode 100644 index 000000000..2dfd7e7b7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"blacklisttest2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-ignore.pat.json new file mode 100644 index 000000000..a4359cb7f --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "blacklisttest2", + "following": "follow-fake-b5" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-ignore.tavern.yaml new file mode 100644 index 000000000..7f34bf102 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/blacklisttest2-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"blacklisttest2","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-follow.pat.json new file mode 100644 index 000000000..1a3a364b7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "fb-test-2", + "following": "follow-fake-a2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-follow.tavern.yaml new file mode 100644 index 000000000..8c1b7ca48 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"fb-test-2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-ignore.pat.json new file mode 100644 index 000000000..695a42c07 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "fb-test-2", + "following": "follow-fake-a3" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-ignore.tavern.yaml new file mode 100644 index 000000000..0077926a0 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fb-test-2-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"fb-test-2","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-follow.pat.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-follow.pat.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-follow.tavern.yaml new file mode 100644 index 000000000..8d8093978 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"fm-test-1","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-ignore.pat.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-ignore.pat.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-ignore.tavern.yaml new file mode 100644 index 000000000..7a3463384 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-1-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"fm-test-1","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-follow.pat.json new file mode 100644 index 000000000..0610ab647 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "fm-test-2", + "following": "follow-fake-a2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-follow.tavern.yaml new file mode 100644 index 000000000..1d790de1e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"fm-test-2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-ignore.pat.json new file mode 100644 index 000000000..4c771a5aa --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "fm-test-2", + "following": "follow-fake-a1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-ignore.tavern.yaml new file mode 100644 index 000000000..d862b5db4 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/fm-test-2-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"fm-test-2","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test1.pat.json new file mode 100644 index 000000000..82314588d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test1.pat.json @@ -0,0 +1,37 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follows-test1", + "following": "follow-fake-b1" + }, + { + "what": [ + "blog" + ], + "follower": "follows-test1", + "following": "follow-fake-b2" + }, + { + "what": [ + "blog" + ], + "follower": "follows-test1", + "following": "follow-fake-b3" + }, + { + "what": [ + "blog" + ], + "follower": "follows-test1", + "following": "follow-fake-b4" + }, + { + "what": [ + "blog" + ], + "follower": "follows-test1", + "following": "follow-fake-b5" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test1.tavern.yaml new file mode 100644 index 000000000..8a7923e69 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"follows-test1","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test2.pat.json new file mode 100644 index 000000000..12f1b19f4 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test2.pat.json @@ -0,0 +1,23 @@ +[ + { + "what": [ + "blog" + ], + "follower": "follows-test2", + "following": "follow-fake-b2" + }, + { + "what": [ + "blog" + ], + "follower": "follows-test2", + "following": "follow-fake-b3" + }, + { + "what": [ + "blog" + ], + "follower": "follows-test2", + "following": "follow-fake-b5" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test2.tavern.yaml new file mode 100644 index 000000000..e758057e3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"follows-test2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3-ignore.pat.json new file mode 100644 index 000000000..20b55e7f8 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "follows-test3", + "following": "follow-fake-b4" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3-ignore.tavern.yaml new file mode 100644 index 000000000..37ed90505 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"follows-test3","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3.pat.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3.pat.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3.tavern.yaml new file mode 100644 index 000000000..94438eeae --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/follows-test3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"follows-test3","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test1.pat.json new file mode 100644 index 000000000..29f48ab1e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test1.pat.json @@ -0,0 +1,23 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "ignore-test1", + "following": "follow-fake-b1" + }, + { + "what": [ + "ignore" + ], + "follower": "ignore-test1", + "following": "follow-fake-b3" + }, + { + "what": [ + "ignore" + ], + "follower": "ignore-test1", + "following": "follow-fake-b5" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test1.tavern.yaml new file mode 100644 index 000000000..28aff6325 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"ignore-test1","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2-follow.pat.json new file mode 100644 index 000000000..75c9853ce --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "ignore-test2", + "following": "follow-fake-b2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2-follow.tavern.yaml new file mode 100644 index 000000000..e69f16484 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"ignore-test2","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2.pat.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2.pat.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2.tavern.yaml new file mode 100644 index 000000000..e08c9a9c2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ignore-test2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"ignore-test2","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-follow.pat.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-follow.pat.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-follow.tavern.yaml new file mode 100644 index 000000000..3538b0fad --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"ral-test","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-ignore.pat.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-ignore.pat.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-ignore.tavern.yaml new file mode 100644 index 000000000..3b04f6918 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/ral-test-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"ral-test","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-follow.pat.json new file mode 100644 index 000000000..e40a7d99a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "rfb-test", + "following": "follow-fake-a2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-follow.tavern.yaml new file mode 100644 index 000000000..2e64a3c39 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"rfb-test","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-ignore.pat.json new file mode 100644 index 000000000..8f6d7c9fc --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "rfb-test", + "following": "follow-fake-a3" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-ignore.tavern.yaml new file mode 100644 index 000000000..3cea18d84 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfb-test-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"rfb-test","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-follow.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-follow.pat.json new file mode 100644 index 000000000..4eb208dd3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-follow.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "blog" + ], + "follower": "rfm-test", + "following": "follow-fake-a2" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-follow.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-follow.tavern.yaml new file mode 100644 index 000000000..31e3a722b --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-follow.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"rfm-test","start":null,"type":"blog","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-ignore.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-ignore.pat.json new file mode 100644 index 000000000..da2d30fad --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-ignore.pat.json @@ -0,0 +1,9 @@ +[ + { + "what": [ + "ignore" + ], + "follower": "rfm-test", + "following": "follow-fake-a1" + } +] \ No newline at end of file diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-ignore.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-ignore.tavern.yaml new file mode 100644 index 000000000..8540f8682 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_following/rfm-test-ignore.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "follow_api.get_following" + params: {"account":"rfm-test","start":null,"type":"ignore","limit":10} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A1.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A1.tavern.yaml new file mode 100644 index 000000000..8e027f0a6 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest1", "account1": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A2.tavern.yaml new file mode 100644 index 000000000..395154dd2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest1", "account1": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A3.tavern.yaml new file mode 100644 index 000000000..d89e17151 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest1", "account1": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A4.tavern.yaml new file mode 100644 index 000000000..482487c86 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest1", "account1": "follow-fake-a4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A5.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A5.tavern.yaml new file mode 100644 index 000000000..750f1d4ae --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_A5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest1", "account1": "follow-fake-a5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B1.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B1.tavern.yaml new file mode 100644 index 000000000..8ce082e24 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest1", "account2": "follow-fake-b1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B2.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B2.tavern.yaml new file mode 100644 index 000000000..3ad43d6f5 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest1", "account2": "follow-fake-b2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B3.tavern.yaml new file mode 100644 index 000000000..a97e34edf --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest1", "account2": "follow-fake-b3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B4.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B4.tavern.yaml new file mode 100644 index 000000000..c82c71a3b --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest1", "account2": "follow-fake-b4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B5.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B5.tavern.yaml new file mode 100644 index 000000000..995172863 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest1_B5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest1", "account2": "follow-fake-b5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A1.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A1.tavern.yaml new file mode 100644 index 000000000..e9bd340ad --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest2", "account1": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A2.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A2.tavern.yaml new file mode 100644 index 000000000..67e583541 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest2", "account1": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A3.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A3.tavern.yaml new file mode 100644 index 000000000..96c8361bc --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest2", "account1": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A4.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A4.tavern.yaml new file mode 100644 index 000000000..02f0c920d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest2", "account1": "follow-fake-a4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A5.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A5.tavern.yaml new file mode 100644 index 000000000..032a2acbd --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_A5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "blacklisttest2", "account1": "follow-fake-a5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B1.tavern.yaml new file mode 100644 index 000000000..86ed72c86 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest2", "account2": "follow-fake-b1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B2.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B2.tavern.yaml new file mode 100644 index 000000000..6a1120716 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest2", "account2": "follow-fake-b2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B3.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B3.tavern.yaml new file mode 100644 index 000000000..e004e5b4e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest2", "account2": "follow-fake-b3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B4.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B4.tavern.yaml new file mode 100644 index 000000000..c57e9a789 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest2", "account2": "follow-fake-b4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B5.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B5.tavern.yaml new file mode 100644 index 000000000..82b6df7a3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_B5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest2", "account2": "follow-fake-b5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C1.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C1.tavern.yaml new file mode 100644 index 000000000..b540af239 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest2", "account2": "follow-fake-c1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C2.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C2.tavern.yaml new file mode 100644 index 000000000..c930f2d0a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/blacklisttest2_C2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "blacklisttest2", "account2": "follow-fake-c2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C1.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C1.tavern.yaml new file mode 100644 index 000000000..0f580bec9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-1", "account1": "follow-fake-c1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C2.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C2.tavern.yaml new file mode 100644 index 000000000..c2099301f --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-1", "account1": "follow-fake-c2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C3.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C3.tavern.yaml new file mode 100644 index 000000000..f181b5b20 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-1", "account1": "follow-fake-c3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C4.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C4.tavern.yaml new file mode 100644 index 000000000..29f646c1b --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-1", "account1": "follow-fake-c4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C5.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C5.tavern.yaml new file mode 100644 index 000000000..a0469b8b5 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_C5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-1", "account1": "follow-fake-c5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-1.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-1.tavern.yaml new file mode 100644 index 000000000..7da2698d6 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fb-test-1", "account2": "fb-fake-1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-2.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-2.tavern.yaml new file mode 100644 index 000000000..54591c9be --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-1_fb-fake-2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fb-test-1", "account2": "fb-fake-2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A1.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A1.tavern.yaml new file mode 100644 index 000000000..5108743b1 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fb-test-2", "account2": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A2.tavern.yaml new file mode 100644 index 000000000..4bc9d3926 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fb-test-2", "account2": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A3.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A3.tavern.yaml new file mode 100644 index 000000000..0b22022df --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fb-test-2", "account2": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A4.tavern.yaml new file mode 100644 index 000000000..406f3ad25 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_A4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fb-test-2", "account2": "follow-fake-a4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C1.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C1.tavern.yaml new file mode 100644 index 000000000..e7f4726de --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-2", "account1": "follow-fake-c1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C2.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C2.tavern.yaml new file mode 100644 index 000000000..b02753cbe --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-2", "account1": "follow-fake-c2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C3.tavern.yaml new file mode 100644 index 000000000..51438eeb4 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-2", "account1": "follow-fake-c3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C4.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C4.tavern.yaml new file mode 100644 index 000000000..9882d200c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-2", "account1": "follow-fake-c4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C5.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C5.tavern.yaml new file mode 100644 index 000000000..56638e6e4 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_C5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fb-test-2", "account1": "follow-fake-c5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-1.tavern.yaml new file mode 100644 index 000000000..a76105ab3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fb-test-2", "account2": "fb-fake-1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-2.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-2.tavern.yaml new file mode 100644 index 000000000..91626a94b --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fb-test-2_fb-fake-2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fb-test-2", "account2": "fb-fake-2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C1.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C1.tavern.yaml new file mode 100644 index 000000000..bb3b67a6e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-1", "account1": "follow-fake-c1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C2.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C2.tavern.yaml new file mode 100644 index 000000000..c20dfc120 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-1", "account1": "follow-fake-c2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C3.tavern.yaml new file mode 100644 index 000000000..1ac7071cf --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-1", "account1": "follow-fake-c3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C4.tavern.yaml new file mode 100644 index 000000000..1ab00e689 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-1", "account1": "follow-fake-c4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C5.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C5.tavern.yaml new file mode 100644 index 000000000..9a9f31d17 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_C5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-1", "account1": "follow-fake-c5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-1.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-1.tavern.yaml new file mode 100644 index 000000000..e9791f5a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fm-test-1", "account2": "fm-fake-1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-2.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-2.tavern.yaml new file mode 100644 index 000000000..ffab851ba --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-1_fm-fake-2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fm-test-1", "account2": "fm-fake-2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A1.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A1.tavern.yaml new file mode 100644 index 000000000..0a2db3f17 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fm-test-2", "account2": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A2.tavern.yaml new file mode 100644 index 000000000..b4b61f7f3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fm-test-2", "account2": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A3.tavern.yaml new file mode 100644 index 000000000..566bdc2b2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fm-test-2", "account2": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A4.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A4.tavern.yaml new file mode 100644 index 000000000..48b3c67a7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_A4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fm-test-2", "account2": "follow-fake-a4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C1.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C1.tavern.yaml new file mode 100644 index 000000000..ea8c031a0 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-2", "account1": "follow-fake-c1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C2.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C2.tavern.yaml new file mode 100644 index 000000000..b31e92173 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-2", "account1": "follow-fake-c2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C3.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C3.tavern.yaml new file mode 100644 index 000000000..d93d682df --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-2", "account1": "follow-fake-c3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C4.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C4.tavern.yaml new file mode 100644 index 000000000..8e31efb69 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-2", "account1": "follow-fake-c4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C5.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C5.tavern.yaml new file mode 100644 index 000000000..d69a47702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_C5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "fm-test-2", "account1": "follow-fake-c5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-1.tavern.yaml new file mode 100644 index 000000000..a69b3ffb0 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fm-test-2", "account2": "fm-fake-1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-2.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-2.tavern.yaml new file mode 100644 index 000000000..4c35aa3a4 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/fm-test-2_fm-fake-2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "fm-test-2", "account2": "fm-fake-2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A1.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A1.tavern.yaml new file mode 100644 index 000000000..5e68696e5 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test1", "account1": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A2.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A2.tavern.yaml new file mode 100644 index 000000000..86f0c70bc --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test1", "account1": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A3.tavern.yaml new file mode 100644 index 000000000..92ed68a09 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test1", "account1": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A4.tavern.yaml new file mode 100644 index 000000000..3887e1746 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test1", "account1": "follow-fake-a4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A5.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A5.tavern.yaml new file mode 100644 index 000000000..9e8c64ce9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_A5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test1", "account1": "follow-fake-a5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B1.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B1.tavern.yaml new file mode 100644 index 000000000..93dcb0d19 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test1", "account2": "follow-fake-b1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B2.tavern.yaml new file mode 100644 index 000000000..d8721e510 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test1", "account2": "follow-fake-b2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B3.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B3.tavern.yaml new file mode 100644 index 000000000..ba8c2d2eb --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test1", "account2": "follow-fake-b3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B4.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B4.tavern.yaml new file mode 100644 index 000000000..b22b0af22 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test1", "account2": "follow-fake-b4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B5.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B5.tavern.yaml new file mode 100644 index 000000000..c66c38ffc --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test1_B5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test1", "account2": "follow-fake-b5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A1.tavern.yaml new file mode 100644 index 000000000..dcc0fa6d8 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test2", "account1": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A2.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A2.tavern.yaml new file mode 100644 index 000000000..1ceb5db2c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test2", "account1": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A3.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A3.tavern.yaml new file mode 100644 index 000000000..f0cce783b --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test2", "account1": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A4.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A4.tavern.yaml new file mode 100644 index 000000000..bb9ee79cc --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_A4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test2", "account1": "follow-fake-a4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B1.tavern.yaml new file mode 100644 index 000000000..4ba64f52f --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test2", "account2": "follow-fake-b1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B2.tavern.yaml new file mode 100644 index 000000000..7091e4a2d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test2", "account2": "follow-fake-b2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B3.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B3.tavern.yaml new file mode 100644 index 000000000..70283dc27 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test2", "account2": "follow-fake-b3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B4.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B4.tavern.yaml new file mode 100644 index 000000000..ed0028208 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test2", "account2": "follow-fake-b4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B5.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B5.tavern.yaml new file mode 100644 index 000000000..78786375a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test2_B5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test2", "account2": "follow-fake-b5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A1.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A1.tavern.yaml new file mode 100644 index 000000000..178b62f1a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test3", "account1": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A2.tavern.yaml new file mode 100644 index 000000000..81193a62a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test3", "account1": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A3.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A3.tavern.yaml new file mode 100644 index 000000000..995a7e382 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test3", "account1": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A4.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A4.tavern.yaml new file mode 100644 index 000000000..352830e8e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_A4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test3", "account1": "follow-fake-a4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B1.tavern.yaml new file mode 100644 index 000000000..903474d1d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test3", "account2": "follow-fake-b1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B2.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B2.tavern.yaml new file mode 100644 index 000000000..c2af8e978 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test3", "account2": "follow-fake-b2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B3.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B3.tavern.yaml new file mode 100644 index 000000000..7f371e3ea --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test3", "account2": "follow-fake-b3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B4.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B4.tavern.yaml new file mode 100644 index 000000000..96eb9f4b1 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test3", "account2": "follow-fake-b4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B5.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B5.tavern.yaml new file mode 100644 index 000000000..3706252e2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_B5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test3", "account2": "follow-fake-b5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C1.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C1.tavern.yaml new file mode 100644 index 000000000..83b7cef5c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test3", "account1": "follow-fake-c1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C2.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C2.tavern.yaml new file mode 100644 index 000000000..b633e1728 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "follows-test3", "account1": "follow-fake-c2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C3.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C3.tavern.yaml new file mode 100644 index 000000000..a3a6a3fa2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test3", "account2": "follow-fake-c3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C4.tavern.yaml new file mode 100644 index 000000000..f66b70fb5 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/follows-test3_C4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "follows-test3", "account2": "follow-fake-c4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A1.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A1.tavern.yaml new file mode 100644 index 000000000..8911831ca --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test1", "account1": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A2.tavern.yaml new file mode 100644 index 000000000..b06f17bf7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test1", "account1": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A3.tavern.yaml new file mode 100644 index 000000000..d1415623d --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test1", "account1": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A4.tavern.yaml new file mode 100644 index 000000000..4a9cc8ec6 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test1", "account1": "follow-fake-a4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A5.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A5.tavern.yaml new file mode 100644 index 000000000..aab47e975 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_A5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test1", "account1": "follow-fake-a5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B1.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B1.tavern.yaml new file mode 100644 index 000000000..0815cee3f --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test1", "account2": "follow-fake-b1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B2.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B2.tavern.yaml new file mode 100644 index 000000000..44e3f819e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test1", "account2": "follow-fake-b2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B3.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B3.tavern.yaml new file mode 100644 index 000000000..4ce709067 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test1", "account2": "follow-fake-b3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B4.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B4.tavern.yaml new file mode 100644 index 000000000..116657318 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test1", "account2": "follow-fake-b4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B5.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B5.tavern.yaml new file mode 100644 index 000000000..6db1c2cf0 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test1_B5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test1", "account2": "follow-fake-b5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A1.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A1.tavern.yaml new file mode 100644 index 000000000..e2319934c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test2", "account1": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A2.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A2.tavern.yaml new file mode 100644 index 000000000..00d9a3b1c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test2", "account1": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A3.tavern.yaml new file mode 100644 index 000000000..7a93139b4 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test2", "account1": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A4.tavern.yaml new file mode 100644 index 000000000..9d41ee78c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test2", "account1": "follow-fake-a4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A5.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A5.tavern.yaml new file mode 100644 index 000000000..2fde3161b --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_A5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ignore-test2", "account1": "follow-fake-a5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B1.tavern.yaml new file mode 100644 index 000000000..60fe1df09 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test2", "account2": "follow-fake-b1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B2.tavern.yaml new file mode 100644 index 000000000..652cdf1d1 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test2", "account2": "follow-fake-b2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B3.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B3.tavern.yaml new file mode 100644 index 000000000..0e2fb89a6 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test2", "account2": "follow-fake-b3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B4.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B4.tavern.yaml new file mode 100644 index 000000000..6eae5c125 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test2", "account2": "follow-fake-b4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B5.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B5.tavern.yaml new file mode 100644 index 000000000..30bbabea3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_B5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test2", "account2": "follow-fake-b5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C3.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C3.tavern.yaml new file mode 100644 index 000000000..268b36be3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test2", "account2": "follow-fake-c3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C4.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C4.tavern.yaml new file mode 100644 index 000000000..99eb8a6a3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ignore-test2_C4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ignore-test2", "account2": "follow-fake-c4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A1.tavern.yaml new file mode 100644 index 000000000..29f8f828c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ral-test", "account2": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A2.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A2.tavern.yaml new file mode 100644 index 000000000..55d567b5e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ral-test", "account2": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A3.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A3.tavern.yaml new file mode 100644 index 000000000..e899724e9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ral-test", "account2": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C1.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C1.tavern.yaml new file mode 100644 index 000000000..754ebc774 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ral-test", "account1": "follow-fake-c1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C2.tavern.yaml new file mode 100644 index 000000000..422732556 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ral-test", "account1": "follow-fake-c2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C3.tavern.yaml new file mode 100644 index 000000000..f141db18a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ral-test", "account1": "follow-fake-c3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C4.tavern.yaml new file mode 100644 index 000000000..b3ad92ef6 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ral-test", "account1": "follow-fake-c4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C5.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C5.tavern.yaml new file mode 100644 index 000000000..d063d5fc1 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-C5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "ral-test", "account1": "follow-fake-c5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-b.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-b.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-b.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-b.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-b.tavern.yaml new file mode 100644 index 000000000..de3e9099b --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-b.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ral-test", "account2": "ral-fake-b"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-m.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-m.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-m.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-m.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-m.tavern.yaml new file mode 100644 index 000000000..3208d86da --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/ral-test_ral-fake-m.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "ral-test", "account2": "ral-fake-m"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A1.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A1.tavern.yaml new file mode 100644 index 000000000..0dac39322 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfb-test", "account2": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A2.tavern.yaml new file mode 100644 index 000000000..935e7f57a --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfb-test", "account2": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A3.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A3.tavern.yaml new file mode 100644 index 000000000..aaf75a10c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfb-test", "account2": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C1.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C1.tavern.yaml new file mode 100644 index 000000000..edd05059e --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfb-test", "account1": "follow-fake-c1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C2.tavern.yaml new file mode 100644 index 000000000..249d084ea --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfb-test", "account1": "follow-fake-c2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C3.tavern.yaml new file mode 100644 index 000000000..1218f1400 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfb-test", "account1": "follow-fake-c3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C4.tavern.yaml new file mode 100644 index 000000000..ba2b58dd1 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfb-test", "account1": "follow-fake-c4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C5.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C5.tavern.yaml new file mode 100644 index 000000000..78dbf1d3f --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_C5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfb-test", "account1": "follow-fake-c5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fb-fake-1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fb-fake-1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fb-fake-1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fb-fake-1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fb-fake-1.tavern.yaml new file mode 100644 index 000000000..ca11d1f67 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fb-fake-1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfb-test", "account2": "fb-fake-1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fm-fake-2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fm-fake-2.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fm-fake-2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fm-fake-2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fm-fake-2.tavern.yaml new file mode 100644 index 000000000..727372761 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfb-test_fm-fake-2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfb-test", "account2": "fm-fake-2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A1.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A1.tavern.yaml new file mode 100644 index 000000000..299530c0f --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfm-test", "account2": "follow-fake-a1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A2.tavern.yaml new file mode 100644 index 000000000..ee088df35 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfm-test", "account2": "follow-fake-a2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A3.tavern.yaml new file mode 100644 index 000000000..c32f91fff --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_A3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfm-test", "account2": "follow-fake-a3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C1.pat.json new file mode 100644 index 000000000..4d40991a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": true +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C1.tavern.yaml new file mode 100644 index 000000000..4a03f5b63 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfm-test", "account1": "follow-fake-c1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C2.pat.json new file mode 100644 index 000000000..35e7fe6af --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": true, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C2.tavern.yaml new file mode 100644 index 000000000..1dff9d8c6 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfm-test", "account1": "follow-fake-c2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C3.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C3.pat.json new file mode 100644 index 000000000..57d8f8134 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C3.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": true, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C3.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C3.tavern.yaml new file mode 100644 index 000000000..f8f0890bf --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C3.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfm-test", "account1": "follow-fake-c3"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C4.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C4.pat.json new file mode 100644 index 000000000..ce88655e7 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C4.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": true, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C4.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C4.tavern.yaml new file mode 100644 index 000000000..c75243b38 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C4.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfm-test", "account1": "follow-fake-c4"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C5.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C5.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C5.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C5.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C5.tavern.yaml new file mode 100644 index 000000000..918ad4502 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_C5.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account2": "rfm-test", "account1": "follow-fake-c5"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fb-fake-2.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fb-fake-2.pat.json new file mode 100644 index 000000000..d8216a702 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fb-fake-2.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": true, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fb-fake-2.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fb-fake-2.tavern.yaml new file mode 100644 index 000000000..4fb9085a9 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fb-fake-2.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfm-test", "account2": "fb-fake-2"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fm-fake-1.pat.json b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fm-fake-1.pat.json new file mode 100644 index 000000000..1f5f4c2a2 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fm-fake-1.pat.json @@ -0,0 +1,7 @@ +{ + "blacklists": false, + "follows": false, + "follows_blacklists": false, + "follows_muted": false, + "ignores": false +} diff --git a/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fm-fake-1.tavern.yaml b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fm-fake-1.tavern.yaml new file mode 100644 index 000000000..bb2099cc0 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/mock_tests/get_relationship_between_accounts/rfm-test_fm-fake-1.tavern.yaml @@ -0,0 +1,26 @@ +--- + test_name: Hivemind + + marks: + - patterntest # relies on mock data + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.get_relationship_between_accounts" + params: {"account1": "rfm-test", "account2": "fm-fake-1"} + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern -- GitLab From d9f12b00de81a77bd058cca658be0485861e94eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 24 Feb 2025 16:46:57 +0100 Subject: [PATCH 59/83] Remove '' mode --- hive/indexer/follow.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py index 2cd54a9ef..d8185d967 100644 --- a/hive/indexer/follow.py +++ b/hive/indexer/follow.py @@ -40,7 +40,7 @@ def insert_or_update(items, follower, following, block_num): class Batch(): def __init__(self): - self.data = [('', [])] + self.data = [] def iter(self): return iter(self.data) @@ -49,8 +49,11 @@ class Batch(): self.data.append((mode, [])) def mode(self): - (mode, _) = self.data[-1] - return mode + if len(self.data) > 0: + (mode, _) = self.data[-1] + return mode + else: + return '' def add_insert(self, follower, following, block_num): if self.mode() != 'insert': @@ -72,7 +75,6 @@ class Batch(): def clear(self): self.data.clear() - self.new('') class Follow(DbAdapterHolder): @@ -243,20 +245,15 @@ class Follow(DbAdapterHolder): follow_muted = [] follow_blacklisted = [] for (n, (mode, batch)) in enumerate(cls.follows_batches_to_flush.iter()): - if mode!= '': - follows.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.follow" for r,g,b in batch])}])::hivemind_app.follow_updates""") + follows.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.follow" for r,g,b in batch])}])::hivemind_app.follow_updates""") for (n, (mode, batch)) in enumerate(cls.muted_batches_to_flush.iter()): - if mode!= '': - muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.mute" for r,g,b in batch])}])::hivemind_app.mute_updates""") + muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.mute" for r,g,b in batch])}])::hivemind_app.mute_updates""") for (n, (mode, batch)) in enumerate(cls.blacklisted_batches_to_flush.iter()): - if mode!= '': - blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.blacklist" for r,g,b in batch])}])::hivemind_app.blacklist_updates""") + blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.blacklist" for r,g,b in batch])}])::hivemind_app.blacklist_updates""") for (n, (mode, batch)) in enumerate(cls.follow_muted_batches_to_flush.iter()): - if mode!= '': - follow_muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.follow_mute" for r,g,b in batch])}])::hivemind_app.follow_mute_updates""") + follow_muted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.follow_mute" for r,g,b in batch])}])::hivemind_app.follow_mute_updates""") for (n, (mode, batch)) in enumerate(cls.follow_blacklisted_batches_to_flush.iter()): - if mode!= '': - follow_blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.follow_blacklist" for r,g,b in batch])}])::hivemind_app.follow_blacklist_updates""") + follow_blacklisted.append(f"""({n}, '{mode}', array[{','.join([f"({r},{g or 'NULL'},{b})::hivemind_app.follow_blacklist" for r,g,b in batch])}])::hivemind_app.follow_blacklist_updates""") if follows or muted or blacklisted or follow_muted or follow_blacklisted: cls.db.query_no_return( f""" -- GitLab From 1a77979dda5e849c52da9ad9426796129deec26b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 3 Mar 2025 15:43:03 +0100 Subject: [PATCH 60/83] Add link to follows design --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 25ce47a1c..ae19a3f00 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ communities, providing a consensus interpretation layer for Hive applications. - *communities:* mod roles/actions, members, feeds (in 1.5; [spec](https://gitlab.syncad.com/hive/hivemind/-/blob/master/docs/communities.md)) - *accounts:* normalized profile data, reputation -- *feeds:* un/follows and un/reblogs +- *feeds:* un/follows and un/reblogs: [spec](https://gitlab.syncad.com/hive/hivemind/-/blob/master/docs/follows.md) ### Hivemind does not track most blockchain operations -- GitLab From 233b8f76cb4ae659ff6789425bb1aab10868ea9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Tue, 25 Feb 2025 14:25:14 +0100 Subject: [PATCH 61/83] Simplify account registration in blocks.py --- hive/indexer/blocks.py | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/hive/indexer/blocks.py b/hive/indexer/blocks.py index ac7227263..bf49ec503 100644 --- a/hive/indexer/blocks.py +++ b/hive/indexer/blocks.py @@ -346,7 +346,12 @@ class Blocks: Posts.comment_payout_ops, block, cls._current_block_date, num, num <= cls._last_safe_cashout_block ) - json_ops = [] + def try_register_account(account_name, op, op_details): + if not Accounts.register( + account_name, op_details, cls._head_block_date, num + ): + log.error(f"Failed to register account {account_name} from operation: {op}") + for transaction in block.get_next_transaction(): assert issubclass(type(transaction), Transaction) for operation in transaction.get_next_operation(): @@ -365,36 +370,20 @@ class Blocks: assert 'block_num' not in op op['block_num'] = num - account_name = None - op_details = None - potentially_new_account = False # account ops if op_type == OperationType.POW: - account_name = op['worker_account'] - potentially_new_account = True + try_register_account(op['worker_account'], op, None) elif op_type == OperationType.POW_2: - account_name = op['work']['value']['input']['worker_account'] - potentially_new_account = True + try_register_account(op['work']['value']['input']['worker_account'], op, None) elif op_type == OperationType.ACCOUNT_CREATE: - account_name = op['new_account_name'] - op_details = op - potentially_new_account = True + try_register_account(op['new_account_name'], op, op) elif op_type == OperationType.ACCOUNT_CREATE_WITH_DELEGATION: - account_name = op['new_account_name'] - op_details = op - potentially_new_account = True + try_register_account(op['new_account_name'], op, op) elif op_type == OperationType.CREATE_CLAIMED_ACCOUNT: - account_name = op['new_account_name'] - op_details = op - potentially_new_account = True - - if potentially_new_account and not Accounts.register( - account_name, op_details, cls._head_block_date, num - ): - log.error(f"Failed to register account {account_name} from operation: {op}") + try_register_account(op['new_account_name'], op, op) # account metadata updates - if op_type == OperationType.ACCOUNT_UPDATE: + elif op_type == OperationType.ACCOUNT_UPDATE: Accounts.update_op(op, False) elif op_type == OperationType.ACCOUNT_UPDATE_2: Accounts.update_op(op, True) -- GitLab From d469563cba17a9e105742091264a1a347dee4ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 27 Feb 2025 11:14:14 +0100 Subject: [PATCH 62/83] Add is_author_muted to hivemind_app.process_hive_post_operation Also rename is_muted to is_post_muted to avoid confusion. --- hive/db/sql_scripts/hive_post_operations.sql | 181 +++++++++++-------- hive/indexer/posts.py | 2 +- 2 files changed, 107 insertions(+), 76 deletions(-) diff --git a/hive/db/sql_scripts/hive_post_operations.sql b/hive/db/sql_scripts/hive_post_operations.sql index d4a9135e2..063c14a2d 100644 --- a/hive/db/sql_scripts/hive_post_operations.sql +++ b/hive/db/sql_scripts/hive_post_operations.sql @@ -26,13 +26,13 @@ END $function$; DROP FUNCTION IF EXISTS hivemind_app.encode_bitwise_mask; -CREATE OR REPLACE FUNCTION hivemind_app.encode_bitwise_mask(muted_reasons INT[]) +CREATE OR REPLACE FUNCTION hivemind_app.encode_bitwise_mask(post_muted_reasons INT[]) RETURNS INT AS $$ DECLARE mask INT := 0; number INT; BEGIN - FOREACH number IN ARRAY muted_reasons + FOREACH number IN ARRAY post_muted_reasons LOOP mask := mask | (1 << number); END LOOP; @@ -42,13 +42,13 @@ $$ LANGUAGE plpgsql; DROP TYPE IF EXISTS hivemind_app.process_community_post_result CASCADE; CREATE TYPE hivemind_app.process_community_post_result AS ( - is_muted bool, + is_post_muted bool, community_id integer, -- hivemind_app.hive_posts.community_id%TYPE - muted_reasons INTEGER + post_muted_reasons INTEGER ); DROP FUNCTION IF EXISTS hivemind_app.process_community_post; -CREATE OR REPLACE FUNCTION hivemind_app.process_community_post(_block_num hivemind_app.hive_posts.block_num%TYPE, _community_support_start_block hivemind_app.hive_posts.block_num%TYPE, _parent_permlink hivemind_app.hive_permlink_data.permlink%TYPE, _author_id hivemind_app.hive_posts.author_id%TYPE, _is_comment bool, _is_parent_muted bool, _community_id hivemind_app.hive_posts.community_id%TYPE) +CREATE OR REPLACE FUNCTION hivemind_app.process_community_post(_block_num hivemind_app.hive_posts.block_num%TYPE, _community_support_start_block hivemind_app.hive_posts.block_num%TYPE, _parent_permlink hivemind_app.hive_permlink_data.permlink%TYPE, _author_id hivemind_app.hive_posts.author_id%TYPE, _is_comment bool, _is_parent_post_muted bool, _community_id hivemind_app.hive_posts.community_id%TYPE) RETURNS hivemind_app.process_community_post_result LANGUAGE plpgsql as @@ -60,12 +60,12 @@ declare __community_type_topic CONSTANT SMALLINT := 1; __community_type_journal CONSTANT SMALLINT := 2; __community_type_council CONSTANT SMALLINT := 3; - __is_muted BOOL := TRUE; + __is_post_muted BOOL := TRUE; __community_id hivemind_app.hive_posts.community_id%TYPE; - __muted_reasons INTEGER[] := ARRAY[]::INTEGER[]; + __post_muted_reasons INTEGER[] := ARRAY[]::INTEGER[]; BEGIN IF _block_num < _community_support_start_block THEN - __is_muted := FALSE; + __is_post_muted := FALSE; __community_id := NULL; ELSE IF _is_comment = TRUE THEN @@ -76,36 +76,36 @@ BEGIN IF __community_id IS NOT NULL THEN IF __community_type_id = __community_type_topic THEN - __is_muted := FALSE; + __is_post_muted := FALSE; ELSE IF __community_type_id = __community_type_journal AND _is_comment = TRUE THEN - __is_muted := FALSE; + __is_post_muted := FALSE; ELSE select role_id into __role_id from hivemind_app.hive_roles where hivemind_app.hive_roles.community_id = __community_id AND account_id = _author_id; IF __community_type_id = __community_type_journal AND _is_comment = FALSE AND __role_id IS NOT NULL AND __role_id >= __member_role THEN - __is_muted := FALSE; + __is_post_muted := FALSE; ELSIF __community_type_id = __community_type_council AND __role_id IS NOT NULL AND __role_id >= __member_role THEN - __is_muted := FALSE; + __is_post_muted := FALSE; ELSE -- This means the post was muted because of community reasons, 1 is MUTED_COMMUNITY_TYPE see community.py for the ENUM definition - __muted_reasons := ARRAY[1]; + __post_muted_reasons := ARRAY[1]; END IF; END IF; END IF; ELSE - __is_muted := FALSE; + __is_post_muted := FALSE; END IF; - -- __is_muted can be TRUE here if it's a comment and its parent is muted - IF _is_parent_muted = TRUE THEN - __is_muted := TRUE; + -- __is_post_muted can be TRUE here if it's a comment and its parent is muted + IF _is_parent_post_muted = TRUE THEN + __is_post_muted := TRUE; -- 2 is MUTED_PARENT, see community.py for the ENUM definition - __muted_reasons := array_append(__muted_reasons, 2); + __post_muted_reasons := array_append(__post_muted_reasons, 2); END IF; END IF; - RETURN (__is_muted, __community_id, hivemind_app.encode_bitwise_mask(__muted_reasons))::hivemind_app.process_community_post_result; + RETURN (__is_post_muted, __community_id, hivemind_app.encode_bitwise_mask(__post_muted_reasons))::hivemind_app.process_community_post_result; END; $$ STABLE; @@ -122,7 +122,7 @@ CREATE OR REPLACE FUNCTION hivemind_app.process_hive_post_operation( in _metadata_tags VARCHAR[]) RETURNS TABLE (is_new_post boolean, id hivemind_app.hive_posts.id%TYPE, author_id hivemind_app.hive_posts.author_id%TYPE, permlink_id hivemind_app.hive_posts.permlink_id%TYPE, post_category hivemind_app.hive_category_data.category%TYPE, parent_id hivemind_app.hive_posts.parent_id%TYPE, community_id hivemind_app.hive_posts.community_id%TYPE, - is_valid hivemind_app.hive_posts.is_valid%TYPE, is_muted hivemind_app.hive_posts.is_muted%TYPE, depth hivemind_app.hive_posts.depth%TYPE) + is_valid hivemind_app.hive_posts.is_valid%TYPE, is_post_muted hivemind_app.hive_posts.is_muted%TYPE, depth hivemind_app.hive_posts.depth%TYPE, is_author_muted BOOLEAN) LANGUAGE plpgsql AS $function$ @@ -137,64 +137,94 @@ BEGIN ON CONFLICT DO NOTHING ; IF _parent_author != '' THEN - RETURN QUERY INSERT INTO hivemind_app.hive_posts as hp + RETURN QUERY + WITH selected_posts AS ( + SELECT + s.parent_id, + s.parent_author_id, + s.depth, + (s.composite).community_id, + s.category_id, + s.root_id, + (s.composite).is_post_muted, + s.is_valid, + s.author_id, + s.permlink_id, + s.created_at, + s.updated_at, + s.sc_hot, + s.sc_trend, + s.active, + s.payout_at, + s.cashout_time, + s.counter_deleted, + s.block_num, + s.block_num_created, + (s.composite).post_muted_reasons + FROM ( + SELECT + hivemind_app.process_community_post(_block_num, _community_support_start_block, _parent_permlink, ha.id, TRUE, php.is_muted, php.community_id) as composite, + php.id AS parent_id, + php.author_id AS parent_author_id, + php.depth + 1 AS depth, + COALESCE(php.category_id, (select hcg.id from hivemind_app.hive_category_data hcg where hcg.category = _parent_permlink)) AS category_id, + (CASE(php.root_id) + WHEN 0 THEN php.id + ELSE php.root_id + END) AS root_id, + php.is_valid AS is_valid, + ha.id AS author_id, hpd.id AS permlink_id, _date AS created_at, + _date AS updated_at, + hivemind_app.calculate_time_part_of_hot(_date) AS sc_hot, + hivemind_app.calculate_time_part_of_trending(_date) AS sc_trend, + _date AS active, (_date + INTERVAL '7 days') AS payout_at, (_date + INTERVAL '7 days') AS cashout_time, + 0 AS counter_deleted, + _block_num as block_num, _block_num as block_num_created + FROM hivemind_app.hive_accounts ha, + hivemind_app.hive_permlink_data hpd, + hivemind_app.hive_posts php + INNER JOIN hivemind_app.hive_accounts pha ON pha.id = php.author_id + INNER JOIN hivemind_app.hive_permlink_data phpd ON phpd.id = php.permlink_id + WHERE pha.name = _parent_author AND phpd.permlink = _parent_permlink AND + ha.name = _author AND hpd.permlink = _permlink AND php.counter_deleted = 0 + ) AS s + ) + INSERT INTO hivemind_app.hive_posts as hp (parent_id, depth, community_id, category_id, root_id, is_muted, is_valid, author_id, permlink_id, created_at, updated_at, sc_hot, sc_trend, active, payout_at, cashout_time, counter_deleted, block_num, block_num_created, muted_reasons) - SELECT - s.parent_id, - s.depth, - (s.composite).community_id, - s.category_id, - s.root_id, - (s.composite).is_muted, - s.is_valid, - s.author_id, - s.permlink_id, - s.created_at, - s.updated_at, - s.sc_hot, - s.sc_trend, - s.active, - s.payout_at, - s.cashout_time, - s.counter_deleted, - s.block_num, - s.block_num_created, - (s.composite).muted_reasons - FROM ( - SELECT - hivemind_app.process_community_post(_block_num, _community_support_start_block, _parent_permlink, ha.id, TRUE, php.is_muted, php.community_id) as composite, - php.id AS parent_id, php.depth + 1 AS depth, - COALESCE(php.category_id, (select hcg.id from hivemind_app.hive_category_data hcg where hcg.category = _parent_permlink)) AS category_id, - (CASE(php.root_id) - WHEN 0 THEN php.id - ELSE php.root_id - END) AS root_id, - php.is_valid AS is_valid, - ha.id AS author_id, hpd.id AS permlink_id, _date AS created_at, - _date AS updated_at, - hivemind_app.calculate_time_part_of_hot(_date) AS sc_hot, - hivemind_app.calculate_time_part_of_trending(_date) AS sc_trend, - _date AS active, (_date + INTERVAL '7 days') AS payout_at, (_date + INTERVAL '7 days') AS cashout_time, - 0 AS counter_deleted, - _block_num as block_num, _block_num as block_num_created - FROM hivemind_app.hive_accounts ha, - hivemind_app.hive_permlink_data hpd, - hivemind_app.hive_posts php - INNER JOIN hivemind_app.hive_accounts pha ON pha.id = php.author_id - INNER JOIN hivemind_app.hive_permlink_data phpd ON phpd.id = php.permlink_id - WHERE pha.name = _parent_author AND phpd.permlink = _parent_permlink AND - ha.name = _author AND hpd.permlink = _permlink AND php.counter_deleted = 0 - ) s + SELECT + s.parent_id, + s.depth, + s.community_id, + s.category_id, + s.root_id, + s.is_post_muted, + s.is_valid, + s.author_id, + s.permlink_id, + s.created_at, + s.updated_at, + s.sc_hot, + s.sc_trend, + s.active, + s.payout_at, + s.cashout_time, + s.counter_deleted, + s.block_num, + s.block_num_created, + s.post_muted_reasons + FROM selected_posts AS s ON CONFLICT ON CONSTRAINT hive_posts_ux1 DO UPDATE SET --- During post update it is disallowed to change: parent-post, category, community-id - --- then also depth, is_valid and is_muted is impossible to change + --- then also depth, is_valid and is_post_muted is impossible to change --- post edit part updated_at = _date, active = _date, block_num = _block_num - RETURNING (xmax = 0) as is_new_post, hp.id, hp.author_id, hp.permlink_id, (SELECT hcd.category FROM hivemind_app.hive_category_data hcd WHERE hcd.id = hp.category_id) as post_category, hp.parent_id, hp.community_id, hp.is_valid, hp.is_muted, hp.depth + RETURNING (xmax = 0) as is_new_post, hp.id, hp.author_id, hp.permlink_id, (SELECT hcd.category FROM hivemind_app.hive_category_data hcd WHERE hcd.id = hp.category_id) as post_category, hp.parent_id, hp.community_id, hp.is_valid, hp.is_muted, hp.depth, (SELECT NOT EXISTS (SELECT NULL::text + FROM hivemind_app.muted AS m + WHERE m.follower = (SELECT parent_author_id FROM selected_posts) AND m.following = hp.author_id)) ; ELSE INSERT INTO hivemind_app.hive_category_data @@ -211,7 +241,7 @@ BEGIN (s.composite).community_id, s.category_id, s.root_id, - (s.composite).is_muted, + (s.composite).is_post_muted, s.is_valid, s.author_id, s.permlink_id, @@ -225,7 +255,7 @@ BEGIN s.counter_deleted, s.block_num, s.block_num_created, - (s.composite).muted_reasons + (s.composite).post_muted_reasons FROM ( SELECT hivemind_app.process_community_post(_block_num, _community_support_start_block, _parent_permlink, ha.id, FALSE,FALSE, NULL) as composite, @@ -258,7 +288,7 @@ BEGIN pdi.community_id, pdi.category_id, pdi.root_id, - pdi.is_muted, + pdi.is_post_muted, pdi.is_valid, pdi.author_id, pdi.permlink_id, @@ -272,11 +302,11 @@ BEGIN pdi.counter_deleted, pdi.block_num, pdi.block_num_created, - pdi.muted_reasons + pdi.post_muted_reasons FROM posts_data_to_insert as pdi ON CONFLICT ON CONSTRAINT hive_posts_ux1 DO UPDATE SET --- During post update it is disallowed to change: parent-post, category, community-id - --- then also depth, is_valid and is_muted is impossible to change + --- then also depth, is_valid and is_post_muted is impossible to change --- post edit part updated_at = _date, active = _date, @@ -312,7 +342,8 @@ BEGIN ip.community_id, ip.is_valid, ip.is_muted, - ip.depth + ip.depth, + FALSE AS is_author_muted FROM inserted_post as ip; END IF; END diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index a8ce3e90d..eb264a9a4 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -67,7 +67,7 @@ class Posts(DbAdapterHolder): tags.append(tag) # No escaping needed due to used sqlalchemy formatting features sql = f""" - SELECT is_new_post, id, author_id, permlink_id, post_category, parent_id, community_id, is_valid, is_muted, depth + SELECT is_new_post, id, author_id, permlink_id, post_category, parent_id, community_id, is_valid, is_post_muted, depth, is_author_muted FROM {SCHEMA_NAME}.process_hive_post_operation((:author)::varchar, (:permlink)::varchar, (:parent_author)::varchar, (:parent_permlink)::varchar, (:date)::timestamp, (:community_support_start_block)::integer, (:block_num)::integer, (:tags)::VARCHAR[]); """ -- GitLab From 5521d699e7d0ae8838453433723d2d9dfdfbde9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 27 Feb 2025 13:05:57 +0100 Subject: [PATCH 63/83] Add parent_author_id to hivemind_app.process_hive_post_operation --- hive/db/sql_scripts/hive_post_operations.sql | 7 ++++--- hive/indexer/posts.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/hive/db/sql_scripts/hive_post_operations.sql b/hive/db/sql_scripts/hive_post_operations.sql index 063c14a2d..4d90e4578 100644 --- a/hive/db/sql_scripts/hive_post_operations.sql +++ b/hive/db/sql_scripts/hive_post_operations.sql @@ -121,7 +121,7 @@ CREATE OR REPLACE FUNCTION hivemind_app.process_hive_post_operation( in _block_num hivemind_app.hive_posts.block_num%TYPE, in _metadata_tags VARCHAR[]) RETURNS TABLE (is_new_post boolean, id hivemind_app.hive_posts.id%TYPE, author_id hivemind_app.hive_posts.author_id%TYPE, permlink_id hivemind_app.hive_posts.permlink_id%TYPE, - post_category hivemind_app.hive_category_data.category%TYPE, parent_id hivemind_app.hive_posts.parent_id%TYPE, community_id hivemind_app.hive_posts.community_id%TYPE, + post_category hivemind_app.hive_category_data.category%TYPE, parent_id hivemind_app.hive_posts.parent_id%TYPE, parent_author_id hivemind_app.hive_posts.author_id%TYPE, community_id hivemind_app.hive_posts.community_id%TYPE, is_valid hivemind_app.hive_posts.is_valid%TYPE, is_post_muted hivemind_app.hive_posts.is_muted%TYPE, depth hivemind_app.hive_posts.depth%TYPE, is_author_muted BOOLEAN) LANGUAGE plpgsql AS @@ -222,9 +222,9 @@ BEGIN updated_at = _date, active = _date, block_num = _block_num - RETURNING (xmax = 0) as is_new_post, hp.id, hp.author_id, hp.permlink_id, (SELECT hcd.category FROM hivemind_app.hive_category_data hcd WHERE hcd.id = hp.category_id) as post_category, hp.parent_id, hp.community_id, hp.is_valid, hp.is_muted, hp.depth, (SELECT NOT EXISTS (SELECT NULL::text + RETURNING (xmax = 0) as is_new_post, hp.id, hp.author_id, hp.permlink_id, (SELECT hcd.category FROM hivemind_app.hive_category_data hcd WHERE hcd.id = hp.category_id) as post_category, hp.parent_id, (SELECT s.parent_author_id FROM selected_posts AS s) AS parent_author_id, hp.community_id, hp.is_valid, hp.is_muted, hp.depth, (SELECT EXISTS (SELECT NULL::text FROM hivemind_app.muted AS m - WHERE m.follower = (SELECT parent_author_id FROM selected_posts) AND m.following = hp.author_id)) + WHERE m.follower = (SELECT s.parent_author_id FROM selected_posts AS s) AND m.following = hp.author_id)) ; ELSE INSERT INTO hivemind_app.hive_category_data @@ -339,6 +339,7 @@ BEGIN ip.permlink_id, ip.post_category, ip.parent_id, + 0 AS parent_author_id, ip.community_id, ip.is_valid, ip.is_muted, diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index eb264a9a4..b540fef4c 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -67,7 +67,7 @@ class Posts(DbAdapterHolder): tags.append(tag) # No escaping needed due to used sqlalchemy formatting features sql = f""" - SELECT is_new_post, id, author_id, permlink_id, post_category, parent_id, community_id, is_valid, is_post_muted, depth, is_author_muted + SELECT is_new_post, id, author_id, permlink_id, post_category, parent_id, parent_author_id, community_id, is_valid, is_post_muted, depth, is_author_muted FROM {SCHEMA_NAME}.process_hive_post_operation((:author)::varchar, (:permlink)::varchar, (:parent_author)::varchar, (:parent_permlink)::varchar, (:date)::timestamp, (:community_support_start_block)::integer, (:block_num)::integer, (:tags)::VARCHAR[]); """ -- GitLab From 05ad508d53f157d5de5311762591994057d30b21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 27 Feb 2025 19:33:55 +0100 Subject: [PATCH 64/83] Remove unused stuff --- hive/indexer/posts.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index b540fef4c..664592b04 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -23,11 +23,6 @@ log = logging.getLogger(__name__) class Posts(DbAdapterHolder): """Handles critical/core post ops and data.""" - # LRU cache for (author-permlink -> id) lookup (~400mb per 1M entries) - CACHE_SIZE = 2000000 - _hits = 0 - _miss = 0 - comment_payout_ops = {} _comment_payout_ops = [] @@ -194,8 +189,6 @@ class Posts(DbAdapterHolder): @classmethod def comment_payout_op(cls): - values_limit = 1000 - """ Process comment payment operations """ for k, v in cls.comment_payout_ops.items(): author = None -- GitLab From 817531054f0bf2a3d9667e6b8753c07c72d6dda2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 27 Feb 2025 19:37:29 +0100 Subject: [PATCH 65/83] Fill posts notifications from posts indexer --- hive/db/sql_scripts/head_block_time.sql | 10 ++++++- hive/db/sql_scripts/notifications_view.sql | 20 +------------ .../sql_scripts/update_notification_cache.sql | 7 +---- hive/indexer/posts.py | 30 ++++++++++++++++++- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/hive/db/sql_scripts/head_block_time.sql b/hive/db/sql_scripts/head_block_time.sql index 822d45d0f..70c1cc9a7 100644 --- a/hive/db/sql_scripts/head_block_time.sql +++ b/hive/db/sql_scripts/head_block_time.sql @@ -9,7 +9,6 @@ $BODY$ $BODY$ ; - DROP FUNCTION IF EXISTS hivemind_app.block_before_head CASCADE; CREATE OR REPLACE FUNCTION hivemind_app.block_before_head( in _time INTERVAL ) RETURNS hivemind_app.blocks_view.num%TYPE @@ -17,4 +16,13 @@ LANGUAGE 'sql' STABLE AS $BODY$ SELECT hive.app_get_current_block_num( 'hivemind_app' ) - CAST( extract(epoch from _time)/3 as INTEGER ); +$BODY$; + +DROP FUNCTION IF EXISTS hivemind_app.block_before_irreversible CASCADE; +CREATE OR REPLACE FUNCTION hivemind_app.block_before_irreversible( in _time INTERVAL ) +RETURNS hivemind_app.blocks_view.num%TYPE +LANGUAGE 'sql' STABLE +AS $BODY$ + SELECT hive.app_get_irreversible_block( 'hivemind_app' ) - CAST( extract(epoch from _time)/3 as INTEGER ); +$BODY$; diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index c7bcb937f..13ca51f70 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -93,25 +93,7 @@ CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view notifs.community_title, notifs.payload, harv.score - FROM ( SELECT hpv.block_num, - hpv.id AS post_id, - CASE hpv.depth - WHEN 1 THEN 12 - ELSE 13 - END AS type_id, - hpv.created_at, - hpv.author_id AS src, - hpv.parent_author_id AS dst, - hpv.parent_id as dst_post_id, - ''::character varying(16) AS community, - ''::character varying AS community_title, - ''::character varying AS payload - FROM hivemind_app.hive_posts_parent_view hpv - WHERE hpv.depth > 0 AND - NOT EXISTS (SELECT NULL::text - FROM hivemind_app.muted AS m - WHERE m.follower = hpv.parent_author_id AND m.following = hpv.author_id) -UNION ALL + FROM ( SELECT f.block_num, 0 AS post_id, 15 AS type_id, diff --git a/hive/db/sql_scripts/update_notification_cache.sql b/hive/db/sql_scripts/update_notification_cache.sql index d8872c095..f3cb1fdc3 100644 --- a/hive/db/sql_scripts/update_notification_cache.sql +++ b/hive/db/sql_scripts/update_notification_cache.sql @@ -1,5 +1,4 @@ DROP FUNCTION IF EXISTS hivemind_app.update_notification_cache; -; CREATE OR REPLACE FUNCTION hivemind_app.update_notification_cache(in _first_block_num INT, in _last_block_num INT, in _prune_old BOOLEAN) RETURNS VOID AS @@ -7,11 +6,7 @@ $function$ DECLARE __limit_block hivemind_app.blocks_view.num%TYPE = hivemind_app.block_before_head( '90 days' ); BEGIN - SET LOCAL work_mem='256MB'; - IF _first_block_num IS NULL THEN - TRUNCATE TABLE hivemind_app.hive_notification_cache; - ALTER SEQUENCE hivemind_app.hive_notification_cache_id_seq RESTART WITH 1; - ELSE + IF _first_block_num IS NOT NULL THEN DELETE FROM hivemind_app.hive_notification_cache nc WHERE _prune_old AND nc.block_num <= __limit_block; END IF; diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index 664592b04..54c5c2d36 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -25,6 +25,7 @@ class Posts(DbAdapterHolder): comment_payout_ops = {} _comment_payout_ops = [] + _comment_notifications = [] @classmethod def last_id(cls): @@ -93,6 +94,9 @@ class Posts(DbAdapterHolder): body=op['body'] if op['body'] else '', json=op['json_metadata'] if op['json_metadata'] else '', ) + if row['depth'] > 0 and not row['is_author_muted']: + type_id = 12 if row['depth'] == 1 else 13 + cls._comment_notifications.append({"block_num": op['block_num'], "type_id": type_id, "created_at": block_date, "src": row['author_id'], "dst": row['parent_author_id'], "dst_post_id": row['parent_id'], "post_id": row['id'], "payload": "", "community": "", "community_title": ""}) else: # edit case. Now we need to (potentially) apply patch to the post body. # empty new body means no body edit, not clear (same with other data) @@ -187,6 +191,30 @@ class Posts(DbAdapterHolder): cls._comment_payout_ops.clear() return n + @classmethod + def flush_notifications(cls): + n = len(cls._comment_notifications) + if n > 0: + sql = f""" + INSERT INTO {SCHEMA_NAME}.hive_notification_cache + (block_num, type_id, created_at, src, dst, dst_post_id, post_id, score, payload, community, community_title) + SELECT n.block_num, n.type_id, n.created_at, n.src, n.dst, n.dst_post_id, n.post_id, harv.score, '', '', '' + FROM + (VALUES {{}}) + AS n(block_num, type_id, created_at, src, dst, dst_post_id, post_id) + JOIN {SCHEMA_NAME}.hive_accounts_rank_view AS harv ON harv.id = n.src + WHERE n.block_num > hivemind_app.block_before_irreversible( '90 days' ) + ORDER BY n.block_num, n.type_id, n.created_at, n.src, n.dst, n.dst_post_id, n.post_id + """ + for chunk in chunks(cls._comment_notifications, 1000): + cls.beginTx() + values_str = ','.join(f"({n['block_num']}, {n['type_id']}, {escape_characters(n['created_at'])}::timestamp, {n['src']}, {n['dst']}, {n['dst_post_id']}, {n['post_id']})" for n in chunk) + cls.db.query_prepared(sql.format(values_str)) + cls.commitTx() + + cls._comment_notifications.clear() + return n + @classmethod def comment_payout_op(cls): """ Process comment payment operations """ @@ -408,4 +436,4 @@ class Posts(DbAdapterHolder): @classmethod def flush(cls): - return cls.comment_payout_op() + cls.flush_into_db() + return cls.comment_payout_op() + cls.flush_into_db() + cls.flush_notifications() -- GitLab From 6b76d95362450473761c92979783519984c1ef2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 10 Mar 2025 15:42:09 +0100 Subject: [PATCH 66/83] Only flush post notifications for the last 90 days --- hive/indexer/posts.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index 54c5c2d36..3d35c55f6 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -26,12 +26,7 @@ class Posts(DbAdapterHolder): comment_payout_ops = {} _comment_payout_ops = [] _comment_notifications = [] - - @classmethod - def last_id(cls): - """Get the last indexed post id.""" - sql = f"SELECT id FROM {SCHEMA_NAME}.hive_posts WHERE counter_deleted = 0 ORDER BY id DESC LIMIT 1;" - return DbAdapterHolder.common_block_processing_db().query_one(sql) or 0 + _notification_first_block = None @classmethod def delete_op(cls, op, block_date): @@ -193,8 +188,11 @@ class Posts(DbAdapterHolder): @classmethod def flush_notifications(cls): + if cls._notification_first_block is None: + cls._notification_first_block = cls.db.query_row("select hivemind_app.block_before_irreversible( '90 days' ) AS num")['num'] n = len(cls._comment_notifications) - if n > 0: + max_block_num = max(n['block_num'] for n in cls._comment_notifications or [{'block_num': 0}]) + if n > 0 and max_block_num > cls._notification_first_block: sql = f""" INSERT INTO {SCHEMA_NAME}.hive_notification_cache (block_num, type_id, created_at, src, dst, dst_post_id, post_id, score, payload, community, community_title) @@ -211,8 +209,10 @@ class Posts(DbAdapterHolder): values_str = ','.join(f"({n['block_num']}, {n['type_id']}, {escape_characters(n['created_at'])}::timestamp, {n['src']}, {n['dst']}, {n['dst_post_id']}, {n['post_id']})" for n in chunk) cls.db.query_prepared(sql.format(values_str)) cls.commitTx() + else: + n = 0 + cls._comment_notifications.clear() - cls._comment_notifications.clear() return n @classmethod -- GitLab From f807ae7f275c4275ec0d7379fa3f811395e3bd7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 10 Mar 2025 15:45:29 +0100 Subject: [PATCH 67/83] Calculate the notification score from reputation rather than from hive_accounts_rank_view This uses reptracker_endpoints.get_account_reputation function, but inlines the call. The first reason is that the function doesn't specify reptracker_app schema directly. Since hivemind doesn't have it in its search_path, the call fail. The second reason is that the calculation is modified to bring the resulting range closer to the scores from hive_accounts_rank_view. --- hive/indexer/posts.py | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index 3d35c55f6..74b3d6a63 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -91,7 +91,15 @@ class Posts(DbAdapterHolder): ) if row['depth'] > 0 and not row['is_author_muted']: type_id = 12 if row['depth'] == 1 else 13 - cls._comment_notifications.append({"block_num": op['block_num'], "type_id": type_id, "created_at": block_date, "src": row['author_id'], "dst": row['parent_author_id'], "dst_post_id": row['parent_id'], "post_id": row['id'], "payload": "", "community": "", "community_title": ""}) + cls._comment_notifications.append({ + "block_num": op['block_num'], + "type_id": type_id, + "created_at": block_date, + "src": row['author_id'], + "dst": row['parent_author_id'], + "dst_post_id": row['parent_id'], + "post_id": row['id'], + }) else: # edit case. Now we need to (potentially) apply patch to the post body. # empty new body means no body edit, not clear (same with other data) @@ -193,14 +201,37 @@ class Posts(DbAdapterHolder): n = len(cls._comment_notifications) max_block_num = max(n['block_num'] for n in cls._comment_notifications or [{'block_num': 0}]) if n > 0 and max_block_num > cls._notification_first_block: + # With clause is inlined, modified call to reptracker_endpoints.get_account_reputation. + # Reputation is multiplied by 7.5 rather than 9 to bring the max value to 100 rather than 115. + # In case of reputation being 0, the score is set to 25 rather than 0. sql = f""" + WITH log_account_rep AS + ( + SELECT + account_id, + LOG(10, ABS(nullif(reputation, 0))) AS rep, + (CASE WHEN reputation < 0 THEN -1 ELSE 1 END) AS is_neg + FROM reptracker_app.account_reputations + ), + calculate_rep AS + ( + SELECT + account_id, + GREATEST(lar.rep - 9, 0) * lar.is_neg AS rep + FROM log_account_rep lar + ), + final_rep AS + ( + SELECT account_id, coalesce(cr.rep * 7.5 + 25, 25)::INT AS rep FROM calculate_rep AS cr + ) INSERT INTO {SCHEMA_NAME}.hive_notification_cache (block_num, type_id, created_at, src, dst, dst_post_id, post_id, score, payload, community, community_title) - SELECT n.block_num, n.type_id, n.created_at, n.src, n.dst, n.dst_post_id, n.post_id, harv.score, '', '', '' + SELECT n.block_num, n.type_id, n.created_at, n.src, n.dst, n.dst_post_id, n.post_id, r.rep, '', '', '' FROM (VALUES {{}}) AS n(block_num, type_id, created_at, src, dst, dst_post_id, post_id) - JOIN {SCHEMA_NAME}.hive_accounts_rank_view AS harv ON harv.id = n.src + JOIN {SCHEMA_NAME}.hive_accounts AS ha ON n.src = ha.id + JOIN final_rep AS r ON ha.haf_id = r.account_id WHERE n.block_num > hivemind_app.block_before_irreversible( '90 days' ) ORDER BY n.block_num, n.type_id, n.created_at, n.src, n.dst, n.dst_post_id, n.post_id """ -- GitLab From d6ed68fba5c837fce5e7d76825d7a6cd06d8f186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 10 Mar 2025 15:56:58 +0100 Subject: [PATCH 68/83] Test for post notification scores --- .../block_data/follow_op/mock_reply_data.json | 53 +++++++++++++++++++ .../get_payout_stats/limit_10.pat.json | 2 +- .../get_payout_stats/limit_as_string.pat.json | 2 +- .../get_payout_stats/max_limit.pat.json | 2 +- .../get_payout_stats/no_param.pat.json | 2 +- .../post_notifications/steemrollin.pat.json | 26 +++++++++ .../steemrollin.tavern.yaml | 33 ++++++++++++ .../get_trending_tags/max_limit.pat.json | 2 +- 8 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 mock_data/block_data/follow_op/mock_reply_data.json create mode 100644 tests/api_tests/hivemind/tavern/bridge_api_patterns/post_notifications/steemrollin.pat.json create mode 100644 tests/api_tests/hivemind/tavern/bridge_api_patterns/post_notifications/steemrollin.tavern.yaml diff --git a/mock_data/block_data/follow_op/mock_reply_data.json b/mock_data/block_data/follow_op/mock_reply_data.json new file mode 100644 index 000000000..bc01c1c23 --- /dev/null +++ b/mock_data/block_data/follow_op/mock_reply_data.json @@ -0,0 +1,53 @@ +{ + "4999999": { + "transactions": [ + { + "ref_block_num": 100000, + "ref_block_prefix": 0, + "expiration": "2020-03-23T12:08:00", + "operations": [ + { + "type": "comment_operation", + "value": { + "body": "test comment from negative reputation account", + "title": "", + "author": "wang", + "permlink": "test-1", + "json_metadata": "{}", + "parent_author": "steemrollin", + "parent_permlink": "steemit-frequently-asked-questions-faq" + } + }, + { + "type": "comment_operation", + "value": { + "body": "test comment from 0 reputation account", + "title": "", + "author": "awhite", + "permlink": "test-2", + "json_metadata": "{}", + "parent_author": "steemrollin", + "parent_permlink": "steemit-frequently-asked-questions-faq" + } + }, + { + "type": "comment_operation", + "value": { + "body": "test comment from high reputation account", + "title": "", + "author": "gavvet", + "permlink": "test-3", + "json_metadata": "{}", + "parent_author": "steemrollin", + "parent_permlink": "steemit-frequently-asked-questions-faq" + } + } + ], + "extensions": [], + "signatures": [ + "" + ] + } + ] + } +} diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/limit_10.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/limit_10.pat.json index cd8f332a2..afd5c7456 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/limit_10.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/limit_10.pat.json @@ -19,7 +19,7 @@ "@gavvet", "@gavvet", 48152.134, - 206, + 207, null ], [ diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/limit_as_string.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/limit_as_string.pat.json index 38d92ec2a..fdf5a1a68 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/limit_as_string.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/limit_as_string.pat.json @@ -19,7 +19,7 @@ "@gavvet", "@gavvet", 48152.134, - 206, + 207, null ], [ diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/max_limit.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/max_limit.pat.json index 4296fa1c1..4b5f80b78 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/max_limit.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/max_limit.pat.json @@ -19,7 +19,7 @@ "@gavvet", "@gavvet", 48152.134, - 206, + 207, null ], [ diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/no_param.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/no_param.pat.json index 4296fa1c1..4b5f80b78 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/no_param.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/get_payout_stats/no_param.pat.json @@ -19,7 +19,7 @@ "@gavvet", "@gavvet", 48152.134, - 206, + 207, null ], [ diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/post_notifications/steemrollin.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/post_notifications/steemrollin.pat.json new file mode 100644 index 000000000..2335e80c3 --- /dev/null +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/post_notifications/steemrollin.pat.json @@ -0,0 +1,26 @@ +[ + { + "date": "2016-09-15T19:47:15", + "id": 2010478, + "msg": "@awhite replied to your post", + "score": 40, + "type": "reply", + "url": "@awhite/test-2" + }, + { + "date": "2016-09-15T19:47:15", + "id": 2010477, + "msg": "@gavvet replied to your post", + "score": 70, + "type": "reply", + "url": "@gavvet/test-3" + }, + { + "date": "2016-09-15T19:47:15", + "id": 2010476, + "msg": "@wang replied to your post", + "score": 30, + "type": "reply", + "url": "@wang/test-1" + } +] diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/post_notifications/steemrollin.tavern.yaml b/tests/api_tests/hivemind/tavern/bridge_api_patterns/post_notifications/steemrollin.tavern.yaml new file mode 100644 index 000000000..019aff13c --- /dev/null +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/post_notifications/steemrollin.tavern.yaml @@ -0,0 +1,33 @@ +--- + test_name: Hivemind + + # Test the post notification scores for: + # - highest reputation account (gavvet) + # - lowest reputation account (wang) + # - account with 0 reputation (awhite) + + marks: + - patterntest # test to check paging (first 100 results) + + + includes: + - !include ../../common.yaml + + stages: + - name: test + request: + url: "{service.proto:s}://{service.server:s}:{service.port}/" + method: POST + headers: + content-type: application/json + json: + jsonrpc: "2.0" + id: 1 + method: "bridge.post_notifications" + params: {"author":"steemrollin", + "permlink": "steemit-frequently-asked-questions-faq" + } + response: + status_code: 200 + verify_response_with: + function: validate_response:compare_response_with_pattern diff --git a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_trending_tags/max_limit.pat.json b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_trending_tags/max_limit.pat.json index 0434b4f97..ba0fb73f1 100644 --- a/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_trending_tags/max_limit.pat.json +++ b/tests/api_tests/hivemind/tavern/condenser_api_patterns/get_trending_tags/max_limit.pat.json @@ -24,7 +24,7 @@ "total_payouts": "106519.079 HBD" }, { - "comments": 10141, + "comments": 10144, "name": "steem", "top_posts": 1158, "total_payouts": "82690.698 HBD" -- GitLab From 509617c5ebfcbc31b9b436da0ce8fa6bdcc1c560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Tue, 11 Mar 2025 13:22:19 +0100 Subject: [PATCH 69/83] LEFT JOIN reptracker_app.account_reputations `account_reputations` might not have all the accounts, so left join is needed. --- hive/indexer/posts.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index 74b3d6a63..5cbaf9528 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -222,16 +222,16 @@ class Posts(DbAdapterHolder): ), final_rep AS ( - SELECT account_id, coalesce(cr.rep * 7.5 + 25, 25)::INT AS rep FROM calculate_rep AS cr + SELECT account_id, (cr.rep * 7.5 + 25)::INT AS rep FROM calculate_rep AS cr ) INSERT INTO {SCHEMA_NAME}.hive_notification_cache (block_num, type_id, created_at, src, dst, dst_post_id, post_id, score, payload, community, community_title) - SELECT n.block_num, n.type_id, n.created_at, n.src, n.dst, n.dst_post_id, n.post_id, r.rep, '', '', '' + SELECT n.block_num, n.type_id, n.created_at, n.src, n.dst, n.dst_post_id, n.post_id, COALESCE(r.rep, 25), '', '', '' FROM (VALUES {{}}) AS n(block_num, type_id, created_at, src, dst, dst_post_id, post_id) JOIN {SCHEMA_NAME}.hive_accounts AS ha ON n.src = ha.id - JOIN final_rep AS r ON ha.haf_id = r.account_id + LEFT JOIN final_rep AS r ON ha.haf_id = r.account_id WHERE n.block_num > hivemind_app.block_before_irreversible( '90 days' ) ORDER BY n.block_num, n.type_id, n.created_at, n.src, n.dst, n.dst_post_id, n.post_id """ -- GitLab From e983e5c52795ea543572bda029b17dfaca8fe75d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Tue, 11 Mar 2025 16:51:42 +0100 Subject: [PATCH 70/83] Do not write notification for self and negative scores --- hive/indexer/posts.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index 5cbaf9528..d6022fa9e 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -233,6 +233,8 @@ class Posts(DbAdapterHolder): JOIN {SCHEMA_NAME}.hive_accounts AS ha ON n.src = ha.id LEFT JOIN final_rep AS r ON ha.haf_id = r.account_id WHERE n.block_num > hivemind_app.block_before_irreversible( '90 days' ) + AND COALESCE(r.rep, 25) > 0 + AND n.src IS DISTINCT FROM n.dst ORDER BY n.block_num, n.type_id, n.created_at, n.src, n.dst, n.dst_post_id, n.post_id """ for chunk in chunks(cls._comment_notifications, 1000): -- GitLab From b9d3ba895f574f64538f8489f6f97722857f0b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 17 Mar 2025 15:04:14 +0100 Subject: [PATCH 71/83] Clear notifications from muted accounts after massive sync In massive sync we operate an 1000 blocks at a time. Post notifications are filled by posts indexer, mutes are filled by follow indexer. If we process a 1000 blocks batch and there's a mute, it will be processed by the follow indexer, but this won't be seen by the posts indexer in this batch. This means that the posts notifications will be generated even for accounts that are muted. This essentially means that if there is a mute operation in a 1000 blocks batch, notifications for posts from that batch will not get that mute into account. So it would be possible for users to get notifications from an accounts they have recently muted. The fix is to clear any notifications from muted account at the end of the massive sync. The issue should not affect live mode, because we process only one block at a time. --- hive/db/db_state.py | 5 +++++ hive/db/schema.py | 1 + hive/db/sql_scripts/clear_muted_notifications.sql | 11 +++++++++++ 3 files changed, 17 insertions(+) create mode 100644 hive/db/sql_scripts/clear_muted_notifications.sql diff --git a/hive/db/db_state.py b/hive/db/db_state.py index f55e6b1e6..5c3529967 100644 --- a/hive/db/db_state.py +++ b/hive/db/db_state.py @@ -455,6 +455,11 @@ class DbState: cls._execute_query_with_modified_work_mem(db=db_mgr.db, sql=sql) log.info("[MASSIVE] update_notification_cache executed in %.4fs", perf_counter() - time_start) + time_start = perf_counter() + sql = f"CALL {SCHEMA_NAME}.clear_muted_notifications();" + cls._execute_query_with_modified_work_mem(db=db_mgr.db, sql=sql) + log.info("[MASSIVE] clear_muted_notifications executed in %.4fs", perf_counter() - time_start) + @classmethod def _finish_follow_count(cls, db, last_imported_block, current_imported_block): with AutoDbDisposer(db, "finish_follow_count") as db_mgr: diff --git a/hive/db/schema.py b/hive/db/schema.py index 36c2ff8d8..6167c2d83 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -601,6 +601,7 @@ def setup_runtime_code(db): "delete_hive_posts_mentions.sql", "notifications_view.sql", "update_notification_cache.sql", + "clear_muted_notifications.sql", "hot_and_trends.sql", "update_hive_posts_children_count.sql", "update_posts_rshares.sql", diff --git a/hive/db/sql_scripts/clear_muted_notifications.sql b/hive/db/sql_scripts/clear_muted_notifications.sql new file mode 100644 index 000000000..430a3d5d6 --- /dev/null +++ b/hive/db/sql_scripts/clear_muted_notifications.sql @@ -0,0 +1,11 @@ +DROP FUNCTION IF EXISTS hivemind_app.clear_muted_notifications; +CREATE OR REPLACE PROCEDURE hivemind_app.clear_muted_notifications() + LANGUAGE sql +AS +$BODY$ + DELETE FROM hivemind_app.hive_notification_cache AS n + WHERE EXISTS ( + SELECT NULL FROM hivemind_app.muted AS m + WHERE n.src=m.following AND n.dst=m.follower + ); +$BODY$; -- GitLab From f66c9d6c76a435ec47fecaaeb1a2b3053e00b1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 17 Mar 2025 16:41:21 +0100 Subject: [PATCH 72/83] Refresh expects for number of unread notifications --- .../bridge_api_patterns/unread_notifications/abit.pat.json | 2 +- .../bridge_api_patterns/unread_notifications/elyaque.pat.json | 2 +- .../bridge_api_patterns/unread_notifications/larrytom.pat.json | 2 +- .../bridge_api_patterns/unread_notifications/min_score.pat.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json index 14443b611..cc5f96a85 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json @@ -1,4 +1,4 @@ { "lastread": "2016-04-29 04:11:57", - "unread": 1922 + "unread": 1894 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json index b93fc6405..b433dc925 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 2121 + "unread": 2089 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json index 42f038524..d4f009ba2 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 27 + "unread": 26 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json index 2b99f878a..30ea5ea9b 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 2927 + "unread": 2922 } -- GitLab From 29ea089703af8e484afe0c5ab97b19fb5e3d7c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Wed, 19 Mar 2025 13:42:56 +0100 Subject: [PATCH 73/83] Fill notification cache for follows in the indexer --- hive/db/sql_scripts/notifications_view.sql | 13 ----- hive/indexer/follow.py | 55 ++++++++++++++++++- .../unread_notifications/abit.pat.json | 2 +- .../unread_notifications/alice.pat.json | 2 +- .../unread_notifications/anton333.pat.json | 2 +- .../unread_notifications/elyaque.pat.json | 2 +- .../unread_notifications/min_score.pat.json | 2 +- .../unread_notifications/steemit.pat.json | 2 +- 8 files changed, 60 insertions(+), 20 deletions(-) diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index 13ca51f70..fd704423f 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -94,19 +94,6 @@ CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view notifs.payload, harv.score FROM ( - SELECT f.block_num, - 0 AS post_id, - 15 AS type_id, - (select hb.created_at from hivemind_app.blocks_view hb where hb.num = (f.block_num - 1)) as created_at, -- use time of previous block to match head_block_time behavior at given block - f.follower AS src, - f.following AS dst, - 0 as dst_post_id, - ''::character varying(16) AS community, - ''::character varying AS community_title, - ''::character varying AS payload - FROM hivemind_app.follows f - -UNION ALL SELECT hr.block_num, hp.id AS post_id, 14 AS type_id, diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py index d8185d967..05a95b8c1 100644 --- a/hive/indexer/follow.py +++ b/hive/indexer/follow.py @@ -5,6 +5,7 @@ from hive.conf import SCHEMA_NAME from hive.indexer.db_adapter_holder import DbAdapterHolder from hive.indexer.accounts import Accounts from hive.utils.normalize import escape_characters +from hive.utils.misc import chunks from funcy.seqs import first # Ensure 'first' is imported log = logging.getLogger(__name__) @@ -86,6 +87,7 @@ class Follow(DbAdapterHolder): follow_muted_batches_to_flush = Batch() follow_blacklisted_batches_to_flush = Batch() affected_accounts = set() + follow_notifications_to_flush = [] idx = 0 @classmethod @@ -165,6 +167,7 @@ class Follow(DbAdapterHolder): cls.muted_batches_to_flush.add_delete(follower, following, block_num) cls.affected_accounts.add(following) cls.idx += 1 + cls.follow_notifications_to_flush.append((follower, following, block_num)) elif action == FollowAction.Mute: for following in op.get('following', []): cls.muted_batches_to_flush.add_insert(follower, following, block_num) @@ -225,7 +228,7 @@ class Follow(DbAdapterHolder): cls.idx += 1 @classmethod - def flush(cls): + def flush_follows(cls): """Flush accumulated follow operations to the database in batches.""" n = ( cls.follows_batches_to_flush.len() + @@ -276,3 +279,53 @@ class Follow(DbAdapterHolder): cls.follow_blacklisted_batches_to_flush.clear() cls.commitTx() return n + + @classmethod + def flush_notifications(cls): + n = len(cls.follow_notifications_to_flush) + if n > 0: + sql = f""" + WITH log_account_rep AS + ( + SELECT + account_id, + LOG(10, ABS(nullif(reputation, 0))) AS rep, + (CASE WHEN reputation < 0 THEN -1 ELSE 1 END) AS is_neg + FROM reptracker_app.account_reputations + ), + calculate_rep AS + ( + SELECT + account_id, + GREATEST(lar.rep - 9, 0) * lar.is_neg AS rep + FROM log_account_rep lar + ), + final_rep AS + ( + SELECT account_id, (cr.rep * 7.5 + 25)::INT AS rep FROM calculate_rep AS cr + ) + INSERT INTO {SCHEMA_NAME}.hive_notification_cache + (block_num, type_id, created_at, src, dst, dst_post_id, post_id, score, payload, community, community_title) + SELECT n.block_num, 15, (SELECT hb.created_at FROM hivemind_app.blocks_view hb WHERE hb.num = (n.block_num - 1)) AS created_at, r.id, g.id, 0, 0, COALESCE(rep.rep, 25), '', '', '' + FROM + (VALUES {{}}) + AS n(src, dst, block_num) + JOIN {SCHEMA_NAME}.hive_accounts AS r ON n.src = r.name + JOIN {SCHEMA_NAME}.hive_accounts AS g ON n.dst = g.name + LEFT JOIN final_rep AS rep ON r.haf_id = rep.account_id + WHERE n.block_num > hivemind_app.block_before_irreversible( '90 days' ) + AND COALESCE(rep.rep, 25) > 0 + AND n.src IS DISTINCT FROM n.dst + ORDER BY n.block_num, created_at, r.id, r.id + """ + for chunk in chunks(cls.follow_notifications_to_flush, 1000): + cls.beginTx() + values_str = ','.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in chunk) + cls.db.query_prepared(sql.format(values_str)) + cls.commitTx() + cls.follow_notifications_to_flush.clear() + return n + + @classmethod + def flush(cls): + return cls.flush_follows() + cls.flush_notifications() diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json index cc5f96a85..8970da895 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json @@ -1,4 +1,4 @@ { "lastread": "2016-04-29 04:11:57", - "unread": 1894 + "unread": 1921 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/alice.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/alice.pat.json index 9ab6ac561..36e8ea00d 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/alice.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/alice.pat.json @@ -1,4 +1,4 @@ { "lastread": "2016-04-29 04:11:57", - "unread": 45 + "unread": 47 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/anton333.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/anton333.pat.json index e2c5e6507..938c8302a 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/anton333.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/anton333.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 169 + "unread": 175 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json index b433dc925..4718bddc4 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 2089 + "unread": 2113 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json index 30ea5ea9b..a9151c2e1 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 2922 + "unread": 2996 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/steemit.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/steemit.pat.json index 1632275cb..547bf9867 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/steemit.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/steemit.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 660 + "unread": 673 } -- GitLab From 378387b529c666300653c1c7001fde918052fe57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 20 Mar 2025 13:55:47 +0100 Subject: [PATCH 74/83] fixup! Fill notification cache for follows in the indexer --- hive/indexer/follow.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py index 05a95b8c1..736504a16 100644 --- a/hive/indexer/follow.py +++ b/hive/indexer/follow.py @@ -284,6 +284,9 @@ class Follow(DbAdapterHolder): def flush_notifications(cls): n = len(cls.follow_notifications_to_flush) if n > 0: + # With clause is inlined, modified call to reptracker_endpoints.get_account_reputation. + # Reputation is multiplied by 7.5 rather than 9 to bring the max value to 100 rather than 115. + # In case of reputation being 0, the score is set to 25 rather than 0. sql = f""" WITH log_account_rep AS ( -- GitLab From e8d0bfd4b41b06281292ccbdf13e34d10a2a237b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 20 Mar 2025 15:32:36 +0100 Subject: [PATCH 75/83] fixup! Fill notification cache for follows in the indexer --- hive/indexer/follow.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py index 736504a16..4d9a0fedf 100644 --- a/hive/indexer/follow.py +++ b/hive/indexer/follow.py @@ -89,6 +89,8 @@ class Follow(DbAdapterHolder): affected_accounts = set() follow_notifications_to_flush = [] idx = 0 + _notification_first_block = None + @classmethod def _validate_op(cls, account, op): @@ -282,8 +284,11 @@ class Follow(DbAdapterHolder): @classmethod def flush_notifications(cls): + if cls._notification_first_block is None: + cls._notification_first_block = cls.db.query_row("select hivemind_app.block_before_irreversible( '90 days' ) AS num")['num'] n = len(cls.follow_notifications_to_flush) - if n > 0: + max_block_num = max(block_num for r,g,block_num in cls.follow_notifications_to_flush or [("","",0)]) + if n > 0 and max_block_num > cls._notification_first_block: # With clause is inlined, modified call to reptracker_endpoints.get_account_reputation. # Reputation is multiplied by 7.5 rather than 9 to bring the max value to 100 rather than 115. # In case of reputation being 0, the score is set to 25 rather than 0. @@ -326,7 +331,10 @@ class Follow(DbAdapterHolder): values_str = ','.join(f"({follower}, {following}, {block_num})" for (follower, following, block_num) in chunk) cls.db.query_prepared(sql.format(values_str)) cls.commitTx() - cls.follow_notifications_to_flush.clear() + else: + n = 0 + cls.follow_notifications_to_flush.clear() + return n @classmethod -- GitLab From 9e86cfcf965d39906740bc5c4000508c33f75491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Fri, 21 Mar 2025 09:29:39 +0100 Subject: [PATCH 76/83] Fill reblog notifications from the indexer --- hive/db/sql_scripts/notifications_view.sql | 13 ---- hive/indexer/reblog.py | 71 ++++++++++++++++++++++ 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index fd704423f..de75c10e2 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -94,19 +94,6 @@ CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view notifs.payload, harv.score FROM ( - SELECT hr.block_num, - hp.id AS post_id, - 14 AS type_id, - hr.created_at, - hr.blogger_id AS src, - hp.author_id AS dst, - hr.post_id as dst_post_id, - ''::character varying(16) AS community, - ''::character varying AS community_title, - ''::character varying AS payload - FROM hivemind_app.hive_reblogs hr -- reblogs - JOIN hivemind_app.hive_posts hp ON hr.post_id = hp.id -UNION ALL SELECT hs.block_num, 0 AS post_id, 11 AS type_id, diff --git a/hive/indexer/reblog.py b/hive/indexer/reblog.py index f65b5d288..409184b46 100644 --- a/hive/indexer/reblog.py +++ b/hive/indexer/reblog.py @@ -7,6 +7,7 @@ from hive.db.adapter import Db from hive.indexer.accounts import Accounts from hive.indexer.db_adapter_holder import DbAdapterHolder from hive.utils.normalize import escape_characters +from hive.utils.misc import chunks log = logging.getLogger(__name__) @@ -14,6 +15,8 @@ class Reblog(DbAdapterHolder): """Class for reblog operations""" reblog_items_to_flush = {} + reblog_notifications_to_flush = [] + _notification_first_block = None @classmethod def _validated_op(cls, actor, op, block_date, block_num): @@ -54,6 +57,13 @@ class Reblog(DbAdapterHolder): cls.delete(op['author'], op['permlink'], op['account']) else: cls.reblog_items_to_flush[key] = {'op': op} + cls.reblog_notifications_to_flush.append({ + "block_num": block_num, + "created_at": block_date, + "src": op['account'], + "dst": op['author'], + "permlink": op['permlink'], + }) @classmethod def delete(cls, author, permlink, account): @@ -66,6 +76,10 @@ class Reblog(DbAdapterHolder): @classmethod def flush(cls): + return cls.flush_reblogs() + cls.flush_notifications() + + @classmethod + def flush_reblogs(cls): """Flush collected data to database""" sql_prefix = f""" INSERT INTO {SCHEMA_NAME}.hive_reblogs (blogger_id, post_id, created_at, block_num) @@ -119,3 +133,60 @@ class Reblog(DbAdapterHolder): cls.reblog_items_to_flush.clear() return item_count + + @classmethod + def flush_notifications(cls): + if cls._notification_first_block is None: + cls._notification_first_block = cls.db.query_row("select hivemind_app.block_before_irreversible( '90 days' ) AS num")['num'] + n = len(cls.reblog_notifications_to_flush) + max_block_num = max(n['block_num'] for n in cls.reblog_notifications_to_flush or [{"block_num": 0}]) + if n > 0 and max_block_num > cls._notification_first_block: + # With clause is inlined, modified call to reptracker_endpoints.get_account_reputation. + # Reputation is multiplied by 7.5 rather than 9 to bring the max value to 100 rather than 115. + # In case of reputation being 0, the score is set to 25 rather than 0. + sql = f""" + WITH log_account_rep AS + ( + SELECT + account_id, + LOG(10, ABS(nullif(reputation, 0))) AS rep, + (CASE WHEN reputation < 0 THEN -1 ELSE 1 END) AS is_neg + FROM reptracker_app.account_reputations + ), + calculate_rep AS + ( + SELECT + account_id, + GREATEST(lar.rep - 9, 0) * lar.is_neg AS rep + FROM log_account_rep lar + ), + final_rep AS + ( + SELECT account_id, (cr.rep * 7.5 + 25)::INT AS rep FROM calculate_rep AS cr + ) + INSERT INTO {SCHEMA_NAME}.hive_notification_cache + (block_num, type_id, created_at, src, dst, dst_post_id, post_id, score, payload, community, community_title) + SELECT n.block_num, 14, n.created_at, r.id, g.id, pp.parent_id, p.id, COALESCE(rep.rep, 25), '', '', '' + FROM + (VALUES {{}}) + AS n(block_num, created_at, src, dst, permlink) + JOIN {SCHEMA_NAME}.hive_accounts AS r ON n.src = r.name + JOIN {SCHEMA_NAME}.hive_accounts AS g ON n.dst = g.name + JOIN {SCHEMA_NAME}.hive_permlink_data AS p ON n.permlink = p.permlink + JOIN {SCHEMA_NAME}.hive_posts AS pp ON pp.id = p.id + LEFT JOIN final_rep AS rep ON r.haf_id = rep.account_id + WHERE n.block_num > hivemind_app.block_before_irreversible( '90 days' ) + AND COALESCE(rep.rep, 25) > 0 + AND n.src IS DISTINCT FROM n.dst + ORDER BY n.block_num, n.created_at, r.id, g.id, pp.parent_id, p.id + """ + for chunk in chunks(cls.reblog_notifications_to_flush, 1000): + cls.beginTx() + values_str = ','.join(f"({n['block_num']}, {escape_characters(n['created_at'])}::timestamp, {escape_characters(n['src'])}, {escape_characters(n['dst'])}, {escape_characters(n['permlink'])})" for n in chunk) + cls.db.query_prepared(sql.format(values_str)) + cls.commitTx() + else: + n = 0 + cls.reblog_notifications_to_flush.clear() + return n + -- GitLab From 1d1c6898b7ebb7ea530048d9255c8da3594eb49f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 24 Mar 2025 12:49:17 +0100 Subject: [PATCH 77/83] Fill subscriptions notifications from the indexer --- hive/db/sql_scripts/notifications_view.sql | 13 ------ hive/indexer/community.py | 47 ++++++++++++++++++++++ 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index de75c10e2..7a11e6223 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -94,19 +94,6 @@ CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view notifs.payload, harv.score FROM ( - SELECT hs.block_num, - 0 AS post_id, - 11 AS type_id, - hs.created_at, - hs.account_id AS src, - hs.community_id AS dst, - 0 as dst_post_id, - hc.name AS community, - hc.title AS community_title, - ''::character varying AS payload - FROM hivemind_app.hive_subscriptions hs -- subscriptions - JOIN hivemind_app.hive_communities hc ON hs.community_id = hc.id -UNION ALL SELECT hm.block_num, hm.post_id, 16 AS type_id, diff --git a/hive/indexer/community.py b/hive/indexer/community.py index b375a0c0c..266bcb1f1 100644 --- a/hive/indexer/community.py +++ b/hive/indexer/community.py @@ -5,6 +5,7 @@ from enum import IntEnum import logging import re +from time import perf_counter import ujson as json @@ -12,6 +13,7 @@ from hive.conf import SCHEMA_NAME from hive.indexer.db_adapter_holder import DbAdapterHolder from hive.indexer.accounts import Accounts from hive.indexer.notify import Notify +from hive.utils.stats import FlushStatusManager as FSM log = logging.getLogger(__name__) @@ -256,6 +258,8 @@ class Community: class CommunityOp: """Handles validating and processing of community custom_json ops.""" + _notification_first_block = None + # pylint: disable=too-many-instance-attributes SCHEMA = { @@ -337,6 +341,8 @@ class CommunityOp: """Applies a validated operation.""" assert self.valid, 'cannot apply invalid op' + time_start = perf_counter() + action = self.action params = dict( date=self.date, @@ -375,6 +381,46 @@ class CommunityOp: WHERE id = :community_id""", **params, ) + if CommunityOp._notification_first_block is None: + CommunityOp._notification_first_block = DbAdapterHolder.common_block_processing_db().query_row("select hivemind_app.block_before_irreversible( '90 days' ) AS num")['num'] + if self.block_num > CommunityOp._notification_first_block: + # With clause is inlined, modified call to reptracker_endpoints.get_account_reputation. + # Reputation is multiplied by 7.5 rather than 9 to bring the max value to 100 rather than 115. + # In case of reputation being 0, the score is set to 25 rather than 0. + sql = f""" + WITH log_account_rep AS + ( + SELECT + account_id, + LOG(10, ABS(nullif(reputation, 0))) AS rep, + (CASE WHEN reputation < 0 THEN -1 ELSE 1 END) AS is_neg + FROM reptracker_app.account_reputations + ), + calculate_rep AS + ( + SELECT + account_id, + GREATEST(lar.rep - 9, 0) * lar.is_neg AS rep + FROM log_account_rep lar + ), + final_rep AS + ( + SELECT account_id, (cr.rep * 7.5 + 25)::INT AS rep FROM calculate_rep AS cr + ) + INSERT INTO {SCHEMA_NAME}.hive_notification_cache + (block_num, type_id, created_at, src, dst, dst_post_id, post_id, score, payload, community, community_title) + SELECT n.block_num, 11, n.created_at, r.id, hc.id, 0, 0, COALESCE(rep.rep, 25), '', hc.name, hc.title + FROM + (VALUES (:block_num, (:date)::timestamp, :actor_id, :community_id)) AS n(block_num, created_at, src, dst) + JOIN {SCHEMA_NAME}.hive_accounts AS r ON n.src = r.id + JOIN {SCHEMA_NAME}.hive_communities AS hc ON n.dst = hc.id + LEFT JOIN final_rep AS rep ON r.haf_id = rep.account_id + WHERE n.block_num > hivemind_app.block_before_irreversible( '90 days' ) + AND COALESCE(rep.rep, 25) > 0 + AND n.src IS DISTINCT FROM n.dst + ORDER BY n.block_num, n.created_at, r.id, hc.id + """ + DbAdapterHolder.common_block_processing_db().query_no_return(sql, **params) elif action == 'unsubscribe': DbAdapterHolder.common_block_processing_db().query( f"""DELETE FROM {SCHEMA_NAME}.hive_subscriptions @@ -445,6 +491,7 @@ class CommunityOp: elif action == 'flagPost': self._notify('flag_post', payload=self.notes) + FSM.flush_stat('Community', perf_counter() - time_start, 1) return True def _notify(self, op, **kwargs): -- GitLab From 8c560b30cbf12ed666065c93868460ed5b672697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 24 Mar 2025 12:50:57 +0100 Subject: [PATCH 78/83] Log flush times in live sync --- hive/indexer/blocks.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hive/indexer/blocks.py b/hive/indexer/blocks.py index bf49ec503..fa2fb8899 100644 --- a/hive/indexer/blocks.py +++ b/hive/indexer/blocks.py @@ -179,7 +179,8 @@ class Blocks: def flush_data_in_1_thread(cls) -> None: for description, f, c in cls._concurrent_flush: try: - f() + (n, elapsedTime) = time_collector(f) + log.info("%s flush executed in: %.4f s", description, elapsedTime) except Exception as exc: log.error(f'{description!r} generated an exception: {exc}') raise exc -- GitLab From 8a847f903c3c826ad274b0da5fbcbe71f0848a07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Thu, 27 Mar 2025 15:01:18 +0100 Subject: [PATCH 79/83] Fill mention notifications from indexer --- hive/db/schema.py | 1 + hive/db/sql_scripts/hive_post_operations.sql | 65 +++++++++++++++++ hive/db/sql_scripts/notifications_view.sql | 71 ------------------- hive/indexer/post_data_cache.py | 39 +++++----- .../unread_notifications/abit.pat.json | 2 +- .../unread_notifications/alice.pat.json | 2 +- .../unread_notifications/larrytom.pat.json | 2 +- .../unread_notifications/min_score.pat.json | 2 +- .../unread_notifications/steemit.pat.json | 2 +- 9 files changed, 92 insertions(+), 94 deletions(-) diff --git a/hive/db/schema.py b/hive/db/schema.py index 6167c2d83..bc8bde043 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -452,6 +452,7 @@ def build_metadata_community(metadata=None): sa.Column('community', sa.String(16), nullable=True), sa.Column('payload', sa.String, nullable=True), sa.Index('hive_notification_cache_block_num_idx', 'block_num'), + sa.Index('hive_notification_cache_src_dst_post_id', 'src', 'dst', 'post_id', unique=True, postgresql_where=sql_text("type_id = 16")), # mentions type sa.Index('hive_notification_cache_dst_score_idx', 'dst', 'score', postgresql_where=sql_text("dst IS NOT NULL")), ) diff --git a/hive/db/sql_scripts/hive_post_operations.sql b/hive/db/sql_scripts/hive_post_operations.sql index 4d90e4578..a3a853282 100644 --- a/hive/db/sql_scripts/hive_post_operations.sql +++ b/hive/db/sql_scripts/hive_post_operations.sql @@ -351,6 +351,71 @@ END $function$ ; +DROP FUNCTION IF EXISTS hivemind_app.process_hive_post_mentions; +CREATE OR REPLACE FUNCTION hivemind_app.process_hive_post_mentions(_post_id hivemind_app.hive_posts.id%TYPE) +RETURNS SETOF BIGINT +LANGUAGE plpgsql +AS +$function$ +BEGIN + -- With clause is inlined, modified call to reptracker_endpoints.get_account_reputation. + -- Reputation is multiplied by 7.5 rather than 9 to bring the max value to 100 rather than 115. + -- In case of reputation being 0, the score is set to 25 rather than 0. + RETURN query + WITH log_account_rep AS + ( + SELECT + account_id, + LOG(10, ABS(nullif(reputation, 0))) AS rep, + (CASE WHEN reputation < 0 THEN -1 ELSE 1 END) AS is_neg + FROM reptracker_app.account_reputations + ), + calculate_rep AS + ( + SELECT + account_id, + GREATEST(lar.rep - 9, 0) * lar.is_neg AS rep + FROM log_account_rep lar + ), + final_rep AS + ( + SELECT account_id, (cr.rep * 7.5 + 25)::INT AS rep FROM calculate_rep AS cr + ), + mentions AS + ( + SELECT DISTINCT _post_id AS post_id, T.author_id, ha.id AS account_id, T.block_num + FROM + hivemind_app.hive_accounts ha + INNER JOIN + ( + SELECT LOWER( ( SELECT trim( T.mention::text, '{""}') ) ) AS mention, T.author_id, T.block_num + FROM + ( + SELECT + hp.id, REGEXP_MATCHES( hpd.body, '(?:^|[^a-zA-Z0-9_!#$%&*@\\/])(?:@)([a-zA-Z0-9\\.-]{1,16}[a-zA-Z0-9])(?![a-z])', 'g') AS mention, hp.author_id, hp.block_num + FROM hivemind_app.hive_posts hp + INNER JOIN hivemind_app.hive_post_data hpd ON hp.id = hpd.id + WHERE hp.id = _post_id + ) AS T + ) AS T ON ha.name = T.mention + WHERE ha.id != T.author_id + ORDER BY T.block_num, ha.id + ) + INSERT INTO hivemind_app.hive_notification_cache + (block_num, type_id, created_at, src, dst, dst_post_id, post_id, score, payload, community, community_title) + SELECT hm.block_num, 16, (SELECT hb.created_at FROM hivemind_app.blocks_view hb WHERE hb.num = (hm.block_num - 1)) AS created_at, hm.author_id, hm.account_id, hm.post_id, hm.post_id, COALESCE(rep.rep, 25), '', '', '' + FROM mentions AS hm + JOIN hivemind_app.hive_accounts AS a ON hm.account_id = a.id + LEFT JOIN final_rep AS rep ON a.haf_id = rep.account_id + WHERE hm.block_num > hivemind_app.block_before_irreversible( '90 days' ) + AND COALESCE(rep.rep, 25) > 0 + ORDER BY hm.block_num, created_at, hm.author_id, hm.account_id + ON CONFLICT (src, dst, post_id) WHERE type_id=16 DO UPDATE + SET block_num=EXCLUDED.block_num, created_at=EXCLUDED.created_at + RETURNING id; +END; +$function$; + DROP FUNCTION IF EXISTS hivemind_app.delete_hive_post(character varying,character varying,character varying, integer, timestamp) ; CREATE OR REPLACE FUNCTION hivemind_app.delete_hive_post( diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index 7a11e6223..33491fb25 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -1,37 +1,3 @@ -DROP VIEW IF EXISTS hivemind_app.hive_accounts_rank_view CASCADE; - -CREATE OR REPLACE VIEW hivemind_app.hive_accounts_rank_view - AS -SELECT ha.id, - case - WHEN ds.account_rank < 200 THEN 70 - WHEN ds.account_rank < 1000 THEN 60 - WHEN ds.account_rank < 6500 THEN 50 - WHEN ds.account_rank < 25000 THEN 40 - WHEN ds.account_rank < 100000 THEN 30 - ELSE 20 - end AS score -FROM hivemind_app.hive_accounts ha -LEFT JOIN -( - WITH base_rank_data AS - ( - SELECT ha.id, COALESCE(ha3.reputation,0) as reputation - FROM hivemind_app.hive_accounts ha - LEFT JOIN account_reputations ha3 ON ha.haf_id = ha3.account_id - ) - SELECT brd.id, rank() OVER (ORDER BY brd.reputation DESC) AS account_rank - FROM base_rank_data brd - ORDER BY brd.reputation DESC - LIMIT 150000 - -- Conditions above (related to rank.position) eliminates all records having rank > 100k. So with inclding some - -- additional space for redundant accounts (having same reputation) lets assume we're limiting it to 150k - -- As another reason, it can be pointed that only 2% of account has the same reputations, it means only 2000 - -- in 100000, but we get 150000 as 50% would repeat - -) ds on ds.id = ha.id -; - DROP FUNCTION IF EXISTS hivemind_app.calculate_notify_vote_score(_payout hivemind_app.hive_posts.payout%TYPE, _abs_rshares hivemind_app.hive_posts.abs_rshares%TYPE, _rshares hivemind_app.hive_votes.rshares%TYPE) CASCADE ; CREATE OR REPLACE FUNCTION hivemind_app.calculate_notify_vote_score(_payout hivemind_app.hive_posts.payout%TYPE, _abs_rshares hivemind_app.hive_posts.abs_rshares%TYPE, _rshares hivemind_app.hive_votes.rshares%TYPE) @@ -75,41 +41,6 @@ AS $BODY$ END $BODY$; - --- View: hivemind_app.hive_raw_notifications_as_view - --- hive_posts, follows, hive_reblogs, hive_subscriptions, hive_mentions (these are scored by the src account's rank) -DROP VIEW IF EXISTS hivemind_app.hive_raw_notifications_as_view CASCADE; -CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_as_view - AS - SELECT notifs.block_num, - notifs.post_id, - notifs.type_id, - notifs.created_at, - notifs.src, - notifs.dst, - notifs.dst_post_id, - notifs.community, - notifs.community_title, - notifs.payload, - harv.score - FROM ( - SELECT hm.block_num, - hm.post_id, - 16 AS type_id, - (select hb.created_at from hivemind_app.blocks_view hb where hb.num = (hm.block_num - 1)) as created_at, -- use time of previous block to match head_block_time behavior at given block - hp.author_id AS src, - hm.account_id AS dst, - hm.post_id as dst_post_id, - ''::character varying(16) AS community, - ''::character varying AS community_title, - ''::character varying AS payload - FROM hivemind_app.hive_mentions hm -- mentions - JOIN hivemind_app.hive_posts hp ON hm.post_id = hp.id -) notifs -JOIN hivemind_app.hive_accounts_rank_view harv ON harv.id = notifs.src -; - --vote has own score, new communities score as 35 (magic number), persistent notifications are already scored DROP VIEW IF EXISTS hivemind_app.hive_raw_notifications_view_no_account_score cascade; CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_view_no_account_score @@ -197,8 +128,6 @@ AS SELECT * FROM ( - SELECT * FROM hivemind_app.hive_raw_notifications_as_view - UNION ALL SELECT * FROM hivemind_app.hive_raw_notifications_view_no_account_score ) as notifs WHERE notifs.score >= 0 AND notifs.src IS DISTINCT FROM notifs.dst; diff --git a/hive/indexer/post_data_cache.py b/hive/indexer/post_data_cache.py index 3f29f1b2a..aaf512a4b 100644 --- a/hive/indexer/post_data_cache.py +++ b/hive/indexer/post_data_cache.py @@ -8,7 +8,7 @@ log = logging.getLogger(__name__) class PostDataCache(DbAdapterHolder): - """Procides cache for DB operations on post data table in order to speed up massive sync""" + """Provides cache for DB operations on post data table in order to speed up massive sync""" _data = {} @@ -61,11 +61,13 @@ class PostDataCache(DbAdapterHolder): cls.beginTx() if len(values_insert) > 0: sql = f""" - INSERT INTO - {SCHEMA_NAME}.hive_post_data (id, title, body, json) - VALUES + WITH inserted AS ( + INSERT INTO {SCHEMA_NAME}.hive_post_data (id, title, body, json) + VALUES {','.join(values_insert)} + RETURNING id + ) + SELECT {SCHEMA_NAME}.process_hive_post_mentions(id) FROM inserted """ - sql += ','.join(values_insert) if print_query: log.info(f"Executing query:\n{sql}") cls.db.query_prepared(sql) @@ -73,19 +75,20 @@ class PostDataCache(DbAdapterHolder): if len(values_update) > 0: sql = f""" - UPDATE {SCHEMA_NAME}.hive_post_data AS hpd SET - title = COALESCE( data_source.title, hpd.title ), - body = COALESCE( data_source.body, hpd.body ), - json = COALESCE( data_source.json, hpd.json ) - FROM - ( SELECT * FROM - ( VALUES - """ - sql += ','.join(values_update) - sql += """ - ) AS T(id, title, body, json) - ) AS data_source - WHERE hpd.id = data_source.id + WITH updated AS ( + UPDATE {SCHEMA_NAME}.hive_post_data AS hpd SET + title = COALESCE( data_source.title, hpd.title ), + body = COALESCE( data_source.body, hpd.body ), + json = COALESCE( data_source.json, hpd.json ) + FROM ( + SELECT * + FROM (VALUES {','.join(values_update)}) + AS T(id, title, body, json) + ) AS data_source + WHERE hpd.id = data_source.id + RETURNING hpd.id + ) + SELECT {SCHEMA_NAME}.process_hive_post_mentions(id) FROM updated """ if print_query: log.info(f"Executing query:\n{sql}") diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json index 8970da895..5d082633b 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json @@ -1,4 +1,4 @@ { "lastread": "2016-04-29 04:11:57", - "unread": 1921 + "unread": 1929 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/alice.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/alice.pat.json index 36e8ea00d..5f7f25779 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/alice.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/alice.pat.json @@ -1,4 +1,4 @@ { "lastread": "2016-04-29 04:11:57", - "unread": 47 + "unread": 48 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json index d4f009ba2..b0725a87a 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 26 + "unread": 23 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json index a9151c2e1..8432ef92c 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 2996 + "unread": 3013 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/steemit.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/steemit.pat.json index 547bf9867..9581b259e 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/steemit.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/steemit.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 673 + "unread": 691 } -- GitLab From e555e7cb980abec2ae2b18f3bbccbab8167abb2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Fri, 28 Mar 2025 17:26:55 +0100 Subject: [PATCH 80/83] Fill votes notifications in the indexer --- hive/db/db_state.py | 1 - hive/db/sql_scripts/notifications_view.sql | 69 ++++++------------- hive/indexer/votes.py | 79 +++++++++++++++++++++- hive/utils/misc.py | 11 ++- 4 files changed, 106 insertions(+), 54 deletions(-) diff --git a/hive/db/db_state.py b/hive/db/db_state.py index 5c3529967..bbacd3395 100644 --- a/hive/db/db_state.py +++ b/hive/db/db_state.py @@ -119,7 +119,6 @@ class DbState: 'hive_posts_payout_at_idx', 'hive_posts_sc_trend_id_idx', 'hive_posts_sc_hot_id_idx', - 'hive_posts_block_num_idx', 'hive_posts_block_num_created_idx', 'hive_posts_payout_plus_pending_payout_id_idx', 'hive_posts_category_id_payout_plus_pending_payout_depth_idx', diff --git a/hive/db/sql_scripts/notifications_view.sql b/hive/db/sql_scripts/notifications_view.sql index 33491fb25..1c3f776e3 100644 --- a/hive/db/sql_scripts/notifications_view.sql +++ b/hive/db/sql_scripts/notifications_view.sql @@ -5,10 +5,13 @@ RETURNS INT LANGUAGE 'sql' IMMUTABLE AS $BODY$ - SELECT CASE + SELECT CASE _abs_rshares = 0 + WHEN TRUE THEN CAST(0 AS INT) + ELSE CASE WHEN ((( _payout )/_abs_rshares) * 1000 * _rshares < 20 ) THEN -1 - ELSE LEAST(100, (LENGTH(CAST( CAST( ( (( _payout )/_abs_rshares) * 1000 * _rshares ) as BIGINT) as text)) - 1) * 25) - END; + ELSE LEAST(100, (LENGTH(CAST( CAST( ( (( _payout )/_abs_rshares) * 1000 * _rshares ) as BIGINT) as text)) - 1) * 25) + END + END; $BODY$; DROP FUNCTION IF EXISTS hivemind_app.notification_id CASCADE; @@ -41,56 +44,24 @@ AS $BODY$ END $BODY$; +DROP FUNCTION IF EXISTS hivemind_app.format_vote_value_payload CASCADE; +CREATE OR REPLACE FUNCTION hivemind_app.format_vote_value_payload( + _vote_value FLOAT +) +RETURNS VARCHAR +LANGUAGE 'sql' +IMMUTABLE +AS $BODY$ + SELECT CASE + WHEN _vote_value < 0.01 THEN ''::VARCHAR + ELSE CAST( to_char(_vote_value, '($FM99990.00)') AS VARCHAR ) + END +$BODY$; + --vote has own score, new communities score as 35 (magic number), persistent notifications are already scored DROP VIEW IF EXISTS hivemind_app.hive_raw_notifications_view_no_account_score cascade; CREATE OR REPLACE VIEW hivemind_app.hive_raw_notifications_view_no_account_score AS -SELECT -- votes - vn.block_num - , vn.post_id - , vn.type_id - , vn.created_at - , vn.src - , vn.dst - , vn.dst_post_id - , vn.community - , vn.community_title - , CASE - WHEN vn.vote_value < 0.01 THEN ''::VARCHAR - ELSE CAST( to_char(vn.vote_value, '($FM99990.00)') AS VARCHAR ) - END as payload - , vn.score -FROM - ( - SELECT - hv1.block_num - , hpv.id AS post_id - , 17 AS type_id - , hv1.last_update AS created_at - , hv1.voter_id AS src - , hpv.author_id AS dst - , hpv.id AS dst_post_id - , ''::VARCHAR(16) AS community - , ''::VARCHAR AS community_title - , hivemind_app.calculate_value_of_vote_on_post(hpv.payout + hpv.pending_payout, hpv.rshares, hv1.rshares) AS vote_value - , hivemind_app.calculate_notify_vote_score(hpv.payout + hpv.pending_payout, hpv.abs_rshares, hv1.rshares) AS score - FROM hivemind_app.hive_votes hv1 - JOIN - ( - SELECT - hpvi.id - , hpvi.author_id - , hpvi.payout - , hpvi.pending_payout - , hpvi.abs_rshares - , hpvi.vote_rshares as rshares - FROM hivemind_app.hive_posts hpvi - WHERE hpvi.block_num > hivemind_app.block_before_head('97 days'::interval) - ) hpv ON hv1.post_id = hpv.id - WHERE hv1.rshares >= 10e9 - ) as vn - WHERE vn.vote_value >= 0.02 -UNION ALL SELECT -- new community hc.block_num as block_num , 0 as post_id diff --git a/hive/indexer/votes.py b/hive/indexer/votes.py index f7ed80657..c44f69777 100644 --- a/hive/indexer/votes.py +++ b/hive/indexer/votes.py @@ -6,6 +6,7 @@ import logging from hive.conf import SCHEMA_NAME from hive.indexer.db_adapter_holder import DbAdapterHolder from hive.utils.normalize import escape_characters +from hive.utils.misc import chunks log = logging.getLogger(__name__) @@ -15,6 +16,8 @@ class Votes(DbAdapterHolder): _votes_data = collections.OrderedDict() _votes_per_post = {} + _vote_notifications = collections.OrderedDict() + _notification_first_block = None inside_flush = False @@ -38,6 +41,8 @@ class Votes(DbAdapterHolder): vote_data = cls._votes_data[key] vote_data["vote_percent"] = weight vote_data["last_update"] = date + n = cls._vote_notifications[key] + n['last_update'] = date # only effective vote edits increase num_changes counter else: if not post_key in cls._votes_per_post: @@ -55,6 +60,14 @@ class Votes(DbAdapterHolder): num_changes=0, block_num=block_num, ) + cls._vote_notifications[key] = { + 'block_num': block_num, + 'voter': voter, + 'author': author, + 'permlink': permlink, + 'last_update': date, + 'rshares': 0, + } @classmethod def drop_votes_of_deleted_comment(cls, comment_delete_operation): @@ -69,6 +82,7 @@ class Votes(DbAdapterHolder): for voter in cls._votes_per_post[post_key]: key = f"{voter}/{post_key}" del cls._votes_data[key] + del cls._vote_notifications[key] del cls._votes_per_post[post_key] @classmethod @@ -85,6 +99,9 @@ class Votes(DbAdapterHolder): vote_data["is_effective"] = True vote_data["num_changes"] += 1 vote_data["block_num"] = vop["block_num"] + n = cls._vote_notifications[key] + n['rshares'] = vop["rshares"] + n['block_num'] = vop["block_num"] else: if not post_key in cls._votes_per_post: cls._votes_per_post[post_key] = [] @@ -101,9 +118,64 @@ class Votes(DbAdapterHolder): num_changes=0, block_num=vop["block_num"], ) + cls._vote_notifications[key] = { + 'block_num': vop["block_num"], + 'voter': vop["voter"], + 'author': vop["author"], + 'permlink': vop["permlink"], + 'last_update': "1970-01-01 00:00:00", + 'rshares': vop["rshares"], + } @classmethod - def flush(cls): + def flush_notifications(cls): + if cls._notification_first_block is None: + cls._notification_first_block = cls.db.query_row("select hivemind_app.block_before_irreversible( '90 days' ) AS num")['num'] + n = len(cls._vote_notifications) + max_block_num = max(n['block_num'] for k,n in (cls._vote_notifications or {'': {'block_num': 0} }).items()) + if n > 0 and max_block_num > cls._notification_first_block: + sql = f""" + INSERT INTO {SCHEMA_NAME}.hive_notification_cache + (block_num, type_id, created_at, src, dst, dst_post_id, post_id, score, payload, community, community_title) + SELECT hn.block_num, 17, hn.last_update AS created_at, hn.src, hn.dst, hn.post_id, hn.post_id, hn.score, {SCHEMA_NAME}.format_vote_value_payload(vote_value) as payload, '', '' + FROM ( + SELECT n.*, + ha.id AS src, + hpv.author_id AS dst, + hpv.id AS post_id, + hivemind_app.calculate_value_of_vote_on_post(hpv.payout + hpv.pending_payout, hpv.rshares, n.rshares) AS vote_value, + hivemind_app.calculate_notify_vote_score(hpv.payout + hpv.pending_payout, hpv.abs_rshares, n.rshares) AS score + FROM + (VALUES {{}}) + AS n(block_num, voter, author, permlink, last_update, rshares) + JOIN {SCHEMA_NAME}.hive_accounts AS ha ON n.voter = ha.name + JOIN {SCHEMA_NAME}.hive_permlink_data AS p ON n.permlink = n.permlink + JOIN ( + SELECT hpvi.id, hpvi.author_id, hpvi.payout, hpvi.pending_payout, hpvi.abs_rshares, hpvi.vote_rshares as rshares + FROM {SCHEMA_NAME}.hive_posts hpvi + WHERE hpvi.block_num > hivemind_app.block_before_head('97 days'::interval) + ) hpv ON p.id = hpv.id + ) AS hn + WHERE hn.block_num > hivemind_app.block_before_irreversible( '90 days' ) + AND score > 0 + AND hn.src IS DISTINCT FROM hn.dst + AND hn.rshares >= 10e9 + AND hn.vote_value >= 0.02 + ORDER BY hn.block_num, created_at, hn.src, hn.dst + """ + for chunk in chunks(cls._vote_notifications, 1000): + cls.beginTx() + values_str = ','.join(f"({n['block_num']}, {escape_characters(n['voter'])}, {escape_characters(n['author'])}, {escape_characters(n['permlink'])}, {escape_characters(n['last_update'])}::timestamp, {n['rshares']})" for k,n in chunk.items()) + cls.db.query_prepared(sql.format(values_str)) + cls.commitTx() + log.warning(f"sql={sql.format(values_str)}") + else: + n = 0 + cls._vote_notifications.clear() + return n + + @classmethod + def flush_votes(cls): """Flush vote data from cache to database""" cls.inside_flush = True @@ -182,3 +254,8 @@ class Votes(DbAdapterHolder): cls.inside_flush = False return n + + @classmethod + def flush(cls): + log.info("votes.flush()") + return cls.flush_votes() + cls.flush_notifications() diff --git a/hive/utils/misc.py b/hive/utils/misc.py index 7c797194d..667bd8cf6 100644 --- a/hive/utils/misc.py +++ b/hive/utils/misc.py @@ -37,9 +37,14 @@ def log_memory_usage(memtypes=["rss", "vms", "shared"], broadcast=True) -> str: def chunks(lst, n): - """Yield successive n-sized chunks from lst.""" - for i in range(0, len(lst), n): - yield lst[i : i + n] + """Yield successive n-sized chunks from list or dict o.""" + if isinstance(lst, dict): + items = list(lst.items()) + for i in range(0, len(items), n): + yield dict(items[i:i + n]) + else: + for i in range(0, len(lst), n): + yield lst[i:i + n] def get_memory_amount() -> float: -- GitLab From 0f6877b677312d294efed660975e90ae1b34b56f Mon Sep 17 00:00:00 2001 From: Dan Notestein <dan@syncad.com> Date: Sun, 30 Mar 2025 20:08:09 -0400 Subject: [PATCH 81/83] fix typo in query to add votes to notification cache --- hive/indexer/votes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hive/indexer/votes.py b/hive/indexer/votes.py index c44f69777..858db5fee 100644 --- a/hive/indexer/votes.py +++ b/hive/indexer/votes.py @@ -149,7 +149,7 @@ class Votes(DbAdapterHolder): (VALUES {{}}) AS n(block_num, voter, author, permlink, last_update, rshares) JOIN {SCHEMA_NAME}.hive_accounts AS ha ON n.voter = ha.name - JOIN {SCHEMA_NAME}.hive_permlink_data AS p ON n.permlink = n.permlink + JOIN {SCHEMA_NAME}.hive_permlink_data AS p ON n.permlink = p.permlink JOIN ( SELECT hpvi.id, hpvi.author_id, hpvi.payout, hpvi.pending_payout, hpvi.abs_rshares, hpvi.vote_rshares as rshares FROM {SCHEMA_NAME}.hive_posts hpvi -- GitLab From e1acb85c1b76d36ff907c3584d4bf01a773b7cd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Mon, 31 Mar 2025 15:18:33 +0200 Subject: [PATCH 82/83] fixup! Fill votes notifications in the indexer --- hive/indexer/votes.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/hive/indexer/votes.py b/hive/indexer/votes.py index 858db5fee..065c74036 100644 --- a/hive/indexer/votes.py +++ b/hive/indexer/votes.py @@ -168,7 +168,6 @@ class Votes(DbAdapterHolder): values_str = ','.join(f"({n['block_num']}, {escape_characters(n['voter'])}, {escape_characters(n['author'])}, {escape_characters(n['permlink'])}, {escape_characters(n['last_update'])}::timestamp, {n['rshares']})" for k,n in chunk.items()) cls.db.query_prepared(sql.format(values_str)) cls.commitTx() - log.warning(f"sql={sql.format(values_str)}") else: n = 0 cls._vote_notifications.clear() @@ -257,5 +256,4 @@ class Votes(DbAdapterHolder): @classmethod def flush(cls): - log.info("votes.flush()") return cls.flush_votes() + cls.flush_notifications() -- GitLab From e26892d5a1bf9e44a113d668a3b2c63189cb14f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Le=C5=9Bniak?= <klesniak@syncad.com> Date: Tue, 1 Apr 2025 15:08:53 +0200 Subject: [PATCH 83/83] Fix calculating rshares In previous commit vote notifications were changed to be inserted after processing each block. But in massive sync rshares for posts were calculated only at the end of massive sync. This resulted in vote notifications to not be inserted, because score were always calculated as 0. To fix this, calculate rshares for modified posts after processing each block. `hive_posts` are now modified in posts and votes indexer. An advisory lock was added to synchronise, because deadlock was detected by postgres failing transactions. --- hive/db/adapter.py | 4 ++ hive/db/db_state.py | 6 --- hive/db/sql_scripts/update_posts_rshares.sql | 40 ++----------------- hive/indexer/blocks.py | 1 - hive/indexer/posts.py | 1 + hive/indexer/votes.py | 37 +++++++---------- .../unread_notifications/abit.pat.json | 2 +- .../unread_notifications/anton333.pat.json | 2 +- .../unread_notifications/elyaque.pat.json | 2 +- .../unread_notifications/larrytom.pat.json | 2 +- .../unread_notifications/max_score.pat.json | 2 +- .../unread_notifications/min_score.pat.json | 2 +- 12 files changed, 28 insertions(+), 73 deletions(-) diff --git a/hive/db/adapter.py b/hive/db/adapter.py index e708a2c8f..c1959cd08 100644 --- a/hive/db/adapter.py +++ b/hive/db/adapter.py @@ -163,6 +163,10 @@ class Db: def query_prepared(self, sql, **kwargs): self._query(sql, True, **kwargs) + def query_prepared_all(self, sql, **kwargs): + res = self._query(sql, True, **kwargs) + return res.fetchall() + def query_no_return(self, sql, **kwargs): self._query(sql, **kwargs) diff --git a/hive/db/db_state.py b/hive/db/db_state.py index bbacd3395..f08873424 100644 --- a/hive/db/db_state.py +++ b/hive/db/db_state.py @@ -381,12 +381,6 @@ class DbState: @classmethod def _finish_hive_posts(cls, db, massive_sync_preconditions, last_imported_block, current_imported_block): with AutoDbDisposer(db, "finish_hive_posts") as db_mgr: - # UPDATE: `abs_rshares`, `vote_rshares`, `sc_hot`, ,`sc_trend`, `total_votes`, `net_votes` - time_start = perf_counter() - sql = f"SELECT {SCHEMA_NAME}.update_posts_rshares({last_imported_block}, {current_imported_block});" - cls._execute_query_with_modified_work_mem(db=db_mgr.db, sql=sql, explain=True) - log.info("[MASSIVE] update_posts_rshares executed in %.4fs", perf_counter() - time_start) - time_start = perf_counter() # UPDATE: `children` diff --git a/hive/db/sql_scripts/update_posts_rshares.sql b/hive/db/sql_scripts/update_posts_rshares.sql index 672afe53c..ec6203cf2 100644 --- a/hive/db/sql_scripts/update_posts_rshares.sql +++ b/hive/db/sql_scripts/update_posts_rshares.sql @@ -1,7 +1,6 @@ DROP FUNCTION IF EXISTS hivemind_app.update_posts_rshares; CREATE OR REPLACE FUNCTION hivemind_app.update_posts_rshares( - _first_block hivemind_app.blocks_view.num%TYPE - , _last_block hivemind_app.blocks_view.num%TYPE + _post_ids INTEGER[] ) RETURNS VOID LANGUAGE 'plpgsql' @@ -11,34 +10,7 @@ $BODY$ BEGIN SET LOCAL work_mem='4GB'; SET LOCAL enable_seqscan = off; -IF (_last_block - _first_block) > 10000 THEN - WITH votes_rshares_view AS MATERIALIZED - ( - SELECT - hv.post_id - , SUM( hv.rshares ) as rshares - , SUM( ABS( hv.rshares ) ) as abs_rshares - , SUM( CASE hv.is_effective WHEN True THEN 1 ELSE 0 END ) as total_votes - , SUM( CASE - WHEN hv.rshares > 0 THEN 1 - WHEN hv.rshares = 0 THEN 0 - ELSE -1 - END ) as net_votes - FROM hivemind_app.hive_votes hv - GROUP BY hv.post_id - ) - UPDATE hivemind_app.hive_posts hp - SET - abs_rshares = votes_rshares.abs_rshares - ,vote_rshares = votes_rshares.rshares - ,sc_hot = CASE hp.is_paidout OR hp.parent_id > 0 WHEN True Then 0 ELSE hivemind_app.calculate_hot( votes_rshares.rshares, hp.created_at) END - ,sc_trend = CASE hp.is_paidout OR hp.parent_id > 0 WHEN True Then 0 ELSE hivemind_app.calculate_trending( votes_rshares.rshares, hp.created_at) END - ,total_votes = votes_rshares.total_votes - ,net_votes = votes_rshares.net_votes - FROM votes_rshares_view votes_rshares - WHERE hp.id = votes_rshares.post_id - AND hp.counter_deleted = 0; -ELSE + UPDATE hivemind_app.hive_posts hp SET abs_rshares = votes_rshares.abs_rshares @@ -60,12 +32,7 @@ ELSE ELSE -1 END ) as net_votes FROM hivemind_app.hive_votes hv - WHERE EXISTS - ( - SELECT NULL - FROM hivemind_app.hive_votes hv2 - WHERE hv2.post_id = hv.post_id AND hv2.block_num BETWEEN _first_block AND _last_block - ) + WHERE hv.post_id = ANY(_post_ids) GROUP BY hv.post_id ) as votes_rshares WHERE hp.id = votes_rshares.post_id @@ -76,7 +43,6 @@ ELSE OR hp.total_votes != votes_rshares.total_votes OR hp.net_votes != votes_rshares.net_votes ); -END IF; RESET enable_seqscan; RESET work_mem; diff --git a/hive/indexer/blocks.py b/hive/indexer/blocks.py index fa2fb8899..98b6486ff 100644 --- a/hive/indexer/blocks.py +++ b/hive/indexer/blocks.py @@ -420,7 +420,6 @@ class Blocks: is_hour_action = block_number % 1200 == 0 queries = [ - f"SELECT {SCHEMA_NAME}.update_posts_rshares({block_number}, {block_number})", f"SELECT {SCHEMA_NAME}.update_hive_posts_children_count({block_number}, {block_number})", f"SELECT {SCHEMA_NAME}.update_hive_posts_root_id({block_number},{block_number})", f"SELECT {SCHEMA_NAME}.update_feed_cache({block_number}, {block_number})", diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index d6022fa9e..52aebbee9 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -184,6 +184,7 @@ class Posts(DbAdapterHolder): for chunk in chunks(cls._comment_payout_ops, 1000): cls.beginTx() + cls.db.query_no_return('SELECT pg_advisory_xact_lock(777)') # synchronise with update_posts_rshares in votes values_str = ','.join(chunk) actual_query = sql.format(values_str) cls.db.query_prepared(actual_query) diff --git a/hive/indexer/votes.py b/hive/indexer/votes.py index 065c74036..7057b5e04 100644 --- a/hive/indexer/votes.py +++ b/hive/indexer/votes.py @@ -2,6 +2,7 @@ import collections import logging +from itertools import count from hive.conf import SCHEMA_NAME from hive.indexer.db_adapter_holder import DbAdapterHolder @@ -157,7 +158,7 @@ class Votes(DbAdapterHolder): ) hpv ON p.id = hpv.id ) AS hn WHERE hn.block_num > hivemind_app.block_before_irreversible( '90 days' ) - AND score > 0 + AND score >= 0 AND hn.src IS DISTINCT FROM hn.dst AND hn.rshares >= 10e9 AND hn.vote_value >= 0.02 @@ -180,8 +181,6 @@ class Votes(DbAdapterHolder): cls.inside_flush = True n = 0 if cls._votes_data: - cls.beginTx() - sql = f""" INSERT INTO {SCHEMA_NAME}.hive_votes (post_id, voter_id, author_id, permlink_id, weight, rshares, vote_percent, last_update, num_changes, block_num, is_effective) @@ -209,17 +208,17 @@ class Votes(DbAdapterHolder): last_update = EXCLUDED.last_update, num_changes = {SCHEMA_NAME}.hive_votes.num_changes + EXCLUDED.num_changes + 1, block_num = EXCLUDED.block_num - WHERE {SCHEMA_NAME}.hive_votes.voter_id = EXCLUDED.voter_id and {SCHEMA_NAME}.hive_votes.author_id = EXCLUDED.author_id and {SCHEMA_NAME}.hive_votes.permlink_id = EXCLUDED.permlink_id; + WHERE {SCHEMA_NAME}.hive_votes.voter_id = EXCLUDED.voter_id and {SCHEMA_NAME}.hive_votes.author_id = EXCLUDED.author_id and {SCHEMA_NAME}.hive_votes.permlink_id = EXCLUDED.permlink_id + RETURNING post_id """ # WHERE clause above seems superfluous (and works all the same without it, at least up to 5mln) - values = [] - values_limit = 1000 - - for _, vd in cls._votes_data.items(): - values.append( + cnt = count() + for chunk in chunks(cls._votes_data, 1000): + cls.beginTx() + values_str = ','.join( "({}, '{}', '{}', {}, {}, {}, {}, '{}'::timestamp, {}, {}, {})".format( - len(values), # for ordering + next(cnt), # for ordering vd['voter'], vd['author'], vd['permlink'], @@ -230,25 +229,17 @@ class Votes(DbAdapterHolder): vd['num_changes'], vd['block_num'], vd['is_effective'], - ) + ) for k,vd in chunk.items() ) - - if len(values) >= values_limit: - values_str = ','.join(values) - actual_query = sql.format(values_str) - cls.db.query_prepared(actual_query) - values.clear() - - if len(values) > 0: - values_str = ','.join(values) actual_query = sql.format(values_str) - cls.db.query_prepared(actual_query) - values.clear() + post_ids = cls.db.query_prepared_all(actual_query) + cls.db.query_no_return('SELECT pg_advisory_xact_lock(777)') # synchronise with update hive_posts in posts + cls.db.query_no_return("SELECT * FROM hivemind_app.update_posts_rshares(:post_ids)", post_ids=[id[0] for id in post_ids]) + cls.commitTx() n = len(cls._votes_data) cls._votes_data.clear() cls._votes_per_post.clear() - cls.commitTx() cls.inside_flush = False diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json index 5d082633b..d1b622dff 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/abit.pat.json @@ -1,4 +1,4 @@ { "lastread": "2016-04-29 04:11:57", - "unread": 1929 + "unread": 1918 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/anton333.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/anton333.pat.json index 938c8302a..e2c5e6507 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/anton333.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/anton333.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 175 + "unread": 169 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json index 4718bddc4..4db62cbde 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/elyaque.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 2113 + "unread": 2111 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json index b0725a87a..cd7d93a73 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/larrytom.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 23 + "unread": 31 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/max_score.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/max_score.pat.json index 59e94b364..82ce6765b 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/max_score.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/max_score.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 181 + "unread": 361 } diff --git a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json index 8432ef92c..3b8f0b146 100644 --- a/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json +++ b/tests/api_tests/hivemind/tavern/bridge_api_patterns/unread_notifications/min_score.pat.json @@ -1,4 +1,4 @@ { "lastread": "1970-01-01 00:00:00", - "unread": 3013 + "unread": 3256 } -- GitLab