From d46ca8f69b5b43bf0f359043392185a70af77c1a Mon Sep 17 00:00:00 2001 From: Mateusz Walesiak Date: Wed, 3 Apr 2024 17:19:07 +0200 Subject: [PATCH] feat: Add create/update card request fields; SFTPSettings (#17) Co-authored-by: ProcessOut Fountain --- card_create_request.go | 36 +++++++- card_update_request.go | 8 +- processout.go | 17 +++- project_sftp_settings.go | 2 +- project_sftp_settings_public.go | 147 ++++++++++++++++++++++++++++++++ 5 files changed, 206 insertions(+), 4 deletions(-) create mode 100755 project_sftp_settings_public.go diff --git a/card_create_request.go b/card_create_request.go index e75a0cc..70b5f27 100755 --- a/card_create_request.go +++ b/card_create_request.go @@ -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) diff --git a/card_update_request.go b/card_update_request.go index 4b5dae1..8e692ba 100755 --- a/card_update_request.go +++ b/card_update_request.go @@ -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) diff --git a/processout.go b/processout.go index ef4b500..6f443b3 100644 --- a/processout.go +++ b/processout.go @@ -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) @@ -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 { diff --git a/project_sftp_settings.go b/project_sftp_settings.go index 0b71d52..bc8dcb2 100755 --- a/project_sftp_settings.go +++ b/project_sftp_settings.go @@ -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"` diff --git a/project_sftp_settings_public.go b/project_sftp_settings_public.go new file mode 100755 index 0000000..2120acd --- /dev/null +++ b/project_sftp_settings_public.go @@ -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, "", "") +}