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) } clearTokenFromLocalStorage() { localStorage.removeItem(LOCAL_STORAGE_KEY); } _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) => { this._performApiCall('post', '/auth/login', {name, password}, false, 200, { 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); } getTrackFromList(listid, trackid) { return this._performApiCall('get', `/lists/${listid}/${trackid}`, null, true, 200); } }