Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ setup::
go install -v github.com/sqlc-dev/sqlc/cmd/sqlc@latest

apidiff::
npx deno run -A --watch apidiff2.ts
npx deno run -A --watch apidiff.ts
18 changes: 18 additions & 0 deletions api/resolve_middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,21 @@ func (app *ApiServer) requireHandleMiddleware(c *fiber.Ctx) error {
c.Locals("userId", userId)
return c.Next()
}

func (app *ApiServer) requireTrackIdMiddleware(c *fiber.Ctx) error {
trackId, err := trashid.DecodeHashId(c.Params("trackId"))
if err != nil || trackId == 0 {
return sendError(c, 400, "invalid trackId")
}
c.Locals("trackId", trackId)
return c.Next()
}

func (app *ApiServer) requirePlaylistIdMiddleware(c *fiber.Ctx) error {
playlistId, err := trashid.DecodeHashId(c.Params("playlistId"))
if err != nil || playlistId == 0 {
return sendError(c, 400, "invalid playlistId")
}
c.Locals("playlistId", playlistId)
return c.Next()
}
39 changes: 36 additions & 3 deletions api/response_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,18 @@ import (
"github.com/gofiber/fiber/v2"
)

func v1UserResponse(c *fiber.Ctx, users []dbv1.FullUser) error {
func v1UserResponse(c *fiber.Ctx, user dbv1.FullUser) error {
if c.Locals("isFull").(bool) {
return c.JSON(fiber.Map{
"data": user,
})
}
return c.JSON(fiber.Map{
"data": dbv1.ToMinUser(user),
})
}

func v1UsersResponse(c *fiber.Ctx, users []dbv1.FullUser) error {
if c.Locals("isFull").(bool) {
return c.JSON(fiber.Map{
"data": users,
Expand All @@ -16,7 +27,18 @@ func v1UserResponse(c *fiber.Ctx, users []dbv1.FullUser) error {
})
}

func v1PlaylistResponse(c *fiber.Ctx, playlists []dbv1.FullPlaylist) error {
func v1PlaylistResponse(c *fiber.Ctx, playlist dbv1.FullPlaylist) error {
if c.Locals("isFull").(bool) {
return c.JSON(fiber.Map{
"data": playlist,
})
}
return c.JSON(fiber.Map{
"data": dbv1.ToMinPlaylist(playlist),
})
}

func v1PlaylistsResponse(c *fiber.Ctx, playlists []dbv1.FullPlaylist) error {
if c.Locals("isFull").(bool) {
return c.JSON(fiber.Map{
"data": playlists,
Expand All @@ -27,7 +49,18 @@ func v1PlaylistResponse(c *fiber.Ctx, playlists []dbv1.FullPlaylist) error {
})
}

func v1TrackResponse(c *fiber.Ctx, tracks []dbv1.FullTrack) error {
func v1TrackResponse(c *fiber.Ctx, track dbv1.FullTrack) error {
if c.Locals("isFull").(bool) {
return c.JSON(fiber.Map{
"data": track,
})
}
return c.JSON(fiber.Map{
"data": dbv1.ToMinTrack(track),
})
}

func v1TracksResponse(c *fiber.Ctx, tracks []dbv1.FullTrack) error {
if c.Locals("isFull").(bool) {
return c.JSON(fiber.Map{
"data": tracks,
Expand Down
80 changes: 39 additions & 41 deletions api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,47 +115,45 @@ func NewApiServer(config Config) *ApiServer {
app.Use(app.isFullMiddleware)
app.Use(app.resolveMyIdMiddleware)

// v1/full
app.Get("/v1/full/users", app.v1Users)

app.Use("/v1/full/users/handle/:handle", app.requireHandleMiddleware)
app.Get("/v1/full/users/handle/:handle/tracks", app.v1UserTracks)
app.Get("/v1/full/users/handle/:handle/reposts", app.v1UsersReposts)

app.Use("/v1/full/users/:userId", app.requireUserIdMiddleware)
app.Get("/v1/full/users/:userId/followers", app.v1UsersFollowers)
app.Get("/v1/full/users/:userId/following", app.v1UsersFollowing)
app.Get("/v1/full/users/:userId/mutuals", app.v1UsersMutuals)
app.Get("/v1/full/users/:userId/reposts", app.v1UsersReposts)
app.Get("/v1/full/users/:userId/supporting", app.v1UsersSupporting)
app.Get("/v1/full/users/:userId/tracks", app.v1UserTracks)

app.Get("/v1/full/tracks", app.v1Tracks)
app.Get("/v1/full/tracks/:trackId/reposts", app.v1TracksReposts)
app.Get("/v1/full/tracks/:trackId/favorites", app.v1TracksFavorites)

app.Get("/v1/full/playlists", app.v1playlists)
app.Get("/v1/full/playlists/:playlistId/reposts", app.v1PlaylistsReposts)
app.Get("/v1/full/playlists/:playlistId/favorites", app.v1PlaylistsFavorites)

app.Get("/v1/full/developer_apps/:address", app.v1DeveloperApps)

// v1
app.Get("/v1/users", app.v1Users)
app.Get("/v1/users/:userId/followers", app.v1UsersFollowers)
app.Get("/v1/users/:userId/following", app.v1UsersFollowing)
app.Get("/v1/users/:userId/mutuals", app.v1UsersMutuals)
app.Get("/v1/users/:userId/supporting", app.v1UsersSupporting)

app.Get("/v1/tracks", app.v1Tracks)
app.Get("/v1/tracks/:trackId/reposts", app.v1TracksReposts)
app.Get("/v1/tracks/:trackId/favorites", app.v1TracksFavorites)

app.Get("/v1/playlists", app.v1playlists)
app.Get("/v1/playlists/:playlistId/reposts", app.v1PlaylistsReposts)
app.Get("/v1/playlists/:playlistId/favorites", app.v1PlaylistsFavorites)

app.Get("/v1/developer_apps/:address", app.v1DeveloperApps)
v1 := app.Group("/v1")
v1Full := app.Group("/v1/full")

for _, g := range []fiber.Router{v1, v1Full} {
// Users
g.Get("/users", app.v1Users)

g.Use("/users/handle/:handle", app.requireHandleMiddleware)
g.Get("/users/handle/:handle/tracks", app.v1UserTracks)
g.Get("/users/handle/:handle/reposts", app.v1UsersReposts)

g.Use("/users/:userId", app.requireUserIdMiddleware)
g.Get("/users/:userId", app.v1User)
g.Get("/users/:userId/followers", app.v1UsersFollowers)
g.Get("/users/:userId/following", app.v1UsersFollowing)
g.Get("/users/:userId/mutuals", app.v1UsersMutuals)
g.Get("/users/:userId/reposts", app.v1UsersReposts)
g.Get("/users/:userId/supporting", app.v1UsersSupporting)
g.Get("/users/:userId/tracks", app.v1UserTracks)

// Tracks
g.Get("/tracks", app.v1Tracks)

g.Use("/tracks/:trackId", app.requireTrackIdMiddleware)
g.Get("/tracks/:trackId", app.v1Track)
g.Get("/tracks/:trackId/reposts", app.v1TracksReposts)
g.Get("/tracks/:trackId/favorites", app.v1TracksFavorites)

// Playlists
g.Get("/playlists", app.v1playlists)

g.Use("/playlists/:playlistId", app.requirePlaylistIdMiddleware)
g.Get("/playlists/:playlistId", app.v1Playlist)
g.Get("/playlists/:playlistId/reposts", app.v1PlaylistsReposts)
g.Get("/playlists/:playlistId/favorites", app.v1PlaylistsFavorites)

// Developer Apps
g.Get("/developer_apps/:address", app.v1DeveloperApps)
}

// proxy unhandled requests thru to existing discovery API
{
Expand Down
27 changes: 27 additions & 0 deletions api/v1_playlist.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package api

import (
"bridgerton.audius.co/api/dbv1"
"github.com/gofiber/fiber/v2"
)

func (app *ApiServer) v1Playlist(c *fiber.Ctx) error {
myId := c.Locals("myId").(int)
playlistId := c.Locals("playlistId").(int)

playlists, err := app.queries.FullPlaylists(c.Context(), dbv1.GetPlaylistsParams{
MyID: int32(myId),
Ids: []int32{int32(playlistId)},
})
if err != nil {
return err
}

if len(playlists) == 0 {
return sendError(c, 404, "playlist not found")
}

playlist := playlists[0]

return v1PlaylistResponse(c, playlist)
}
21 changes: 21 additions & 0 deletions api/v1_playlist_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package api

import (
"strings"
"testing"

"bridgerton.audius.co/api/dbv1"
"github.com/stretchr/testify/assert"
)

func TestGetPlaylist(t *testing.T) {
var playlistResponse struct {
Data dbv1.FullPlaylist
}

status, body := testGet(t, "/v1/full/playlists/7eP5n", &playlistResponse)
assert.Equal(t, 200, status)

assert.True(t, strings.Contains(string(body), `"playlist_name":"First"`))
assert.True(t, strings.Contains(string(body), `"id":"7eP5n"`))
}
2 changes: 1 addition & 1 deletion api/v1_playlists.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@ func (app *ApiServer) v1playlists(c *fiber.Ctx) error {
return err
}

return v1PlaylistResponse(c, playlists)
return v1PlaylistsResponse(c, playlists)
}
27 changes: 27 additions & 0 deletions api/v1_track.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package api

import (
"bridgerton.audius.co/api/dbv1"
"github.com/gofiber/fiber/v2"
)

func (app *ApiServer) v1Track(c *fiber.Ctx) error {
myId := c.Locals("myId").(int)
trackId := c.Locals("trackId").(int)

tracks, err := app.queries.FullTracks(c.Context(), dbv1.GetTracksParams{
MyID: int32(myId),
Ids: []int32{int32(trackId)},
})
if err != nil {
return err
}

if len(tracks) == 0 {
return sendError(c, 404, "track not found")
}

track := tracks[0]

return v1TrackResponse(c, track)
}
21 changes: 21 additions & 0 deletions api/v1_track_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package api

import (
"strings"
"testing"

"bridgerton.audius.co/api/dbv1"
"github.com/stretchr/testify/assert"
)

func TestGetTrack(t *testing.T) {
var trackResponse struct {
Data dbv1.FullTrack
}

status, body := testGet(t, "/v1/full/tracks/eYJyn", &trackResponse)
assert.Equal(t, 200, status)

assert.True(t, strings.Contains(string(body), `"title":"Culca Canyon"`))
assert.True(t, strings.Contains(string(body), `"id":"eYJyn"`))
}
2 changes: 1 addition & 1 deletion api/v1_tracks.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@ func (app *ApiServer) v1Tracks(c *fiber.Ctx) error {
return err
}

return v1TrackResponse(c, tracks)
return v1TracksResponse(c, tracks)
}
28 changes: 28 additions & 0 deletions api/v1_user.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package api

import (
"bridgerton.audius.co/api/dbv1"
"github.com/gofiber/fiber/v2"
)

func (app *ApiServer) v1User(c *fiber.Ctx) error {
myId := c.Locals("myId")
userId := c.Locals("userId").(int)

users, err := app.queries.FullUsers(c.Context(), dbv1.GetUsersParams{
MyID: myId,
Ids: []int32{int32(userId)},
})

if err != nil {
return err
}

if len(users) == 0 {
return sendError(c, 404, "user not found")
}

user := users[0]

return v1UserResponse(c, user)
}
27 changes: 27 additions & 0 deletions api/v1_user_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package api

import (
"strings"
"testing"

"bridgerton.audius.co/api/dbv1"
"github.com/stretchr/testify/assert"
)

func TestGetUser(t *testing.T) {
var userResponse struct {
Data dbv1.FullUser
}

status, body := testGet(t, "/v1/full/users/7eP5n", &userResponse)
assert.Equal(t, 200, status)

// body is response json
assert.True(t, strings.Contains(string(body), `"handle":"rayjacobson"`))
assert.True(t, strings.Contains(string(body), `"user_id":1`))
assert.True(t, strings.Contains(string(body), `"id":"7eP5n"`))

// but we also unmarshaled into userResponse
// for structured testing
assert.Equal(t, userResponse.Data.ID, "7eP5n")
}
4 changes: 2 additions & 2 deletions api/v1_users.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func (app *ApiServer) v1Users(c *fiber.Ctx) error {
return err
}

return v1UserResponse(c, users)
return v1UsersResponse(c, users)
}

// a generic responder for all the simple user lists:
Expand Down Expand Up @@ -61,5 +61,5 @@ func (app *ApiServer) queryFullUsers(c *fiber.Ctx, sql string, args pgx.NamedArg
users[idx] = userMap[id]
}

return v1UserResponse(c, users)
return v1UsersResponse(c, users)
}
6 changes: 5 additions & 1 deletion api/v1_users_followers.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package api

import (
"fmt"

"github.com/gofiber/fiber/v2"
"github.com/jackc/pgx/v5"
)
Expand All @@ -21,7 +23,9 @@ func (app *ApiServer) v1UsersFollowers(c *fiber.Ctx) error {
`

userId := c.Locals("userId").(int)
return app.queryFullUsers(c, sql, pgx.NamedArgs{
res := app.queryFullUsers(c, sql, pgx.NamedArgs{
"userId": userId,
})
fmt.Println(res)
return res
}
2 changes: 1 addition & 1 deletion api/v1_users_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func TestUserQuery(t *testing.T) {
}
}

func TestGetUser(t *testing.T) {
func TestGetUsers(t *testing.T) {
var userResponse struct {
Data []dbv1.FullUser
}
Expand Down
1 change: 1 addition & 0 deletions apidiff2.ts → apidiff.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const testPaths = [
"/v1/full/users?id=0EoAm&user_id=aNzoj",
"/v1/full/users?id=0EoAm&id=7eP5n&id=aWvp71&id=Wem1e&user_id=aNzoj",

"/v1/users/0EoAm",
"/v1/full/users?id=invalid_id1&id=aNzoj",

"/v1/full/tracks?id=ZaXp01y&user_id=aNzoj",
Expand Down
Loading