From 146b7808128bb3e47387f83116d16e7fda2612f4 Mon Sep 17 00:00:00 2001 From: Nikolay <46225163+vigdorov@users.noreply.github.com> Date: Mon, 6 Jul 2020 13:52:19 +0300 Subject: [PATCH] =?UTF-8?q?HM-23.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20api=20servie-store=20(#2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: vigdorov --- package-lock.json | 61 ++++++++++++++++++--- package.json | 4 ++ src/api/StorageListAPI.js | 100 +++++++++++++++++++++++++++++++++++ src/api/StorageServiceAPI.js | 28 ++++++++++ src/api/consts.js | 5 ++ 5 files changed, 192 insertions(+), 6 deletions(-) create mode 100644 src/api/StorageListAPI.js create mode 100644 src/api/StorageServiceAPI.js create mode 100644 src/api/consts.js diff --git a/package-lock.json b/package-lock.json index ff2b6c3..46d2655 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1595,6 +1595,32 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + } + } + }, "babel-loader": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", @@ -6233,8 +6259,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", @@ -8052,6 +8077,14 @@ "faye-websocket": "^0.10.0", "uuid": "^3.4.0", "websocket-driver": "0.6.5" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "sockjs-client": { @@ -8630,6 +8663,15 @@ "requires": { "temp-dir": "^1.0.0", "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "optional": true + } } }, "terser": { @@ -9147,10 +9189,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.2.0.tgz", + "integrity": "sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q==" }, "v8-compile-cache": { "version": "2.1.1", @@ -9578,6 +9619,14 @@ "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "webpack-sources": { diff --git a/package.json b/package.json index d1c9ed9..86c56a3 100644 --- a/package.json +++ b/package.json @@ -31,5 +31,9 @@ "webpack": "^4.43.0", "webpack-cli": "^3.3.12", "webpack-dev-server": "^3.11.0" + }, + "dependencies": { + "axios": "^0.19.2", + "uuid": "^8.2.0" } } diff --git a/src/api/StorageListAPI.js b/src/api/StorageListAPI.js new file mode 100644 index 0000000..7ca839a --- /dev/null +++ b/src/api/StorageListAPI.js @@ -0,0 +1,100 @@ +import StorageServiceApi from './StorageServiceAPI'; + +/** + * Класс создания api для списков данных + * @class + * @public + */ +class StorageListApi { + /** + * @param {string} key - уникальный ключ для api, который будет записан в сервисе + */ + constructor(key) { + this.key = key; + this.api = new StorageServiceApi(); + } + + /** + * @private + * @param {string} _id - _id искомого элемента + * + + * @returns {Promise} + */ + async _findIndex(_id) { + const list = await this.request(); + return list.findIndex(item => item._id === _id); + } + + /** + * @public + * @returns {Promise} - возвращает все элементы списка + */ + async request() { + const data = await this.api.find(this.key); + return (data && data.value) || []; + } + + /** + * @param {string} _id - _id искомого элемента списка + * + * @returns {Promise} - возвращает элемент списка или генерит ошибку + */ + async find(_id) { + const list = await this.request(); + const findIndex = LocalStorageListApi.findIndex(list, _id); + if (findIndex === -1) { + throw new Error(`Not Found _id: ${_id}`); + } + return list[findIndex]; + } + + /** + * @param {Object} data - элемент списка + * + * @returns {Promise} - Возвращает вновь созданный элемент с уникальным полем _id + */ + async create(data) { + const list = await this.request(); + const _id = uuidv4(); + const newData = { + ...data, + _id, + }; + await this.api.createOrUpdate(this.key, list.concat(newData)); + return newData; + } + + /** + * @param {Object} data - элемент списка + * @param {string} data._id - наличие _id обязательно + * + * @returns {Promise} - Возвращает обновленный элемент списка + */ + async update(data) { + const list = await this.request(); + const findIndex = LocalStorageListApi.findIndex(list, data._id); + if (findIndex === -1) { + throw new Error(`Not Found _id: ${data._id}`); + } + list.splice(findIndex, 1, data); + await this.api.createOrUpdate(this.key, list); + return data; + } + + /** + * @param {string} _id - _id удаляемого элемента + * + * @returns {Promise} - Возвращает _id удаленного элемента или ошибку + */ + async remove(_id) { + const list = await this.request(); + const findIndex = LocalStorageListApi.findIndex(list, _id); + if (findIndex === -1) { + throw new Error(`Not Found _id: ${_id}`); + } + list.splice(findIndex, 1); + await this.api.createOrUpdate(this.key, list); + return _id; + } +} \ No newline at end of file diff --git a/src/api/StorageServiceAPI.js b/src/api/StorageServiceAPI.js new file mode 100644 index 0000000..f88bf61 --- /dev/null +++ b/src/api/StorageServiceAPI.js @@ -0,0 +1,28 @@ +import {API_URL, ENDPOINT} from './consts'; + + +class StorageServiceApi { + URL = `${API_URL}${ENDPOINT}`; + + async request() { + const {data} = await axios.get(this.URL); + return data; + } + + async find(key) { + const {data} = await axios.get(`${this.URL}/${key}`) + return data; + } + + async createOrUpdate(key, value) { + const {data} = await axios.post(this.URL, {key, value}) + return data; + } + + async remove(key) { + const {data} = await axios.delete(`${this.URL}/${key}`); + return data; + } +} + +export default StorageServiceApi; diff --git a/src/api/consts.js b/src/api/consts.js new file mode 100644 index 0000000..92e3dbd --- /dev/null +++ b/src/api/consts.js @@ -0,0 +1,5 @@ +export const API_URL = 'http://vigdorov.ru:4001'; +export const ENDPOINT = '/store'; +export const API_KEYS = { + +}; \ No newline at end of file