Я настраиваю API-интерфейс GraphQL для nodeJS и экспериментирую с точкой блокировки для одного из типов вывода моего ресурса.
Функция представляет собой форму, которая содержит три различных уровня:
- Уровень 1 - formTemplate
- Уровень 2 - formItems (templateId, тип (видео, изображение, вопрос) - 1-N отношение с formTemplate)
- Уровень 3 - formQuestions (0-1 связь с formItem тогда и только тогда, когда formItems.type равен 'question')
Мой ресурс GraphQL возвращает все шаблоны в базе данных, поэтому это массив, в котором для каждого шаблона возвращаются все его элементы икаждый элемент типа «вопрос» должен возвращать массив, содержащий связанный вопрос.
Моя проблема: я действительно не знаю, как вернуть пустой тип объекта для formItems, где тип отличается от «вопроса»"или, если есть подход лучше для такой ситуации
Я пытался взглянуть на директивы GraphQL и встроенные фрагменты, но я думаю, что это действительно нужнобыть управляемым серверной стороной, потому что он прозрачен для потребителя API.
const formTemplate = new GraphQLObjectType({
name: 'FormTemplate',
fields: () => {
return {
id: {
type: new GraphQLNonNull(GraphQLInt)
},
authorId: {
type: new GraphQLNonNull(GraphQLInt)
},
name: {
type: new GraphQLNonNull(GraphQLString)
},
items: {
type: new GraphQLList(formItem),
resolve: parent => FormItem.findAllByTemplateId(parent.id)
}
}
}
})
const formItem = new GraphQLObjectType({
name: 'FormItem',
fields: () => {
return {
id: {
type: new GraphQLNonNull(GraphQLInt)
},
templateId: {
type: new GraphQLNonNull(GraphQLInt)
},
type: {
type: new GraphQLNonNull(GraphQLString)
},
question: {
type: formQuestion,
resolve: async parent => FormQuestion.findByItemId(parent.id)
}
}
}
})
const formQuestion= new GraphQLObjectType({
name: 'FormQuestion',
fields: () => {
return {
id: {
type: new GraphQLNonNull(GraphQLInt)
},
itemId: {
type: new GraphQLNonNull(GraphQLInt)
},
type: {
type: new GraphQLNonNull(GraphQLString)
},
label: {
type: new GraphQLNonNull(GraphQLString)
}
}
}
})
Мой запрос GraphQL:
query {
getFormTemplates {
name
items {
type
question {
label
type
}
}
}
}
То, что я ожидаю, это
{
"data": {
"getFormTemplates": [
{
"name": "Form 1",
"items": [
{
"type": "question",
"question": {
"label": "Question 1",
"type": "shortText"
},
{
"type": "rawContent"
"question": {}
}
]
}
]
}
}