From 4b6cda863270736b6cbfd68d5a5c4c73243e0a17 Mon Sep 17 00:00:00 2001 From: vbuglov Date: Wed, 6 Mar 2024 12:46:19 +0300 Subject: [PATCH] fix(refactor): add services/adapters/useCases --- .../adapters/adapterOfServices/Services.js | 95 ++++++++ .../adapters/adapterOfServices/apiHelpers.js | 39 ++++ .../src/adapters/adapterOfUsers/StaticData.js | 28 +++ .../src/adapters/adapterOfUsers/Users.js | 206 ++++++++++++++++++ .../src/adapters/adapterOfUsers/apiHelpers.js | 39 ++++ .../2_molecules/Tabulator/VTabulator.vue | 3 +- .../2_molecules/Tabulator/helper.js | 4 +- .../3_organisms/UsersManager/UsersManager.vue | 2 +- .../UsersManager/UsersManagerUsersTable.vue | 77 +++++-- .../SitesManagerPage/SitesManagerPage.vue | 43 +++- users-manage/src/helpers/Users/Users.js | 10 +- .../services/serviceOfServices/Services.js | 14 ++ .../src/services/serviceOfUsers/Users.js | 6 + users-manage/src/store/modules/users/index.js | 11 +- .../src/useCases/CaseOfUsersInService.js | 9 + users-manage/tests/adapters/Services.test.js | 11 + users-manage/tests/adapters/Users.test.js | 11 + .../tests/services/serviceOfServices.test.js | 62 ++++++ .../tests/services/serviceOfUsers.test.js | 18 ++ .../useCases/CaseOfUsersInService.test.js | 106 +++++++++ .../tests/views/1_atoms/AppPageHeader.test.js | 2 - .../tests/views/2_molecules/Tabulator.test.js | 4 +- .../views/3_organisms/UsersManager.test.js | 10 +- .../tests/views/5_pages/SitesList.test.js | 6 +- users-manage/vite.config.js | 3 + 25 files changed, 769 insertions(+), 50 deletions(-) create mode 100644 users-manage/src/adapters/adapterOfServices/Services.js create mode 100644 users-manage/src/adapters/adapterOfServices/apiHelpers.js create mode 100644 users-manage/src/adapters/adapterOfUsers/StaticData.js create mode 100644 users-manage/src/adapters/adapterOfUsers/Users.js create mode 100644 users-manage/src/adapters/adapterOfUsers/apiHelpers.js create mode 100644 users-manage/src/services/serviceOfServices/Services.js create mode 100644 users-manage/src/services/serviceOfUsers/Users.js create mode 100644 users-manage/src/useCases/CaseOfUsersInService.js create mode 100644 users-manage/tests/adapters/Services.test.js create mode 100644 users-manage/tests/adapters/Users.test.js create mode 100644 users-manage/tests/services/serviceOfServices.test.js create mode 100644 users-manage/tests/services/serviceOfUsers.test.js create mode 100644 users-manage/tests/useCases/CaseOfUsersInService.test.js diff --git a/users-manage/src/adapters/adapterOfServices/Services.js b/users-manage/src/adapters/adapterOfServices/Services.js new file mode 100644 index 0000000..3d243a2 --- /dev/null +++ b/users-manage/src/adapters/adapterOfServices/Services.js @@ -0,0 +1,95 @@ +import {get, post, put, remove} from './apiHelpers.js' +import {convertList} from '@helpers/adapter/adapter.js' + +const config = { + id: "id", + created_at: "created_at", + updated_at: "updated_at", + deleted_at: "deleted_at", + name: "name", + port: "port", + proxy_ip: "proxy_ip", + internet_uri: "internet_uri", + description: "description", + is_online: "is_online", + site_ip: "device_ip", +} + +class Services { + + /** + * + * @param {String} apiAddr - path to service + */ + + constructor(apiAddr) { + this.apiAddr = apiAddr + this.config = config + } + + /** + * + * @returns {Array} res.data - all services + */ + + async getServices() { + const res = await get(`${this.apiAddr}/servers`) + return convertList(res.data, {config: this.config}) + } + + /** + * + * @param {Object} payload - add new service + * @returns {Object} newService - added new service + */ + + async createService(payload) { + let newService = [] + const updatedPort = parseFloat(payload.port) + const updatedService = {...convertObject(payload, {config: servConfig}), port: updatedPort} + await post(`${this.apiAddr}/servers`, updatedService).then(res => { + newService = convertObject(res.value, {config: this.config}) + }).catch(err => { + console.log('err', err) + }) + return newService + } + + /** + * + * @param {Object} payload - edit params in selected service + * @returns {Object} resService - updated service with edited params + */ + + async updateService(payload) { + let resService = [] + const updatedPort = parseFloat(payload.port) + const updatedService = {...convertObject(payload, {config: servConfig}), port: updatedPort} + if (payload.id) { + await put(`${this.apiAddr}/servers`, updatedService, payload.id).then(res => { + resService = convertObject(res.value, {config: this.config}) + }).catch(err => { + console.log('err', err) + }) + } + return resService + } + + /** + * + * @param {Number} id - id selected service for remove + * @returns {Number} deletedServiceId - id removed service + */ + + async deleteService(id) { + let deletedServiceId = null + await remove(`${this.apiAddr}/servers`, id).then((res) => { + deletedServiceId = res.id + }).catch(err => { + console.log('err', err) + }) + return deletedServiceId + } +} + +export default Services diff --git a/users-manage/src/adapters/adapterOfServices/apiHelpers.js b/users-manage/src/adapters/adapterOfServices/apiHelpers.js new file mode 100644 index 0000000..7303589 --- /dev/null +++ b/users-manage/src/adapters/adapterOfServices/apiHelpers.js @@ -0,0 +1,39 @@ +import axios from "axios"; + +const post = async (path, data, onError) => { + return await axios.post(path, data) + .then(r => r.data) + .catch(error => { + onError && onError(error) + console.error('Error post request:', error) + }) +} + + +const get = async (path) => { + return await axios.get(path) + .catch(error => { + console.error('Error get request:', error) + }) +} + +const put = async (path, data, id, onError) => { + return await axios.put(`${path}/${id}`, data) + .then(r => r.data) + .catch(error => { + onError && onError(error) + console.error('Error put request:', error) + }) +} + +const remove = async (path, id, onError) => { + return await axios.delete(`${path}/${id}`) + .then(r => r.data) + .catch(error => { + onError && onError(error) + console.error('Error delete request:', error) + }) +} + + +export {get, post, put, remove} diff --git a/users-manage/src/adapters/adapterOfUsers/StaticData.js b/users-manage/src/adapters/adapterOfUsers/StaticData.js new file mode 100644 index 0000000..63daf7a --- /dev/null +++ b/users-manage/src/adapters/adapterOfUsers/StaticData.js @@ -0,0 +1,28 @@ +const devUsersList = [ + { + "id": 1, + "first_name": "Leanne", + "last_name": "Graham", + "email": "test@mail.ru", + "role": "admin", + "is_active": true + }, + { + "id": 2, + "first_name": "Leanne", + "last_name": "Graham", + "email": "test@mail.ru", + "role": "admin", + "is_active": true + }, + { + "id": 3, + "first_name": "Leanne", + "last_name": "Graham", + "email": "test@mail.ru", + "role": "admin", + "is_active": true + }, +] + +export {devUsersList} \ No newline at end of file diff --git a/users-manage/src/adapters/adapterOfUsers/Users.js b/users-manage/src/adapters/adapterOfUsers/Users.js new file mode 100644 index 0000000..aad01a7 --- /dev/null +++ b/users-manage/src/adapters/adapterOfUsers/Users.js @@ -0,0 +1,206 @@ +import {get, post, put, remove} from './apiHelpers.js' +import {convertList} from '@helpers/adapter/adapter.js' +import {devUsersList} from './StaticData.js' + +/** + * Интерфейс пользователя + * @typedef {Object} User + * @param {Number} id + */ + +class Users { + /** + * Класс управления роутерами + * @param {String} apiAddr - path to service + * @param {Object | undefined} adapter_config - oldKey: newKey + * @param {Object | undefined} params - Конфиг настроек + * @param {'prod' | 'test'} params.mode - Конфиг настроек + */ + constructor(apiAddr, adapter_config = {}, params = {mode: 'prod'}) { + this.apiAddr = apiAddr + this.config = adapter_config + this.mode = params.mode + } + + /** + * + * @param {Object} params - Конфиг настроек + * @param {'prod' | 'dev'} params.mode - Конфиг настроек + * @returns {Promise<*[]> | *[]} + */ + async getUsers(params) { + if (params.mode === "dev") { + return devUsersList + } + let res = await get(`${this.apiAddr}/users`) + let updatedUsers = convertList(res.data, {config: this.config}) + return updatedUsers + } + + /** + * + * @param {Number} id - Сервис id, если id не указан, отображается список всех роутеров + * @param {'dev' | 'prod'} mode - Сервис id, если id не указан, отображается список всех роутеров + * @returns {Promise<*[]>} + */ + async getUsersBySiteId(id, mode) { + if (mode === "dev") { + return devUsersList + } + let res = await get(`${this.apiAddr}/users/by_server/${id}`) + let updatedUsers = convertList(res.data, {config: this.config}) + return updatedUsers + } + + /** + * + * @param {User} userData + * @returns {Promise} + */ + async createUser(userData) { + const newUser = await post(`${this.apiAddr}/users`, userData) + return newUser + } + + /** + * + * @param {User} userData + * @returns {Promise} + */ + async updateUser(userData) { + const updatedUserData = {...userData} + delete updatedUserData.id + const newUser = await put(`${this.apiAddr}/users/${userData.id}`, updatedUserData) + return newUser + } + + /** + * + * @param {Number} userId - Сервис id, если id не указан, отображается список всех роутеров + * @returns {Promise<*[]>} + */ + async removeUser(userId) { + const removedUser = await remove(`${this.apiAddr}/users/${userId}`) + return removedUser + } + + + /** + * Функция запускает список запросов к апишке и логает ответы + * @returns {Promise} + */ + async test() { + console.log("_______START TEST_______") + + const allUsers = await this.getUsers() + console.log("allUsers", allUsers) + const serverUser = await this.getUserById(1) + console.log("getUserById 1", serverUser) + const newUser = await this.createUser({ + "server_id": 1, + "path": "/", + "role": 1, + "description": "tests swagger", + "deepness": 6, + "order": 0, + "is_cb_on": true, + "cb_request_limit": 100, + "cb_min_requests": 100, + "cb_error_threshold_percentage": 0.35, + "cb_interval_duration": 2000000, + "cb_open_state_timeout": 1000000 + }) + console.log("newUser", newUser) + const updatedUser = await this.updateUser({ + "path": "/updated_path/", + "description": "updated_description", + "id": newUser.id + }) + console.log("updatedUser", updatedUser) + const removedUser = await this.removeUser(newUser.id) + console.log("removedUser", removedUser) + + const newUser1 = await this.createUser({ + "server_id": 1, + "path": "/", + "role": 1, + "description": "tests swagger", + "deepness": 6, + "order": 0, + "is_cb_on": true, + "cb_request_limit": 100, + "cb_min_requests": 100, + "cb_error_threshold_percentage": 0.35, + "cb_interval_duration": 2000000, + "cb_open_state_timeout": 1000000 + }) + const newUser2 = await this.createUser({ + "server_id": 1, + "path": "/", + "role": 1, + "description": "tests swagger", + "deepness": 6, + "order": 0, + "is_cb_on": true, + "cb_request_limit": 100, + "cb_min_requests": 100, + "cb_error_threshold_percentage": 0.35, + "cb_interval_duration": 2000000, + "cb_open_state_timeout": 1000000 + }) + const newUser3 = await this.createUser({ + "server_id": 1, + "path": "/", + "role": 1, + "description": "tests swagger", + "deepness": 6, + "order": 0, + "is_cb_on": true, + "cb_request_limit": 100, + "cb_min_requests": 100, + "cb_error_threshold_percentage": 0.35, + "cb_interval_duration": 2000000, + "cb_open_state_timeout": 1000000 + }) + + const actions = [ + { + ...newUser1, + action: "update", + "path": "/updated_path2/", + "description": "updated_description2", + }, { + ...newUser2, + action: "update", + "path": "/updated_path3/", + "description": "updated_description3", + }, { + ...newUser3, + action: "remove" + }, + { + action: "create", + "server_id": 1, + "path": "/lalalala/lalalal", + "role": 1, + "description": "new_route_created", + "deepness": 6, + "order": 0, + "is_cb_on": true, + "cb_request_limit": 100, + "cb_min_requests": 100, + "cb_error_threshold_percentage": 0.35, + "cb_interval_duration": 2000000, + "cb_open_state_timeout": 1000000 + } + ] + + const mutationsList = await this.updateGroupUsers(actions) + console.log("mutationsList", mutationsList) + console.log("________END TEST________") + + return "ok" + } +} + +export default Users \ No newline at end of file diff --git a/users-manage/src/adapters/adapterOfUsers/apiHelpers.js b/users-manage/src/adapters/adapterOfUsers/apiHelpers.js new file mode 100644 index 0000000..7303589 --- /dev/null +++ b/users-manage/src/adapters/adapterOfUsers/apiHelpers.js @@ -0,0 +1,39 @@ +import axios from "axios"; + +const post = async (path, data, onError) => { + return await axios.post(path, data) + .then(r => r.data) + .catch(error => { + onError && onError(error) + console.error('Error post request:', error) + }) +} + + +const get = async (path) => { + return await axios.get(path) + .catch(error => { + console.error('Error get request:', error) + }) +} + +const put = async (path, data, id, onError) => { + return await axios.put(`${path}/${id}`, data) + .then(r => r.data) + .catch(error => { + onError && onError(error) + console.error('Error put request:', error) + }) +} + +const remove = async (path, id, onError) => { + return await axios.delete(`${path}/${id}`) + .then(r => r.data) + .catch(error => { + onError && onError(error) + console.error('Error delete request:', error) + }) +} + + +export {get, post, put, remove} diff --git a/users-manage/src/components/2_molecules/Tabulator/VTabulator.vue b/users-manage/src/components/2_molecules/Tabulator/VTabulator.vue index 2931297..716946a 100644 --- a/users-manage/src/components/2_molecules/Tabulator/VTabulator.vue +++ b/users-manage/src/components/2_molecules/Tabulator/VTabulator.vue @@ -11,9 +11,8 @@ import { import {TabulatorFull as Tabulator} from 'tabulator-tables'; - -import localization from "./localization"; import { is, sort, mergeDeepRight } from "ramda"; +import localization from "./localization"; import Pagination from "./VTabulatorPagination.vue"; export default { diff --git a/users-manage/src/components/2_molecules/Tabulator/helper.js b/users-manage/src/components/2_molecules/Tabulator/helper.js index 8bb5bcf..5286f1e 100644 --- a/users-manage/src/components/2_molecules/Tabulator/helper.js +++ b/users-manage/src/components/2_molecules/Tabulator/helper.js @@ -181,13 +181,14 @@ const link = (col) => ({ const render = (col) => ({ ...col, formatter: (cell, _, onRendered) => { - onRendered(function () { if (`${col.render}`.includes("{{") && `${col.render}`.includes("}}")) { let record = cell.getRow().getData(); cell.getElement().innerHTML = Handlebars.compile(col.render)( {...record, __record__: record} ); + } else if (typeof col.render === "function") { + cell.getElement().innerHTML = col.render(cell.getRow().getData(), cell.getRow()); } }); }, @@ -213,6 +214,7 @@ let sorter = (a, b) => { const prepCol = (col) => cond([ [() => is(String, col.render), () => render(col)], + [() => is(Function, col.render), () => render(col)], [equals("link"), () => link(col)], [T, always(col)], ])(col.mode); diff --git a/users-manage/src/components/3_organisms/UsersManager/UsersManager.vue b/users-manage/src/components/3_organisms/UsersManager/UsersManager.vue index 194ba02..2c36ad4 100644 --- a/users-manage/src/components/3_organisms/UsersManager/UsersManager.vue +++ b/users-manage/src/components/3_organisms/UsersManager/UsersManager.vue @@ -40,7 +40,7 @@ export default { :class="`${gridCols}`" > - + diff --git a/users-manage/src/components/3_organisms/UsersManager/UsersManagerUsersTable.vue b/users-manage/src/components/3_organisms/UsersManager/UsersManagerUsersTable.vue index 9a28026..f244223 100644 --- a/users-manage/src/components/3_organisms/UsersManager/UsersManagerUsersTable.vue +++ b/users-manage/src/components/3_organisms/UsersManager/UsersManagerUsersTable.vue @@ -1,10 +1,20 @@ @@ -49,7 +75,10 @@ export default { class="flex flex-col max-h-[70vh] mb-14" >
- users table +
diff --git a/users-manage/src/components/5_pages/SitesManagerPage/SitesManagerPage.vue b/users-manage/src/components/5_pages/SitesManagerPage/SitesManagerPage.vue index 806a3d8..a29f5f9 100644 --- a/users-manage/src/components/5_pages/SitesManagerPage/SitesManagerPage.vue +++ b/users-manage/src/components/5_pages/SitesManagerPage/SitesManagerPage.vue @@ -1,12 +1,39 @@