Skip to content

Commit

Permalink
Allow delegated track writes in EM C-2294 (#5236)
Browse files Browse the repository at this point in the history
Co-authored-by: Nikki Kang <kangaroo233@gmail.com>
  • Loading branch information
nicoback2 and nicoback committed May 17, 2023
1 parent c4583e6 commit 299d171
Show file tree
Hide file tree
Showing 5 changed files with 315 additions and 32 deletions.
Expand Up @@ -84,7 +84,7 @@ def test_index_valid_track(app, mocker):
},
"track_id": 77955,
"stem_of": None,
"ai_attribution_user_id": 2
"ai_attribution_user_id": 2,
},
"QmCreateTrack2": {
"owner_id": 1,
Expand Down Expand Up @@ -164,6 +164,45 @@ def test_index_valid_track(app, mocker):
"iswc": "",
"is_playlist_upload": False,
},
"QmCreateTrack4": {
"owner_id": 2,
"track_cid": "some-track-cid-4",
"title": "track 4",
"length": None,
"cover_art": None,
"cover_art_sizes": "QmQKXkVxGBbCFjcnhgxftzYDhph1CT8PJCuPEsRpffjjGC",
"tags": None,
"genre": "Rock",
"mood": None,
"credits_splits": None,
"created_at": None,
"create_date": None,
"updated_at": None,
"release_date": None,
"file_type": None,
"track_segments": [],
"has_current_user_reposted": False,
"is_current": True,
"is_unlisted": False,
"is_premium": False,
"premium_conditions": None,
"field_visibility": {
"genre": True,
"mood": True,
"tags": True,
"share": True,
"play_count": True,
"remixes": True,
},
"remix_of": None,
"repost_count": 0,
"save_count": 0,
"description": "",
"license": "",
"isrc": "",
"iswc": "",
"is_playlist_upload": False,
},
"QmUpdateTrack1": {
"owner_id": 1,
"track_cid": "some-track-cid",
Expand Down Expand Up @@ -214,11 +253,12 @@ def test_index_valid_track(app, mocker):
"track_id": 77955,
"stem_of": None,
"is_playlist_upload": False,
"ai_attribution_user_id": 2
"ai_attribution_user_id": 2,
},
}

track3_json = json.dumps(test_metadata["QmCreateTrack3"])
track4_json = json.dumps(test_metadata["QmCreateTrack4"])
tx_receipts = {
"CreateTrack1Tx": [
{
Expand Down Expand Up @@ -290,6 +330,21 @@ def test_index_valid_track(app, mocker):
)
},
],
# Delegated track write
"CreateTrack4Tx": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET + 3,
"_entityType": "Track",
"_userId": 2,
"_action": "Create",
"_metadata": f'{{"cid": "QmCreateTrack4", "data": {track4_json}}}',
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb76c",
}
)
},
],
}

entity_manager_txs = [
Expand All @@ -309,8 +364,27 @@ def get_events_side_effect(_, tx_receipt):
entities = {
"users": [
{"user_id": 1, "handle": "user-1", "wallet": "user1wallet"},
{"user_id": 2, "handle": "user-2", "wallet": "user2wallet", "allow_ai_attribution": True},
]
{
"user_id": 2,
"handle": "user-2",
"wallet": "user2wallet",
"allow_ai_attribution": True,
},
],
"app_delegates": [
{
"user_id": 1,
"name": "My App",
"address": "0x3a388671bb4D6E1Ea08D79Ee191b40FB45A8F4C4",
},
],
"delegations": [
{
"user_id": 2,
"shared_address": "0xdB384D555480214632D08609848BbFB54CCeb76c",
"delegate_address": "0x3a388671bb4D6E1Ea08D79Ee191b40FB45A8F4C4",
}
],
}
populate_mock_db(db, entities)

Expand All @@ -329,7 +403,7 @@ def get_events_side_effect(_, tx_receipt):

# validate db records
all_tracks: List[Track] = session.query(Track).all()
assert len(all_tracks) == 5
assert len(all_tracks) == 6

track_1: Track = (
session.query(Track)
Expand Down Expand Up @@ -362,6 +436,17 @@ def get_events_side_effect(_, tx_receipt):
assert track_3.title == "track 3"
assert track_3.is_delete == False

track_4: Track = (
session.query(Track)
.filter(
Track.is_current == True,
Track.track_id == TRACK_ID_OFFSET + 3,
)
.first()
)
assert track_4.title == "track 4"
assert track_4.is_delete == False

# Check that track routes are updated appropriately
track_routes = (
session.query(TrackRoute)
Expand Down Expand Up @@ -403,11 +488,7 @@ def test_index_invalid_tracks(app, mocker):
db = get_db()
web3 = Web3()
update_task = UpdateTask(None, web3, None)
test_metadata = {
"QmAIDisabled": {
"ai_attribution_user_id": 2
}
}
test_metadata = {"QmAIDisabled": {"ai_attribution_user_id": 2}}
tx_receipts = {
# invalid create
"CreateTrackBelowOffset": [
Expand Down Expand Up @@ -479,7 +560,50 @@ def test_index_invalid_tracks(app, mocker):
}
)
},
], # invalid updates
],
"CreateTrackInvalidDeletedDelegate": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET + 1,
"_entityType": "Track",
"_userId": 1,
"_action": "Create",
"_metadata": "",
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb76c",
}
)
},
],
"CreateTrackInvalidRevokedDelegation": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET + 1,
"_entityType": "Track",
"_userId": 1,
"_action": "Create",
"_metadata": "",
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb7AA",
}
)
},
],
"CreateTrackInvalidWrongUserDelegation": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET + 1,
"_entityType": "Track",
"_userId": 1,
"_action": "Create",
"_metadata": "",
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb7CC",
}
)
},
],
# invalid updates
"UpdateTrackInvalidSigner": [
{
"args": AttributeDict(
Expand Down Expand Up @@ -508,6 +632,48 @@ def test_index_invalid_tracks(app, mocker):
)
},
],
"UpdateTrackInvalidDeletedDelegate": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET,
"_entityType": "Track",
"_userId": 1,
"_action": "Update",
"_metadata": "",
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb76c",
}
)
},
],
"UpdateTrackInvalidRevokedDelegation": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET,
"_entityType": "Track",
"_userId": 1,
"_action": "Update",
"_metadata": "",
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb7AA",
}
)
},
],
"UpdateTrackInvalidWrongUserDelegation": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET,
"_entityType": "Track",
"_userId": 1,
"_action": "Update",
"_metadata": "",
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb7CC",
}
)
},
],
# invalid deletes
"DeleteTrackInvalidSigner": [
{
Expand Down Expand Up @@ -551,6 +717,48 @@ def test_index_invalid_tracks(app, mocker):
)
},
],
"DeleteTrackInvalidDeletedDelegate": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET,
"_entityType": "Track",
"_userId": 1,
"_action": "Delete",
"_metadata": "",
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb76c",
}
)
},
],
"DeleteTrackInvalidRevokedDelegation": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET,
"_entityType": "Track",
"_userId": 1,
"_action": "Delete",
"_metadata": "",
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb7AA",
}
)
},
],
"DeleteTrackInvalidWrongUserDelegation": [
{
"args": AttributeDict(
{
"_entityId": TRACK_ID_OFFSET,
"_entityType": "Track",
"_userId": 1,
"_action": "Delete",
"_metadata": "",
"_signer": "0xdB384D555480214632D08609848BbFB54CCeb7CC",
}
)
},
],
}

entity_manager_txs = [
Expand All @@ -575,6 +783,37 @@ def get_events_side_effect(_, tx_receipt):
"tracks": [
{"track_id": TRACK_ID_OFFSET, "owner_id": 1},
],
"app_delegates": [
{
"user_id": 2,
"name": "My App",
"address": "0x3a388671bb4D6E1Ea08D79Ee191b40FB45A8F4C4",
"is_delete": True,
},
{
"user_id": 2,
"name": "My App",
"address": "0x3a388671bb4D6E1Ea08D79Ee191b40FB45A8F4ZZ",
},
],
"delegations": [
{
"user_id": 1,
"shared_address": "0xdB384D555480214632D08609848BbFB54CCeb76c",
"delegate_address": "0x3a388671bb4D6E1Ea08D79Ee191b40FB45A8F4C4",
},
{
"user_id": 1,
"shared_address": "0xdB384D555480214632D08609848BbFB54CCeb7AA",
"delegate_address": "0x3a388671bb4D6E1Ea08D79Ee191b40FB45A8F4ZZ",
"is_revoked": True,
},
{
"user_id": 2,
"shared_address": "0xdB384D555480214632D08609848BbFB54CCeb7CC",
"delegate_address": "0x3a388671bb4D6E1Ea08D79Ee191b40FB45A8F4ZZ",
},
],
}
populate_mock_db(db, entities)

Expand All @@ -593,4 +832,4 @@ def get_events_side_effect(_, tx_receipt):

# validate db records
all_tracks: List[Track] = session.query(Track).all()
assert len(all_tracks) == 1 # no new playlists indexed
assert len(all_tracks) == 1 # no new tracks indexed
1 change: 1 addition & 0 deletions discovery-provider/integration_tests/utils.py
Expand Up @@ -287,6 +287,7 @@ def populate_mock_db(db, entities, block_offset=None):
is_personal_access=delegate_meta.get("is_personal_access", False),
blockhash=hex(i + block_offset),
blocknumber=(i + block_offset),
is_delete=delegate_meta.get("is_delete", False),
is_current=True,
txhash=delegate_meta.get("txhash", str(i + block_offset)),
updated_at=delegate_meta.get("updated_at", datetime.now()),
Expand Down
10 changes: 10 additions & 0 deletions discovery-provider/src/tasks/entity_manager/delegation.py
Expand Up @@ -93,6 +93,16 @@ def validate_delegation_tx(params: ManageEntityParameters, metadata):
raise Exception(
f"Invalid Create Delegation transaction, delegate address {metadata['delegate_address']} does not exist"
)
if (
metadata["delegate_address"].lower()
in params.existing_records[EntityType.APP_DELEGATE]
and params.existing_records[EntityType.APP_DELEGATE][
metadata["delegate_address"].lower()
].is_delete
):
raise Exception(
f"Invalid Delegation transaction, delegate address {metadata['delegate_address']} is invalid"
)
if (
metadata["shared_address"].lower()
in params.existing_records[EntityType.DELEGATION]
Expand Down

0 comments on commit 299d171

Please sign in to comment.