Результат сглаживания из запроса Apollo / Hasura GraphQL с использованием Typescript - PullRequest
0 голосов
/ 23 марта 2020

Используя клиентские перехватчики Apollo, я получаю следующий запрос в компоненте:

import {
  gql
} from '@apollo/client';

interface User {
  id: number;
  email: string;
  role: string;
}

interface QueryData {
  organization_users: OrgUser[];
}

export const GET_USERS = gql `
  query GetUsers {
    organization_users {
      user {
        id
        email
      }
      role
    }
  }
`;

Как сделать так, чтобы результат возвращался с карты Hasura на мой интерфейс User правильно, эффективно выравнивая organization_users.user выше?

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Несколько предложений ...

  1. Создайте несколько логик преобразования c, которые сглаживают данные в памяти, т. Е. В Typescript вашего приложения используйте утверждение типа as. https://www.typescriptlang.org/docs/handbook/interfaces.html.

  2. создать представление в Hasura, которое объединяет столбцы user и organization_users. Таким образом, organization_users_view может быть определен как

select user.id as id, users.email as email, organization_users.role as role
  from organization_users 
  join users 
  on organization_users.user_id = users.id;

Таким образом, запрос выглядит так ...

export const GET_USERS = gql `
  query GetUsers {
    organization_users_view {
      id
      email
      role
    }
  }
`;

, который ближе с меньшим количеством кода, но удваивается убедитесь, что вы сохраняете преимущества кэша Apollo в увлажнении других частей вашего приложения, что в значительной степени зависит от идентификатора и типа ресурса. Это также требует некоторых дополнительных затрат на определение и / или изменение представления каждый раз, когда вам нужно больше столбцов (при необходимости можете использовать users. * И organization_users. *). Преимущество, однако, заключается в том, что это будет хорошо сочетаться с генерацией типов и компонентов ... поэтому вам не нужно определять интерфейс вручную.

0 голосов
/ 04 апреля 2020

Добавив еще одно предложение здесь к ответу avimoondra:

Вычисляемые поля

с помощью вычисляемых полей Hasura вы фактически можете избежать создания совершенно нового представления для его создания. На самом деле вы можете просто сделать role виртуальным свойством пользовательской схемы, определив функцию для объекта пользователя, которая возвращает роль.

Подробнее здесь: https://hasura.io/docs/1.0/graphql/manual/schema/computed-fields.html

...