-
Notifications
You must be signed in to change notification settings - Fork 6
/
APIWrapper.js
127 lines (113 loc) · 3.23 KB
/
APIWrapper.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const axios = require("axios")
const jwt = require('jsonwebtoken')
const cookie = require('cookie')
const setCookie = require('set-cookie-parser')
const ENDPOINT = "https://www.services.renault-ze.com/api"
function APIWrapper({username, password}) {
this.user = {
username, password
}
this.isLoading = false
this.jwt = null
this.jwtExpiration = null
this.refreshToken = null
this.xsrfToken = null
this.VIN = null
}
APIWrapper.prototype.login = function () {
return new Promise(async (resolve, reject) => {
try {
const { username, password } = this.user
const res = await axios.post(ENDPOINT + "/user/login", { username, password })
const { token, xsrfToken, user } = res.data
this.jwt = token
this.xsrfToken = xsrfToken
this.VIN = user.vehicle_details.VIN
this.jwtExpiration = parseJWTExpiration(this.jwt)
this.refreshToken = parseRefreshToken(res)
resolve(200)
} catch (e) {
reject(e.response)
}
})
}
APIWrapper.prototype.handleTokenRefresh = function () {
return new Promise(async (resolve, reject) => {
try {
this.isLoading = true
const res = await axios(ENDPOINT + "/user/token/refresh", {
method: 'POST',
headers: {
'X-XSRF-TOKEN': this.xsrfToken,
'Cookie': cookie.serialize('refreshToken', this.refreshToken.value)
}
})
this.jwt = res.data.token
this.jwtExpiration = parseJWTExpiration(this.jwt)
this.refreshToken = parseRefreshToken(res)
this.isLoading = false
resolve(200)
this.log('ZOE Token refreshed')
} catch (e) {
this.isLoading = false
reject(e)
}
})
}
APIWrapper.prototype.getBatteryStatus = function () {
return new Promise(async (resolve, reject) => {
try {
const res = await axios.get(ENDPOINT + `/vehicle/${this.VIN}/battery`, authHeader(this.jwt))
resolve(res.data)
} catch (e) {
reject(e)
}
})
}
APIWrapper.prototype.startCharging = function () {
return new Promise(async (resolve, reject) => {
try {
const res = await axios.post(ENDPOINT + `/vehicle/${this.VIN}/charge`, {}, authHeader(this.jwt))
resolve(res.status)
} catch (e) {
reject(e)
}
})
}
APIWrapper.prototype.preconditionNow = function () {
return new Promise(async (resolve, reject) => {
try {
await axios.post(ENDPOINT + `/vehicle/${this.VIN}/air-conditioning`, {}, authHeader(this.jwt))
last = await axios.get(ENDPOINT + `/vehicle/${this.VIN}/air-conditioning/last`, authHeader(this.jwt))
resolve(last)
} catch (e) {
reject(e)
}
})
}
APIWrapper.prototype.lastPrecondition = function () {
return new Promise(async (resolve, reject) => {
try {
const last = await axios.get(ENDPOINT + `/vehicle/${this.VIN}/air-conditioning/last`, authHeader(this.jwt))
resolve(last.data)
} catch (e) {
reject(e)
}
})
}
function authHeader(jwt) {
return {
headers: {
'Authorization': 'Bearer ' + jwt
}
}
}
function parseRefreshToken(res) {
const cookies = setCookie.parse(res, { map: true })
return cookies.refreshToken
}
function parseJWTExpiration(token) {
const decoded = jwt.decode(token)
return decoded.exp
}
module.exports = APIWrapper