Я изучаю Nestjs и у меня возникают проблемы с пониманием того, как я могу изменить или скрыть поля при возврате данных пользователю.
например, у меня есть маршрут site.com/product/1
и поля в таблице продуктов: название, цена, категория, createdBy,
когда какой-то обычный пользователь попадает в API, я хочу скрыть createdBy, и когда администратор или администратор магазина попадает в API, я хочу вернуть созданное поле, а также как я могу этого добиться
Вы можете использовать Сериализацию! См. => https://docs.nestjs.com/techniques/serialization
Например, у вас есть сущность customer
, а маршрут для получения одного клиента — GET customer/:id
В вашем контроллере:
@Controller('customer')
export class CustomerController {
@Get(':id/v2')
public async getOneById(
@Param('id', new ParseIntPipe()) id: number,
): Promise<CustomerSerializer> {
return this.service.getOneCustomer(id);
}
}
В вашей службе:
export class CustomerService {
public async getOneCustomer(id): Promise<CustomerSerializer> {
// Get your customer in BDD
if (customers.data.length !== 1) {
throw new NotFoundException('customer not found');
}
return plainToInstance(CustomerSerializer, customers.data, {
groups: defaultCustomersGroupsForSerializing,
});
}
}
И ваш CustomerSerializer :
export const defaultCustomersGroupsForSerializing: string[] = [];
export const allCustomersGroupsForSerializing: string[] = [...defaultCustomersGroupsForSerializing, 'system'];
export class CustomerSerializer implements ICustomer {
@Expose({ group: 'system' })
@ApiProperty({ type: String })
public createdBy: string;
@Expose()
@IsString()
@IsNotEmpty()
@ApiProperty()
public legalName: string;
// ...
}
Соглашение состоит в том, чтобы никогда не выставлять сущность из маршрута, а либо копию, либо DTO, либо сериализованный объект.