2020-11-26 01:30:15 +01:00
|
|
|
import axios from 'axios'
|
|
|
|
|
|
|
|
const API_BASE_URL = process.env.VUE_APP_API_LOCATION
|
|
|
|
const LOCAL_STORAGE_KEY = "JWT"
|
|
|
|
|
|
|
|
const COMMON_ERROR_CODES = {
|
|
|
|
403: "Access Denied",
|
|
|
|
401: "Authentication failed",
|
|
|
|
400: "Invalid Request",
|
|
|
|
417: "Invalid Request"
|
|
|
|
}
|
|
|
|
|
|
|
|
export default new class {
|
|
|
|
|
|
|
|
_setupHTTPObject() {
|
|
|
|
const token = localStorage.getItem(LOCAL_STORAGE_KEY)
|
|
|
|
|
|
|
|
let headers = {}
|
|
|
|
if (token) {
|
|
|
|
headers = {'Authorization': token}
|
|
|
|
}
|
|
|
|
|
|
|
|
this.http = axios.create({
|
|
|
|
baseURL: API_BASE_URL,
|
|
|
|
timeout: 15000, // 15 sec, mert szar a mobilnet
|
|
|
|
headers: headers
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
this._setupHTTPObject()
|
|
|
|
}
|
|
|
|
|
|
|
|
get haveToken() {
|
|
|
|
return !!localStorage.getItem(LOCAL_STORAGE_KEY)
|
|
|
|
}
|
|
|
|
|
2020-11-26 03:18:28 +01:00
|
|
|
clearTokenFromLocalStorage() {
|
|
|
|
localStorage.removeItem(LOCAL_STORAGE_KEY);
|
|
|
|
}
|
|
|
|
|
2020-11-26 01:30:15 +01:00
|
|
|
_performApiCall(method, url, data, precheckToken, expectedStatus, errorTexts = COMMON_ERROR_CODES) {
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
|
|
if (precheckToken && !this.haveToken) {
|
|
|
|
return reject({
|
|
|
|
status: null,
|
|
|
|
text: "Not logged in",
|
|
|
|
data: null
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
this.http.request({
|
|
|
|
url, method, data,
|
|
|
|
validateStatus(status) {
|
|
|
|
return status === expectedStatus;
|
|
|
|
}
|
|
|
|
}).then((response) => {
|
|
|
|
|
|
|
|
return resolve(response.data);
|
|
|
|
|
|
|
|
}).catch((error) => {
|
|
|
|
|
|
|
|
if (!error.response) { // Network error (CORS?)
|
|
|
|
|
|
|
|
return reject({
|
|
|
|
status: null,
|
|
|
|
text: "Network error",
|
|
|
|
data: null
|
|
|
|
})
|
|
|
|
|
|
|
|
} else { // Server side error
|
|
|
|
|
|
|
|
return reject({
|
|
|
|
status: error.response.status,
|
|
|
|
text: errorTexts[error.response.status] || "Network or server error",
|
|
|
|
data: error.response.data
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
performLogin(name, password) {
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
2020-11-26 03:18:28 +01:00
|
|
|
this._performApiCall('post', '/auth/login', {name, password}, false, 200, {
|
2020-11-26 01:30:15 +01:00
|
|
|
401: "Invalid credentials",
|
|
|
|
...COMMON_ERROR_CODES
|
|
|
|
}).then((data) => {
|
|
|
|
|
|
|
|
localStorage.setItem(LOCAL_STORAGE_KEY, data.token)
|
|
|
|
this._setupHTTPObject() // Update JWT token memes
|
|
|
|
return resolve({name})
|
|
|
|
|
|
|
|
}).catch(reject)
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
performLogout() {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
|
|
this._performApiCall('delete', '/auth/login', null, true, 204).then(() => {
|
|
|
|
|
|
|
|
localStorage.removeItem(LOCAL_STORAGE_KEY)
|
|
|
|
this._setupHTTPObject() // Update JWT token memes
|
|
|
|
return resolve(null)
|
|
|
|
|
|
|
|
}).catch(reject)
|
|
|
|
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
getMyInfo() {
|
|
|
|
return this._performApiCall('get', '/auth/me', null, true, 200);
|
|
|
|
}
|
|
|
|
|
|
|
|
getAllLists() {
|
|
|
|
return this._performApiCall('get', '/lists', null, true, 200);
|
|
|
|
}
|
|
|
|
|
|
|
|
getList(id) {
|
|
|
|
return this._performApiCall('get', `/lists/${id}`, null, true, 200);
|
|
|
|
}
|
|
|
|
|
2020-11-26 19:48:43 +01:00
|
|
|
getItem(id) {
|
|
|
|
return this._performApiCall('get', `/items/${id}`, null, true, 200);
|
2020-11-26 01:30:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|