Skip to content

Commit

Permalink
Add unclaimed user ID API (#4439)
Browse files Browse the repository at this point in the history
  • Loading branch information
isaacsolo committed Dec 8, 2022
1 parent f0ffb39 commit 2700cc8
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 0 deletions.
11 changes: 11 additions & 0 deletions discovery-provider/src/api/v1/playlists.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
get_full_trending_playlists,
get_trending_playlists,
)
from src.queries.get_unclaimed_id import get_unclaimed_id
from src.queries.search_queries import SearchKind, search
from src.trending_strategies.trending_strategy_factory import (
DEFAULT_TRENDING_VERSIONS,
Expand Down Expand Up @@ -454,3 +455,13 @@ def playlist_stream(playlist_id):
status=200,
mimetype="application/mpegurl",
)


@ns.route("/unclaimed_id", doc=False)
class GetUnclaimedPlaylistId(Resource):
@ns.doc(
id="""Get unclaimed playlist ID""",
description="""Gets an unclaimed blockchain playlist ID""",
)
def get(self):
return get_unclaimed_id("playlist")
11 changes: 11 additions & 0 deletions discovery-provider/src/api/v1/tracks.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
from src.queries.get_trending import get_full_trending, get_trending
from src.queries.get_trending_ids import get_trending_ids
from src.queries.get_trending_tracks import TRENDING_LIMIT, TRENDING_TTL_SEC
from src.queries.get_unclaimed_id import get_unclaimed_id
from src.queries.get_underground_trending import get_underground_trending
from src.queries.search_queries import SearchKind, search
from src.trending_strategies.trending_strategy_factory import (
Expand Down Expand Up @@ -1329,3 +1330,13 @@ def get(self, track_id):

subsequent_tracks = get_subsequent_tracks(decoded_track_id, limit)
return success_response(subsequent_tracks)


@ns.route("/unclaimed_id", doc=False)
class GetUnclaimedTrackId(Resource):
@ns.doc(
id="""Get unclaimed track ID""",
description="""Gets an unclaimed blockchain track ID""",
)
def get(self):
return get_unclaimed_id("track")
16 changes: 16 additions & 0 deletions discovery-provider/src/api/v1/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
from src.queries.get_top_user_track_tags import get_top_user_track_tags
from src.queries.get_top_users import get_top_users
from src.queries.get_tracks import GetTrackArgs, get_tracks
from src.queries.get_unclaimed_id import get_unclaimed_id
from src.queries.get_user_listen_counts_monthly import get_user_listen_counts_monthly
from src.queries.get_user_listening_history import (
GetUserListeningHistoryArgs,
Expand Down Expand Up @@ -1791,3 +1792,18 @@ class GetReplicaSet(FullGetReplicaSet):
@ns.marshal_with(user_replica_set_response)
def get(self, id: str):
return super()._get(id)


verify_token_response = make_response(
"verify_token", ns, fields.Nested(decoded_user_token)
)


@ns.route("/unclaimed_id", doc=False)
class GetUnclaimedUserId(Resource):
@ns.doc(
id="""Get unclaimed user ID""",
description="""Gets an unclaimed blockchain user ID""",
)
def get(self):
return get_unclaimed_id("user")
58 changes: 58 additions & 0 deletions discovery-provider/src/queries/get_unclaimed_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import random

from src import exceptions
from src.models.playlists.aggregate_playlist import AggregatePlaylist
from src.models.tracks.aggregate_track import AggregateTrack
from src.models.users.aggregate_user import AggregateUser
from src.tasks.entity_manager.utils import (
PLAYLIST_ID_OFFSET,
TRACK_ID_OFFSET,
USER_ID_OFFSET,
)
from src.utils.db_session import get_db_read_replica
from src.utils.helpers import encode_int_id

MAX_USER_ID = 999999999 # max for reward specifier id
MAX_POSTGRES_ID = 2147483647


def get_unclaimed_id(type):

if type not in ["track", "playlist", "user"]:
raise exceptions.ArgumentError(
"Invalid type provided, must be one of 'track', 'playlist', 'user'"
)

db = get_db_read_replica()
with db.scoped_session() as session:
for _ in range(10):
is_claimed = True
random_id = None
if type == "user":
random_id = random.randint(USER_ID_OFFSET, MAX_USER_ID)
is_claimed = (
session.query(AggregateUser.user_id).filter(
AggregateUser.user_id == random_id
)
).first()

if type == "track":
random_id = random.randint(TRACK_ID_OFFSET, MAX_POSTGRES_ID)

is_claimed = (
session.query(AggregateTrack.track_id).filter(
AggregateTrack.track_id == random_id
)
).first()

if type == "playlist":
random_id = random.randint(PLAYLIST_ID_OFFSET, MAX_POSTGRES_ID)

is_claimed = (
session.query(AggregatePlaylist.playlist_id).filter(
AggregatePlaylist.playlist_id == random_id
)
).first()

if not is_claimed:
return encode_int_id(random_id)

0 comments on commit 2700cc8

Please sign in to comment.