Skip to content

Commit

Permalink
score ttl on lib
Browse files Browse the repository at this point in the history
  • Loading branch information
henrod committed Jul 11, 2018
1 parent 8a53952 commit e385834
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 25 deletions.
12 changes: 6 additions & 6 deletions lib/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import "context"

// PodiumInterface defines the interface to be implemented
type PodiumInterface interface {
GetTop(ctx context.Context, leaderboard string, page int, pageSize int) (*MemberList, error)
GetTop(ctx context.Context, leaderboard string, page, pageSize int) (*MemberList, error)
GetTopPercent(ctx context.Context, leaderboard string, percentage int) (*MemberList, error)
UpdateScore(ctx context.Context, leaderboard string, memberID string, score int) (*MemberList, error)
IncrementScore(ctx context.Context, leaderboard string, memberID string, increment int) (*MemberList, error)
UpdateScores(ctx context.Context, leaderboards []string, memberID string, score int) (*ScoreList, error)
RemoveMemberFromLeaderboard(ctx context.Context, leaderboard string, member string) (*Response, error)
GetMember(ctx context.Context, leaderboard string, memberID string) (*Member, error)
UpdateScore(ctx context.Context, leaderboard, memberID string, score, scoreTTL int) (*MemberList, error)
IncrementScore(ctx context.Context, leaderboard, memberID string, increment, scoreTTL int) (*MemberList, error)
UpdateScores(ctx context.Context, leaderboards []string, memberID string, score, scoreTTL int) (*ScoreList, error)
RemoveMemberFromLeaderboard(ctx context.Context, leaderboard, member string) (*Response, error)
GetMember(ctx context.Context, leaderboard, memberID string) (*Member, error)
GetMembers(ctx context.Context, leaderboard string, memberIDs []string) (*MemberList, error)
Healthcheck(ctx context.Context) (string, error)
DeleteLeaderboard(ctx context.Context, leaderboard string) (*Response, error)
Expand Down
42 changes: 26 additions & 16 deletions lib/lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,32 +160,34 @@ func (p *Podium) buildGetTopPercentURL(leaderboard string, percentage int) strin
return p.buildURL(pathname)
}

func (p *Podium) buildUpdateScoreURL(leaderboard string, memberID string) string {
func (p *Podium) buildUpdateScoreURL(leaderboard, memberID string, scoreTTL int) string {
var pathname = fmt.Sprintf("/l/%s/members/%s/score", leaderboard, memberID)
pathname = p.appendScoreTTL(pathname, scoreTTL)
return p.buildURL(pathname)
}

func (p *Podium) buildIncrementScoreURL(leaderboard string, memberID string) string {
return p.buildUpdateScoreURL(leaderboard, memberID)
func (p *Podium) buildIncrementScoreURL(leaderboard, memberID string, scoreTTL int) string {
return p.buildUpdateScoreURL(leaderboard, memberID, scoreTTL)
}

func (p *Podium) buildUpdateScoresURL(memberID string) string {
func (p *Podium) buildUpdateScoresURL(memberID string, scoreTTL int) string {
var pathname = fmt.Sprintf("/m/%s/scores", memberID)
pathname = p.appendScoreTTL(pathname, scoreTTL)
return p.buildURL(pathname)
}

func (p *Podium) buildRemoveMemberFromLeaderboardURL(leaderboard string, member string) string {
func (p *Podium) buildRemoveMemberFromLeaderboardURL(leaderboard, member string) string {
var pathname = fmt.Sprintf("/l/%s/members/%s", leaderboard, member)
return p.buildURL(pathname)
}

// page is 1-based
func (p *Podium) buildGetTopURL(leaderboard string, page int, pageSize int) string {
func (p *Podium) buildGetTopURL(leaderboard string, page, pageSize int) string {
var pathname = fmt.Sprintf("/l/%s/top/%d?pageSize=%d", leaderboard, page, pageSize)
return p.buildURL(pathname)
}

func (p *Podium) buildGetMemberURL(leaderboard string, memberID string) string {
func (p *Podium) buildGetMemberURL(leaderboard, memberID string) string {
pathname := fmt.Sprintf("/l/%s/members/%s", leaderboard, memberID)
return p.buildURL(pathname)
}
Expand All @@ -201,8 +203,16 @@ func (p *Podium) buildHealthcheckURL() string {
return p.buildURL(pathname)
}

func (p *Podium) appendScoreTTL(pathname string, scoreTTL int) string {
if scoreTTL <= 0 {
return pathname
}

return fmt.Sprintf("%s?scoreTTL=%d", pathname, scoreTTL)
}

// GetTop returns the top members for this leaderboard. Page is 1-index
func (p *Podium) GetTop(ctx context.Context, leaderboard string, page int, pageSize int) (*MemberList, error) {
func (p *Podium) GetTop(ctx context.Context, leaderboard string, page, pageSize int) (*MemberList, error) {
route := p.buildGetTopURL(leaderboard, page, pageSize)
body, err := p.sendTo(ctx, "GET", route, nil)
if err != nil {
Expand Down Expand Up @@ -231,8 +241,8 @@ func (p *Podium) GetTopPercent(ctx context.Context, leaderboard string, percenta
}

// UpdateScore updates the score of a particular member in a leaderboard
func (p *Podium) UpdateScore(ctx context.Context, leaderboard string, memberID string, score int) (*MemberList, error) {
route := p.buildUpdateScoreURL(leaderboard, memberID)
func (p *Podium) UpdateScore(ctx context.Context, leaderboard, memberID string, score, scoreTTL int) (*MemberList, error) {
route := p.buildUpdateScoreURL(leaderboard, memberID, scoreTTL)
payload := map[string]interface{}{
"score": score,
}
Expand All @@ -249,8 +259,8 @@ func (p *Podium) UpdateScore(ctx context.Context, leaderboard string, memberID s
}

// IncrementScore increments the score of a particular member in a leaderboard
func (p *Podium) IncrementScore(ctx context.Context, leaderboard string, memberID string, increment int) (*MemberList, error) {
route := p.buildIncrementScoreURL(leaderboard, memberID)
func (p *Podium) IncrementScore(ctx context.Context, leaderboard, memberID string, increment, scoreTTL int) (*MemberList, error) {
route := p.buildIncrementScoreURL(leaderboard, memberID, scoreTTL)
payload := map[string]interface{}{
"increment": increment,
}
Expand All @@ -267,8 +277,8 @@ func (p *Podium) IncrementScore(ctx context.Context, leaderboard string, memberI
}

// UpdateScores updates the score of a member in more than one leaderboard
func (p *Podium) UpdateScores(ctx context.Context, leaderboards []string, memberID string, score int) (*ScoreList, error) {
route := p.buildUpdateScoresURL(memberID)
func (p *Podium) UpdateScores(ctx context.Context, leaderboards []string, memberID string, score, scoreTTL int) (*ScoreList, error) {
route := p.buildUpdateScoresURL(memberID, scoreTTL)
payload := map[string]interface{}{
"score": score,
"leaderboards": leaderboards,
Expand All @@ -286,7 +296,7 @@ func (p *Podium) UpdateScores(ctx context.Context, leaderboards []string, member
}

// RemoveMemberFromLeaderboard removes a member from a leaderboard
func (p *Podium) RemoveMemberFromLeaderboard(ctx context.Context, leaderboard string, member string) (*Response, error) {
func (p *Podium) RemoveMemberFromLeaderboard(ctx context.Context, leaderboard, member string) (*Response, error) {
route := p.buildRemoveMemberFromLeaderboardURL(leaderboard, member)
body, err := p.sendTo(ctx, "DELETE", route, nil)

Expand All @@ -301,7 +311,7 @@ func (p *Podium) RemoveMemberFromLeaderboard(ctx context.Context, leaderboard st
}

// GetMember shows score and rank of a particular member in a leaderboard
func (p *Podium) GetMember(ctx context.Context, leaderboard string, memberID string) (*Member, error) {
func (p *Podium) GetMember(ctx context.Context, leaderboard, memberID string) (*Member, error) {
route := p.buildGetMemberURL(leaderboard, memberID)
body, err := p.sendTo(ctx, "GET", route, nil)

Expand Down
56 changes: 53 additions & 3 deletions lib/lib_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,23 @@ var _ = Describe("Lib", func() {
httpmock.RegisterResponder("PUT", url,
httpmock.NewStringResponder(200, `{ "success": true, "member": { "publicID": "1", "score": 2, "rank": 1 } }`))

members, err := p.UpdateScore(nil, leaderboard, "1", 10)
members, err := p.UpdateScore(nil, leaderboard, "1", 10, 0)

Expect(members).NotTo(BeNil())
Expect(members.Member.PublicID).To(Equal("1"))
Expect(members.Member.Score).To(Equal(2))
Expect(err).NotTo(HaveOccurred())
})

It("Should call API to update score of a member with TTL", func() {
leaderboard := globalLeaderboard

//mock url that should be called
url := "http://podium/l/" + leaderboard + "/members/1/score?scoreTTL=10"
httpmock.RegisterResponder("PUT", url,
httpmock.NewStringResponder(200, `{ "success": true, "member": { "publicID": "1", "score": 2, "rank": 1 } }`))

members, err := p.UpdateScore(nil, leaderboard, "1", 10, 10)

Expect(members).NotTo(BeNil())
Expect(members.Member.PublicID).To(Equal("1"))
Expand All @@ -104,7 +120,23 @@ var _ = Describe("Lib", func() {
httpmock.RegisterResponder("PATCH", url,
httpmock.NewStringResponder(200, `{ "success": true, "member": { "publicID": "123", "score": 12, "rank": 1 } }`))

members, err := p.IncrementScore(nil, leaderboard, "1", 10)
members, err := p.IncrementScore(nil, leaderboard, "1", 10, 0)

Expect(members).NotTo(BeNil())
Expect(members.Member.PublicID).To(Equal("123"))
Expect(members.Member.Score).To(Equal(12))
Expect(err).NotTo(HaveOccurred())
})

It("Should call API to increment score of a member with TTL", func() {
leaderboard := globalLeaderboard

//mock url that should be called
url := "http://podium/l/" + leaderboard + "/members/1/score?scoreTTL=10"
httpmock.RegisterResponder("PATCH", url,
httpmock.NewStringResponder(200, `{ "success": true, "member": { "publicID": "123", "score": 12, "rank": 1 } }`))

members, err := p.IncrementScore(nil, leaderboard, "1", 10, 10)

Expect(members).NotTo(BeNil())
Expect(members.Member.PublicID).To(Equal("123"))
Expand All @@ -123,7 +155,25 @@ var _ = Describe("Lib", func() {
httpmock.RegisterResponder("PUT", url,
httpmock.NewStringResponder(200, `{ "success": true, "scores": [ { "leaderboardID": "brazil", "publicID": "1", "score": 1, "rank": 3, "previousRank": 1 } ] }`))

scores, err := p.UpdateScores(nil, []string{leaderboard1, leaderboard2}, "1", 10)
scores, err := p.UpdateScores(nil, []string{leaderboard1, leaderboard2}, "1", 10, 0)

Expect(scores).NotTo(BeNil())
Expect(scores.Scores[0]).NotTo(BeNil())
Expect(scores.Scores[0].LeaderboardID).To(Equal("brazil"))
Expect(scores.Scores[0].PublicID).To(Equal("1"))
Expect(err).NotTo(HaveOccurred())
})

It("Should call API to update scores of a member in different leaderboards with TTL", func() {
leaderboard1 := globalLeaderboard
leaderboard2 := localeLeaderboard

//mock url that should be called
url := "http://podium/m/1/scores?scoreTTL=10"
httpmock.RegisterResponder("PUT", url,
httpmock.NewStringResponder(200, `{ "success": true, "scores": [ { "leaderboardID": "brazil", "publicID": "1", "score": 1, "rank": 3, "previousRank": 1 } ] }`))

scores, err := p.UpdateScores(nil, []string{leaderboard1, leaderboard2}, "1", 10, 10)

Expect(scores).NotTo(BeNil())
Expect(scores.Scores[0]).NotTo(BeNil())
Expand Down

0 comments on commit e385834

Please sign in to comment.