Skip to content

Commit

Permalink
Remove kamereonAccessToken (#203)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig committed Jul 3, 2020
1 parent 6cbb457 commit 24adf76
Showing 1 changed file with 17 additions and 84 deletions.
101 changes: 17 additions & 84 deletions vehicle/renault.go
Expand Up @@ -86,11 +86,11 @@ type batteryAttributes struct {
type Renault struct {
*embed
*util.HTTPHelper
user, password, vin string
gigya, kamereon configServer
gigyaJwtToken, kamereonAccessToken string
accountID string
chargeStateG provider.FloatGetter
user, password, vin string
gigya, kamereon configServer
gigyaJwtToken string
accountID string
chargeStateG provider.FloatGetter
}

// NewRenaultFromConfig creates a new vehicle
Expand Down Expand Up @@ -168,12 +168,6 @@ func (v *Renault) authFlow() error {
return errors.New("missing vin")
}
}

token, err := v.kamereonToken(v.accountID)
if err != nil || token == "" {
return fmt.Errorf("refreshing kamereon access token failed: %v", err)
}
v.kamereonAccessToken = token
}
}
}
Expand Down Expand Up @@ -252,51 +246,38 @@ func (v *Renault) jwtToken(sessionCookie string) (string, error) {
return gr.IDToken, err
}

func (v *Renault) kamereonHeaders(additional ...map[string]string) map[string]string {
func (v *Renault) kamereonRequest(uri string) (kamereonResponse, error) {
data := url.Values{"country": []string{"DE"}}
headers := map[string]string{
"x-gigya-id_token": v.gigyaJwtToken,
"apikey": v.kamereon.APIKey,
}

for _, h := range additional {
for k, v := range h {
headers[k] = v
}
var kr kamereonResponse
req, err := v.request(uri, data, headers)
if err == nil {
_, err = v.RequestJSON(req, &kr)
}

return headers
return kr, err
}

func (v *Renault) kamereonPerson(personID string) (string, error) {
var kr kamereonResponse
uri := fmt.Sprintf("%s/commerce/v1/persons/%s", v.kamereon.Target, personID)
kr, err := v.kamereonRequest(uri)

data := url.Values{"country": []string{"DE"}}
headers := v.kamereonHeaders()

req, err := v.request(uri, data, headers)
if err == nil {
_, err = v.RequestJSON(req, &kr)

if len(kr.Accounts) == 0 {
return "", nil
}
if len(kr.Accounts) == 0 {
return "", err
}

return kr.Accounts[0].AccountID, err
}

func (v *Renault) kamereonVehicles(accountID string) (string, error) {
var kr kamereonResponse
uri := fmt.Sprintf("%s/commerce/v1/accounts/%s/vehicles", v.kamereon.Target, accountID)
kr, err := v.kamereonRequest(uri)

data := url.Values{"country": []string{"DE"}}
headers := v.kamereonHeaders()

req, err := v.request(uri, data, headers)
if err == nil {
_, err = v.RequestJSON(req, &kr)

for _, v := range kr.VehicleLinks {
if strings.ToUpper(v.Status) == "ACTIVE" {
return v.VIN, nil
Expand All @@ -307,58 +288,10 @@ func (v *Renault) kamereonVehicles(accountID string) (string, error) {
return "", err
}

func (v *Renault) kamereonToken(accountID string) (string, error) {
var kr kamereonResponse
uri := fmt.Sprintf("%s/commerce/v1/accounts/%s/kamereon/token", v.kamereon.Target, accountID)

data := url.Values{"country": []string{"DE"}}
headers := v.kamereonHeaders()

req, err := v.request(uri, data, headers)
if err == nil {
_, err = v.RequestJSON(req, &kr)
}

return kr.AccessToken, err
}

func (v *Renault) kamereonRequest(uri string) (*http.Request, error) {
if v.kamereonAccessToken == "" {
if err := v.authFlow(); err != nil {
return nil, err
}
}

data := url.Values{"country": []string{"DE"}}
headers := v.kamereonHeaders(map[string]string{"x-kamereon-authorization": "Bearer " + v.kamereonAccessToken})

return v.request(uri, data, headers)
}

// doJSONRequest executes request and handles token expiry
func (v *Renault) doKamereonRequest(uri string, kr interface{}) error {
req, err := v.kamereonRequest(uri)
if err == nil {
_, err = v.RequestJSON(req, &kr)
if err != nil {
if resp := v.LastResponse(); resp != nil && resp.StatusCode == http.StatusUnauthorized {
v.kamereonAccessToken = ""
}
}
}
return err
}

// chargeState implements the Vehicle.ChargeState interface
func (v *Renault) chargeState() (float64, error) {
var kr kamereonResponse
uri := fmt.Sprintf("%s/commerce/v1/accounts/%s/kamereon/kca/car-adapter/v1/cars/%s/battery-status", v.kamereon.Target, v.accountID, v.vin)

// do request with retry
err := v.doKamereonRequest(uri, &kr)
if err != nil && v.kamereonAccessToken == "" {
err = v.doKamereonRequest(uri, &kr)
}
kr, err := v.kamereonRequest(uri)

return float64(kr.Data.Attributes.BatteryLevel), err
}
Expand Down

0 comments on commit 24adf76

Please sign in to comment.