Я хочу использовать канал в 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);
}
...
}