Skip to content

Map Domain to GQL Types with Convertors

Convertor-Based Type Mapping

Use Convertors for all transformations between domain types and GQL types.

@riverpod
Convertor<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)”
@riverpod
Convertor<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);
});
}
@riverpod
Convertor<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)”
@riverpod
Convertor<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)));
});
}

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),
);
ConcernManual ExtensionsConvertors
Forgotten fieldsDiscovered at runtimeExplicit in Convertor function
TestabilityHard to test in isolationPure function, easy to unit test
ComposabilityNo compositionChain with .then(), .thenMap()
Null safetyManual ?? handlingCentralized in one place