Apollo iOS codegen: вложенное использование фрагмента в мутации создает неожиданные типы свойств в структуре Fragments

У меня есть следующий фрагмент:

fragment User on UserResponse {
    firstName
    lastName
    emailAddress
    emailConsent
    phoneNumber
}

Когда используется как корень в мутации, генерация кода будет правильно генерировать корень User структурировать в API.swift и использовать эту структуру в качестве типа пользовательских свойств в Fragments

Например.:

mutation updateUserYourInformation($phoneNumber: String!, $emailConsent: Boolean!) {
    updateUser(phoneNumber: $phoneNumber, emailConsent: $emailConsent) {
        ...User
    }
}

а также

mutation addRelations($spouse: Boolean!, $children: Int!, $roomMates: Int!) {
     addRelations(spouse: $spouse, roommates: $roomMates, children: $children) {
        ...User
    }
}

будет генерировать мутации, где оба UpdateUserYourInformationMutation.Data.UpdateUser.Fragments а также AddRelationsMutation.Data.AddRelation.Fragments имеет пользовательское свойство того же типа структуры User,

Однако при вложении фрагмента в мутацию генерируется вложенный фрагмент. User структура в структуре Mutation, которая будет типом пользовательского свойства в сгенерированном вложенном Fragments структура. Например:

mutation exchangePin($email: String!, $pin: String!) {
    exchangePinForToken(email: $email, pin: $pin) {
        valid
        user {
            ...User
        }
        authToken
        remainingAttempts
    }
}

будет генерировать ExchangePinMutation.Data.ExchangePinForToken.User а также ExchangePinMutation.Data.ExchangePinForToken.User.Fragments Структуры. Тем не менее, пользовательское свойство ExchangePinMutation.Data.ExchangePinForToken.User.Fragments имеет тип ExchangePinMutation.Data.ExchangePinForToken.User а не типа User, как я и ожидал.

Следовательно, типы различаются и для обновления текущего User объект в моем приложении, я должен сделать снимок ExchangePinMutation.Data.ExchangePinForToken.User и инициализировать новый User объект, использующий это: Например:

...
let userSnapshot = data.exchangePinForToken.user?.snapshot
Session.currentUser = User(snapshot: userSnapshot)
...

Может быть, я просто создаю свои фрагменты или мутации неправильно?

1 ответ

Решение

Проблема в том, что пользовательское свойство ExchangePinMutation.Data.ExchangePinForToken.User.Fragments struct должна иметь тип фрагмента User, но этот тип затеняется локальным типом ExchangePinMutation.Data.ExchangePinForToken.User.

Я исправил проблему, переименовав User фрагмент к UserFull и создание typealias: typealias User = UserFull

Рефакторинг практически не нужен!

https://github.com/apollographql/apollo-codegen/issues/394

Другие вопросы по тегам