github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libkb/invite.go (about)

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package libkb
     5  
     6  import (
     7  	"path"
     8  
     9  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
    10  )
    11  
    12  // InviteArg contains optional invitation arguments.
    13  type InviteArg struct {
    14  	Message    string
    15  	NoteToSelf string
    16  }
    17  
    18  type Invitation struct {
    19  	ID        string
    20  	ShortCode string
    21  	Throttled bool
    22  }
    23  
    24  func (i Invitation) Link() string {
    25  	if i.Throttled {
    26  		return ""
    27  	}
    28  	return path.Join(CanonicalHost, "inv", i.ID[0:10])
    29  }
    30  
    31  func (i InviteArg) ToHTTPArgs() HTTPArgs {
    32  	return HTTPArgs{
    33  		"invitation_message": S{Val: i.Message},
    34  		"note_to_self":       S{Val: i.NoteToSelf},
    35  	}
    36  }
    37  
    38  func SendInvitation(mctx MetaContext, email string, arg InviteArg) (*Invitation, error) {
    39  	hargs := arg.ToHTTPArgs()
    40  	hargs["email"] = S{Val: email}
    41  	return callSendInvitation(mctx, hargs)
    42  }
    43  
    44  func GenerateInvitationCode(mctx MetaContext, arg InviteArg) (*Invitation, error) {
    45  	return callSendInvitation(mctx, arg.ToHTTPArgs())
    46  }
    47  
    48  func GenerateInvitationCodeForAssertion(mctx MetaContext, assertion keybase1.SocialAssertion, arg InviteArg) (*Invitation, error) {
    49  	hargs := arg.ToHTTPArgs()
    50  	hargs["assertion"] = S{Val: assertion.String()}
    51  	return callSendInvitation(mctx, hargs)
    52  }
    53  
    54  func callSendInvitation(mctx MetaContext, params HTTPArgs) (*Invitation, error) {
    55  	arg := APIArg{
    56  		Endpoint:       "send_invitation",
    57  		SessionType:    APISessionTypeREQUIRED,
    58  		Args:           params,
    59  		AppStatusCodes: []int{SCOk, SCThrottleControl},
    60  	}
    61  	res, err := mctx.G().API.Post(mctx, arg)
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  
    66  	var inv Invitation
    67  
    68  	if res.AppStatus.Code == SCThrottleControl {
    69  		mctx.Debug("send_invitation returned SCThrottleControl: user is out of invites")
    70  		inv.Throttled = true
    71  		return &inv, nil
    72  	}
    73  
    74  	inv.ID, err = res.Body.AtKey("invitation_id").GetString()
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  	inv.ShortCode, err = res.Body.AtKey("short_code").GetString()
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  	return &inv, nil
    83  }