HM-23. Добавелены классы для работы с api servie-store (#2)

Co-authored-by: vigdorov <vigdorov@yandex-team.ru>
This commit is contained in:
Nikolay
2020-07-06 13:52:19 +03:00
committed by GitHub
parent 243f2ce614
commit 146b780812
5 changed files with 192 additions and 6 deletions

61
package-lock.json generated
View File

@ -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": {

View File

@ -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"
}
}

100
src/api/StorageListAPI.js Normal file
View File

@ -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<Object, string>}
*/
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;
}
}

View File

@ -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;

5
src/api/consts.js Normal file
View File

@ -0,0 +1,5 @@
export const API_URL = 'http://vigdorov.ru:4001';
export const ENDPOINT = '/store';
export const API_KEYS = {
};