habralab/garnet-team

Подключить к клиенту graphql

Closed this issue · 37 comments

С чем связан запрос на фичу?

Необходимо добавить для всех страниц graphql запросы

Расскажите как вы это себе видите

Добавить query и mutation запросы на страницы:

  • Профиль
  • Мой профиль
  • Поиск команд
  • Команда
  • Моя команда
  • Поиск проектов
  • Проект
  • Мой проект
  • Онбоардинг

DoD (критерий готовности)

На всех страницах проходят quiery и mutation запросы

Приложите пример реализаций

No response

Приложите материалы задачи

https://stage.garnet.pet-project.habr.com/api/sandbox/

@Nelfimov
Что можно с CORS сделать?

Ошибка:

Access to fetch at 'https://stage.garnet.pet-project.habr.com/api/sandbox' from origin 'http://localhost:3020' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

@picolino посмотришь пожалуйста настройки cors?

@picolino посмотришь пожалуйста настройки cors?

Готово. На stage можно обращаться с localhost

@Amiditin fyi

@picolino посмотришь пожалуйста настройки cors?

Готово. На stage можно обращаться с localhost

@Amiditin fyi

@picolino теперь такая ошибка падает:

Access to fetch at 'https://stage.garnet.pet-project.habr.com/api/sandbox' from origin 'http://localhost:3020' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

@Amiditin проверь еще разок

@picolino собираем бинго из ошибок, на этот раз:

Chrome v119.0.6045.105:

Access to fetch at 'https://stage.garnet.pet-project.habr.com/api/sandbox' from origin 'http://localhost:3020' has been blocked by CORS policy: Cannot parse Access-Control-Allow-Methods response header field in preflight response.

FIrefox v119.0:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://stage.garnet.pet-project.habr.com/api/sandbox. (Reason: invalid token ‘["POST"’ in CORS header ‘Access-Control-Allow-Methods’).
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://stage.garnet.pet-project.habr.com/api/sandbox. (Reason: CORS request did not succeed). Status code: (null).

@picolino @Demorey @gfg7

При загрузке аватарок падает 404, запрос:

mutation UserUploadAvatar($file: Upload!) {
  userUploadAvatar(input: { file: $file }) {
    id
    avatarUrl
  }
}

Вопросы:

  1. Чтобы получить все команды пользователя у нас есть запрос teamsListByUser, но для проектов аналогичного не нашел, т.е. projectsListByUser, как можно их получить? И такой же вопрос по командам projectsListByTeam.
  2. В payload teamsListByUser не хватает информации о количестве участников и проектов команды, которая необходима для этого ховер эффекта.

Чтобы получить все команды пользователя у нас есть запрос teamsListByUser, но для проектов аналогичного не нашел, т.е. projectsListByUser, как можно их получить? И такой же вопрос по командам projectsListByTeam.

query ProjectTeamParticipantsFilter - в инпуте айди проекта по которому надо отобрать команды-участников, в списке полученных объектов есть список из объектов пользователей-участников команды с их аватарками

Чтобы получить все команды пользователя у нас есть запрос teamsListByUser, но для проектов аналогичного не нашел, т.е. projectsListByUser, как можно их получить? И такой же вопрос по командам projectsListByTeam.

query ProjectTeamParticipantsFilter - в инпуте айди проекта по которому надо отобрать команды-участников, в списке полученных объектов есть список из объектов пользователей-участников команды с их аватарками

Этот вопрос про кейс, когда мы на странице пользователя/команды и нам нужно получить список проектов figma. А ProjectTeamParticipantsFilter возвращает информацию о командах для конкретного проекта, верно?

@Amiditin

При загрузке аватарок падает 404, запрос:

Добавь в запрос header:

GraphQL-preflight: 1

Он нужен по соображениям безопасности, поэтому отдает 404.


Но имей в виду, эндпоинты для взаимодействия с пользователем на редактирование должны выполняться под текущим пользователем. Сейчас у нас кратос не развернут на стейдже, нет нормальной регистрации и авторизации, к бекенду функционал "текущего пользователя" не подключен. Все запросы исполняются от системы. До момента развернутого и работоспособного кратоса с полным функционалом по регистрации и авторизации мы не сможем зафести фукнционал редактирования текущего пользователя.

Этот вопрос про кейс, когда мы на странице пользователя/команды и нам нужно получить список проектов figma.

Понял о чем ты, этих запросов действительно нет, добавлю

А ProjectTeamParticipantsFilter возвращает информацию о командах для конкретного проекта, верно?

Верно

@picolino

Добавь в запрос header:

GraphQL-preflight: 1
Он нужен по соображениям безопасности, поэтому отдает 404.

В первый раз запрос прошел успешно, а при следующих выкидывает такую ошибку:

{
  "errors": [
    {
      "message": "Unexpected Execution Error",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "userUploadAvatar"
      ]
    }
  ]
}

Кейс редактирования аватара.

Кейс редактирования аватара.

@Amiditin фикс на stage

  1. Чтобы получить все команды пользователя у нас есть запрос teamsListByUser, но для проектов аналогичного не нашел, т.е. projectsListByUser, как можно их получить? И такой же вопрос по командам projectsListByTeam.

@Amiditin добавил запросы ProjectFilterByTeamParticipantId и ProjectFilterByUserParticipantId

@Demorey запрос teamsListByUser на получение команд пользователя начал выдавать ошибку 500:

Запрос:

query UserGet($id: String!, $skip: Int!, $take: Int!) {
  teamsListByUser(input: { userId: $id, skip: $skip, take: $take }) {
    teams {
      id
      name
      avatarUrl
    }
  }
}

Ошибка:

{
  "errors": [
    {
      "message": "Unexpected Execution Error",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "teamsListByUser"
      ]
    }
  ]
}
gfg7 commented

@Demorey запрос teamsListByUser на получение команд пользователя начал выдавать ошибку 500:

если тестили в стейдж, какой userId был

@Demorey запрос teamsListByUser на получение команд пользователя начал выдавать ошибку 500:

если тестили в стейдж, какой userId был

system

gfg7 commented

@Demorey запрос teamsListByUser на получение команд пользователя начал выдавать ошибку 500:

если тестили в стейдж, какой userId был

system

почистила бд, теперь проходит

gfg7 commented

2. В payload teamsListByUser не хватает информации о количестве участников и проектов команды, которая необходима для этого ховер эффекта.

судя по дизайну, нужны еще сразу аватарки участников?

  1. В payload teamsListByUser не хватает информации о количестве участников и проектов команды, которая необходима для этого ховер эффекта.

судя по дизайну, нужны еще сразу аватарки участников?

Да, нужны, хотя бы первые 3

@Demorey запрос teamsListByUser на получение команд пользователя начал выдавать ошибку 500:

Аналогичная ситуация с projectsFilter

Запрос:

query ProjectFilters($search: String, $skip: Int!, $tags: [String!], $take: Int!) {
  projectsFilter(input: {search: $search, skip: $skip, tags: $tags, take: $take}) {
    projects {
      id
      projectName
      avatarUrl
    }
  }
}

Variables:

{
  "search": "",
  "skip": 0,
  "tags": [],
  "take": 0
}

@Demorey запрос teamsListByUser на получение команд пользователя начал выдавать ошибку 500:

Аналогичная ситуация с projectsFilter

Тоже подчистил бд, сейчас вроде проходит запрос

@Amiditin добавил запросы ProjectFilterByTeamParticipantId и ProjectFilterByUserParticipantId

При запросе ProjectFilters возвращается один проект с "ownerUserId": "system":

query ProjectFilters($search: String, $skip: Int!, $tags: [String!], $take: Int!) {
  projectsFilter(input: {search: $search, skip: $skip, tags: $tags, take: $take}) {
    projects {
      id
      projectName
      avatarUrl
      ownerUserId
    }
  }
}
variables
{
  "search": "",
  "skip": 0,
  "tags": [],
  "take": 0
}

При этом запрос projectFilterByUserParticipantId с "id": "system" возвращает пустой массив:

query UserGetProjects($id: String!) {
  projectFilterByUserParticipantId(userId: $id) {
    projects {
      id
      projectName
      avatarUrl
    }
  }
}
variables
{
  "id": "system"
}

Как я и говорил, у нас не будет адекватно работать функционал, связанный с пользователями, пока мы не настроим корректную регистрацию и авторизацию через kratos.

Предлагаю пока что жить на моках. В процессе сейчас добавление регистрации пользователей на бекенде, как закончим - полностью почистим базу (чтобы все было консистентным) и можно будет норм пользоваться и тестить.

@Demorey @gfg7
Для запросов teamParticipantFilter, teamUserJoinRequestsShow, teamJoinInvitationsShow можно в респонс добавить полностью информацию о пользователе? (имя, аватар, теги)

gfg7 commented

@Amiditin

Для запросов teamParticipantFilter можно в респонс добавить полностью информацию о пользователе? (имя, аватар, теги)

не вижу в дизайне показа тегов для списка участников, будут правки?

имя, аватар

добавлено в рамках #223

teamUserJoinRequestsShow, teamJoinInvitationsShow

добавлю

не вижу в дизайне показа тегов для списка участников, будут правки?

Да, для списка участников теги не нужны.

@Nelfimov
Зарегался на stage, запросы c /api/sandbox проходят, но с локалхоста нет 401, куки добавлены и идентичны stage. Что-то ещё нужно сделать?

@Nelfimov
Зарегался на stage, запросы c /api/sandbox проходят, но с локалхоста нет 401, куки добавлены и идентичны stage. Что-то ещё нужно сделать?

Попробуй порт поменять на 3000 у приложения для локальной разработки. Иначе призываем бэк.

Проблема в том, что куки в браузере указываются для текущей страницы (localhost).
И при запросах на стейдж автоматически не передаются, так как другой домен. Секьюрити.

Если выполнять запросы напрямую с куками из curl или postman - все будет ок. Нужно курить доку\конфиги чтобы все заработало. Если вообще так можно

@picolino @Nelfimov Как можно получить id авторизованного пользователя?

@Amiditin возможно с нашего бэка можно вытащить - они же делают у себя дубликат id пользователя.

Эндпоинта на получение текущего юзера мы не делали, вся нужная инфа по текущему пользаку есть в кратосе, эндпоинт указали выше

@Amiditin id можешь получить из kratos: https://www.ory.sh/docs/kratos/reference/api#tag/frontend/operation/toSession

@Nelfimov Откуда мне взять flow.id? в useFlow ничего не лежит

@Amiditin А зачем тебе flow.id? Там обычный запрос на эндпоинт с текущими куками кратоса

gfg7 commented

teamUserJoinRequestsShow, teamJoinInvitationsShow можно в респонс добавить полностью информацию о пользователе? (имя, аватар, теги)

#225