Skip to content

Commit

Permalink
Accept platform tenant-id header key (#99)
Browse files Browse the repository at this point in the history
* Accept platform tenant-id header key  d1103b

* Fix header matcher

* Lowercase key

* Update docs
  • Loading branch information
miguelreiswildlife committed Sep 25, 2023
1 parent 27f808c commit cda5bf0
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 28 deletions.
2 changes: 2 additions & 0 deletions api/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,8 @@ func customHeadersMatcher(key string) (string, bool) {
switch strings.ToLower(key) {
case "tenant-id":
return key, true
case strings.ToLower(TenantIDHeaderKey):
return key, true
default:
return runtime.DefaultHeaderMatcher(key)
}
Expand Down
49 changes: 32 additions & 17 deletions api/leaderboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ import (
)

const (
notFoundError = "Could not find data for member"
defaultPageSize = 20
notFoundError = "Could not find data for member"
defaultPageSize = 20
TenantIDHeaderKey = "wildlife-platform-tenant-id"
)

func validateBulkUpsertScoresRequest(req *api.BulkUpsertScoresRequest) error {
Expand Down Expand Up @@ -436,9 +437,9 @@ func (app *App) GetAroundMember(ctx context.Context, req *api.GetAroundMemberReq
return nil, err
}

tenantID := metadata.ValueFromIncomingContext(ctx, "tenant-id")
if tenantID != nil {
members, err = app.Enricher.Enrich(ctx, tenantID[0], req.LeaderboardId, members)
tenantID, ok := tryGetTenantIDFromHeader(ctx)
if ok {
members, err = app.Enricher.Enrich(ctx, tenantID, req.LeaderboardId, members)
if err != nil {
lg.Error("Enriching members failed.", zap.Error(err))
app.AddError()
Expand Down Expand Up @@ -500,9 +501,9 @@ func (app *App) GetAroundScore(ctx context.Context, req *api.GetAroundScoreReque
return nil, err
}

tenantID := metadata.ValueFromIncomingContext(ctx, "tenant-id")
if tenantID != nil {
members, err = app.Enricher.Enrich(ctx, tenantID[0], req.LeaderboardId, members)
tenantID, ok := tryGetTenantIDFromHeader(ctx)
if ok {
members, err = app.Enricher.Enrich(ctx, tenantID, req.LeaderboardId, members)
if err != nil {
lg.Error("Enriching members failed.", zap.Error(err))
app.AddError()
Expand Down Expand Up @@ -575,9 +576,9 @@ func (app *App) GetTopMembers(ctx context.Context, req *api.GetTopMembersRequest
return nil, err
}

tenantID := metadata.ValueFromIncomingContext(ctx, "tenant-id")
if tenantID != nil {
members, err = app.Enricher.Enrich(ctx, tenantID[0], req.LeaderboardId, members)
tenantID, ok := tryGetTenantIDFromHeader(ctx)
if ok {
members, err = app.Enricher.Enrich(ctx, tenantID, req.LeaderboardId, members)
if err != nil {
lg.Error("Enriching members failed.", zap.Error(err))
app.AddError()
Expand Down Expand Up @@ -629,9 +630,9 @@ func (app *App) GetTopPercentage(ctx context.Context, req *api.GetTopPercentageR
return nil, err
}

tenantID := metadata.ValueFromIncomingContext(ctx, "tenant-id")
if tenantID != nil {
members, err = app.Enricher.Enrich(ctx, tenantID[0], req.LeaderboardId, members)
tenantID, ok := tryGetTenantIDFromHeader(ctx)
if ok {
members, err = app.Enricher.Enrich(ctx, tenantID, req.LeaderboardId, members)
if err != nil {
lg.Error("Enriching members failed.", zap.Error(err))

Expand Down Expand Up @@ -711,9 +712,9 @@ func (app *App) GetMembers(ctx context.Context, req *api.GetMembersRequest) (*ap
}
}

tenantID := metadata.ValueFromIncomingContext(ctx, "tenant-id")
if tenantID != nil {
members, err = app.Enricher.Enrich(ctx, tenantID[0], req.LeaderboardId, members)
tenantID, ok := tryGetTenantIDFromHeader(ctx)
if ok {
members, err = app.Enricher.Enrich(ctx, tenantID, req.LeaderboardId, members)
if err != nil {
lg.Error("Enriching members failed.", zap.Error(err))
app.AddError()
Expand Down Expand Up @@ -816,3 +817,17 @@ func (app *App) RemoveLeaderboard(ctx context.Context, req *api.RemoveLeaderboar

return &api.RemoveLeaderboardResponse{Success: true}, nil
}

func tryGetTenantIDFromHeader(ctx context.Context) (string, bool) {
tenantID := metadata.ValueFromIncomingContext(ctx, TenantIDHeaderKey)
if len(tenantID) != 0 {
return tenantID[0], true
}

tenantID = metadata.ValueFromIncomingContext(ctx, "tenant-id") // Wrong key, but currently being used
if len(tenantID) != 0 {
return tenantID[0], true
}

return "", false
}
20 changes: 10 additions & 10 deletions api/leaderboard_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1136,7 +1136,7 @@ var _ = Describe("Leaderboard Handler", func() {
Expect(err).NotTo(HaveOccurred())
}

status, body := Get(app, "/l/testkey/members/member_50/around", "tenant-id", tenantID)
status, body := Get(app, "/l/testkey/members/member_50/around", api.TenantIDHeaderKey, tenantID)

Expect(status).To(Equal(http.StatusOK), body)

Expand Down Expand Up @@ -1224,7 +1224,7 @@ var _ = Describe("Leaderboard Handler", func() {
Expect(err).NotTo(HaveOccurred())
}

status, body := Get(app, "/l/testkey/members/member_50/around", "tenant-id", tenantID)
status, body := Get(app, "/l/testkey/members/member_50/around", api.TenantIDHeaderKey, tenantID)

Expect(status).To(Equal(http.StatusInternalServerError), body)
})
Expand Down Expand Up @@ -1574,7 +1574,7 @@ var _ = Describe("Leaderboard Handler", func() {
}

score := 50
status, body := Get(app, fmt.Sprintf("/l/testkey/scores/%d/around", score), "tenant-id", tenantID)
status, body := Get(app, fmt.Sprintf("/l/testkey/scores/%d/around", score), api.TenantIDHeaderKey, tenantID)
Expect(status).To(Equal(http.StatusOK), body)
var result map[string]interface{}
json.Unmarshal([]byte(body), &result)
Expand Down Expand Up @@ -1655,7 +1655,7 @@ var _ = Describe("Leaderboard Handler", func() {
Expect(err).NotTo(HaveOccurred())
}

status, body := Get(app, "/l/testkey/members/member_50/around", "tenant-id", tenantID)
status, body := Get(app, "/l/testkey/members/member_50/around", api.TenantIDHeaderKey, tenantID)

Expect(status).To(Equal(http.StatusInternalServerError), body)
})
Expand Down Expand Up @@ -1973,7 +1973,7 @@ var _ = Describe("Leaderboard Handler", func() {
Expect(err).NotTo(HaveOccurred())
}

status, body := Get(app, "/l/testkey/top/1", "tenant-id", tenantID)
status, body := Get(app, "/l/testkey/top/1", api.TenantIDHeaderKey, tenantID)
Expect(status).To(Equal(http.StatusOK), body)
var result map[string]interface{}
json.Unmarshal([]byte(body), &result)
Expand Down Expand Up @@ -2050,7 +2050,7 @@ var _ = Describe("Leaderboard Handler", func() {
Expect(err).NotTo(HaveOccurred())
}

status, body := Get(app, "/l/testkey/top/1", "tenant-id", tenantID)
status, body := Get(app, "/l/testkey/top/1", api.TenantIDHeaderKey, tenantID)
Expect(status).To(Equal(http.StatusInternalServerError), body)
var result map[string]interface{}
json.Unmarshal([]byte(body), &result)
Expand Down Expand Up @@ -2303,7 +2303,7 @@ var _ = Describe("Leaderboard Handler", func() {
Expect(err).NotTo(HaveOccurred())
}

status, body := Get(app, fmt.Sprintf("/l/%s/top-percent/10", leaderboardID), "tenant-id", tenantID)
status, body := Get(app, fmt.Sprintf("/l/%s/top-percent/10", leaderboardID), api.TenantIDHeaderKey, tenantID)
Expect(status).To(Equal(http.StatusOK), body)

var result map[string]interface{}
Expand Down Expand Up @@ -2375,7 +2375,7 @@ var _ = Describe("Leaderboard Handler", func() {
Expect(err).NotTo(HaveOccurred())
}

status, body := Get(app, fmt.Sprintf("/l/%s/top-percent/10", leaderboardID), "tenant-id", tenantID)
status, body := Get(app, fmt.Sprintf("/l/%s/top-percent/10", leaderboardID), api.TenantIDHeaderKey, tenantID)

Expect(status).To(Equal(http.StatusInternalServerError), body)
})
Expand Down Expand Up @@ -2746,7 +2746,7 @@ var _ = Describe("Leaderboard Handler", func() {
status, body := Get(
app,
fmt.Sprintf("/l/%s/members?ids=member_10,member_20,member_30", leaderboardID),
"tenant-id", tenantID,
api.TenantIDHeaderKey, tenantID,
)
Expect(status).To(Equal(http.StatusOK), body)

Expand Down Expand Up @@ -2830,7 +2830,7 @@ var _ = Describe("Leaderboard Handler", func() {
status, body := Get(
app,
fmt.Sprintf("/l/%s/members?ids=member_10,member_20,member_30", leaderboardID),
"tenant-id", tenantID,
api.TenantIDHeaderKey, tenantID,
)
Expect(status).To(Equal(http.StatusInternalServerError), body)
})
Expand Down
2 changes: 1 addition & 1 deletion docs/leaderboard-enrichment.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ The webhook endpoint is expected to return a `JSON` response with metadata for t
Once the webhook endpoint is set up, you will need to add the information to your header when making read requests to the Podium API:

```json
"tenant-id": "tenant-id",
"Wildlife-Platform-Tenant-Id": "my-tenant-id",
```

Podium will automatically call the endpoint for each read operation that retrieves information about leaderboard members. The enriched metadata will be included in the response, enhancing the details available for each member. If the corresponding configuration for the tenant-id sent is not found, of if none is specified, Podium will return the response without any metadata.

0 comments on commit cda5bf0

Please sign in to comment.