Skip to content

Commit

Permalink
add repost
Browse files Browse the repository at this point in the history
  • Loading branch information
isaacsolo committed Aug 31, 2022
1 parent de23886 commit 8021584
Show file tree
Hide file tree
Showing 6 changed files with 188 additions and 169 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,6 @@ def get_events_side_effect(_, tx_receipt):
assert playlist_3.playlist_name == "playlist 3 updated"
assert playlist_3.is_delete == False
assert playlist_3.is_current == True
pass


def test_index_invalid_playlists(app, mocker):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
from integration_tests.challenges.index_helpers import UpdateTask
from integration_tests.utils import populate_mock_db
from src.models.social.follow import Follow
from src.models.social.repost import Repost
from src.models.social.save import Save
from src.tasks.entity_manager.entity_manager import entity_manager_update
from src.tasks.entity_manager.utils import EntityType
from src.utils.db_session import get_db
from web3 import Web3
from web3.datastructures import AttributeDict
Expand Down Expand Up @@ -86,6 +88,34 @@ def test_index_valid_social_features(app, mocker):
)
},
],
"RepostPlaylistTx3": [
{
"args": AttributeDict(
{
"_entityId": 1,
"_entityType": "Playlist",
"_userId": 1,
"_action": "Repost",
"_metadata": "",
"_signer": "user1wallet",
}
)
},
],
"UnrepostPlaylistTx3": [
{
"args": AttributeDict(
{
"_entityId": 1,
"_entityType": "Playlist",
"_userId": 1,
"_action": "Unrepost",
"_metadata": "",
"_signer": "user1wallet",
}
)
},
],
}

entity_manager_txs = [
Expand All @@ -111,6 +141,7 @@ def get_events_side_effect(_, tx_receipt):
],
"follows": [{"follower_user_id": 1, "followee_user_id": 3}],
"tracks": [{"track_id": 1}],
"playlists": [{"playlist_id": 1}],
}
populate_mock_db(db, entities)

Expand All @@ -126,37 +157,53 @@ def get_events_side_effect(_, tx_receipt):
block_hash=0,
ipfs_metadata=test_metadata,
)

# Verify follows
all_follows: List[Follow] = session.query(Follow).all()
assert len(all_follows) == 3

user1_follows: List[Follow] = (
user_3_follows: List[Follow] = (
session.query(Follow)
.filter(
Follow.is_current == True,
Follow.is_delete == False,
Follow.follower_user_id == 1,
)
.filter(Follow.is_current == True, Follow.followee_user_id == 3)
.all()
)
assert len(user1_follows) == 1
assert user1_follows[0].followee_user_id == 2
assert len(user_3_follows) == 1
user_3_follow = user_3_follows[0]
assert user_3_follow.is_delete == True

user1_deleted_follows: List[Follow] = (
user_2_follows: List[Follow] = (
session.query(Follow)
.filter(
Follow.is_current == True,
Follow.is_delete == True,
Follow.follower_user_id == 1,
)
.filter(Follow.is_current == True, Follow.followee_user_id == 2)
.all()
)
assert len(user1_deleted_follows) == 1
assert user1_deleted_follows[0].followee_user_id == 3
assert len(user_2_follows) == 1
user_2_follow = user_2_follows[0]
assert user_2_follow.is_delete == False

# Verify saves

all_saves: List[Save] = session.query(Save).all()
assert len(all_saves) == 2

current_saves: List[Save] = (
session.query(Save).filter(Save.is_current == True).all()
)
assert len(current_saves) == 1
current_save = current_saves[0]
assert current_save.is_delete == True
pass
assert current_save.save_type == EntityType.TRACK.value.lower()
assert current_save.save_item_id == 1

# Verify repost

all_reposts: List[Repost] = session.query(Repost).all()
assert len(all_reposts) == 2

current_reposts: List[Repost] = (
session.query(Repost).filter(Repost.is_current == True).all()
)
assert len(current_reposts) == 1
current_repost = current_reposts[0]
assert current_repost.is_delete == True
assert current_repost.repost_type == EntityType.PLAYLIST.value.lower()
assert current_repost.repost_item_id == 1
75 changes: 21 additions & 54 deletions discovery-provider/src/tasks/entity_manager/entity_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from src.database_task import DatabaseTask
from src.models.playlists.playlist import Playlist
from src.models.social.follow import Follow
from src.models.social.repost import Repost
from src.models.social.save import Save
from src.models.tracks.track import Track
from src.models.tracks.track_route import TrackRoute
Expand Down Expand Up @@ -160,60 +161,6 @@ def entity_manager_update(
if entity_id in original_records[record_type]:
original_records[record_type][entity_id].is_current = False

# if original record
# records_to_save = []
# for playlist_records in new_records["playlists"].values():
# if not playlist_records:
# continue
# # invalidate all playlists besides the last one
# for i in range(len(playlist_records)):
# playlist_records[i].is_current = False

# # invalidate existing record only if it's being updated
# playlist_id = playlist_records[0].playlist_id
# if playlist_id in original_records["playlists"]:
# original_records["playlists"][playlist_id].is_current = False

# # flip is_current to true for the last tx in each playlist
# playlist_records[-1].is_current = True
# records_to_save.extend(playlist_records)

# for track_records in new_records["tracks"].values():
# # flip is_current to true for the last tx in each playlist
# track_records[-1].is_current = True
# records_to_save.extend(track_records)

# for follow_records in new_records["follows"].values():
# if not playlist_records:
# continue
# # invalidate all playlists besides the last one
# for i in range(len(playlist_records)):
# playlist_records[i].is_current = False

# # invalidate existing record only if it's being updated
# playlist_id = playlist_records[0].playlist_id
# if playlist_id in original_records["playlists"]:
# original_records["playlists"][playlist_id].is_current = False

# # flip is_current to true for the last follow tx
# follow_records[-1].is_current = True
# records_to_save.extend(follow_records)

# for save_records in new_records["saves"].values():
# if not playlist_records:
# continue
# # invalidate all playlists besides the last one
# for i in range(len(playlist_records)):
# playlist_records[i].is_current = False

# # invalidate existing record only if it's being updated
# playlist_id = playlist_records[0].playlist_id
# if playlist_id in original_records["playlists"]:
# original_records["playlists"][playlist_id].is_current = False
# # flip is_current to true for the last follow tx
# save_records[-1].is_current = True
# records_to_save.extend(save_records)

# insert/update all tracks, playlist records in this block
session.bulk_save_objects(records_to_save)
num_total_changes += len(records_to_save)
Expand Down Expand Up @@ -335,6 +282,26 @@ def fetch_existing_entities(session: Session, entities_to_fetch: EntitiesToFetch
(save.user_id, save.save_type, save.save_item_id): save for save in saves
}

reposts_to_fetch: Set[Tuple] = entities_to_fetch[EntityType.REPOST.value]
and_queries = []
for repost_to_fetch in reposts_to_fetch:
user_id = repost_to_fetch[0]
entity_type = repost_to_fetch[1]
entity_id = repost_to_fetch[2]
and_queries.append(
and_(
Repost.user_id == user_id,
Repost.repost_type == entity_type.lower(),
Repost.repost_item_id == entity_id,
Repost.is_current == True,
)
)
reposts: List[Repost] = session.query(Repost).filter(or_(*and_queries)).all()
existing_entities[EntityType.REPOST.value] = {
(repost.user_id, repost.repost_type, repost.repost_item_id): repost
for repost in reposts
}

return existing_entities


Expand Down
106 changes: 76 additions & 30 deletions discovery-provider/src/tasks/entity_manager/social_features.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,28 @@
from typing import Union

from src.models.social.follow import Follow
from src.models.social.repost import Repost
from src.models.social.save import Save
from src.tasks.entity_manager.utils import Action, EntityType, ManageEntityParameters

# saves
action_to_record_type = {
Action.FOLLOW: EntityType.FOLLOW.value,
Action.UNFOLLOW: EntityType.FOLLOW.value,
Action.SAVE: EntityType.SAVE.value,
Action.UNSAVE: EntityType.SAVE.value,
Action.REPOST: EntityType.REPOST.value,
Action.UNREPOST: EntityType.REPOST.value,
}

create_actions = {Action.FOLLOW.value, Action.SAVE.value}
delete_actions = {Action.UNFOLLOW, Action.UNSAVE}
create_actions = {Action.FOLLOW.value, Action.SAVE.value, Action.REPOST.value}
delete_actions = {Action.UNFOLLOW, Action.UNSAVE, Action.UNREPOST.value}


def create_social_record(params: ManageEntityParameters):

validate_social_feature(params)

create_record = None
create_record: Union[Save, Follow, None] = None
if params.action == Action.FOLLOW.value:
create_record = Follow(
blockhash=params.event_blockhash,
Expand All @@ -42,17 +46,31 @@ def create_social_record(params: ManageEntityParameters):
is_current=True,
is_delete=False,
)
if params.action == Action.REPOST.value:
create_record = Repost(
blockhash=params.event_blockhash,
blocknumber=params.block_number,
created_at=params.block_datetime,
txhash=params.txhash,
user_id=params.user_id,
repost_item_id=params.entity_id,
repost_type=params.entity_type.lower(),
is_current=True,
is_delete=False,
)

params.add_social_feature_record(
params.user_id,
params.entity_type,
params.entity_id,
action_to_record_type[params.action],
create_record,
)
if create_record:
params.add_social_feature_record(
params.user_id,
params.entity_type,
params.entity_id,
action_to_record_type[params.action],
create_record,
)


def delete_social_records(params):

validate_social_feature(params)

entity_key = (params.user_id, params.entity_type, params.entity_id)
Expand All @@ -65,23 +83,51 @@ def delete_social_records(params):

deleted_record = None
if params.action == Action.UNFOLLOW.value:
deleted_record = copy_follow_record(
existing_entity, params.block_number, params.event_blockhash, params.txhash
deleted_record = Follow(
blockhash=params.event_blockhash,
blocknumber=params.block_number,
follower_user_id=existing_entity.follower_user_id,
followee_user_id=existing_entity.followee_user_id,
is_current=existing_entity.is_current,
is_delete=existing_entity.is_delete,
created_at=existing_entity.created_at,
txhash=params.txhash,
)
elif params.action == Action.UNSAVE.value:
deleted_record = Save(
blockhash=params.event_blockhash,
blocknumber=params.block_number,
user_id=existing_entity.user_id,
save_item_id=existing_entity.save_item_id,
save_type=existing_entity.save_type,
is_current=existing_entity.is_current,
is_delete=existing_entity.is_delete,
created_at=existing_entity.created_at,
txhash=params.txhash,
)
elif params.action == Action.SAVE or params.action == Action.UNSAVE:
deleted_record = copy_save_record(
existing_entity, params.block_number, params.event_blockhash, params.txhash
elif params.action == Action.UNREPOST.value:
deleted_record = Repost(
blockhash=params.event_blockhash,
blocknumber=params.block_number,
user_id=existing_entity.user_id,
repost_item_id=existing_entity.repost_item_id,
repost_type=existing_entity.repost_type,
is_current=existing_entity.is_current,
is_delete=existing_entity.is_delete,
created_at=existing_entity.created_at,
txhash=params.txhash,
)

deleted_record.is_delete = True

params.add_social_feature_record(
params.user_id,
params.entity_type,
params.entity_id,
record_type,
deleted_record,
)
if deleted_record:
params.add_social_feature_record(
params.user_id,
params.entity_type,
params.entity_id,
record_type,
deleted_record,
)


def validate_social_feature(params: ManageEntityParameters):
Expand Down Expand Up @@ -114,16 +160,16 @@ def copy_follow_record(


def copy_save_record(
old_save: Save, block_number: int, event_blockhash: str, txhash: str
existing_entity: Save, block_number: int, event_blockhash: str, txhash: str
):
return Save(
blockhash=event_blockhash,
blocknumber=block_number,
user_id=old_save.user_id,
save_item_id=old_save.save_item_id,
save_type=old_save.save_type,
is_current=old_save.is_current,
is_delete=old_save.is_delete,
created_at=old_save.created_at,
user_id=existing_entity.user_id,
save_item_id=existing_entity.save_item_id,
save_type=existing_entity.save_type,
is_current=existing_entity.is_current,
is_delete=existing_entity.is_delete,
created_at=existing_entity.created_at,
txhash=txhash,
)
Loading

0 comments on commit 8021584

Please sign in to comment.