diff --git a/api/v1_challenges_undisbursed.go b/api/v1_challenges_undisbursed.go index 1cb5907e..d1a15a2d 100644 --- a/api/v1_challenges_undisbursed.go +++ b/api/v1_challenges_undisbursed.go @@ -1,6 +1,8 @@ package api import ( + "fmt" + "strings" "time" "api.audius.co/trashid" @@ -8,6 +10,19 @@ import ( "github.com/jackc/pgx/v5" ) +// openRewards are challenge IDs available to unverified users +var openRewards = []string{ + "dvl", // daily volume rewards + "t", // tastemaker + "tp", // trending playlists + "tt", // trending + "tut", // trending underground + "b", // audio match buy (from verified user) + "rd", // referred (by verified user) + "w", // remix contest winner (from verified user) + "cs", // cosign (from verified user) +} + type GetUndisbursedChallengesQueryParams struct { ChallengeID string `query:"challenge_id"` CompletedBlocknumber int `query:"completed_blocknumber"` @@ -26,7 +41,13 @@ func (app *ApiServer) v1ChallengesUndisbursed(c *fiber.Ctx) error { return err } - sql := ` + openRewardsPlaceholders := make([]string, len(openRewards)) + for i, reward := range openRewards { + openRewardsPlaceholders[i] = fmt.Sprintf("'%s'", reward) + } + openRewardsInClause := strings.Join(openRewardsPlaceholders, ", ") + + sql := fmt.Sprintf(` -- Get Undisbursed Challenges SELECT user_challenges.challenge_id, user_challenges.user_id, @@ -52,6 +73,8 @@ func (app *ApiServer) v1ChallengesUndisbursed(c *fiber.Ctx) error { AND (@user_id = 0 OR user_challenges.user_id = @user_id) AND (@completed_blocknumber = 0 OR user_challenges.completed_blocknumber > @completed_blocknumber) AND (@challenge_id = '' OR user_challenges.challenge_id = @challenge_id) + -- Filter by verification status: unverified users only see openRewards, verified users see all + AND (users.is_verified = true OR user_challenges.challenge_id IN (%s)) ORDER BY user_challenges.user_id ASC, user_challenges.challenge_id ASC, @@ -59,7 +82,7 @@ func (app *ApiServer) v1ChallengesUndisbursed(c *fiber.Ctx) error { LIMIT COALESCE(@limit, 100) OFFSET @offset ; - ` + `, openRewardsInClause) rows, err := app.pool.Query(c.Context(), sql, pgx.NamedArgs{ "user_id": userId, diff --git a/api/v1_challenges_undisbursed_test.go b/api/v1_challenges_undisbursed_test.go index ebf849d1..68b9186c 100644 --- a/api/v1_challenges_undisbursed_test.go +++ b/api/v1_challenges_undisbursed_test.go @@ -1,6 +1,7 @@ package api import ( + "context" "testing" "github.com/stretchr/testify/assert" @@ -9,6 +10,11 @@ import ( func TestGetUndisbursedChallenges(t *testing.T) { app := testAppWithFixtures(t) + // Set all users as verified so they can see all challenges + ctx := context.Background() + _, err := app.pool.Exec(ctx, `UPDATE users SET is_verified = true WHERE is_current = true`) + assert.NoError(t, err) + // Test basic functionality with no parameters status, body := testGet(t, app, "/v1/challenges/undisbursed") assert.Equal(t, 200, status)