Код: Выделить всё
type Artist {
name: String!
fans(first: Int, after: String, last: Int, before: String): FanConnection!
}
type ArtistConnection {
edges: [ArtistEdge!]!
pageInfo: PageInfo!
}
type ArtistEdge {
cursor: String!
node: Artist!
}
type FanConnection {
edges: [FanEdge!]!
pageInfo: PageInfo!
}
type FanEdge {
cursor: String!
node: Fan!
}
type Fan {
name: String!
}
type PageInfo {
hasPreviousPage: Boolean!
hasNextPage: Boolean!
startCursor: String
endCursor: String
}
type Query {
artists(first: Int, after: String, last: Int, before: String): ArtistConnection!
}
Как правильно обрабатывать пакетную загрузку объектов Fan для всех объектов Artist в результате этого запроса:
Код: Выделить всё
query {
artists {
name
fans(first: 10) {
name
}
}
}
Вот что у меня было на данный момент:
Регистрация загрузчика данных:
Код: Выделить всё
FanController(final FanService fanService, final BatchLoaderRegistry batchLoaderRegistry) {
this.fanService = fanService;
batchLoaderRegistry
.forName("artistFansDataLoader")
.registerMappedBatchLoader((final Set artists, final BatchLoaderEnvironment environment) -> {
final GraphQLContext graphQLContext = Optional.ofNullable(environment.getContext())
.map(GraphQLContext.class::cast)
.orElseThrow(() -> new InternalError("Failed to get GraphQL Context"));
final Identity identity = Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.map(Authentication::getPrincipal)
.map(Identity.class::cast)
.orElseThrow(() -> new InternalError("Failed to get authentication principal"));
final ScrollSubrange scrollSubrange = graphQLContext.get("scrollSubrange");
return (Mono) this.fansByArtists(artists, identity, scrollSubrange);
});
}
Код: Выделить всё
@SchemaMapping(typeName = "Artist", field = "fans")
public CompletableFuture artistFans(
final GraphQLContext context,
final ScrollSubrange scrollSubrange,
@Qualifier("artistFansDataLoader") final DataLoader loader,
final Artist artist
) {
return loader.load(artist);
}
Код: Выделить всё
private Mono fansByArtists(
final Set artists,
final Identity identity,
final ScrollSubrange scrollSubrange
) {
final Map result = artists.parallelStream()
.collect(Collectors.toMap(
Function.identity(),
artist -> this.fanService.list(
new ListFansRequest(
identity.accountId(),
Collections.singleton(artist.id()),
scrollSubrange
)
)
));
return Mono.just(result);
}
Непреобразуемые типы; невозможно привести 'Mono' к 'Mono'
Подробнее здесь: https://stackoverflow.com/questions/798 ... ng-graphql
Мобильная версия