gql-dart / ferry

Stream-based strongly typed GraphQL client for Dart
https://ferrygraphql.com/
MIT License
602 stars 116 forks source link

Using mixins for generating the fragments #511

Closed arreshashikant closed 1 year ago

arreshashikant commented 1 year ago

Regarding the fragment related fields, ferry generates:

  1. GPlaylistDetails_response_data
  2. GPlaylistByUserId_response_data

Can we convert graphql fragments as dart mixins. So that we don't generate separate models which are same.

  1. GPlaylistDetailsFragmentMixin
query PlaylistDetails($playlistId:String!){
    response:getPlaylistDetails(playlistId: $playlistId){
        message
        error
        data {
            ...PlaylistDetailsFragment
        }
    }
}

query PlaylistByUserId($privacy:privacyType!,$userId:String!,$after:String!){
    response:getAllPlaylists(privacy: $privacy,userId: $userId,after: $after){
        data {
            ...PlaylistDetailsFragment
        }
    }
}

fragment PlaylistDetailsFragment on playlist{
    privacy
    userId
    listOfPosts
    coverImage
    createdOn
    title
    playlistId
}
knaeckeKami commented 1 year ago

Hi!

The current behaviour is that way because it solves a more general problem:

Suppose you had these queries:

query PlaylistDetails($playlistId:String!){
    response:getPlaylistDetails(playlistId: $playlistId){
        message
        error
        data {
            ...PlaylistDetailsFragment
            additionalField1
        }
    }
}

query PlaylistByUserId($privacy:privacyType!,$userId:String!,$after:String!){
    response:getAllPlaylists(privacy: $privacy,userId: $userId,after: $after){
        data {
            ...PlaylistDetailsFragment
            additionalField2
        }
    }
}

fragment PlaylistDetailsFragment on playlist{
    privacy
    userId
    listOfPosts
    coverImage
    createdOn
    title
    playlistId
}

But did you notice that both generated classes implement the abstract class GPlaylistDetailsFragment and this abstract class defines all shared fields?

You can cast your models up to GPlaylistDetailsFragment if you want to write code that handles both models.

arreshashikant commented 1 year ago

Wow! I didn't notice this one. Thank you