Map Domain to GQL Types with Convertors
Convertor-Based Type Mapping
Use Convertors for all transformations between domain types and GQL types.
Map Domain to GQL Types with Convertors
Section titled “Map Domain to GQL Types with Convertors”GQL Raw -> Domain Model (Model Convertor)
Section titled “GQL Raw -> Domain Model (Model Convertor)”@riverpodConvertor<AttendeeModel, GQueryAttendeeData_attendee_attendeeItems>attendeeModelConvertor(Ref ref) { return Convertor((raw) { return AttendeeModel( id: raw.id ?? '', fullName: raw.fullName ?? 'Unknown', email: raw.email ?? '', jobTitle: raw.jobTitle ?? '', createdAt: raw.createdAt ?? DateTime.now(), ); });}Domain Filter -> GQL Filter (Filter Convertor)
Section titled “Domain Filter -> GQL Filter (Filter Convertor)”@riverpodConvertor<GattendeeFilters, AttendeeFilterCriteria>attendeeFilterConvertor(Ref ref) { return Convertor((filter) { return GattendeeFilters((b) => b ..id = filter.id ..fullName = filter.fullName != null ? GStringFiltersBuilder().construct(contains: filter.fullName) : null); });}Domain Sort -> GQL Sort (Sort Convertor)
Section titled “Domain Sort -> GQL Sort (Sort Convertor)”@riverpodConvertor<GattendeeOrder, AttendeeSortCriteria>attendeeSortConvertor(Ref ref) { return Convertor((sort) { return GattendeeOrder((b) => b ..fullName = sort.fullName?.value ..createdAt = sort.createdAt?.value); });}Domain Input -> GQL Mutation Vars (Input Convertor)
Section titled “Domain Input -> GQL Mutation Vars (Input Convertor)”@riverpodConvertor<GMutateAttendeeSaveVars, AttendeeUpsertInput>attendeeInputConvertor(Ref ref) { return Convertor((input) { return GMutateAttendeeSaveVars((b) => b ..attendeeArg.replace(GAttendeeArgs((args) => args ..fullName = input.fullName ..email = input.email ..jobTitle = input.jobTitle))); });}Usage with mightExecute
Section titled “Usage with mightExecute”For nullable parameters, use mightExecute which handles null input gracefully:
final params = ListRequestParams<GattendeeFilters, GattendeeOrder>( filter: filterConvertor.mightExecute(filter), // returns null if filter is null sort: sortConvertor.mightExecute(sort),);Why Convertors Instead of Extensions?
Section titled “Why Convertors Instead of Extensions?”| Concern | Manual Extensions | Convertors |
|---|---|---|
| Forgotten fields | Discovered at runtime | Explicit in Convertor function |
| Testability | Hard to test in isolation | Pure function, easy to unit test |
| Composability | No composition | Chain with .then(), .thenMap() |
| Null safety | Manual ?? handling | Centralized in one place |