Как я могу использовать type-graphql и RESTDataSource - PullRequest
1 голос
/ 10 января 2020

Интересно, как можно использовать RESTDataSource в type-graphql и при этом правильно кешировать в redis. Буду признателен за небольшой пример.

В данный момент я использую контейнер DI для получения службы, которая расширена из класса RestDataSource, но это не правильный путь.

BookmarkResolver.ts

import { Resolver, FieldResolver, Root, Query, Ctx, Authorized } from 'type-graphql';
import { DealService } from '../service/DealService';
import { AvailableLocale } from '../enum/AvailableLocale';
import { Bookmark } from '../entity/Bookmark';

@Resolver(_of => Bookmark)
export class BookmarkResolver {
  constructor(private dealService: DealService) {}

  @FieldResolver()
  async wordpressDeal(@Root() bookmark: Bookmark) {
    return await this.dealService.getDealById(bookmark.item_id, AvailableLocale.STAGING);
  }
}

DealService.ts

import { Service } from 'typedi';
import { AbstractService } from './AbstractService';
import { AvailableLocale } from '../enum/AvailableLocale';

@Service()
export class DealService extends AbstractService {
  baseURL = process.env.DEAL_SERVICE_URL;

  async getDealById(dealId: string | number, locale: AvailableLocale) {
    const response = await this.get(
      'deals/' + dealId,
      { locale }
    );

    return this.dealReducer(response);
  }

  dealReducer(deal: any) {
    return {
      id: deal.id || 0,
      title: deal.title
    };
  }
}

AbstractService.ts

import { RESTDataSource, HTTPCache } from 'apollo-datasource-rest';
import { Service } from 'typedi';

@Service()
export class AbstractService extends RESTDataSource {
  constructor() {
    super();
    this.httpCache = new HTTPCache();
  }
}
...