Skip to content

Commit

Permalink
Merge pull request #79 from jancajthaml-openbank/feature/better-impor…
Browse files Browse the repository at this point in the history
…t-workflow

better import workflow
  • Loading branch information
jancajthaml authored Apr 30, 2019
2 parents 77fe1a2 + 55552c9 commit 04235a4
Show file tree
Hide file tree
Showing 7 changed files with 208 additions and 233 deletions.
9 changes: 9 additions & 0 deletions packaging/debian_amd64/DEBIAN/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
bondster-bco (1.2.5) unstable; urgency=low

* Iban calculator bugfix
* Bugfix serialize token with createdAt
* Added createdAt to token listing
* Add _TYPE_ and _ORIGINATOR_ in meta data accounts

-- Jan Cajthaml <jan.cajthaml@gmail.com> Tue, 30 Apr 2019 07:44:27 +0200

bondster-bco (1.2.4) unstable; urgency=low

* Better logging
Expand Down
2 changes: 1 addition & 1 deletion packaging/debian_amd64/DEBIAN/control
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Package: bondster-bco
Version: 1.2.4+token-created-at
Version: 1.2.5+better-import-workflow
Architecture: amd64
Maintainer: Jan Cajthaml <jan.cajthaml@gmail.com>
Depends: init-system-helpers (>= 1.18~), libzmq5 (>= 4.2.1~), openssl (>= 1.1~)
Expand Down
215 changes: 26 additions & 189 deletions services/bondster-bco-import/actor/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"time"

"github.com/jancajthaml-openbank/bondster-bco-import/daemon"
"github.com/jancajthaml-openbank/bondster-bco-import/integration"
"github.com/jancajthaml-openbank/bondster-bco-import/model"
"github.com/jancajthaml-openbank/bondster-bco-import/persistence"
"github.com/jancajthaml-openbank/bondster-bco-import/utils"
Expand Down Expand Up @@ -124,102 +125,6 @@ func ExistToken(s *daemon.ActorSystem) func(interface{}, system.Context) {
}
}

func getLoginScenario(s *daemon.ActorSystem, device string, channel string) error {
var (
err error
response []byte
code int
uri string
)

uri = s.BondsterGateway + "/router/api/public/authentication/getLoginScenario"

headers := map[string]string{
"device": device,
"channeluuid": channel,
"x-active-language": "cs",
"host": "bondster.com",
"origin": "https://bondster.com",
"referer": "https://bondster.com/ib/cs",
"accept": "application/json",
}

response, code, err = s.HttpClient.Post(uri, nil, headers)
if err != nil {
return fmt.Errorf("bondster get login scenario Error %+v", err)
return err
} else if code != 200 {
return fmt.Errorf("bondster get login scenario error %d %+v", code, string(response))
}

var scenario = new(model.LoginScenario)
err = utils.JSON.Unmarshal(response, scenario)
if err != nil {
return err
}

if scenario.Value != "USR_PWD" {
return fmt.Errorf("bondster unsupported login scenario %s", string(response))
}

return nil
}

func validateLoginStep(s *daemon.ActorSystem, device string, channel string, token model.Token) (*model.JWT, error) {
var (
err error
response []byte
request []byte
code int
uri string
)

step := model.LoginStep{
Code: "USR_PWD",
Values: []model.LoginStepValue{
{
Type: "USERNAME",
Value: token.Username,
},
{
Type: "PWD",
Value: token.Password,
},
},
}

request, err = utils.JSON.Marshal(step)
if err != nil {
return nil, err
}

uri = s.BondsterGateway + "/router/api/public/authentication/validateLoginStep"

headers := map[string]string{
"device": device,
"channeluuid": channel,
"x-active-language": "cs",
"host": "bondster.com",
"origin": "https://bondster.com",
"referer": "https://bondster.com/ib/cs",
"accept": "application/json",
}

response, code, err = s.HttpClient.Post(uri, request, headers)
if err != nil {
return nil, err
} else if code != 200 {
return nil, fmt.Errorf("bondster validate login step error %d %+v", code, string(response))
}

var session = new(model.JWT)
err = utils.JSON.Unmarshal(response, session)
if err != nil {
return nil, err
}
return session, nil
}

func importNewTransactions(s *daemon.ActorSystem, token *model.Token, currency string, session *model.Session) error {
var (
err error
Expand Down Expand Up @@ -259,7 +164,8 @@ func importNewTransactions(s *daemon.ActorSystem, token *model.Token, currency s

if err != nil {
return fmt.Errorf("bondster transaction search error %+v, request: %+v", err, string(request))
} else if code != 200 {
}
if code != 200 {
return fmt.Errorf("bondster transaction search error %d %+v, request: %+v", code, string(response), string(request))
}

Expand Down Expand Up @@ -299,23 +205,17 @@ func importNewTransactions(s *daemon.ActorSystem, token *model.Token, currency s
if err != nil {
return err
}
uri := s.VaultGateway + "/account/" + s.Tenant
err = utils.Retry(3, time.Second, func() (err error) {
response, code, err = s.HttpClient.Post(uri, request, nil)
if code == 200 || code == 409 || code == 400 {
return
} else if code >= 500 && err == nil {
err = fmt.Errorf("vault POST %s error %d %+v", uri, code, string(response))
}
return
})

uri := s.VaultGateway + "/account/" + s.Tenant
response, code, err = s.HttpClient.Post(uri, request, nil)
if err != nil {
return fmt.Errorf("vault POST %s error %+v", uri, err)
} else if code == 400 {
return fmt.Errorf("vault account malformed request %+v", string(request))
} else if code != 200 && code != 409 {
return fmt.Errorf("vault POST %s error %d %+v", uri, code, string(response))
return fmt.Errorf("vault-rest create account %s error %+v", uri, err)
}
if code == 400 {
return fmt.Errorf("vault-rest account malformed request %+v", string(request))
}
if code != 200 && code != 409 {
return fmt.Errorf("vault-rest create account %s error %d %+v", uri, code, string(response))
}
}

Expand All @@ -335,24 +235,18 @@ func importNewTransactions(s *daemon.ActorSystem, token *model.Token, currency s
}

uri := s.LedgerGateway + "/transaction/" + s.Tenant
err = utils.Retry(3, time.Second, func() (err error) {
response, code, err = s.HttpClient.Post(uri, request, nil)
if code == 200 || code == 201 || code == 400 {
return
} else if code >= 500 && err == nil {
err = fmt.Errorf("ledger-rest POST %s error %d %+v", uri, code, string(response))
}
return
})

response, code, err = s.HttpClient.Post(uri, request, nil)
if err != nil {
return fmt.Errorf("ledger-rest POST %s error %+v", uri, err)
} else if code == 409 {
return fmt.Errorf("ledger-rest create transaction %s error %+v", uri, err)
}
if code == 409 {
return fmt.Errorf("ledger-rest transaction duplicate %+v", string(request))
} else if code == 400 {
}
if code == 400 {
return fmt.Errorf("ledger-rest transaction malformed request %+v", string(request))
} else if code != 200 && code != 201 {
return fmt.Errorf("ledger-rest POST %s error %d %+v", uri, code, string(response))
}
if code != 200 && code != 201 {
return fmt.Errorf("ledger-rest create transaction %s error %d %+v", uri, code, string(response))
}

s.Metrics.TransactionImported()
Expand All @@ -370,75 +264,18 @@ func importNewTransactions(s *daemon.ActorSystem, token *model.Token, currency s
return nil
}

func login(s *daemon.ActorSystem, token model.Token) (session *model.Session, err error) {
var jwt *model.JWT

device := utils.RandDevice()
channel := utils.UUID()

if err = getLoginScenario(s, device, channel); err != nil {
log.Warnf("Unable to get login scenario for token %+v", token.ID)
return
}

if jwt, err = validateLoginStep(s, device, channel, token); err != nil {
log.Warnf("Unable to validate login step for token %+v", token.ID)
return
}
log.Debugf("Logged in with token %s", token.ID)

session = &model.Session{
JWT: jwt.Value,
Device: device,
Channel: channel,
}
return
}

func getCurrencies(s *daemon.ActorSystem, session *model.Session) ([]string, error) {
var (
err error
response []byte
code int
uri string
)

uri = s.BondsterGateway + "/clientusersetting/api/private/market/getContactInformation"

headers := map[string]string{
"device": session.Device,
"channeluuid": session.Channel,
"authorization": "Bearer " + session.JWT,
}

response, code, err = s.HttpClient.Post(uri, nil, headers)
if err != nil {
return nil, fmt.Errorf("bondster get contact information error %+v", err)
} else if code != 200 {
return nil, fmt.Errorf("bondster get contact information error %d %+v", code, string(response))
}

var currencies = new(model.PotrfolioCurrencies)
err = utils.JSON.Unmarshal(response, currencies)
if err != nil {
return nil, err
}

return currencies.Value, nil
}

func importStatements(s *daemon.ActorSystem, token model.Token) {
log.Debugf("Importing statements for %+v", token.ID)
log.Debugf("Importing statements for %s", token.ID)

session, err := login(s, token)
session, err := integration.GetSession(s.HttpClient, s.BondsterGateway, token)
if err != nil {
log.Warnf("Unable to login because %+v", err)
log.Warnf("Unable to get session for %s because %+v", token.ID, err)
return
}

currencies, err := getCurrencies(s, session)
currencies, err := integration.GetCurrencies(s.HttpClient, s.BondsterGateway, session)
if err != nil {
log.Warnf("Unable to get contact information because %+v", err)
log.Warnf("Unable to get currencies for %s because %+v", token.ID, err)
return
}

Expand Down
56 changes: 56 additions & 0 deletions services/bondster-bco-import/integration/info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright (c) 2016-2019, Jan Cajthaml <jan.cajthaml@gmail.com>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package integration

import (
"fmt"

"github.com/jancajthaml-openbank/bondster-bco-import/http"
"github.com/jancajthaml-openbank/bondster-bco-import/model"
"github.com/jancajthaml-openbank/bondster-bco-import/utils"
)

func GetCurrencies(client http.Client, gateway string, session *model.Session) ([]string, error) {
var (
err error
response []byte
code int
uri string
)

uri = gateway + "/clientusersetting/api/private/market/getContactInformation"

headers := map[string]string{
"device": session.Device,
"channeluuid": session.Channel,
"authorization": "Bearer " + session.JWT,
}

response, code, err = client.Post(uri, nil, headers)
if err != nil {
return nil, fmt.Errorf("bondster get contact information error %+v", err)
}
if code != 200 {
return nil, fmt.Errorf("bondster get contact information error %d %+v", code, string(response))
}

var currencies = new(model.PotrfolioCurrencies)
err = utils.JSON.Unmarshal(response, currencies)
if err != nil {
return nil, err
}

return currencies.Value, nil
}
Loading

0 comments on commit 04235a4

Please sign in to comment.