Skip to content

Commit

Permalink
feat: Add create/update card request fields; SFTPSettings (#17)
Browse files Browse the repository at this point in the history
Co-authored-by: ProcessOut Fountain <[email protected]>
  • Loading branch information
1 parent c3396cc commit d46ca8f
Show file tree
Hide file tree
Showing 5 changed files with 206 additions and 4 deletions.
36 changes: 35 additions & 1 deletion card_create_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,42 @@ func (s CardCreateRequest) Create(options ...CardCreateRequestCreateParameters)

data := struct {
*Options
Device interface{} `json:"device"`
Name interface{} `json:"name"`
Number interface{} `json:"number"`
ExpDay interface{} `json:"exp_day"`
ExpMonth interface{} `json:"exp_month"`
ExpYear interface{} `json:"exp_year"`
Cvc2 interface{} `json:"cvc2"`
PreferredScheme interface{} `json:"preferred_scheme"`
Metadata interface{} `json:"metadata"`
TokenType interface{} `json:"token_type"`
Eci interface{} `json:"eci"`
Cryptogram interface{} `json:"cryptogram"`
ApplepayResponse interface{} `json:"applepay_response"`
ApplepayMid interface{} `json:"applepay_mid"`
PaymentToken interface{} `json:"payment_token"`
Contact interface{} `json:"contact"`
Shipping interface{} `json:"shipping"`
}{
Options: opt.Options,
Options: opt.Options,
Device: s.Device,
Name: s.Name,
Number: s.Number,
ExpDay: s.ExpDay,
ExpMonth: s.ExpMonth,
ExpYear: s.ExpYear,
Cvc2: s.Cvc2,
PreferredScheme: s.PreferredScheme,
Metadata: s.Metadata,
TokenType: s.TokenType,
Eci: s.Eci,
Cryptogram: s.Cryptogram,
ApplepayResponse: s.ApplepayResponse,
ApplepayMid: s.ApplepayMid,
PaymentToken: s.PaymentToken,
Contact: s.Contact,
Shipping: s.Shipping,
}

body, err := json.Marshal(data)
Expand Down
8 changes: 7 additions & 1 deletion card_update_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,14 @@ func (s CardUpdateRequest) Update(cardID string, options ...CardUpdateRequestUpd

data := struct {
*Options
UpdateType interface{} `json:"update_type"`
UpdateReason interface{} `json:"update_reason"`
PreferredScheme interface{} `json:"preferred_scheme"`
}{
Options: opt.Options,
Options: opt.Options,
UpdateType: s.UpdateType,
UpdateReason: s.UpdateReason,
PreferredScheme: s.PreferredScheme,
}

body, err := json.Marshal(data)
Expand Down
17 changes: 16 additions & 1 deletion processout.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func New(projectID, projectSecret string) *ProcessOut {
func setupRequest(client *ProcessOut, opt *Options, req *http.Request) {
req.Header.Set("Content-Type", "application/json")
req.Header.Set("API-Version", client.APIVersion)
req.Header.Set("User-Agent", "ProcessOut Go-Bindings/v4.36.0")
req.Header.Set("User-Agent", "ProcessOut Go-Bindings/v4.37.0")
req.Header.Set("Accept", "application/json")
if client.UserAgent != "" {
req.Header.Set("User-Agent", client.UserAgent)
Expand Down Expand Up @@ -672,6 +672,21 @@ func (c *ProcessOut) NewProjectSFTPSettings(prefill ...*ProjectSFTPSettings) *Pr
return prefill[0]
}

// NewProjectSFTPSettingsPublic creates a new ProjectSFTPSettingsPublic object
func (c *ProcessOut) NewProjectSFTPSettingsPublic(prefill ...*ProjectSFTPSettingsPublic) *ProjectSFTPSettingsPublic {
if len(prefill) > 1 {
panic("You may only provide one structure used to prefill the ProjectSFTPSettingsPublic, or none.")
}
if len(prefill) == 0 {
return &ProjectSFTPSettingsPublic{
client: c,
}
}

prefill[0].client = c
return prefill[0]
}

// NewRefund creates a new Refund object
func (c *ProcessOut) NewRefund(prefill ...*Refund) *Refund {
if len(prefill) > 1 {
Expand Down
2 changes: 1 addition & 1 deletion project_sftp_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (

// ProjectSFTPSettings represents the ProjectSFTPSettings API object
type ProjectSFTPSettings struct {
// Endpoint is the sFTP server endpoint, port is required.
// Endpoint is the sFTP server endpoint, port is required
Endpoint *string `json:"endpoint,omitempty"`
// Username is the sFTP server username
Username *string `json:"username,omitempty"`
Expand Down
147 changes: 147 additions & 0 deletions project_sftp_settings_public.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
package processout

import (
"bytes"
"encoding/json"
"io"
"net/http"
"net/url"
"strings"
"time"

"gopkg.in/processout.v4/errors"
)

// ProjectSFTPSettingsPublic represents the ProjectSFTPSettingsPublic API object
type ProjectSFTPSettingsPublic struct {
// Enabled is the whether the SFTP settings are enabled
Enabled *bool `json:"enabled,omitempty"`
// Endpoint is the sFTP server endpoint with port
Endpoint *string `json:"endpoint,omitempty"`
// Username is the sFTP server username
Username *string `json:"username,omitempty"`

client *ProcessOut
}

// SetClient sets the client for the ProjectSFTPSettingsPublic object and its
// children
func (s *ProjectSFTPSettingsPublic) SetClient(c *ProcessOut) *ProjectSFTPSettingsPublic {
if s == nil {
return s
}
s.client = c

return s
}

// Prefil prefills the object with data provided in the parameter
func (s *ProjectSFTPSettingsPublic) Prefill(c *ProjectSFTPSettingsPublic) *ProjectSFTPSettingsPublic {
if c == nil {
return s
}

s.Enabled = c.Enabled
s.Endpoint = c.Endpoint
s.Username = c.Username

return s
}

// ProjectSFTPSettingsPublicFetchSftpSettingsParameters is the structure representing the
// additional parameters used to call ProjectSFTPSettingsPublic.FetchSftpSettings
type ProjectSFTPSettingsPublicFetchSftpSettingsParameters struct {
*Options
*ProjectSFTPSettingsPublic
}

// FetchSftpSettings allows you to fetch the SFTP settings for the project.
func (s ProjectSFTPSettingsPublic) FetchSftpSettings(ID string, options ...ProjectSFTPSettingsPublicFetchSftpSettingsParameters) (*ProjectSFTPSettingsPublic, error) {
if s.client == nil {
panic("Please use the client.NewProjectSFTPSettingsPublic() method to create a new ProjectSFTPSettingsPublic object")
}
if len(options) > 1 {
panic("The options parameter should only be provided once.")
}

opt := ProjectSFTPSettingsPublicFetchSftpSettingsParameters{}
if len(options) == 1 {
opt = options[0]
}
if opt.Options == nil {
opt.Options = &Options{}
}
s.Prefill(opt.ProjectSFTPSettingsPublic)

type Response struct {
ProjectSFTPSettingsPublic *ProjectSFTPSettingsPublic `json:"sftp_settings"`
HasMore bool `json:"has_more"`
Success bool `json:"success"`
Message string `json:"message"`
Code string `json:"error_type"`
}

data := struct {
*Options
}{
Options: opt.Options,
}

body, err := json.Marshal(data)
if err != nil {
return nil, errors.New(err, "", "")
}

path := "/projects/" + url.QueryEscape(ID) + "/sftp-settings"

req, err := http.NewRequest(
"GET",
Host+path,
bytes.NewReader(body),
)
if err != nil {
return nil, errors.NewNetworkError(err)
}
setupRequest(s.client, opt.Options, req)

res, err := s.client.HTTPClient.Do(req)
if err != nil {
return nil, errors.NewNetworkError(err)
}
payload := &Response{}
defer res.Body.Close()
if res.StatusCode >= 500 {
return nil, errors.New(nil, "", "An unexpected error occurred while processing your request.. A lot of sweat is already flowing from our developers head!")
}
err = json.NewDecoder(res.Body).Decode(payload)
if err != nil {
return nil, errors.New(err, "", "")
}

if !payload.Success {
erri := errors.NewFromResponse(res.StatusCode, payload.Code,
payload.Message)

return nil, erri
}

payload.ProjectSFTPSettingsPublic.SetClient(s.client)
return payload.ProjectSFTPSettingsPublic, nil
}

// dummyProjectSFTPSettingsPublic is a dummy function that's only
// here because some files need specific packages and some don't.
// It's easier to include it for every file. In case you couldn't
// tell, everything is generated.
func dummyProjectSFTPSettingsPublic() {
type dummy struct {
a bytes.Buffer
b json.RawMessage
c http.File
d strings.Reader
e time.Time
f url.URL
g io.Reader
}
errors.New(nil, "", "")
}

0 comments on commit d46ca8f

Please sign in to comment.