#Microservices, Federation 2, @ResolveReference doesn't work

5 messages · Page 1 of 1 (latest)

zealous quest
#

HelloEventDto

@ObjectType()
@Directive('@key(fields: "scheduled_event_id")')
@Directive('@shareable')
export class HelloEventDto {
  @Field(() => ID)
  scheduled_event_id: string;

  @Field()
  ws_connected: boolean;

  @Field(() => ScheduledEventDto)
  scheduled_event: ScheduledEventDto;

  @Field(() => SportTeamDto)
  away_sport_team: SportTeamDto;
}
#

SportTeamDto + BaseDto

@ObjectType()
@Directive('@shareable')
export class BaseDto {
  @Field(() => ID)
  id: string;

  @Field()
  created_at: Date;

  @Field()
  updated_at: Date;
}

@ObjectType()
@Directive('@key(fields: "id")')
@Directive('@shareable')
export class SportTeamDto extends BaseDto {
  @Field()
  created_by_id: string;

  @Field()
  name: string;

  @Field({ nullable: true })
  logo?: string;

  @Field()
  external_id: string;

  @Field(() => [String])
  home_team_of: string[];

  @Field(() => [String])
  away_team_of: string[];
}
#

SportTeamDto + BaseDto

@ObjectType()
@Directive('@shareable')
export class BaseDto {
  @Field(() => ID)
  id: string;

  @Field()
  created_at: Date;

  @Field()
  updated_at: Date;
}

@ObjectType()
@Directive('@key(fields: "id")')
@Directive('@shareable')
export class SportTeamDto extends BaseDto {
  @Field()
  created_by_id: string;

  @Field()
  name: string;

  @Field({ nullable: true })
  logo?: string;

  @Field()
  external_id: string;

  @Field(() => [String])
  home_team_of: string[];

  @Field(() => [String])
  away_team_of: string[];
}
#

HelloEventResolver + on scheduled-event-service

@Resolver((of) => HelloEventDto)
@UseGuards(GQLAuthGuard)
export class HelloEventResolver {
  log = new Logger(HelloEventResolver.name);

  constructor(
    private readonly cls: ClsService,
    private scheduledEventService: ScheduledEventService
  ) {}

  @Public()
  @Query(() => HelloEventDto)
  async helloScheduledEvent(@Args('data') data: GetUniqueInputDto) {
    this.log.debug(`helloScheduledEvent: ${data.id}`);
    const scheduled_event = await this.scheduledEventService.get(data);
    return {
      ws_connected: false,
      scheduled_event_id: scheduled_event.id,
      scheduled_event,
      active_interactions: [],
    };
  }

  @ResolveField((of) => SportTeamDto)
  async away_sport_team(@Parent() data: HelloEventDto) {
    console.log('RESOLVE FIELD away_team FOR', data);
    return {
      __typename: SportTeamDto,
      id: data.scheduled_event.sport_event.away_sport_team_id,
    };
  }
}

SportTeamResolver + on sport-service

@Resolver((of) => SportTeamDto)
@UseGuards(GQLAuthGuard)
export class SportTeamResolver {
  constructor(
    private readonly cls: ClsService,
    private sportTeamService: SportTeamService
  ) {}

  @ResolveReference()
  resolveReference(reference: { __typename: string; id: string }) {
    console.log('ResolveReference SportTeamDto', reference);
    return this.sportTeamService.get({ id: reference.id });
  }

  @Query(() => SportTeamDto)
  async getSportTeam(@Args('data') data: GetUniqueInputDto) {
    return await this.sportTeamService.get(data);
  }
}
#

HelloEventResolver + on scheduled-event-service

@Resolver((of) => HelloEventDto)
@UseGuards(GQLAuthGuard)
export class HelloEventResolver {
  log = new Logger(HelloEventResolver.name);

  constructor(
    private readonly cls: ClsService,
    private scheduledEventService: ScheduledEventService
  ) {}

  @Public()
  @Query(() => HelloEventDto)
  async helloScheduledEvent(@Args('data') data: GetUniqueInputDto) {
    this.log.debug(`helloScheduledEvent: ${data.id}`);
    const scheduled_event = await this.scheduledEventService.get(data);
    return {
      ws_connected: false,
      scheduled_event_id: scheduled_event.id,
      scheduled_event,
      active_interactions: [],
    };
  }

  @ResolveField((of) => SportTeamDto)
  async away_sport_team(@Parent() data: HelloEventDto) {
    console.log('RESOLVE FIELD away_team FOR', data);
    return {
      __typename: SportTeamDto,
      id: data.scheduled_event.sport_event.away_sport_team_id,
    };
  }
}

SportTeamResolver + on sport-service

@Resolver((of) => SportTeamDto)
@UseGuards(GQLAuthGuard)
export class SportTeamResolver {
  constructor(
    private readonly cls: ClsService,
    private sportTeamService: SportTeamService
  ) {}

  @ResolveReference()
  resolveReference(reference: { __typename: string; id: string }) {
    console.log('ResolveReference SportTeamDto', reference);
    return this.sportTeamService.get({ id: reference.id });
  }

  @Query(() => SportTeamDto)
  async getSportTeam(@Args('data') data: GetUniqueInputDto) {
    return await this.sportTeamService.get(data);
  }
}