diff --git a/discovery-provider/alembic/versions/1b6e405ef358_fix_is_current_for_users_and_tracks_due_.py b/discovery-provider/alembic/versions/1b6e405ef358_fix_is_current_for_users_and_tracks_due_.py new file mode 100644 index 00000000000..33e906dc05e --- /dev/null +++ b/discovery-provider/alembic/versions/1b6e405ef358_fix_is_current_for_users_and_tracks_due_.py @@ -0,0 +1,88 @@ +"""Fix is_current for users and tracks due to entity manager invalidation + +Revision ID: 1b6e405ef358 +Revises: f6f009132212 +Create Date: 2022-12-30 19:33:50.134305 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '1b6e405ef358' +down_revision = 'f6f009132212' +branch_labels = None +depends_on = None + + +def upgrade(): + connection = op.get_bind() + connection.execute( + """ + update + users + set + is_current = true + from + ( + select + user_id, + max_block + from + ( + select + user_id, + count( + CASE + WHEN is_current THEN 1 + END + ) as current_count, + max(blocknumber) as max_block + from + users + group by + user_id + ) current_users + where + current_users.current_count < 1 + ) incorrect_users + where + incorrect_users.user_id = users.user_id + and users.blocknumber = incorrect_users.max_block; + + update + tracks + set + is_current = true + from + ( + select + track_id, + max_block + from + ( + select + track_id, + count( + CASE + WHEN is_current THEN 1 + END + ) as current_count, + max(blocknumber) as max_block + from + tracks + group by + track_id + ) current_tracks + where + current_tracks.current_count < 1 + ) incorrect_tracks + where + incorrect_tracks.track_id = tracks.track_id + and tracks.blocknumber = incorrect_tracks.max_block; + """ + ) + + +def downgrade(): + pass diff --git a/discovery-provider/integration_tests/tasks/entity_manager/test_user_entity_manager.py b/discovery-provider/integration_tests/tasks/entity_manager/test_user_entity_manager.py index 874e63d522b..eb432921fec 100644 --- a/discovery-provider/integration_tests/tasks/entity_manager/test_user_entity_manager.py +++ b/discovery-provider/integration_tests/tasks/entity_manager/test_user_entity_manager.py @@ -73,6 +73,20 @@ def test_index_valid_user(app, mocker): ) }, ], + "UpdateArtistPickTrack": [ + { + "args": AttributeDict( + { + "_entityId": TRACK_ID_OFFSET, + "_entityType": "Track", + "_userId": USER_ID_OFFSET, + "_action": "Update", + "_metadata": "QmUpdateArtistPickTrack", + "_signer": "user1wallet", + } + ) + }, + ], "UpdateUser1Tx": [ { "args": AttributeDict( @@ -155,6 +169,10 @@ def get_events_side_effect(_, tx_receipt): "events": None, "user_id": USER_ID_OFFSET + 1, }, + "QmUpdateArtistPickTrack": { + "track_id": TRACK_ID_OFFSET, + "title": "track 1 update", + }, "QmUpdateUser1": { "is_verified": False, "is_deactivated": False, @@ -406,6 +424,20 @@ def test_index_invalid_users(app, mocker): ) }, ], + "UpdateUserInvalidArtistPick": [ + { + "args": AttributeDict( + { + "_entityId": 1, # existing user + "_entityType": "User", + "_userId": 1, + "_action": "Update", + "_metadata": "QmInvalidArtistPick", + "_signer": "user1wallet", + } + ) + }, + ], } test_metadata = { "QmCreateUser1": { @@ -527,6 +559,9 @@ def test_index_invalid_users(app, mocker): "events": {"is_mobile_user": True}, "user_id": USER_ID_OFFSET, }, + "QmInvalidArtistPick": { + "artist_pick_track_id": TRACK_ID_OFFSET + 1, + }, } entity_manager_txs = [ @@ -559,6 +594,8 @@ def get_events_side_effect(_, tx_receipt): populate_mock_db(db, entities) with db.scoped_session() as session: + existing_user: List[User] = session.query(User).filter(User.is_current).first() + # index transactions entity_manager_update( None, @@ -572,9 +609,15 @@ def get_events_side_effect(_, tx_receipt): ) # validate db records - all_users: List[User] = session.query(User).all() + all_users: List[User] = session.query(User).filter(User.is_current).all() assert len(all_users) == 2 # no new users indexed + existing_user_after_index: List[User] = ( + session.query(User).filter(User.user_id == 1).first() + ) + + assert existing_user == existing_user_after_index + def test_index_verify_users(app, mocker): "Tests user verify actions" diff --git a/discovery-provider/src/tasks/entity_manager/track.py b/discovery-provider/src/tasks/entity_manager/track.py index 3b47e86a9c9..c84d5851844 100644 --- a/discovery-provider/src/tasks/entity_manager/track.py +++ b/discovery-provider/src/tasks/entity_manager/track.py @@ -116,7 +116,6 @@ def update_track(params: ManageEntityParameters): track_metadata = params.metadata[params.metadata_cid] track_id = params.entity_id existing_track = params.existing_records[EntityType.TRACK][track_id] - existing_track.is_current = False # invalidate if ( track_id in params.new_records[EntityType.TRACK] ): # override with last updated track is in this block @@ -144,7 +143,6 @@ def delete_track(params: ManageEntityParameters): track_id = params.entity_id existing_track = params.existing_records[EntityType.TRACK][track_id] - existing_track.is_current = False # invalidate old playlist if params.entity_id in params.new_records[EntityType.TRACK]: # override with last updated playlist is in this block existing_track = params.new_records[EntityType.TRACK][params.entity_id][-1] diff --git a/discovery-provider/src/tasks/entity_manager/user.py b/discovery-provider/src/tasks/entity_manager/user.py index 1e6b57f88b7..5165c06e3fc 100644 --- a/discovery-provider/src/tasks/entity_manager/user.py +++ b/discovery-provider/src/tasks/entity_manager/user.py @@ -137,7 +137,6 @@ def update_user(params: ManageEntityParameters): user_metadata = params.metadata[params.metadata_cid] user_id = params.entity_id existing_user = params.existing_records[EntityType.USER][user_id] - existing_user.is_current = False # invalidate if ( user_id in params.new_records[EntityType.USER] and params.new_records[EntityType.USER][user_id] diff --git a/discovery-provider/src/tasks/entity_manager/user_replica_set.py b/discovery-provider/src/tasks/entity_manager/user_replica_set.py index 6103fa3cf48..b88b2d34d7a 100644 --- a/discovery-provider/src/tasks/entity_manager/user_replica_set.py +++ b/discovery-provider/src/tasks/entity_manager/user_replica_set.py @@ -89,7 +89,7 @@ def update_user_replica_set(params: ManageEntityParameters): user_id = params.user_id existing_user = params.existing_records[EntityType.USER][user_id] - existing_user.is_current = False # invalidate + if ( user_id in params.new_records[EntityType.USER] ): # override with last updated user is in this block