распознаватели grapgql: поля с типами, которые ссылаются друг на друга - PullRequest
0 голосов
/ 30 марта 2020

У меня есть эта схема, и я внедряю ее в apollo-graphql, и у меня возникают проблемы при написании распознавателей для типов с подтипами, которые ссылаются друг на друга следующим образом.

Моя схема

type Period {
    start: DateTime!
    end: DateTime!
...
    equipment: [Equipment]
    events: [Event]
}

type Equipment {
    id: ID!
    name: String!
    model: Model!
    loads: [Load]
    events: [Event] <<<<
}

type Event {
    id: ID!
    start: DateTime!
    end: DateTime!
    duration: Duration!
    status: Status!
    equipment: Equipment! <<<<
}

Это обычно приводит к запросу, например

{
period (start:"2019-12-01 07:00:00" end:"2019-12-01 19:00:00")
  {
  equipment {
     id
     events {
         id
         status
         equipment {
            id
            events {
              ....
            }
         }  

     }
  }

}

. С точки зрения возвращаемых объектов это должно быть:

Period : is bound by a start and end.
Period.equipment : is all equipment used during that period.
period.equipment.events : would be all events in that period that relate to a this equipment
period.equipment.events.equipment : would be equipment that relate to these events.

... so on and so forth.

По сути, это приводит к серии фильтрации, которая необходимо передать в зависимости от периода, оборудования и событий.

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

One Подход, который я могу придумать, состоит в том, чтобы ... обработчик запросов для period вернуть equipmentId и eventId и иметь средства распознавания типов для equipment и `events

export const resolvers = {
    Query: {
     ...
        period: (_, { start, end }, { dataSources }) =>
            dataSources.Data.getPeriod({
                start: start,
                end: end
            }),

, а затем иметь тип распознаватели для Equipment и Events

    Equipment: {
...

        events: (equipment, { }, { dataSources }) => {
        // How can I get start,end values here?

//      code to return events
        },

но как тогда передать переменные фильтра start, end et c в эти типы?

Если я попытаюсь разрешить period.equiment как полевой преобразователь, то мне нужно удовлетворить n бесконечный уровень рекурсии как period.equipment.events.equipment.events .... верно?

Любая помощь или совет будут высоко оценены. Спасибо.

...