Невозможно вставить отношения массива в Hasura / GraphQL с моей мутацией

Я использую клиент Apollo iOS для подключения к нашей среде докеров Hasura / postgress.

Я пытаюсь создать объект и заполнить его массивом отношений. Однако я получаю сообщение об ошибке в моем switch result заявлении:

variable subtasks of type [SubtaskReport_insert_input]! is used in position expecting SubtaskReport_arr_rel_insert_input

Я пробовал изменить тип с SubtaskReport_insert_input на SubtaskReport_arr_rel_insert_input, но генератор кода не генерирует SubtaskReport_arr_rel_insert_input типа.

Как создать этот массив, чтобы я мог успешно выполнить мутацию?

Моя мутация graphql выглядит следующим образом:

    mutation addTaskReport($category: String!, $duration: Int!, $interval: Int!, $ppgs: String!, $status: String!, $taskDescription: String!, $task_id: uuid!, $zone_name: String!, $subtasks: [SubtaskReport_insert_input]!) {
      insert_TaskReport(
        objects: {
          category: $category,
          duration: $duration,
          interval: $interval,
          ppgs: $ppgs,
          status: $status,
          taskDescription: $taskDescription,
          task_id: $task_id,
          zone_name: $zone_name
          subtasks: $subtasks
        }) {
        returning {
          id
        }
      }
    }

Код iOS, который я использую для создания и отправки мутации:

    func addTaskReport(for task: Task) {
      guard
        let category = task.category,
        let duration = task.duration,
        let interval = task.interval,
        let ppgsSet = task.ppgs,
        let zoneName = task.zoneOfTask?.name,
        let taskDescription = task.summary
        else {
          return
      }

      let taskReportId = UUID().uuidString.lowercased()

      var subtaskReports = [SubtaskReport_arr_rel_insert_input]()
      for subtask in task.subtasks as! Set<Subtask> {
        let subtaskReportId = UUID().uuidString.lowercased()
        let subtaskReport = SubtaskReport_insert_input(id: subtaskReportId, status: false, taskReportId: taskReportId, title: subtask.title)
        subtaskReports.append(subtaskReport)
      }

      let ppgs = ppgsSet as Set<PersonalProtectionGear>
      let ppgsStringArray = ppgs.compactMap({$0.name})
      let ppgsString = Array(ppgsStringArray).joined(separator:" ")

      self.apollo.perform(mutation: AddTaskReportMutation(
        category: category,
        duration: Int(duration),
        interval: Int(interval),
        ppgs: ppgsString,
        status: "open",
        taskDescription: taskDescription,
        task_id: taskReportId,
        zone_name: zoneName,
        subtasks: subtaskReports)
      ) { (result) in
        switch result {
          case .success(let graphQLResult):
            print("Simon Says graphQLResult \(graphQLResult)")//TODO: Remove
            break
          case .failure(let error):
            print("Simon Says error \(error)")//TODO: Remove
            break
        }
        print("Simon Says BreakHere")//TODO: Remove
      }
    }

person Tycho Pandelaar    schedule 01.04.2020    source источник


Ответы (1)


Добавление ключа data перед соответствующим ресурсом (subtasks) должно сработать для вас! Также совет: используйте также [SubtaskReport_insert_input!]!. Это ожидаемый тип *_array_rel_input.

Обновил запрос как таковой:

+   mutation addTaskReport($category: String!, $duration: Int!, $interval: Int!, $ppgs: String!, $status: String!, $taskDescription: String!, $task_id: uuid!, $zone_name: String!, $subtasks: [SubtaskReport_insert_input!]!) {
      insert_TaskReport(
        objects: {
          category: $category,
          duration: $duration,
          interval: $interval,
          ppgs: $ppgs,
          status: $status,
          taskDescription: $taskDescription,
          task_id: $task_id,
          zone_name: $zone_name
+         subtasks: {
+          data: $subtasks
+         }
        }) {
        returning {
          id
        }
      }
    }

Соответствующая документация: https://hasura.io/docs/1.0/graphql/manual/mutations/insert.html#insert-an-object-along-with-its-related-objects-through-relationships

Я определенно рекомендую использовать интерфейс GraphiQL для отладки запроса (а не вашего кода), потому что он дает предложения и проверки типа graphql, которые можно найти, посетив http://localhost:9695/api-explorer или http://localhost:8080/api-explorer.

person avimoondra    schedule 01.04.2020
comment
Спасибо за помощь. Работал как шарм. P.s. посещение api-explorer дало мне предупреждение {путь: $, ошибка: ресурс не существует, код: не найден} .... - person Tycho Pandelaar; 02.04.2020
comment
Большой! Хм @TychoPandelaar может открыть новый вопрос? Вероятно, связано с тем, как Hasura работает локально - с этой ошибкой также есть некоторые проблемы с Github. - person avimoondra; 03.04.2020