diff --git a/src/api/AuthServiceAPI.js b/src/api/AuthServiceAPI.js index 961510f..961963b 100644 --- a/src/api/AuthServiceAPI.js +++ b/src/api/AuthServiceAPI.js @@ -33,10 +33,18 @@ class AuthServiceApi { */ refresh = () => { const refresh_token = tokenApi.getRefreshToken(); - return axios.post(`${this.URL}${AUTH_ENDPOINTS.REFRESH}`, {refresh_token}) + if (refresh_token) { + return axios.post(`${this.URL}${AUTH_ENDPOINTS.REFRESH}`, {refresh_token}) .then(({data: tokens}) => { tokenApi.saveTokenPair(tokens); + }) + .catch((e) => { + tokenApi.clearTokents(); + throw e; }); + } + + return Promise.reject(new Error('Не авторизован')); } } diff --git a/src/api/HttpAPI.js b/src/api/HttpAPI.js index f3201ce..eb9451c 100644 --- a/src/api/HttpAPI.js +++ b/src/api/HttpAPI.js @@ -26,64 +26,64 @@ class HttpApi { * @param {string} url - адрес запроса * @param {Object} body - тело запроса */ - request = (method, url, body) => { - return httpAuthApi.request({method, url, body}); + request = (method, url, body, config) => { + return httpAuthApi.request({...config, method, url, body}); } /** * @param {string} url - адрес запроса * @param {Object} query - параметры для передачи через query */ - get = (url, query) => { - return this.request(GET, makeUrlWithQuery(url, query)); + get = (url, query, config) => { + return this.request(GET, makeUrlWithQuery(url, query), null, config); } /** * @param {string} url - адрес запроса * @param {Object} body - тело запроса */ - post = (url, body) => { - return this.request(POST, url, body); + post = (url, body, config) => { + return this.request(POST, url, body, config); } /** * @param {string} url - адрес запроса * @param {Object} body - тело запроса */ - put = (url, body) => { - return this.request(PUT, url, body); + put = (url, body, config) => { + return this.request(PUT, url, body, config); } /** * @param {string} url - адрес запроса * @param {Object} query - параметры для передачи через query */ - delete = (url, query) => { - return this.request(DELETE, makeUrlWithQuery(url, query)); + delete = (url, query, config) => { + return this.request(DELETE, makeUrlWithQuery(url, query), null, config); } /** * @param {string} url - адрес запроса * @param {Object} query - параметры для передачи через query */ - head = (url, query) => { - return this.request(HEAD, makeUrlWithQuery(url, query)); + head = (url, query, config) => { + return this.request(HEAD, makeUrlWithQuery(url, query), null, config); } /** * @param {string} url - адрес запроса * @param {Object} query - параметры для передачи через query */ - options = (url, query) => { - return this.request(OPTIONS, makeUrlWithQuery(url, query)); + options = (url, query, config) => { + return this.request(OPTIONS, makeUrlWithQuery(url, query), null, config); } /** * @param {string} url - адрес запроса * @param {Object} body - тело запроса */ - path = (url, body) => { - return this.request(PATH, url, body); + path = (url, body, config) => { + return this.request(PATH, url, body, config); } } diff --git a/src/api/HttpAuthAPI.js b/src/api/HttpAuthAPI.js index 46396ae..e2aa47f 100644 --- a/src/api/HttpAuthAPI.js +++ b/src/api/HttpAuthAPI.js @@ -90,6 +90,7 @@ class HttpAuthApi { addTokenToRequest = (requestConfig) => ({ ...requestConfig, headers: { + ...(requestConfig.headers ?? {}), 'Authorization': tokenApi.getAccessToken(), }, }) diff --git a/src/api/LocalStorageAPI.js b/src/api/LocalStorageAPI.js index 0ba320d..b3aab16 100644 --- a/src/api/LocalStorageAPI.js +++ b/src/api/LocalStorageAPI.js @@ -16,7 +16,7 @@ class LocalStorageAPI { * Возвращает распарсенный объект из Local Storage по ключу из конструктора */ request () { - const value = this.api.getItem(this.key) || '{}'; + const value = this.api.getItem(this.key) || 'null'; return JSON.parse(value); } diff --git a/src/api/StorageLogsAPI.js b/src/api/StorageLogsAPI.js index b8c6b92..d5d2048 100644 --- a/src/api/StorageLogsAPI.js +++ b/src/api/StorageLogsAPI.js @@ -1,6 +1,6 @@ -import axios from 'axios'; import {ENDPOINTS} from './consts'; import adminConfigsService from '../services/AdminConfigsService'; +import http from './HttpAPI'; class StorageLogsApi { constructor () { @@ -9,22 +9,22 @@ class StorageLogsApi { } requestServerLogs = async () => { - const {data} = await axios.get(`${this.URL}${ENDPOINTS.SERVER_LOGS}`); + const {data} = await http.get(`${this.URL}${ENDPOINTS.SERVER_LOGS}`); return data; } requestClientLogs = async () => { - const {data} = await axios.get(`${this.URL}${ENDPOINTS.CLIENT_LOGS}`); + const {data} = await http.get(`${this.URL}${ENDPOINTS.CLIENT_LOGS}`); return data; } deleteAllServerLogs = async () => { - const {data} = await axios.delete(`${this.URL}${ENDPOINTS.SERVER_LOGS}`); + const {data} = await http.delete(`${this.URL}${ENDPOINTS.SERVER_LOGS}`); return data; } deleteAllClientLogs = async () => { - const {data} = await axios.delete(`${this.URL}${ENDPOINTS.CLIENT_LOGS}`); + const {data} = await http.delete(`${this.URL}${ENDPOINTS.CLIENT_LOGS}`); return data; } } diff --git a/src/api/StorageServiceAPI.js b/src/api/StorageServiceAPI.js index b0bbac6..2800aa8 100644 --- a/src/api/StorageServiceAPI.js +++ b/src/api/StorageServiceAPI.js @@ -1,7 +1,6 @@ -import axios from 'axios'; - import {ENDPOINTS} from './consts'; import adminConfigsService from '../services/AdminConfigsService'; +import http from './HttpAPI'; /** * @interface Store @@ -29,7 +28,7 @@ class StorageServiceApi { * @returns {Promise} - Возвращает список всех api */ request = async () => { - const {data} = await axios.get(this.URL, this.OPTIONS); + const {data} = await http.get(this.URL, null, this.OPTIONS); return data; } @@ -39,7 +38,7 @@ class StorageServiceApi { * @returns {Promise} - Возвращает api по указанному ключу */ find = async (key) => { - const {data} = await axios.get(`${this.URL}/${key}`, this.OPTIONS); + const {data} = await http.get(`${this.URL}/${key}`, null, this.OPTIONS); return data; } @@ -49,7 +48,7 @@ class StorageServiceApi { * @returns {Promise} - Возвращает вновь созданный элемент */ create = async (createData) => { - const {data} = await axios.post(this.URL, createData, this.OPTIONS); + const {data} = await http.post(this.URL, createData, this.OPTIONS); return data; } @@ -59,7 +58,7 @@ class StorageServiceApi { * @returns {Promise} - Возвращает обновленный элемент */ update = async (updateData) => { - const {data} = await axios.put(this.URL, updateData, this.OPTIONS); + const {data} = await http.put(this.URL, updateData, this.OPTIONS); return data; } @@ -69,7 +68,7 @@ class StorageServiceApi { * @returns {Promise} - Возвращает удаленный элемент */ remove = async (key) => { - const {data} = await axios.delete(`${this.URL}/${key}`, this.OPTIONS); + const {data} = await http.delete(`${this.URL}/${key}`, null, this.OPTIONS); return data; } } diff --git a/src/api/TokenAPI.js b/src/api/TokenAPI.js index 0e17230..6608780 100644 --- a/src/api/TokenAPI.js +++ b/src/api/TokenAPI.js @@ -33,14 +33,14 @@ class TokenApi { * Возвращает токен авторизации */ getAccessToken = () => { - return this.localApi.request(); + return this.sessionApi.request(); } /** * Возвращает токен ревреша авторизации */ getRefreshToken = () => { - return this.sessionApi.request(); + return this.localApi.request(); } /** diff --git a/src/api/consts.js b/src/api/consts.js index de9464a..e42a6bd 100644 --- a/src/api/consts.js +++ b/src/api/consts.js @@ -39,7 +39,7 @@ export const AUTH_SERVICE = 'http://api.auth.vigdorov.ru'; export const AUTH_ENDPOINTS = { AUTH: '/auth', - REFRESH: '/refresh', + REFRESH: '/auth/refresh', }; export const LOCAL_STORAGE_TYPE = { diff --git a/src/app.js b/src/app.js index cacde27..207a2b0 100644 --- a/src/app.js +++ b/src/app.js @@ -5,36 +5,53 @@ import 'bootstrap'; import './services/AdminConfigsService'; import ApiPage from './components/api-page'; import MainPage from './components/main-page'; -import mainMenu from './components/main-menu/MainMenu'; +import MainMenu from './components/main-menu/MainMenu'; import routeService from './services/RouteService'; import RouterPagesContainer from './components/router-pages-container/index'; import LogsPage from './components/logs-page/index'; import LoginPage from './components/login-page'; +import authServiceApi from './api/AuthServiceAPI'; -mainMenu.render(); +const initAppComponents = () => { + const mainMenu = new MainMenu(); + mainMenu.render(); -const routerPagesContainer = new RouterPagesContainer(mainMenu); + const routerPagesContainer = new RouterPagesContainer(mainMenu); -/** - * Добавление страниц в Роутинг выполняется на странице app.js - * @example - * routerPagesContainer.addRoutes([ - * {url: '/', pageComponent: MainPage}, - * {url: '/api', pageComponent: ApiPage}, - * ]); - */ -routerPagesContainer.addRoutes([ - {url: '/', pageComponent: MainPage}, - {url: '/api', pageComponent: ApiPage}, - {url: '/logs', pageComponent: LogsPage}, - {url: '/login', pageComponent: LoginPage}, -]); + /** + * Добавление страниц в Роутинг выполняется на странице app.js + * @example + * routerPagesContainer.addRoutes([ + * {url: '/', pageComponent: MainPage}, + * {url: '/api', pageComponent: ApiPage}, + * ]); + */ + routerPagesContainer.addRoutes([ + {url: '/', pageComponent: MainPage}, + {url: '/api', pageComponent: ApiPage}, + {url: '/logs', pageComponent: LogsPage}, + {url: '/login', pageComponent: LoginPage}, + ]); -/** - * Этот метод генерит событие Route, чтобы все компоненты получили его после инициализации. - * Поэтому вызывать его надо в самом конце, когда уже созданы все компоненты приложения. - * @example - * // Вызывать его можно только один раз в программе - * routeService.init(); - */ -routeService.init(); + /** + * Этот метод генерит событие Route, чтобы все компоненты получили его после инициализации. + * Поэтому вызывать его надо в самом конце, когда уже созданы все компоненты приложения. + * @example + * // Вызывать его можно только один раз в программе + * routeService.init(); + */ + routeService.init(); +}; + +const initApp = () => { + authServiceApi.refresh() + .then(() => { + initAppComponents(); + }) + .catch(() => { + history.pushState({}, '', '/login'); + initAppComponents(); + }); +}; + +initApp(); diff --git a/src/components/login-page/LoginPage.js b/src/components/login-page/LoginPage.js index bb2d38a..105709b 100644 --- a/src/components/login-page/LoginPage.js +++ b/src/components/login-page/LoginPage.js @@ -3,6 +3,7 @@ import './LoginPage.css'; import LoginForm from '../login-form'; import authServiceApi from '../../api/AuthServiceAPI'; import routeService from '../../services/RouteService'; +import notify from '../../services/NotifyService'; class LoginPage extends Component { constructor (mainNodeSelector, parentNode) { @@ -15,12 +16,12 @@ class LoginPage extends Component { authServiceApi.auth(login, password) .then(() => { this.form.disabled(false); + notify.success('Вы авторизованы'); routeService.goTo('/'); }) .catch((e) => { - // TODO: Времено используется alert, потом прикрутим систему нотификаций - // eslint-disable-next-line no-alert - alert(e?.response?.data?.message || 'Неизвестная ошибка'); + const message = e?.response?.data?.message || 'Неизвестная ошибка'; + notify.warn(message); this.form.disabled(false); }); }); diff --git a/src/components/main-menu/MainMenu.js b/src/components/main-menu/MainMenu.js index c190bef..05293c4 100644 --- a/src/components/main-menu/MainMenu.js +++ b/src/components/main-menu/MainMenu.js @@ -82,6 +82,4 @@ class MainMenu extends Component { } } -const navMenuButtons = new MainMenu(); - -export default navMenuButtons; +export default MainMenu; diff --git a/src/services/AdminConfigsService.js b/src/services/AdminConfigsService.js index e8da0ee..5478cb1 100644 --- a/src/services/AdminConfigsService.js +++ b/src/services/AdminConfigsService.js @@ -36,7 +36,7 @@ class AdminConfigsService { * @param {'api-p' | 'api-t' | 'api-l'} apiName - api с которым хотим работать * @example * // Переключаем api на localhost, пишем в консоли браузера - * __adminConfigs.setApi('api-l') + * __adminConfig.setApi('api-l') */ setApi (apiName) { const options = this.getOptions(); @@ -53,7 +53,7 @@ class AdminConfigsService { const adminConfigsService = new AdminConfigsService(); if (location.hostname === LOCALHOST) { - window.__adminConfigs = adminConfigsService; + window.__adminConfig = adminConfigsService; } export default adminConfigsService;