getRelevantContent method Null safety
- {double randomSeed = 0,
- required int offset,
- required int limit,
- required LocalizedType<
Language> ? language, - required ContentElementType type,
- BuiltSet<
User> ? likedByUsers, - required BuiltSet<
LocalizedType< applicableInterests,Interest> > - required BuiltSet<
LocalizedType< applicableConditions}Condition> >
Retrieves relevant content for a user. Filters content elements by likes
if likedByUsers is not empty and by type. The random seed is used to
randomize elements returned by the backend. Specifying the same random
seed between calls ensures that the same order is maintained between pages.
Uses offset and limit for pagination.
Uses type for filtering the content elements to retrieve.
Implementation
Future<BuiltList<ContentElement>> getRelevantContent({
final double randomSeed = 0,
required final int offset,
required final int limit,
required final LocalizedType<Language>? language,
required final ContentElementType type,
BuiltSet<User>? likedByUsers,
required final BuiltSet<LocalizedType<Interest>> applicableInterests,
required final BuiltSet<LocalizedType<Condition>> applicableConditions,
}) async {
final requestedLocale = language?.defaultValue.isoCode ?? 'en';
likedByUsers ??= BuiltSet<User>();
final gqlQueryString = '''
query FetchAllContent {
getRelevantContent(
${likedByUsers.isNotEmpty ? 'likedByUsers: [${likedByUsers.map((e) => e.userId).join(',')}], ' : ''},
${applicableInterests.isNotEmpty ? 'applicableInterests: [${applicableInterests.map((e) => e.value(locale: requestedLocale).id).join(',')}], ' : ''},
${applicableConditions.isNotEmpty ? 'applicableConditions: [${applicableConditions.map((e) => e.value(locale: requestedLocale).id).join(',')}], ' : ''},
randomSeed: $randomSeed,
ofType: "${type.name}",
limit: $limit,
start: $offset,
locale: "$requestedLocale"
) {
${ContentElementGqlEntity.gqlQueryFragment}
}
}
''';
try {
final queryResult = await graphQLClient.query<void>(QueryOptions(
document: gql(gqlQueryString), fetchPolicy: FetchPolicy.networkOnly));
if (queryResult.hasException) {
logger?.e(queryResult.exception.toString());
return BuiltList<ContentElement>();
}
final data = queryResult.data!['getRelevantContent'] as List<dynamic>;
final l = data
.map((dynamic e) =>
ContentElementGqlEntity.fromJson(e as Map<String, dynamic>))
.where((element) => element != null)
.map((element) => element!.toContentElement())
.toBuiltList();
if (!_contentElementStreamController.isClosed) {
_contentElementStreamController
.add(l.map((c) => EntityRead<ContentElement>(c)).toBuiltList());
}
return l;
} catch (e, stackTrace) {
logger?.e('Could not read content elements', e.toString(), stackTrace);
return BuiltList<ContentElement>();
}
}