HM-30. Добавлен класс Компонент, поправлены api, внедрен тестовый ком… (#5)

This commit is contained in:
Nikolay
2020-07-07 00:35:36 +03:00
committed by GitHub
parent 06d5ed1522
commit 6dabdd42c0
20 changed files with 580 additions and 95 deletions

View File

@ -1,9 +1,16 @@
import {v4 as uuidv4} from 'uuid';
import StorageServiceApi from './StorageServiceAPI';
/**
* @typedef Element
* @type {object}
* @property {string} _id - уникальный id элемента
*/
/**
* Класс создания api для списков данных
* @class
* @public
*/
class StorageListApi {
/**
@ -16,33 +23,47 @@ class StorageListApi {
/**
* @private
*
* @param {Array.<Element>} list - список элементов по которым осуществялется поиск
* @param {string} _id - _id искомого элемента
*
* @returns {Promise<Object, string>}
* @returns {number} - Возвращает индекс искомого эллемента по _id
*/
async _findIndex(_id) {
const list = await this.request();
_findIndex = (list, _id) => {
return list.findIndex(item => item._id === _id);
}
/**
* @public
* @returns {Promise} - возвращает все элементы списка
* @private
*
* @param {Array<Element>} list - новый список элементов
*
* @returns {Promise<Array<Element>>} - возвращает обновленный список элементов
*/
async request() {
_updateList = async (list) => {
return await this.api.createOrUpdate(this.key, list);
}
/**
* @public
*
* @returns {Promise<Array<Element>>} - возвращает все элементы списка
*/
request = async () => {
const data = await this.api.find(this.key);
return (data && data.value) || [];
}
/**
* @public
*
* @param {string} _id - _id искомого элемента списка
*
* @returns {Promise} - возвращает элемент списка или генерит ошибку
* @returns {Promise<Element>} - возвращает элемент списка или генерит ошибку
*/
async find(_id) {
find = async (_id) => {
const list = await this.request();
const findIndex = LocalStorageListApi.findIndex(list, _id);
const findIndex = this._findIndex(list, _id);
if (findIndex === -1) {
throw new Error(`Not Found _id: ${_id}`);
}
@ -50,51 +71,58 @@ class StorageListApi {
}
/**
* @public
*
* @param {Object} data - элемент списка
*
* @returns {Promise} - Возвращает вновь созданный элемент с уникальным полем _id
* @returns {Promise<Element>} - Возвращает вновь созданный элемент с уникальным полем _id
*/
async create(data) {
create = async (data) => {
const list = await this.request();
const _id = uuidv4();
const newData = {
...data,
_id,
};
await this.api.createOrUpdate(this.key, list.concat(newData));
await this._updateList(list.concat(newData));
return newData;
}
/**
* @param {Object} data - элемент списка
* @param {string} data._id - наличие _id обязательно
* @public
*
* @returns {Promise} - Возвращает обновленный элемент списка
* @param {Element} data - элемент списка
*
* @returns {Promise<Element>} - Возвращает обновленный элемент списка
*/
async update(data) {
update = async (data) => {
const list = await this.request();
const findIndex = LocalStorageListApi.findIndex(list, data._id);
const findIndex = this._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);
await this._updateList(list);
return data;
}
/**
* @public
*
* @param {string} _id - _id удаляемого элемента
*
* @returns {Promise} - Возвращает _id удаленного элемента или ошибку
* @returns {Promise<string>} - Возвращает _id удаленного элемента или ошибку
*/
async remove(_id) {
remove = async (_id) => {
const list = await this.request();
const findIndex = LocalStorageListApi.findIndex(list, _id);
const findIndex = this._findIndex(list, _id);
if (findIndex === -1) {
throw new Error(`Not Found _id: ${_id}`);
}
list.splice(findIndex, 1);
await this.api.createOrUpdate(this.key, list);
await this._updateList(list);
return _id;
}
}
}
export default StorageListApi;

View File

@ -1,25 +1,64 @@
import axios from 'axios';
import {API_URL, ENDPOINT} from './consts';
/**
* @typedef Store
* @type {object}
* @property {string} key
* @property {unknown} value
*/
/**
* Класс для работы с store-service api
* @class
*/
class StorageServiceApi {
URL = `${API_URL}${ENDPOINT}`;
async request() {
/**
* @public
*
* @returns {Promise<Array<Store>>} - Возвращает список всех пар ключ-значение
*/
request = async () => {
const {data} = await axios.get(this.URL);
return data;
}
async find(key) {
const {data} = await axios.get(`${this.URL}/${key}`)
/**
* @public
*
* @param {string} key - ключ хранилища в api
*
* @returns {Promise<unknown>} - Возвращает значение по указанному ключу
*/
find = async (key) => {
const {data} = await axios.get(`${this.URL}/${key}`);
return data;
}
async createOrUpdate(key, value) {
const {data} = await axios.post(this.URL, {key, value})
/**
* @public
*
* @param {string} key - ключ хранилища в api
* @param {unknown} value - значение, которое будет хранится под указанным ключом
*
* @returns {Promise<unknown>} - возвращает вновь созданный элемент
*/
createOrUpdate = async (key, value) => {
const {data} = await axios.post(this.URL, {key, value});
return data;
}
async remove(key) {
/**
* @public
*
* @param {string} key - ключ хранилища api
*
* @returns {Promise<string>} - возвращает 'ok', если удаление было выполнено
*/
remove = async (key) => {
const {data} = await axios.delete(`${this.URL}/${key}`);
return data;
}

View File

@ -1,5 +1,15 @@
/**
* @type {string}
*/
export const API_URL = 'http://vigdorov.ru:4001';
export const ENDPOINT = '/store';
export const API_KEYS = {
/**
* @type {string}
*/
export const ENDPOINT = '/store';
/**
* @type {Object<string, string>}
*/
export const API_KEYS = {
};