Тип внутреннего объединения Graphql rosolve на основе info.rootValue - PullRequest
0 голосов
/ 08 июля 2019

Итак, у меня есть внутренний тип объединения, который мне нужно разрешить во время выполнения.На родительском объекте у меня есть поле type, которое сообщит мне, какой тип мутации произошел, и на том же родительском объекте у меня есть поле payload, которое имеет тип этого объединения.

enum OrgMutationType {
   JOIN_ORG
   LEAVE_ORG
   CHANGE_PERMISSIONS
}

union OrgMutatedSubscriptionPayloadUnion =
     JoinOrgMutationResponse |
     LeaveOrgMutationResponse |
     ChangePermissionsMutationResponse

type OrgMutatedSubscriptionPayload {
    type: OrgMutationType
    payload: OrgMutatedSubscriptionPayloadUnion
}

extend type Subscription {
   orgMutated(organization: ID!): OrgMutatedSubscriptionPayload
}

В функции __resolveType я получаю объект payload и на основании этого мне нужно разрешить тип.К сожалению, они payload не содержат type объекта

Так что у меня есть

  OrgMutatedSubscriptionPayloadUnion: {
      __resolveType(payload) {
          // Here i need to access the `parent.type` to make a switch
          // and return the appropriate type
      }
  }

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

Я обнаружил, что в объекте info (3-й аргумент в функции __resolveType) я могу получить доступ к rootValue, что даст мне доступ к type поле родителя.Так что я могу сделать это

  OrgMutatedSubscriptionPayloadUnion: {
      __resolveType(payload, context, info) {
          switch(info.rootValue.type) {
              case('JOIN_ORG'): 
                   return 'JoinOrgMutationResponse';
              case('LEAVE_ORG'): 
                   return 'LeaveOrgMutationResponse';
              ...
          }
      }
  }

Это хорошая идея, чтобы получить к нему доступ таким образом?Есть ли какие-либо подводные камни?

В противном случае, я думаю, что другое решение - сделать объединение целым родительским типом, который даст мне доступ к полю type и переключиться на его основе.В этом случае, хотя я вижу, что мне нужно будет реплицировать больше типов, чтобы создать этот союз.

Есть предложения?Является ли info.rootValue верным решением?

...