Skip to content

Commit c1a36ef

Browse files
authored
Merge pull request #50 from AudiusProject/mjp-tracks-by-permalink
Add GetTracksByPermalink
2 parents 05b56c8 + 29806fe commit c1a36ef

9 files changed

Lines changed: 115 additions & 0 deletions

api/dbv1/get_track_ids_by_permalink.sql.go

Lines changed: 45 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-- name: GetTrackIdsByPermalink :many
2+
SELECT track_id
3+
FROM track_routes
4+
JOIN users ON users.user_id = track_routes.owner_id
5+
WHERE handle_lc = ANY(@handles::text[])
6+
AND slug = ANY(@slugs::text[])
7+
AND CONCAT(handle_lc, '/', slug) = ANY(@permalinks::text[]) -- in case of conflicts across users
8+
;

api/server.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,14 @@ func decodeIdList(c *fiber.Ctx) []int32 {
265265
return ids
266266
}
267267

268+
func queryMutli(c *fiber.Ctx, key string) []string {
269+
var values []string
270+
for _, v := range c.Request().URI().QueryArgs().PeekMulti(key) {
271+
values = append(values, string(v))
272+
}
273+
return values
274+
}
275+
268276
func (app *ApiServer) resolveUserHandleToId(handle string) (int32, error) {
269277
if hit, ok := app.resolveHandleCache.Get(handle); ok {
270278
return hit, nil

api/server_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ func TestMain(m *testing.M) {
7777
insertFixtures("associated_wallets", connectedWalletsBaseRow, "testdata/connected_wallets_fixtures.csv")
7878
insertFixtures("aggregate_user_tips", aggregateUserTipsBaseRow, "testdata/aggregate_user_tips_fixtures.csv")
7979
insertFixtures("usdc_purchases", usdcPurchaseBaseRow, "testdata/usdc_purchases_fixtures.csv")
80+
insertFixtures("track_routes", map[string]any{}, "testdata/track_routes_fixtures.csv")
8081

8182
// index to es / os
8283

api/testdata/track_fixtures.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ track_id,genre,owner_id,title,is_unlisted,stream_conditions,download_conditions
99
302,Electronic,3,Tip Gated Stream,f,"{""tip_user_id"": 3}","{""tip_user_id"": 3}"
1010
303,Electronic,3,Pay Gated Stream,f,"{""usdc_purchase"": {""price"": 135, ""splits"": [{""user_id"": 3, ""percentage"": 100.0}]}}",
1111
400,Folk,5,Trending Month Folk,f,,
12+
500,Experimental,6,track by permalink,f,,
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
"slug","title_slug","collision_id","owner_id","track_id","is_current","blockhash","blocknumber","txhash"
2+
"track-by-permalink","track-by-permalink",0,6,500,TRUE,"0x24f1465e4bd8803b79b2cbcfad695363a640623053563ffd20fdeaf4656a7b89",23200013,"0x76dcea2bf98e56f683b95a071f5c87405a864eea87243920e60cbc7b96ad565b"

api/testdata/user_fixtures.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ user_id,handle,handle_lc,is_deactivated,wallet,playlist_library
44
3,someseller,someseller,f,0x234567890abcdef1,
55
4,accesstester,accesstester,f,0x34567890abcdef12,
66
5,guyintrending,guyintrending,f,0x34567890abcdef13,
7+
6,TracksByPermalink,tracksbypermalink,f,0xffffffffff,
78
91,badguy,badguy,t,0x4567890abcdef123,

api/v1_tracks.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package api
22

33
import (
4+
"strings"
5+
46
"bridgerton.audius.co/api/dbv1"
57
"bridgerton.audius.co/trashid"
68
"github.com/gofiber/fiber/v2"
@@ -10,6 +12,31 @@ func (app *ApiServer) v1Tracks(c *fiber.Ctx) error {
1012
myId, _ := trashid.DecodeHashId(c.Query("user_id"))
1113
ids := decodeIdList(c)
1214

15+
// Add permalink ID mappings
16+
permalinks := queryMutli(c, "permalink")
17+
if len(permalinks) > 0 {
18+
handles := make([]string, len(permalinks))
19+
slugs := make([]string, len(permalinks))
20+
for i, permalink := range permalinks {
21+
permalinks[i] = strings.ToLower(strings.TrimPrefix(permalink, "/"))
22+
splits := strings.Split(permalinks[i], "/")
23+
if len(splits) != 2 {
24+
return fiber.NewError(fiber.StatusBadRequest, "Invalid permalink: "+permalink)
25+
}
26+
handles[i] = splits[0]
27+
slugs[i] = splits[1]
28+
}
29+
newIds, err := app.queries.GetTrackIdsByPermalink(c.Context(), dbv1.GetTrackIdsByPermalinkParams{
30+
Handles: handles,
31+
Slugs: slugs,
32+
Permalinks: permalinks,
33+
})
34+
if err != nil {
35+
return err
36+
}
37+
ids = append(ids, newIds...)
38+
}
39+
1340
tracks, err := app.queries.FullTracks(c.Context(), dbv1.GetTracksParams{
1441
MyID: int32(myId),
1542
Ids: ids,

api/v1_tracks_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package api
2+
3+
import (
4+
"testing"
5+
6+
"bridgerton.audius.co/api/dbv1"
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestGetTracksByPermalink(t *testing.T) {
11+
var tracksResponse struct {
12+
Data []dbv1.FullTrack
13+
}
14+
15+
status, body := testGet(t, "/v1/full/tracks?permalink=/TracksByPermalink/track-by-permalink", &tracksResponse)
16+
assert.Equal(t, 200, status)
17+
18+
jsonAssert(t, body, map[string]string{
19+
"data.0.id": "eYake",
20+
"data.0.title": "track by permalink",
21+
})
22+
}

0 commit comments

Comments
 (0)