graphQl.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. function getGql (endpoint){
  2. let headers = {
  3. 'Content-Type': 'application/json;charset=utf-8',
  4. 'Accept': 'application/json'
  5. }
  6. return async function gql(query, variables={}) {
  7. if ("authToken" in localStorage) {
  8. headers.Authorization = "Bearer " + localStorage.authToken
  9. }
  10. let result = await fetch(endpoint, {
  11. method: 'POST',
  12. headers,
  13. body: JSON.stringify({
  14. query,
  15. variables
  16. })
  17. }).then(res => res.json())
  18. if (("errors" in result) && !("data" in result)) {
  19. throw new Error(JSON.stringify(result.errors))
  20. }
  21. result = Object.values(result.data)[0]
  22. return result
  23. }
  24. }
  25. /*Запрос на список корневых категорий
  26. Используем CategoryFind, однако в параметре query используем поиск по полю parent, которое должно быть равно null. (у корневых категорий нет родителя)*/
  27. const gql = getGql('http://shop-roles.node.ed.asmer.org.ua/graphql')
  28. const gqlRootCats = () =>
  29. gql(`query baseCategory($searchNullparent: String){
  30. CategoryFind(query: $searchNullparent){
  31. _id name parent {
  32. _id
  33. name
  34. }
  35. }
  36. }`, {
  37. searchNullparent: JSON.stringify([{parent: null}])
  38. })
  39. //gqlRootCats().then(console.log)
  40. /*Запрос для получения одной категории с товарами и картинками
  41. Используем CategoryFindOne, передав _id. Попросите GraphQL прислать вам товары из этой категории, а так же подкатегории. Параметр: _id*/
  42. const gqlCategoryGoodsAndSubCategoryGoods = (_id) =>
  43. gql(`query CategoryGoodsAndSubCategoryGoods($qCategoryId: String) {
  44. CategoryFindOne(query: $qCategoryId){
  45. _id
  46. name
  47. parent{
  48. _id
  49. name
  50. }
  51. subCategories{
  52. _id
  53. name
  54. goods{
  55. _id
  56. name
  57. }
  58. }
  59. goods{
  60. _id name price
  61. images {
  62. url
  63. }
  64. }
  65. }
  66. }`, {
  67. qCategoryId: JSON.stringify([{ _id }])
  68. })
  69. //gqlCategoryGoodsAndSubCategoryGoods("62c94b10b74e1f5f2ec1a0dd").then(console.log)
  70. /*Запрос на получение товара с описанием и картинками
  71. Аналогично предыдущему запросу, но используем GoodFindOne, так же по _id. Параметр: _id*/
  72. const gqlOneGoodWithDescriptionAndImages = (_id) =>
  73. gql(`query oneGoodWithDescriptionAndImages($GoodId: String){
  74. GoodFindOne(query: $GoodId){
  75. _id
  76. description
  77. name
  78. price
  79. images{
  80. url
  81. }
  82. }
  83. }`, {
  84. GoodId: JSON.stringify( [{ _id }] )
  85. })
  86. //gqlOneGoodWithDescriptionAndImages("62c94990b74e1f5f2ec1a0db").then(console.log)
  87. /*Запрос на регистрацию
  88. Используется мутация UserUpsert без указания _id пользователя. С указанием _id будет работать редактирование (обновление профиля). Параметры - логин и пароль*/
  89. const gqlUserAdd = (login, password) =>
  90. gql(`mutation registration($login:String, $password: String){
  91. UserUpsert(user: {login:$login, password: $password}){
  92. _id login createdAt
  93. }
  94. }`, {
  95. login,
  96. password
  97. }
  98. )
  99. //gqlUserAdd("vasya321986320915sf5654755ssddgfg", "пороль").then(console.log)
  100. /*Запрос на логин
  101. query login. В ответ приходит токен. Пригодится для залогинивания через authReducer. Параметры: логин и пароль.*/
  102. const gqllogin = (login, password) =>
  103. gql(`query login($login:String, $password:String){
  104. login(login:$login, password:$password)
  105. }`, {
  106. login,
  107. password
  108. }
  109. )
  110. // gqllogin("vasya321986320915sf5654755ssddgfg", "пороль").then(x => {console.log(x)
  111. // localStorage.authToken = x})
  112. /*Запрос истории заказов
  113. OrderFind. По умолчанию возвращает все ваши заказы (но не чужие). Если вы аноним - то и заказов у вас нет;*/
  114. const gqlOrderFind = () =>
  115. gql(`query {
  116. OrderFind(query: "[{}]") {
  117. _id
  118. createdAt
  119. total
  120. }
  121. }`,
  122. )
  123. //gqlOrderFind().then(console.log)
  124. /*Запрос оформления заказа
  125. Мутация OrderUpsert с массивом orderGoods, в которых есть объект good с единственным полем - _id, а также count. Используя этот запросы мы будем передавать информацию из cartReducer на сервер для оформления заказа. Параметр: массив orderGoods с элементами вида {good: {_id}, count}. Параметров нет, так как thunk может прочитать состояние редьюсера корзины используя передаваемый в него getState. После успешного оформления заказа на бэке задиспатчить экшон очистки корзины;*/
  126. //version2
  127. const OrderUpsert2 = (arrGoods) =>
  128. gql(`mutation ($arrGoods: [OrderGoodInput]){
  129. OrderUpsert(order: {orderGoods: $arrGoods}) {
  130. _id, total, orderGoods {
  131. good {
  132. name
  133. }
  134. }
  135. }
  136. }`, {
  137. arrGoods
  138. }
  139. )