Skip to content

Commit

Permalink
Feature/new lib routes (#25)
Browse files Browse the repository at this point in the history
* add remaining khan routes on lib

* default timeout to 500ms

* return response on remaining methods
  • Loading branch information
henrod authored and cscatolini committed Oct 16, 2018
1 parent bb29930 commit a1ff1a1
Show file tree
Hide file tree
Showing 4 changed files with 272 additions and 20 deletions.
18 changes: 13 additions & 5 deletions lib/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,20 @@ import "context"

// KhanInterface defines the interface for the khan client
type KhanInterface interface {
CreatePlayer(context.Context, string, string, interface{}) (string, error)
UpdatePlayer(context.Context, string, string, interface{}) error
RetrievePlayer(context.Context, string) (*Player, error)
ApplyForMembership(context.Context, *ApplicationPayload) (*ClanApplyResult, error)
ApproveDenyMembershipApplication(context.Context, *ApplicationApprovalPayload) (*Result, error)
ApproveDenyMembershipInvitation(context.Context, *InvitationApprovalPayload) (*Result, error)
CreateClan(context.Context, *ClanPayload) (string, error)
UpdateClan(context.Context, *ClanPayload) error
CreatePlayer(context.Context, string, string, interface{}) (string, error)
DeleteMembership(context.Context, *DeleteMembershipPayload) (*Result, error)
InviteForMembership(context.Context, *InvitationPayload) (*Result, error)
LeaveClan(context.Context, string) (*LeaveClanResult, error)
PromoteDemote(context.Context, *PromoteDemotePayload) (*Result, error)
RetrieveClan(context.Context, string) (*Clan, error)
RetrieveClanSummary(context.Context, string) (*ClanSummary, error)
RetrieveClansSummary(context.Context, []string) ([]*ClanSummary, error)
RetrieveClanSummary(context.Context, string) (*ClanSummary, error)
RetrievePlayer(context.Context, string) (*Player, error)
TransferOwnership(context.Context, string, string) (*TransferOwnershipResult, error)
UpdateClan(context.Context, *ClanPayload) (*Result, error)
UpdatePlayer(context.Context, string, string, interface{}) (*Result, error)
}
194 changes: 181 additions & 13 deletions lib/lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ var (
once sync.Once
)

func getHTTPClient(timeoutMs int) *http.Client {
func getHTTPClient(timeout time.Duration) *http.Client {
once.Do(func() {
client = &http.Client{
Timeout: time.Duration(timeoutMs) * time.Millisecond,
Timeout: timeout,
}
ehttp.Instrument(client)
})
Expand All @@ -42,9 +42,9 @@ func getHTTPClient(timeoutMs int) *http.Client {

// NewKhan returns a new khan API application
func NewKhan(config *viper.Viper) KhanInterface {
config.SetDefault("khan.timeout", 1000)
config.SetDefault("khan.timeout", 500*time.Millisecond)
k := &Khan{
httpClient: getHTTPClient(config.GetInt("khan.timeout")),
httpClient: getHTTPClient(config.GetDuration("khan.timeout")),
Config: config,
url: config.GetString("khan.url"),
user: config.GetString("khan.user"),
Expand Down Expand Up @@ -142,6 +142,46 @@ func (k *Khan) buildRetrieveClansSummaryURL(clanIDs []string) string {
return k.buildURL(pathname)
}

func (k *Khan) buildApplyForMembershipURL(clanID string) string {
pathname := fmt.Sprintf("clans/%s/memberships/application", clanID)
return k.buildURL(pathname)
}

func (k *Khan) buildInviteForMembershipURL(clanID string) string {
pathname := fmt.Sprintf("clans/%s/memberships/invitation", clanID)
return k.buildURL(pathname)
}

func (k *Khan) buildApproveDenyMembershipApplicationURL(clanID, action string) string {
pathname := fmt.Sprintf("clans/%s/memberships/application/%s", clanID, action)
return k.buildURL(pathname)
}

func (k *Khan) buildApproveDenyMembershipInvitationURL(clanID, action string) string {
pathname := fmt.Sprintf("clans/%s/memberships/invitation/%s", clanID, action)
return k.buildURL(pathname)
}

func (k *Khan) buildPromoteDemoteURL(clanID, action string) string {
pathname := fmt.Sprintf("clans/%s/memberships/%s", clanID, action)
return k.buildURL(pathname)
}

func (k *Khan) buildDeleteMembershipURL(clanID string) string {
pathname := fmt.Sprintf("clans/%s/memberships/delete", clanID)
return k.buildURL(pathname)
}

func (k *Khan) buildLeaveClanURL(clanID string) string {
pathname := fmt.Sprintf("clans/%s/leave", clanID)
return k.buildURL(pathname)
}

func (k *Khan) buildTransferOwnershipURL(clanID string) string {
pathname := fmt.Sprintf("clans/%s/transfer-ownership", clanID)
return k.buildURL(pathname)
}

// CreatePlayer calls Khan to create a new player
func (k *Khan) CreatePlayer(ctx context.Context, publicID, name string, metadata interface{}) (string, error) {
route := k.buildCreatePlayerURL()
Expand All @@ -163,14 +203,21 @@ func (k *Khan) CreatePlayer(ctx context.Context, publicID, name string, metadata
}

// UpdatePlayer calls khan to update the player
func (k *Khan) UpdatePlayer(ctx context.Context, publicID, name string, metadata interface{}) error {
func (k *Khan) UpdatePlayer(
ctx context.Context,
publicID, name string,
metadata interface{},
) (*Result, error) {
route := k.buildUpdatePlayerURL(publicID)
playerPayload := &Player{
Name: name,
Metadata: metadata,
playerPayload := &Player{Name: name, Metadata: metadata}
body, err := k.sendTo(ctx, "PUT", route, playerPayload)
if err != nil {
return nil, err
}
_, err := k.sendTo(ctx, "PUT", route, playerPayload)
return err

var result Result
err = json.Unmarshal(body, &result)
return &result, err
}

// RetrievePlayer calls the retrieve player route from khan
Expand Down Expand Up @@ -202,10 +249,16 @@ func (k *Khan) CreateClan(ctx context.Context, clan *ClanPayload) (string, error
}

// UpdateClan calls the update clan route from khan
func (k *Khan) UpdateClan(ctx context.Context, clan *ClanPayload) error {
func (k *Khan) UpdateClan(ctx context.Context, clan *ClanPayload) (*Result, error) {
route := k.buildUpdateClanURL(clan.PublicID)
_, err := k.sendTo(ctx, "PUT", route, clan)
return err
body, err := k.sendTo(ctx, "PUT", route, clan)
if err != nil {
return nil, err
}

var result Result
err = json.Unmarshal(body, &result)
return &result, err
}

// RetrieveClanSummary calls the route to retrieve clan summary from khan
Expand Down Expand Up @@ -252,3 +305,118 @@ func (k *Khan) RetrieveClan(ctx context.Context, clanID string) (*Clan, error) {
err = json.Unmarshal(body, &clan)
return &clan, err
}

// ApplyForMembership calls apply for membership route on khan
func (k *Khan) ApplyForMembership(
ctx context.Context,
payload *ApplicationPayload,
) (*ClanApplyResult, error) {
route := k.buildApplyForMembershipURL(payload.ClanID)
body, err := k.sendTo(ctx, "POST", route, payload)

if err != nil {
return nil, err
}

var application ClanApplyResult
err = json.Unmarshal(body, &application)
return &application, err
}

// InviteForMembership invites a clan member to join clan
func (k *Khan) InviteForMembership(
ctx context.Context,
payload *InvitationPayload,
) (*Result, error) {
route := k.buildInviteForMembershipURL(payload.ClanID)
return k.defaultPostRequest(ctx, route, payload)
}

// ApproveDenyMembershipApplication approves or deny player
// application on clan
func (k *Khan) ApproveDenyMembershipApplication(
ctx context.Context,
payload *ApplicationApprovalPayload,
) (*Result, error) {
route := k.buildApproveDenyMembershipApplicationURL(payload.ClanID, payload.Action)
return k.defaultPostRequest(ctx, route, payload)
}

// ApproveDenyMembershipInvitation approves or deny player
// invitation on clan
func (k *Khan) ApproveDenyMembershipInvitation(
ctx context.Context,
payload *InvitationApprovalPayload,
) (*Result, error) {
route := k.buildApproveDenyMembershipInvitationURL(payload.ClanID, payload.Action)
return k.defaultPostRequest(ctx, route, payload)
}

// PromoteDemote promotes or demotes player on clan
func (k *Khan) PromoteDemote(
ctx context.Context,
payload *PromoteDemotePayload,
) (*Result, error) {
route := k.buildPromoteDemoteURL(payload.ClanID, payload.Action)
return k.defaultPostRequest(ctx, route, payload)
}

// DeleteMembership deletes membership on clan
func (k *Khan) DeleteMembership(
ctx context.Context,
payload *DeleteMembershipPayload,
) (*Result, error) {
route := k.buildDeleteMembershipURL(payload.ClanID)
return k.defaultPostRequest(ctx, route, payload)
}

// LeaveClan allows member to leave clan
func (k *Khan) LeaveClan(
ctx context.Context,
clanID string,
) (*LeaveClanResult, error) {
route := k.buildLeaveClanURL(clanID)
body, err := k.sendTo(ctx, "POST", route, nil)

if err != nil {
return nil, err
}

var result LeaveClanResult
err = json.Unmarshal(body, &result)
return &result, err
}

// TransferOwnership transfers clan ownership to another member
func (k *Khan) TransferOwnership(
ctx context.Context,
playerPublicID, clanID string,
) (*TransferOwnershipResult, error) {
route := k.buildTransferOwnershipURL(clanID)
body, err := k.sendTo(ctx, "POST", route, map[string]interface{}{
"playerPublicID": playerPublicID,
})

if err != nil {
return nil, err
}

var result TransferOwnershipResult
err = json.Unmarshal(body, &result)
return &result, err
}

func (k *Khan) defaultPostRequest(
ctx context.Context,
route string,
payload interface{},
) (*Result, error) {
body, err := k.sendTo(ctx, "POST", route, payload)
if err != nil {
return nil, err
}

var result Result
err = json.Unmarshal(body, &result)
return &result, err
}
6 changes: 4 additions & 2 deletions lib/lib_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,10 @@ var _ = Describe("Lib", func() {
httpmock.RegisterResponder("PUT", url,
httpmock.NewStringResponder(200, `{ "success": true, "publicID": "testid" }`))

err := k.UpdatePlayer(nil, publicID, "testname", nil)
result, err := k.UpdatePlayer(nil, publicID, "testname", nil)

Expect(err).To(BeNil())
Expect(result).To(Equal(&lib.Result{Success: true}))
})
})

Expand Down Expand Up @@ -164,9 +165,10 @@ var _ = Describe("Lib", func() {
AllowApplication: false,
AutoJoin: false,
}
err := k.UpdateClan(nil, clanPayload)
result, err := k.UpdateClan(nil, clanPayload)

Expect(err).To(BeNil())
Expect(result).To(Equal(&lib.Result{Success: true}))
})
})

Expand Down
74 changes: 74 additions & 0 deletions lib/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,77 @@ type Clan struct {
Roster []*ClanMembership `json:"roster"`
Memberships *ClanMemberships `json:"memberships"`
}

// ApplicationPayload is the argument on apply for membership
type ApplicationPayload struct {
ClanID string `json:"-"`
Message string `json:"message"`
Level string `json:"level"`
PlayerPublicID string `json:"playerPublicID"`
}

// ClanApplyResult is the result on apply for membership
type ClanApplyResult struct {
Success bool
Approved bool
}

// InvitationPayload is the argument on invite for membership
type InvitationPayload struct {
ClanID string `json:"-"`
Level string `json:"level"`
PlayerPublicID string `json:"playerPublicID"`
RequestorPublicID string `json:"requestorPublicID"`
}

// ApplicationApprovalPayload is the argument on approve or
// deny membership application
type ApplicationApprovalPayload struct {
ClanID string `json:"-"`
Action string `json:"-"`
PlayerPublicID string `json:"playerPublicID"`
RequestorPublicID string `json:"requestorPublicID"`
}

// InvitationApprovalPayload is the argument on approve or
// deny membership invitation
type InvitationApprovalPayload struct {
ClanID string `json:"-"`
Action string `json:"-"`
PlayerPublicID string `json:"playerPublicID"`
}

// PromoteDemotePayload is the argument on promote or demote method
type PromoteDemotePayload struct {
ClanID string `json:"-"`
Action string `json:"-"`
PlayerPublicID string `json:"playerPublicID"`
RequestorPublicID string `json:"requestorPublicID"`
}

// DeleteMembershipPayload is the argument on delete membership method
type DeleteMembershipPayload struct {
ClanID string `json:"-"`
PlayerPublicID string `json:"playerPublicID"`
RequestorPublicID string `json:"requestorPublicID"`
}

// LeaveClanResult is the result of leave clan method
type LeaveClanResult struct {
Success bool
IsDeleted bool
PreviousOwner *ClanPlayerInfo
NewOwner *ClanPlayerInfo
}

// TransferOwnershipResult is the result of transfer ownership method
type TransferOwnershipResult struct {
Success bool
PreviousOwner *ClanPlayerInfo
NewOwner *ClanPlayerInfo
}

// Result is the default result
type Result struct {
Success bool
}

0 comments on commit a1ff1a1

Please sign in to comment.