function getGql (endpoint){ let headers = { 'Content-Type': 'application/json;charset=utf-8', 'Accept': 'application/json' } return async function gql(query, variables={}) { if ("authToken" in localStorage) { headers.Authorization = "Bearer " + localStorage.authToken } let result = await fetch(endpoint, { method: 'POST', headers, body: JSON.stringify({ query, variables }) }).then(res => res.json()) if (("errors" in result) && !("data" in result)) { throw new Error(JSON.stringify(result.errors)) } result = Object.values(result.data)[0] return result } } /*Запрос на список корневых категорий Используем CategoryFind, однако в параметре query используем поиск по полю parent, которое должно быть равно null. (у корневых категорий нет родителя)*/ const gql = getGql('http://shop-roles.node.ed.asmer.org.ua/graphql') const gqlRootCats = () => gql(`query baseCategory($searchNullparent: String){ CategoryFind(query: $searchNullparent){ _id name parent { _id name } } }`, { searchNullparent: JSON.stringify([{parent: null}]) }) //gqlRootCats().then(console.log) /*Запрос для получения одной категории с товарами и картинками Используем CategoryFindOne, передав _id. Попросите GraphQL прислать вам товары из этой категории, а так же подкатегории. Параметр: _id*/ const gqlCategoryGoodsAndSubCategoryGoods = (_id) => gql(`query CategoryGoodsAndSubCategoryGoods($qCategoryId: String) { CategoryFindOne(query: $qCategoryId){ _id name parent{ _id name } subCategories{ _id name goods{ _id name } } goods{ _id name price images { url } } } }`, { qCategoryId: JSON.stringify([{ _id }]) }) //gqlCategoryGoodsAndSubCategoryGoods("62c94b10b74e1f5f2ec1a0dd").then(console.log) /*Запрос на получение товара с описанием и картинками Аналогично предыдущему запросу, но используем GoodFindOne, так же по _id. Параметр: _id*/ const gqlOneGoodWithDescriptionAndImages = (_id) => gql(`query oneGoodWithDescriptionAndImages($GoodId: String){ GoodFindOne(query: $GoodId){ _id description name price images{ url } } }`, { GoodId: JSON.stringify( [{ _id }] ) }) //gqlOneGoodWithDescriptionAndImages("62c94990b74e1f5f2ec1a0db").then(console.log) /*Запрос на регистрацию Используется мутация UserUpsert без указания _id пользователя. С указанием _id будет работать редактирование (обновление профиля). Параметры - логин и пароль*/ const gqlUserAdd = (login, password) => gql(`mutation registration($login:String, $password: String){ UserUpsert(user: {login:$login, password: $password}){ _id login createdAt } }`, { login, password } ) //gqlUserAdd("vasya321986320915sf5654755ssddgfg", "пороль").then(console.log) /*Запрос на логин query login. В ответ приходит токен. Пригодится для залогинивания через authReducer. Параметры: логин и пароль.*/ const gqllogin = (login, password) => gql(`query login($login:String, $password:String){ login(login:$login, password:$password) }`, { login, password } ) // gqllogin("vasya321986320915sf5654755ssddgfg", "пороль").then(x => {console.log(x) // localStorage.authToken = x}) /*Запрос истории заказов OrderFind. По умолчанию возвращает все ваши заказы (но не чужие). Если вы аноним - то и заказов у вас нет;*/ const gqlOrderFind = () => gql(`query { OrderFind(query: "[{}]") { _id createdAt total } }`, ) //gqlOrderFind().then(console.log) /*Запрос оформления заказа Мутация OrderUpsert с массивом orderGoods, в которых есть объект good с единственным полем - _id, а также count. Используя этот запросы мы будем передавать информацию из cartReducer на сервер для оформления заказа. Параметр: массив orderGoods с элементами вида {good: {_id}, count}. Параметров нет, так как thunk может прочитать состояние редьюсера корзины используя передаваемый в него getState. После успешного оформления заказа на бэке задиспатчить экшон очистки корзины;*/ //version2 const OrderUpsert2 = (arrGoods) => gql(`mutation ($arrGoods: [OrderGoodInput]){ OrderUpsert(order: {orderGoods: $arrGoods}) { _id, total, orderGoods { good { name } } } }`, { arrGoods } )