From 865647d5962a1daebea83fef853ed04199e98120 Mon Sep 17 00:00:00 2001 From: isaac Date: Fri, 26 Jan 2024 14:08:33 -0800 Subject: [PATCH 1/4] Block future release dates on public tracks --- .../tasks/entity_manager/test_track_entity_manager.py | 11 ++++++++++- .../src/tasks/entity_manager/entities/track.py | 11 ++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py b/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py index b3527ede549..cfe42e462fb 100644 --- a/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py +++ b/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py @@ -1,5 +1,6 @@ import json import logging # pylint: disable=C0302 +from datetime import datetime from typing import List from web3 import Web3 @@ -545,6 +546,9 @@ def test_index_invalid_tracks(app, mocker): "is_original_available": False, }, "QmInvalidUnlistTrack1Update": {"is_unlisted": True}, + "QmInvalidRescheduleReleaseDate": { + "release_date": "Fri Jan 26 2100 00:00:00 GMT+0000" + }, "InvalidTrackIdUpdate": {"track_id": 1234, "bogus_field": "bogus"}, } invalid_metadata_json = json.dumps(test_metadata["QmAIDisabled"]) @@ -874,7 +878,11 @@ def get_events_side_effect(_, tx_receipt): {"user_id": 2, "handle": "user-1", "wallet": "User2Wallet"}, ], "tracks": [ - {"track_id": TRACK_ID_OFFSET, "owner_id": 1}, + { + "track_id": TRACK_ID_OFFSET, + "owner_id": 1, + "release_date": datetime(2019, 6, 17), + }, ], "developer_apps": [ { @@ -924,6 +932,7 @@ def get_events_side_effect(_, tx_receipt): current_track: List[Track] = ( session.query(Track).filter(Track.is_current == True).first() ) + assert current_track.release_date == datetime(2019, 6, 17) assert current_track.track_id == TRACK_ID_OFFSET diff --git a/packages/discovery-provider/src/tasks/entity_manager/entities/track.py b/packages/discovery-provider/src/tasks/entity_manager/entities/track.py index 83310e10807..728f29ce6bb 100644 --- a/packages/discovery-provider/src/tasks/entity_manager/entities/track.py +++ b/packages/discovery-provider/src/tasks/entity_manager/entities/track.py @@ -292,11 +292,16 @@ def populate_track_record_metadata(track_record: Track, track_metadata, handle, # casting to string because datetime doesn't work for some reason parsed_release_date = parse_release_date(track_metadata["release_date"]) # postgres will convert to a timestamp + if ( + action == Action.UPDATE + and track_record.is_unlisted == False + and parsed_release_date > datetime.now() + ): + # Public tracks cannot be rescheduled into the future + continue + if parsed_release_date: track_record.release_date = str(parsed_release_date) # type: ignore - logger.info( - f"asdf set release_date {parsed_release_date} {track_record.release_date}" - ) elif key == "is_unlisted": if "is_unlisted" in track_metadata: track_record.is_unlisted = track_metadata["is_unlisted"] From 824535ec00a46458d49eea9ef11b55e29df63846 Mon Sep 17 00:00:00 2001 From: isaac Date: Fri, 26 Jan 2024 15:56:10 -0800 Subject: [PATCH 2/4] add for create --- .../test_track_entity_manager.py | 145 ++++++++++++++++++ .../tasks/entity_manager/entities/track.py | 19 ++- 2 files changed, 157 insertions(+), 7 deletions(-) diff --git a/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py b/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py index cfe42e462fb..e9feabe5f45 100644 --- a/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py +++ b/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py @@ -1991,3 +1991,148 @@ def get_events_side_effect(_, tx_receipt): track3 = all_tracks[2] assert track3.track_id == TRACK_ID_OFFSET + 3 + + +def test_release_date(app, mocker): + "Tests track release dates" + with app.app_context(): + db = get_db() + web3 = Web3() + challenge_event_bus: ChallengeEventBus = setup_challenge_bus() + update_task = UpdateTask(web3, challenge_event_bus) + + default_metadata = { + "cover_art": None, + "cover_art_sizes": "QmdxhDiRUC3zQEKqwnqksaSsSSeHiRghjwKzwoRvm77yaZ", + "tags": "realmagic,rickyreed,theroom", + "genre": "R&B/Soul", + "mood": "Empowering", + "credits_splits": None, + "created_at": "2020-07-11 08:22:15", + "create_date": None, + "updated_at": "2020-07-11 08:22:15", + "release_date": "2020-07-11 08:22:15", + "file_type": None, + "title": "title", + "is_playlist_upload": True, + "track_segments": [ + { + "duration": 6.016, + "multihash": "QmabM5svgDgcRdQZaEKSMBCpSZrrYy2y87L8Dx8EQ3T2jp", + } + ], + "has_current_user_reposted": False, + "is_current": True, + "is_unlisted": False, + "field_visibility": { + "mood": True, + "tags": True, + "genre": True, + "share": True, + "play_count": True, + "remixes": True, + }, + "remix_of": None, + "repost_count": 12, + "save_count": 21, + "description": "some description", + "license": "All rights reserved", + "isrc": None, + "iswc": None, + "track_id": 77955, + "stem_of": None, + "ai_attribution_user_id": None, + "orig_file_cid": "original-file-cid", + "orig_filename": "original-filename", + "is_original_available": False, + } + + metadatas = { + "PublicTrackFutureReleaseDate": { + **default_metadata, + "track_id": TRACK_ID_OFFSET, + "release_date": "Fri Jan 26 2100 00:00:00 GMT+0000", + "owner_id": 1, + }, + "UpdatePublicTrackFutureReleaseDate": { + **default_metadata, + "track_id": TRACK_ID_OFFSET, + "title": "updated", + "release_date": "Fri Jan 26 2100 00:00:00 GMT+0000", + "owner_id": 1, + }, + } + + public_track_future_release_date = json.dumps( + metadatas["PublicTrackFutureReleaseDate"] + ) + update_public_track_future_release_date = json.dumps( + metadatas["UpdatePublicTrackFutureReleaseDate"] + ) + + tx_receipts = { + "PublicTrackFutureReleaseDate": [ + { + "args": AttributeDict( + { + "_entityId": TRACK_ID_OFFSET, + "_entityType": "Track", + "_userId": 1, + "_action": "Create", + "_metadata": f'{{"cid": "", "data": {public_track_future_release_date}}}', + "_signer": "user1wallet", + } + ) + } + ], + "UpdatePublicTrackFutureReleaseDate": [ + { + "args": AttributeDict( + { + "_entityId": TRACK_ID_OFFSET, + "_entityType": "Track", + "_userId": 1, + "_action": "Update", + "_metadata": f'{{"cid": "", "data": {update_public_track_future_release_date}}}', + "_signer": "user1wallet", + } + ) + } + ], + } + + def get_events_side_effect(_, tx_receipt): + return tx_receipts[tx_receipt["transactionHash"].decode("utf-8")] + + mocker.patch( + "src.tasks.entity_manager.entity_manager.get_entity_manager_events_tx", + side_effect=get_events_side_effect, + autospec=True, + ) + + entities = { + "users": [ + {"user_id": 1, "handle": "user-1", "wallet": "user1wallet"}, + ], + } + populate_mock_db(db, entities) + + with db.scoped_session() as session: + entity_manager_update( + update_task, + session, + entity_manager_txs=[ + AttributeDict( + {"transactionHash": update_task.web3.to_bytes(text=tx_receipt)} + ) + for tx_receipt in tx_receipts + ], + block_number=0, + block_timestamp=1585336422, + block_hash=hex(0), + ) + + all_tracks: List[Track] = session.query(Track).all() + assert len(all_tracks) == 1 + all_tracks[0].release_date != datetime(2100, 1, 26, 0, 0) + all_tracks[0].title == "update" diff --git a/packages/discovery-provider/src/tasks/entity_manager/entities/track.py b/packages/discovery-provider/src/tasks/entity_manager/entities/track.py index 728f29ce6bb..da5c2cb09c3 100644 --- a/packages/discovery-provider/src/tasks/entity_manager/entities/track.py +++ b/packages/discovery-provider/src/tasks/entity_manager/entities/track.py @@ -292,13 +292,18 @@ def populate_track_record_metadata(track_record: Track, track_metadata, handle, # casting to string because datetime doesn't work for some reason parsed_release_date = parse_release_date(track_metadata["release_date"]) # postgres will convert to a timestamp - if ( - action == Action.UPDATE - and track_record.is_unlisted == False - and parsed_release_date > datetime.now() - ): - # Public tracks cannot be rescheduled into the future - continue + + if parsed_release_date > datetime.now().astimezone(timezone.utc): + # ignore release date if in the future + # for creating or updating public tracks + if ( + action == Action.UPDATE and track_record.is_unlisted == False + ) or ( + action == Action.CREATE + and track_metadata.get("is_unlisted") == False + ): + # Public tracks cannot be rescheduled into the future + continue if parsed_release_date: track_record.release_date = str(parsed_release_date) # type: ignore From 956ffd8175b8b6d66c752df7be58ff26865d2f14 Mon Sep 17 00:00:00 2001 From: isaac Date: Fri, 26 Jan 2024 15:59:19 -0800 Subject: [PATCH 3/4] clean --- .../tasks/entity_manager/test_track_entity_manager.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py b/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py index e9feabe5f45..b126f8c62aa 100644 --- a/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py +++ b/packages/discovery-provider/integration_tests/tasks/entity_manager/test_track_entity_manager.py @@ -546,9 +546,6 @@ def test_index_invalid_tracks(app, mocker): "is_original_available": False, }, "QmInvalidUnlistTrack1Update": {"is_unlisted": True}, - "QmInvalidRescheduleReleaseDate": { - "release_date": "Fri Jan 26 2100 00:00:00 GMT+0000" - }, "InvalidTrackIdUpdate": {"track_id": 1234, "bogus_field": "bogus"}, } invalid_metadata_json = json.dumps(test_metadata["QmAIDisabled"]) @@ -878,11 +875,7 @@ def get_events_side_effect(_, tx_receipt): {"user_id": 2, "handle": "user-1", "wallet": "User2Wallet"}, ], "tracks": [ - { - "track_id": TRACK_ID_OFFSET, - "owner_id": 1, - "release_date": datetime(2019, 6, 17), - }, + {"track_id": TRACK_ID_OFFSET, "owner_id": 1}, ], "developer_apps": [ { @@ -932,7 +925,6 @@ def get_events_side_effect(_, tx_receipt): current_track: List[Track] = ( session.query(Track).filter(Track.is_current == True).first() ) - assert current_track.release_date == datetime(2019, 6, 17) assert current_track.track_id == TRACK_ID_OFFSET From 8507c094766b21dcc0753f26037cc359239a490a Mon Sep 17 00:00:00 2001 From: isaac Date: Tue, 30 Jan 2024 09:09:57 -0800 Subject: [PATCH 4/4] only for update --- .../src/tasks/entity_manager/entities/track.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/discovery-provider/src/tasks/entity_manager/entities/track.py b/packages/discovery-provider/src/tasks/entity_manager/entities/track.py index da5c2cb09c3..162e7c6ccc4 100644 --- a/packages/discovery-provider/src/tasks/entity_manager/entities/track.py +++ b/packages/discovery-provider/src/tasks/entity_manager/entities/track.py @@ -293,16 +293,12 @@ def populate_track_record_metadata(track_record: Track, track_metadata, handle, parsed_release_date = parse_release_date(track_metadata["release_date"]) # postgres will convert to a timestamp - if parsed_release_date > datetime.now().astimezone(timezone.utc): - # ignore release date if in the future - # for creating or updating public tracks - if ( - action == Action.UPDATE and track_record.is_unlisted == False - ) or ( - action == Action.CREATE - and track_metadata.get("is_unlisted") == False - ): - # Public tracks cannot be rescheduled into the future + if ( + parsed_release_date + and parsed_release_date > datetime.now().astimezone(timezone.utc) + ): + # ignore release date if in the future and updating public tracks + if action == Action.UPDATE and track_record.is_unlisted == False: continue if parsed_release_date: