GraphQL назвал литерал объекта typeDef

Я работаю над личным проектом и пытаюсь найти лучший способ определить объект объектов, который выглядит следующим образом в определениях типов GraphQL.

{
    "2020-12-29": {
    open: true,
    hours: 2,
    appointments: {
        "09:00-am": {
            appointmentId: "5223a4ef-a3cf-4e2f-b761-3e06193e2e21",
            userName: "Shaun Cartwright Glover",
            email: "[email protected]",
            phoneNumber: "1-401-519-4771",
            avatar: "https://s3.amazonaws.com/uifaces/faces/twitter/ffbel/128.jpg",
        },
    },
    totalAppointments: 1,
},

Как видите, имя литерала Object для расписания верхнего уровня — это дата, и то же самое делается для каждой отдельной встречи. Я также использую graphql prisma, если это помогает.


person LTFoReal    schedule 28.12.2020    source источник


Ответы (1)


Чтобы следовать вашему примеру, давайте разобьем ваш литерал Object на сущности, которые он представляет. В деталях высокого уровня вы смотрите на

  • Сущность, представляющая назначение
  • Пользователь, связанный с указанным назначением
  • Список встреч, связанных с определенным временем встречи
  • Список AppointmentTimes для данного дня
  • Список дней в виде расписания

Мне кажется, что это близко (но не совсем) соответствует данным в вашем примере. Основываясь на этом, я определил схему ниже с некоторыми преднамеренными дизайнерскими решениями, которые немного отличаются от вашего предложения.

Давайте определим несколько типов и свяжем их вместе, начиная с типа User:

type User {
  id: ID!
  name: String!
  email: String!
  # Depending on your requirements, a user may not have to provide a phone number.
  phoneNumber: String
  # Depending on your requirements, a user may not have an Avatar.
  avatarUrl: String
}
type Appointment {
  id: ID!
  user: User!
}
type AppointmentTime {
  time: String!
  appointments: [Appointment!]!
}
type Day {
  # The Day ID could be the actual day itself, i.e. 2020-12-29
  id: ID!
  open: Boolean!
  hours: Int!
  appointmentTimes: AppointmentTime!
}
type Schedule {
 days: [Day!]!
}

это позволит вам написать запрос (при условии, что у вас есть запрос getSchedule или что-то подобное) следующим образом:

getSchedule {
  days {
    id
    open
    hours
    appointmentTimes {
      time
      appointments {
        id
        user {
          name
          email
          phoneNumber
          avatarUrl
        }
      }
    }
  }
}
{
  days: [
    {
      id: "2020-12-29",
      open: true,
      hours: 2,
      appointmentTimes: [
        {
          time: "09:00-am",
          appointments: [
            {
              id: "5223a4ef-a3cf-4e2f-b761-3e06193e2e21",
              user: {
                name: "John Smith",
                email: "[email protected]",
                phoneNumber: "123...",
                avatarUrl: "...",
              }
            },
            ...
          ]
        },
        ...
      ]
    },
    ...
  ]
}

Обратите внимание, что это приведет к немного другому результату, чем тот, который вы опубликовали. Почему?

Ну, я сделал следующие варианты дизайна, и я бы посоветовал вам изучить их тоже:

  1. Пользователь должен быть отдельным полем. В вашем примере пользователь и информация о встрече находятся под одним и тем же ключом — 09:00-am — здесь мы хотим использовать систему типов GraphQL для нормализации схемы, определяя тип User, который мы можем прикрепить к встрече. Также лучше для самоанализа.

  2. Ваш ключ appointments указывает на другой объект в качестве значения, а не на список. Поскольку вы возвращаете список встреч в конце дня, вы должны смоделировать его как Список GraphQL

  3. Добавлен тип AppointmentTime, связанный со списком встреч. Это позволяет потенциально иметь несколько встреч одновременно. (на будущее)

  4. Каждый день имеет список AppointmentTime --- это оптимально, поскольку теперь вы больше не зависите от ключа (в вашем случае 09:00-am) для определения данных, связанных с каждым временем встречи. (на будущее)

Если вы действительно хотите, чтобы литерал объекта точно соответствовал выводу graphql, вы можете встроить некоторые из полей, которые я выбрал для извлечения, в другие типы, но на самом деле вам следует использовать списки для такого рода вещей. .

person JosephHall    schedule 29.12.2020
comment
Спасибо за всю эту информацию, поэтому кажется, что в конечном итоге я должен использовать массивы для своего решения, а не карты с данными, живущими в именах ключей. Я думал, что так и будет в конце концов. Спасибо за ваш ответ. - person LTFoReal; 29.12.2020
comment
Ага! Точно @LTForReal - person JosephHall; 29.12.2020