Как интегрировать контекст в канал Nest.js? - PullRequest
0 голосов
/ 14 апреля 2019

Я хочу использовать канал в Nest.js для изменения передаваемых данных в соответствии с текущим пользователем. Как интегрировать контекст в канал?

Для создания базовой структуры я следовал инструкциям в документации :

import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';

@Injectable()
export class CheckPipe implements PipeTransform<any> {

  /**
   * Check input
   */
  async transform(value: any, { metatype }: ArgumentMetadata) {

    // Return value if it is only a basic type (without decorator)
    if (!metatype || this.isBasicType(metatype)) {
      return value;
    }

    // Get context
    const context = ???;

    // Restrict value for current user
    if (!context.currentUser.roles.includes('admin')) {
      delete value.id
    }

    // Return value
    return value;
  }

  /**
   * Checks if it is a basic type
   */
  private isBasicType(metatype: any): boolean {
    const types = [String, Boolean, Number, Array, Object];
    return types.includes(metatype);
  }
}

Я пытался интегрировать контекст через инъекцию:

@Injectable({ scope: Scope.REQUEST })
export class CheckPipe implements PipeTransform<any> {

  /**
   * Constructor to inject context
   */
  constructor(@Inject(CONTEXT) private readonly context) {}

  ...
}

И интегрировал трубу в модуль:

@Module({
  providers: [
    {
      provide: APP_PIPE,
      useClass: CheckPipe,
    },
  ],
})

Но this.context не определено.


Обновление: 15.04.2019 22: 32

Я использую канал в распознавателе GraphQL:

@Resolver(of => User)
export class UserResolver {

  ...

  /**
   * Create new user
   */
  @Mutation(returns => User, { description: 'Create a new user' })
  async createUser(@Args('input', CheckPipe) input: UserCreateInput): Promise<User> {
    return await this.usersService.create(input);
  }

  ...
}
...