@graphql_ru
GraphQL — русскоговорящее сообщество

Общаемся на темы, посвященные GraphQL и опыту его использования. Проблемы. Новости. Решения. Вам могут быть полезны: @apollo_ru, @react_js, @vuejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание в чате было полезным и комфортным.

352 members

Архив канала @graphql_ru 26 июня 2018 г.

10:09:56 ДП
User 119990994
где можно найти нормальный туториал по созданию регистрации и авторизации в призме? в доках тупа код без объяснений, еще и отличается от примеров, которые они запушили на гитхаб + эти примеры уже в архиве
10:10:56 ДП
User 3504523
User 119990994
где можно найти нормальный туториал по созданию регистрации и авторизации в призме? в доках тупа код без объяснений, еще и отличается от примеров, которые они запушили на гитхаб + эти примеры уже в архиве
Тут недавно советовали их ютуб канал, посмотри, может че-то полезное найдется https://www.youtube.com/channel/UCptAHlN1gdwD89tFM3ENb6w/videos
youtube.com/channel/UCptAHlN1gdwD89tFM3ENb6w
Build a GraphQL server with any database: Prisma is a performant open-source GraphQL ORM-like * layer doing the heavy lifting in your GraphQL server. https:/...
10:25:56 ДП
User 51988441
User 119990994
где можно найти нормальный туториал по созданию регистрации и авторизации в призме? в доках тупа код без объяснений, еще и отличается от примеров, которые они запушили на гитхаб + эти примеры уже в архиве
там изи
10:26:03 ДП
User 51988441
вообще супер изи
10:26:22 ДП
User 119990994
ну и где тутор или шо то такое
10:26:32 ДП
User 119990994
User 3504523
Тут недавно советовали их ютуб канал, посмотри, может че-то полезное найдется https://www.youtube.com/channel/UCptAHlN1gdwD89tFM3ENb6w/videos
youtube.com/channel/UCptAHlN1gdwD89tFM3ENb6w
Build a GraphQL server with any database: Prisma is a performant open-source GraphQL ORM-like * layer doing the heavy lifting in your GraphQL server. https:/...
здесь я посмотрел, есть 2 тутора, но они вроде старые
10:26:35 ДП
User 119990994
там graphcool юзается
10:27:04 ДП
User 119990994
если ничего годного не найду, зачекаю
10:27:21 ДП
User 119990994
но хотелось бы конечно нормальный тутор с объяснениями, а то дают тупа код копипастить и нифига больше
10:27:35 ДП
User 51988441
User 119990994
где можно найти нормальный туториал по созданию регистрации и авторизации в призме? в доках тупа код без объяснений, еще и отличается от примеров, которые они запушили на гитхаб + эти примеры уже в архиве
const jwt = require('jsonwebtoken')

function getUserId(ctx) {
  const Authorization = ctx.request.get('Authorization')
  if (Authorization) {
    const token = Authorization.replace('Bearer ', '')
    const { userId } = jwt.verify(token, "bbapi")
    return userId
  }

  throw new AuthError()
}

class AuthError extends Error {
  constructor() {
    super('Not authorized')
  }
}

module.exports = {
  getUserId,
  AuthError
}
10:27:57 ДП
User 119990994
это я у них на гитхабе видел
10:28:06 ДП
User 51988441
type Mutation {
  registerCustomer(email: String!, password: String!, login: String!): AuthPayload!
  registerOwner(email: String!, password: String!, login: String!): AuthPayload!
  login(email: String!, password: String!): AuthPayload!
}

type AuthPayload {
  token: String!
  user: User!
}
10:28:12 ДП
User 51988441
это в schema
10:28:15 ДП
User 51988441
пихаешь
10:28:23 ДП
User 119990994
о, ты сразу хочешь готовый код дать, ну давай)
10:28:26 ДП
User 119990994
а в index.js?
10:28:54 ДП
User 51988441
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')

const registerCustomer = async (_, { email, login, password }, ctx, info) => {
  const passwordHash = await bcrypt.hash(password, 10)
  const user = await ctx.db.mutation.createUser({
    data: {
      email,
      login,
      password: passwordHash
    }
  })

  return {
    token: jwt.sign({ userId: user.id }, "bbapi"),
    user
  }
}
10:29:00 ДП
User 51988441
и все)
10:29:13 ДП
User 119990994
а для registerOwner? login?)
10:29:13 ДП
User 51988441
const login = async (_, { email, password }, ctx, info) => {
  const user = await ctx.db.query.user({ 
    where: {
      email: email
    }
  })

  if (!user) {
    throw new Error(`No such user found for email or login`)
  }

  const valid = await bcrypt.compare(password, user.password)
  if (!valid) {
    throw new Error('Invalid password')
  }

  return {
    token: jwt.sign({ userId: user.id }, "bbapi"),
    user
  }
}
10:29:29 ДП
User 51988441
у меня просто несколько ролей
10:29:34 ДП
User 294802884
Приколисты (-:
10:29:53 ДП
User 119990994
хм, насколько я сейчас вижу - у тебя почти тот же самый код с гитхаба))
10:30:01 ДП
User 119990994
я у себя попробовал заюзать - нихуя не вышло
10:30:09 ДП
User 51988441
User 119990994
хм, насколько я сейчас вижу - у тебя почти тот же самый код с гитхаба))
да, я нечего почти не менял
10:30:27 ДП
User 51988441
у меня все запустилось в с первого раза
10:31:24 ДП
User 119990994
User 51988441
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')

const registerCustomer = async (_, { email, login, password }, ctx, info) => {
  const passwordHash = await bcrypt.hash(password, 10)
  const user = await ctx.db.mutation.createUser({
    data: {
      email,
      login,
      password: passwordHash
    }
  })

  return {
    token: jwt.sign({ userId: user.id }, "bbapi"),
    user
  }
}
а разве это не внутрь этого нужно?

const resolvers = {
  Mutation: {
 ...
    },
  }
10:31:41 ДП
User 51988441
User 119990994
а разве это не внутрь этого нужно?

const resolvers = {
  Mutation: {
 ...
    },
  }
да
10:32:00 ДП
User 51988441
ты же мутацию делаешь
10:32:42 ДП
User 119990994
а можешь показать пример вызова мутации?
10:33:00 ДП
User 119990994
User 51988441
type Mutation {
  registerCustomer(email: String!, password: String!, login: String!): AuthPayload!
  registerOwner(email: String!, password: String!, login: String!): AuthPayload!
  login(email: String!, password: String!): AuthPayload!
}

type AuthPayload {
  token: String!
  user: User!
}
т.е. при регистрации ты передаешь только мыло, пароль и логин?
10:33:15 ДП
10:35:18 ДП
User 119990994
ну у меня с моим кодом такая ошибка сейчас: secretOrPrivateKey must have a value
10:35:34 ДП
User 119990994
хотя я по сути тоже все так же копировал, просто под себя раскидал код чтобы структура такой же не была
10:36:08 ДП
User 341172775
User 119990994
ну у меня с моим кодом такая ошибка сейчас: secretOrPrivateKey must have a value
Ну значит ты не отправляешь value, очевидно же
10:36:21 ДП
User 119990994
а лол, работает
10:36:23 ДП
User 341172775
Мутацию свою покажи
10:36:53 ДП
User 119990994
token: jwt.sign({ userId: user.id }, process.env.APP_SECRET),
здесь проблема process.env.APP_SECRET из .env не берет
10:37:07 ДП
User 119990994
попробовал передать рандомную строку вместо этого - сработало
10:37:34 ДП
User 119990994
в чем тут может быть проблема? dotenv установлен
10:38:08 ДП
User 3504523
User 119990994
в чем тут может быть проблема? dotenv установлен
ты его в самом начале вызываешь?
10:38:37 ДП
10:38:48 ДП
User 3504523
да
require('dotenv').config()
10:38:57 ДП
User 119990994
я его вообще не вызываю...
10:39:02 ДП
10:39:07 ДП
10:39:17 ДП
User 3504523
https://github.com/motdotla/dotenv
github.com/motdotla/dotenv
Loads environment variables from .env for nodejs projects. - motdotla/dotenv
10:39:38 ДП
User 119990994
работает :))))
10:39:42 ДП
User 3504523
доки творят чудеса :)
10:39:56 ДП
User 119990994
та я примеры призмы смотрел на гитхабе, там без этого
10:40:14 ДП
User 119990994
но мне все равно не очень понятно зачем этот APP_SECRET если я смог передать любую строку и все сработало
10:40:28 ДП
User 3504523
примеры на то и примеры, чтобы показать направление
10:40:45 ДП
User 3504523
ну, это же ключ к jwt токену
10:40:52 ДП
User 287304803
потому что в production у тебя один secret, а в development другой
10:41:24 ДП
User 119990994
User 3504523
ну, это же ключ к jwt токену
т.е. типа при расшифроке мне понадобится этот secret?
10:42:16 ДП
User 3504523
не совсем. Паблик часть ты и без расшифровки можешь прочесть.
10:43:07 ДП
User 119990994
надо будет еще почитать об этом
10:43:38 ДП
User 3504523
https://www.youtube.com/watch?v=vQldMjSJ6-w&list=PLvTBThJr861y60LQrUGpJNPu3Nt2EeQsP

Вот, очень рекомендую эти видео
youtube.com/watch?v=vQldMjSJ6-w&list=PLvTBThJr861y60LQrUGpJNPu3Nt2EeQsP
Основные принципы работы JWT (Json Web Tokens)
10:43:52 ДП
User 119990994
и еще одно, в джс dotenv вызывается так - require('dotenv').config(), но как его вызвать для prisma.yml?
10:44:18 ДП
User 119990994
User 3504523
https://www.youtube.com/watch?v=vQldMjSJ6-w&list=PLvTBThJr861y60LQrUGpJNPu3Nt2EeQsP

Вот, очень рекомендую эти видео
youtube.com/watch?v=vQldMjSJ6-w&list=PLvTBThJr861y60LQrUGpJNPu3Nt2EeQsP
Основные принципы работы JWT (Json Web Tokens)
спасибо, посмотрю обязательно
10:44:32 ДП
User 119990994
User 119990994
и еще одно, в джс dotenv вызывается так - require('dotenv').config(), но как его вызвать для prisma.yml?
в примере было так:

endpoint: ${env:PRISMA_ENDPOINT}
datamodel: datamodel.graphql
secret: ${env:PRISMA_SECRET}
10:44:53 ДП
User 3504523
User 119990994
и еще одно, в джс dotenv вызывается так - require('dotenv').config(), но как его вызвать для prisma.yml?
а зачем его для призмы вызывать? ты реквайришь дотенв в самом начале исполнения твоего сервера. Где-то вверху своего app.js. И всё.
10:45:36 ДП
User 3504523
главное как можно выше и раньше, чтобы переменные окружения заинджектились до того как подключатся все модули
10:45:39 ДП
User 119990994
User 3504523
а зачем его для призмы вызывать? ты реквайришь дотенв в самом начале исполнения твоего сервера. Где-то вверху своего app.js. И всё.
ну типа в одном месте указал и все
10:46:03 ДП
User 3504523
вот это одно место - самый верх, самое начало твоего сервера
10:46:28 ДП
User 3504523
достаточно это сделать один раз и потом все переменные из .env файла будут доступны везде
10:46:51 ДП
User 3504523
главное только не коммить .env файл в репо
10:47:09 ДП
User 3504523
а храни его прямо на своем энвайрменте
10:47:10 ДП
User 119990994
User 3504523
главное только не коммить .env файл в репо
не коммичу, но вот призму я коммичу
10:47:46 ДП
User 119990994
поэтому хочу чтобы и в призме тянулось из .env, а не было вставлено руками
10:48:01 ДП
User 3504523
ну и правильно
в том окружении где ты будешь разворачивать приложение уже должен быть свой .env файл
10:48:32 ДП
User 3504523
или, если ты например в контейнере его будешь запускать - заинджектить эти переменные сразу в окружение
10:48:44 ДП
User 3504523
ну то есть банально в докер-компоуз описать что надо
10:49:35 ДП
User 3504523
в общем, файл .env  должен быть привязан к окружению, свой для локального дев сервера, свой для стейджжинга, свой для прода,
10:50:23 ДП
User 3504523
или же, если у тебя есть другой способ определения переменных окружения на этих серверах - используй их и всё
10:50:54 ДП
User 119990994
User 3504523
в общем, файл .env  должен быть привязан к окружению, свой для локального дев сервера, свой для стейджжинга, свой для прода,
я не совсем понимаю зачем так много, почему нельзя юзать один?
10:52:34 ДП
User 3504523
потому что у тебя на каждом из серверов будут свои переменные. Например разные адреса БД
10:52:50 ДП
User 3504523
ты ж для прода и для стейджинга явно две разные бд будешь юзать
10:53:51 ДП
User 3504523
вот всю инфу про бд (хост, порт, пароль, юзер, и т.п.) надо записывать в переменные окружения.

Это как конфиг файл привязанный к конкретному серверу на котором ты разворачиваешь свое приложение.
10:54:17 ДП
User 3504523
https://12factor.net/ru/
12factor.net/ru
A methodology for building modern, scalable, maintainable software-as-a-service apps.
10:54:37 ДП
User 3504523
вот, третий пункт читай, там все хорошо и развернуто описано
10:54:55 ДП
User 119990994
понял, спасибо большое
10:55:00 ДП
11:03:28 ДП
User 119990994
Как написать мутацию для этой модельки в одной функции?

Моделька:
type Action {
  id: ID! @unique
  title: String!
  date: String!
  description: String!
  karma: String!
  executors: String!
  members: [ActionMember!]!
  author: User!
}

type ActionMember {
  person: Person!
  side: String!
}

Как я сейчас пробую- https://gist.github.com/SilencerWeb/cda582b71d0548d22bfb19feb06389cd
12:55:48 ПП
User 144022504
User 119990994
где можно найти нормальный туториал по созданию регистрации и авторизации в призме? в доках тупа код без объяснений, еще и отличается от примеров, которые они запушили на гитхаб + эти примеры уже в архиве
https://www.youtube.com/watch?v=nyE6shIRzxM&list=PLN3n1USn4xlmqhVdKMurNREwtiUpq-SFy
youtube.com/watch?v=nyE6shIRzxM&list=PLN3n1USn4xlmqhVdKMurNREwtiUpq-SFy
Introduction for a new project I'm starting. It's going to be an eCommerce app built with React Native and Prisma GraphQL. Playlist: https://www.youtube.com/...
02:18:17 ПП
User 51988441
а есть кто использует graphql на ruby ?
02:18:21 ПП
User 51988441
есть вопросик
03:37:07 ПП
User 51988441
вообщем вопрос такой. есть клиент у него есть питомцы, связываю их 
class Types::ClientType < Types::BaseObject
 field :pets, [Types::PetType], null: false
end

в graphql, хочу сделать запрос такого типа.

{
  client (id: 1) {
    id
    pets(nickname: "some nickname") {
      id
      nickname
    }
  }
}

думал расскрыть field, но туда передается только GraphQL::Schema::Field, а мне нужно отловить питомцев, или id клиента, как такое провернуть?)