Skip to content

Instantly share code, notes, and snippets.

@alexesDev
Last active January 13, 2024 00:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save alexesDev/4d9766bce86940106a1d97ee010c0c83 to your computer and use it in GitHub Desktop.
Save alexesDev/4d9766bce86940106a1d97ee010c0c83 to your computer and use it in GitHub Desktop.

Реализовать graphql апи по спеке schema.graphql с применением следующих библиотек:

Требования:

  • postgres база данных поднимается в докере
  • схема базы создается через миграции (любой инструмент вроде https://github.com/amacneil/dbmate)
  • проект должен запускаться парой команд вроде
    docker-compose up -d
    # любая команда прогона миграций на ваш выбор
    dbmate up
     # любая команда заливки тестовых данных на ваш выбор
    cat seed.sql | psql postgres://staging:staging@localhost:7232
    go run .

Описание апи

  • простой каталог из списка продуктов
  • возможность входа через смс код (сайт предлагает ввести номер телефона и отправляет код через смс, после ввода кода просходит авторизация или регистрация, если пользователь не существовал в базе)
  • получить данные пользователя, если есть токен после signInByCode

Примеры запросов

Получить список продуктов

query {
  products {
    id
    name
  }
}

Отправить смс с кодом на указанный номер (для теста просто писать код в терминале). Запрос вернет null (все ок) или ошибку.

mutation {
  requestSignInCode(input: { phone: "799999999" }) {
    message
  }
}

Авторизация с номер+код, результатом является токен или ошибка

mutation {
  signInByCode(input: { phone: "799999999", code: "0000" }) {
    ... on SignInPayload {
      token
      viewer {
        user {
          phone
        }
      }
    }
    ... on ErrorPayload {
      message
    }
  }
}

С токеном можно получить данные пользователя. Токен передавать через куки или Authorization заголовок (лучше заголовок тк это поддерживает GraphqlIDE встроенная)

query {
  viewer {
    user {
      phone
    }
  }
}
version: '2.4'
services:
postgres:
image: postgres:10.7
environment:
- POSTGRES_USER=staging
- POSTGRES_PASSWORD=staging
ports:
- 7232:5432
type Product {
id: Int!
name: String!
}
type User {
id: Int!
phone: String!
}
type Viewer {
user: User
}
type Query {
products: [Product!]
viewer: Viewer!
}
type ErrorPayload {
message: String!
}
input SignInByCodeInput {
phone: String!
code: String!
}
input RequestSignInCodeInput {
phone: String!
}
type SignInPayload {
token: String!
viewer: Viewer!
}
union SignInOrErrorPayload = SignInPayload | ErrorPayload
type Mutation {
requestSignInCode(input: RequestSignInCodeInput!): ErrorPayload
signInByCode(input: SignInByCodeInput!): SignInOrErrorPayload!
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment