0
votes

I am trying to nest fragments (no-recursion or unbounded expansion) in my graphql query. But, either the graphql schema doesn't consider my query as valid, or the fragment definition seems redundant. My desired graphql response-structure is:

`
{  
    "data":{  
        "availability":{  
            "mon":{  
                "open":"5.00 a.m.",
                "close":"10.00 p.m.",
                "allday":false,
                "closed":false
            },
            "tue":{  
                "open":"5.00 a.m.",
                "close":"10.00 p.m.",
                "allday":false,
                "closed":false
            },
            "wed":{  
                "open":"5.00 a.m.",
                "close":"10.00 p.m.",
                "allday":false,
                "closed":false
            },
            "thu":{  
                "open":"5.00 a.m.",
                "close":"10.00 p.m.",
                "allday":false,
                "closed":false
            },
            "fri":{  
                "open":"5.00 a.m.",
                "close":"10.00 p.m.",
                "allday":false,
                "closed":false
            },
            "sat":{  
                "open":"5.00 a.m.",
                "close":"10.00 p.m.",
                "allday":false,
                "closed":false
            },
            "sun":{  
                "open":"5.00 a.m.",
                "close":"10.00 p.m.",
                "allday":false,
                "closed":false
            }
        }
    }
}
`

where availability has type Availability and mon, tue, etc. have type Day

Approach 1: This is not a valid syntax in graphql. graphql throws error (doesn't allow nesting this way)

`
fragment Hours on Day {
    open
    close
    allday
    closed
}

fragment DailyAvailability on Availability {
    mon 
    tue 
    wed 
    thu 
    fri 
    sat 
    sun
}

query {
    availability {
        ... DailyAvailability {
            ... Hours
        }
    }
}
`

Approach 2: This works, but seems redundant as I have to spread Hours on each Day separately.

`
fragment Hours on Day {
    open
    close
    allday
    closed
}

fragment DailyAvailability on Availability {
    mon {... Hours}
    tue {... Hours}
    wed {... Hours}
    thu {... Hours}
    fri {... Hours}
    sat {... Hours}
    sun {... Hours}
}

query {
    availability {
        ... DailyAvailability
    }
}
`

Please suggest if there is a way to nest fragments as I intend to do in my first approach.

1

1 Answers

1
votes

This looks like you want to use field-requests with "aliases". Your schema would look something like:

type QueryRoot {
  availability: Availability
}

type Availability {
  openingHours(forDay: WeekDay): Day
}

enum WeekDay {
  mon 
  tue 
  wed 
  thu 
  fri 
  sat 
  sun
}

type Day {
  open: String
  close: String
  allday: Boolean
  closed: Boolean
}

Then this query would give you what you asked for:

query q {
  availability {
    mon: openingHours(forDay: mon) { ... DailyAvailability }
    tue: openingHours(forDay: tue) { ... DailyAvailability }
    wed: openingHours(forDay: wed) { ... DailyAvailability }
    thu: openingHours(forDay: thu) { ... DailyAvailability }
    fri: openingHours(forDay: fri) { ... DailyAvailability }
    sat: openingHours(forDay: sat) { ... DailyAvailability }
    sun: openingHours(forDay: sun) { ... DailyAvailability }
  }
}
fragment DailyAvailability on Day {
  open
  close
  allday
  closed
}