GraphQL в Nest JS передача данных от предков - PullRequest
0 голосов
/ 04 августа 2020

Я ищу элегантное решение для древовидной структуры

Я максимально упрощу его, но реальная структура намного сложнее, чем эта

 type LeafComponent {
    someData
 }

 type NodeComponent {
    renderComponents: [Component!]!
 }

 union Component = LeafComponent | NodeComponent

тогда у нас есть сущность root, которая похожа на NodeComponent, но также содержит каталог компонентов. Компоненты создаются пользователем, поэтому у нас есть каталог, и затем их можно сделать видимыми или невидимыми - поэтому у нас также есть renderComponents.

Итак, сущность в No SQL db выглядит так:

{ 
  masterId: 123456,
  catalog: [
     { id: 1, type: 'Node', renderComponentIds: [2, 3] },
     { id: 2, type: 'Leaf' },
     { id: 3, type: 'Node', renderComponentIds: [5] }
     { id: 4, type: 'Leaf' },
     { id: 5, type: 'Leaf' }
  ],
  renderComponentIds: [1, 4]
}

А теперь - какой хороший способ преобразовать ссылку ID внутри NodeComponent в сам компонент, чтобы вы могли иметь запрос вроде

    renderComponents {
       ...on LeafComponent {
          someData
       }
       ...on NodeComponent {
         renderComponents {
            ...etc.
         }
       }
    } 
  }

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

  @ResolveProperty('renderComponents', _returns => [Component])
  async renderComponents(@Parent() root: Root): Promise<Component[]> {
    return root.renderComponentIds.map(id => root.catalog.find(comp => comp.id = id));
  }

, но когда я начинаю работать с вложением через настраиваемый Resolver of NodeComponent - я потеряете каталог и не сможете легко преобразовать идентификаторы в компоненты. Есть ли простой и умный способ отправить каталог всем NodeComponents или мне нужно go через объект, который я получаю из базы данных, и внедрить этот каталог во всех дочерних элементов, у которых есть renderComponentIds? Есть ли способ обмениваться данными между резолверами - я на 100% уверен, что у меня есть каталог, поскольку я всегда обращаюсь ко всей структуре, которая хранится в БД как к единому объекту - я просто использую идентификаторы, чтобы уменьшить структуру.

...