Skip to content

Commit

Permalink
patch quickstart to use new base_url attr for reader hostname (#665)
Browse files Browse the repository at this point in the history
* patch quickstart to use new base_url attr for reader hostname

* lint
  • Loading branch information
suz-stripe committed May 11, 2021
1 parent 75e8179 commit 37deb29
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 41 deletions.
2 changes: 1 addition & 1 deletion pkg/terminal/p400/rabbit_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func CallRabbitService(tsCtx TerminalSessionContext, method string, methodConten
formattedIP := strings.Join(strings.Split(tsCtx.IPAddress, "."), "-")
t := &Transport{}

rabbitServiceURL := fmt.Sprintf(readerURL, formattedIP)
rabbitServiceURL := fmt.Sprintf(readerURL, formattedIP, tsCtx.BaseURL)
req, err := http.NewRequest("POST", rabbitServiceURL, &payload)

if err != nil {
Expand Down
4 changes: 2 additions & 2 deletions pkg/terminal/p400/reader_constants.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package p400

var (
readerURL = "https://%v.device.stripe-terminal-local-reader.net:4443/protojsonservice/JackRabbitService"
stripeTerminalReadersPath = "/v1/terminal/readers?device_type=verifone_P400"
readerURL = "https://%v.%v:4443/protojsonservice/JackRabbitService"
stripeTerminalReadersPath = "/v1/terminal/readers?device_type=verifone_P400&limit=100&compatible_sdk_type=js&compatible_sdk_version=1.3.2"
rpcSessionPath = "/v1/terminal/connection_tokens/generate_pos_rpc_session"
stripeTerminalConnectionTokensPath = "/v1/terminal/connection_tokens"
stripeTerminalRegisterPath = "/v1/terminal/readers"
Expand Down
1 change: 1 addition & 0 deletions pkg/terminal/p400/reader_methods.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
type TerminalSessionContext struct {
APIKey string
IPAddress string
BaseURL string
LocationID string
PstToken string
SessionToken string
Expand Down
58 changes: 38 additions & 20 deletions pkg/terminal/p400/reader_registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,42 +23,68 @@ const (
// AttemptRegisterReader prompt the user for their p400 registration code, and tries to register the reader via Stripe API
// it tries three times before returning an error
// returns the registered reader's IP address if successful
func AttemptRegisterReader(tsCtx TerminalSessionContext, tries int) (string, error) {
func AttemptRegisterReader(tsCtx TerminalSessionContext, tries int) (Reader, error) {
regcode, err := ReaderRegistrationCodePrompt()
var newReader Reader

if err != nil {
return "", err
return newReader, err
}

spinner := ansi.StartNewSpinner("Registering your reader with Stripe...", os.Stdout)

IPAddress, err := RegisterReader(regcode, tsCtx)

ansi.StopSpinner(spinner, "", os.Stdout)
newReader, err = RegisterReader(regcode, tsCtx)

if err != nil {
tries++
ansi.StopSpinner(spinner, "", os.Stdout)
fmt.Println("Could not register the Reader - please try your code again.")

if tries < 3 {
return AttemptRegisterReader(tsCtx, tries)
}

return "", ErrRegisterReaderFailed
return newReader, ErrRegisterReaderFailed
}

// we need to get the reader list again in order to source the base_url attr which you don't get back after registering it
readerList, err := DiscoverReaders(tsCtx)

if err != nil {
return newReader, err
}

for _, reader := range readerList {
if reader.Label == regcode {
newReader = reader
break
}
}

return IPAddress, nil
ansi.StopSpinner(spinner, "", os.Stdout)

return newReader, nil
}

// RegisterAndActivateReader prompts the user to either add a new reader or choose an existing reader on their account
// it then calls the appropriate method to set them up and activate a reader session for them to take a test payment
// it returns an updated TerminalSessionContext containing the session's connection token and rpc session token
func RegisterAndActivateReader(tsCtx TerminalSessionContext) (TerminalSessionContext, error) {
var (
IPAddress string
reader Reader
activationType string
)

spinner := ansi.StartNewSpinner("Requesting connection token...", os.Stdout)
pstToken, err := GetNewConnectionToken(tsCtx)

if err != nil {
return tsCtx, err
}

tsCtx.PstToken = pstToken
ansi.StopSpinner(spinner, ansi.Faint("Received new connection token"), os.Stdout)

// check if user has a reader already registered that they might want to use
readerList, err := DiscoverReaders(tsCtx)

Expand All @@ -76,13 +102,13 @@ func RegisterAndActivateReader(tsCtx TerminalSessionContext) (TerminalSessionCon
}

if activationType == ActivationTypeLabels[RegisteredReaderChoice] {
IPAddress, err = RegisteredReaderChoicePrompt(readerList, tsCtx)
reader, err = RegisteredReaderChoicePrompt(readerList, tsCtx)

if err != nil {
return tsCtx, err
}
} else {
IPAddress, err = AttemptRegisterReader(tsCtx, 0)
reader, err = AttemptRegisterReader(tsCtx, 0)

if err != nil {
return tsCtx, err
Expand All @@ -91,16 +117,8 @@ func RegisterAndActivateReader(tsCtx TerminalSessionContext) (TerminalSessionCon
fmt.Printf("> %s", ansi.Faint("Finished registering reader\n"))
}

tsCtx.IPAddress = IPAddress

spinner := ansi.StartNewSpinner("Requesting connection token...", os.Stdout)
tsCtx.PstToken, err = GetNewConnectionToken(tsCtx)

if err != nil {
return tsCtx, err
}

ansi.StopSpinner(spinner, ansi.Faint("Received new connection token"), os.Stdout)
tsCtx.IPAddress = reader.IPAddress
tsCtx.BaseURL = reader.BaseURL

spinner = ansi.StartNewSpinner("Connecting to Reader...", os.Stdout)
tsCtx.TransactionContext = SetTransactionContext(tsCtx)
Expand Down
22 changes: 8 additions & 14 deletions pkg/terminal/p400/stripe_requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ type Reader struct {
SerialNumber string `json:"serial_number"`
Status string `json:"status"`
Metadata Metadata `json:"metadata"`
BaseURL string `json:"base_url"`
}

type readersResponse struct {
Expand All @@ -51,10 +52,6 @@ type getConnectionTokenResponse struct {
Secret string `json:"secret"`
}

type registerReaderResponse struct {
IPAddress string `json:"ip_address"`
}

// DiscoverReaders calls the Stripe API to get a list of currently registered P400 readers on the account
// it returns a map of Reader types
func DiscoverReaders(tsCtx TerminalSessionContext) ([]Reader, error) {
Expand All @@ -72,7 +69,7 @@ func DiscoverReaders(tsCtx TerminalSessionContext) ([]Reader, error) {

client := &stripe.Client{
BaseURL: parsedBaseURL,
APIKey: tsCtx.APIKey,
APIKey: tsCtx.PstToken,
Verbose: false,
}

Expand Down Expand Up @@ -292,11 +289,12 @@ func CapturePaymentIntent(tsCtx TerminalSessionContext) error {

// RegisterReader calls the Stripe API to register a new P400 reader to an account
// it returns the IP address of the reader if successful
func RegisterReader(regcode string, tsCtx TerminalSessionContext) (string, error) {
func RegisterReader(regcode string, tsCtx TerminalSessionContext) (Reader, error) {
parsedBaseURL, err := url.Parse(stripe.DefaultAPIBaseURL)
var result Reader

if err != nil {
return "", err
return result, err
}

client := &stripe.Client{
Expand All @@ -311,7 +309,7 @@ func RegisterReader(regcode string, tsCtx TerminalSessionContext) (string, error
res, err := client.PerformRequest(context.TODO(), http.MethodPost, stripeTerminalRegisterPath, data.Encode(), nil)

if err != nil {
return "", err
return result, err
}

if res.StatusCode != http.StatusOK {
Expand All @@ -323,15 +321,11 @@ func RegisterReader(regcode string, tsCtx TerminalSessionContext) (string, error
err = ErrStripeGenericResponse
}

return "", err
return result, err
}

var result registerReaderResponse

defer res.Body.Close()
json.NewDecoder(res.Body).Decode(&result)

IPAddress := result.IPAddress

return IPAddress, nil
return result, nil
}
10 changes: 6 additions & 4 deletions pkg/terminal/p400/user_prompts.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,9 @@ func ReaderNewOrExistingPrompt() (string, error) {

// RegisteredReaderChoicePrompt takes a list of registered p400 readers and prompts the reader to choose one to use
// it returns the IP address of the chosen reader
func RegisteredReaderChoicePrompt(readerList []Reader, tsCtx TerminalSessionContext) (string, error) {
func RegisteredReaderChoicePrompt(readerList []Reader, tsCtx TerminalSessionContext) (Reader, error) {
var reader Reader

templates := &promptui.SelectTemplates{
Label: "{{ .Label }} ({{ .Status }}) ",
Active: "▸ {{ .Label | underline }} ({{ .Status }})",
Expand All @@ -89,12 +91,12 @@ func RegisteredReaderChoicePrompt(readerList []Reader, tsCtx TerminalSessionCont
index, _, err := selectOptions(templates, "Select a reader:", readerList)

if err != nil {
return "", err
return reader, err
}

IPAddress := readerList[index].IPAddress
reader = readerList[index]

return IPAddress, nil
return reader, nil
}

func textPrompt(label string, validator promptui.ValidateFunc) (string, error) {
Expand Down

0 comments on commit 37deb29

Please sign in to comment.