Проблема: компания может связать записи, которые не принадлежат ей, просто сообщив идентификатор в отношении
Сценарий: Мой API-интерфейс состоит из нескольких компаний икаждая компания управляет вашими записями (продукты, заказы ...), но эти компании могут только просматривать и использовать записи, которые принадлежат им.Однако в заказ можно ввести идентификатор продукта другой компании, и он не должен
Пример: Компания Apple может сообщать продукт iPhone только в своих заказах, если онапри попытке сообщить пикселю Google должно появиться сообщение об ошибке
Наблюдения: Надеюсь, мне не нужно проверять каждую запись, связанную с заказом, перед сохранением, поскольку моя действительная схема имеет несколько взаимосвязей (20таблицы, связанные с порядком, примерно 2 уровня каскада), и это только небольшой пример.Было бы очень сложно найти в базе данных каждый продукт и убедиться, что он принадлежит компании.Я думаю, что было бы возможно предотвратить эту запись с некоторой настройкой индекса
Вопрос: Как я могу запретить связывать записи других компаний с текущими записями компании, даже сообщая идентификатор по запросу тела?
Буду признателен за вашу помощь, поскольку в этой ситуации у меня работает система.
company.entity.ts
@Entity()
export class Company {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Product, (product) => product.company)
products: Product[];
@OneToMany(() => Order, (order) => order.company)
orders: Order[];
}
product.entity.ts
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
description: string;
@ManyToOne(() => Company, (company) => company.products)
company: Company;
}
order.entity.ts
@Entity()
export class Order {
@PrimaryGeneratedColumn()
id: number;
@Column()
description: string;
@ManyToOne(() => Company, (company) => company.orders)
company: Company;
@ManyToMany(() => Product)
@JoinTable()
products: Product[];
}
order.controller.ts
@Controller('orders')
export class OrderController {
constructor(
@InjectRepository(Order)
public repository: Repository<Order>,
) { }
@Post()
public async create(@Body() body: Order): Promise<Order> {
body.id = undefined;
body = await this.repository.save(body);
return await this.repository.findOne(body.id, { relations: ['products'] });
}
@Put(':id')
public async update(@Param('id') id, @Body() body: Order): Promise<Order> {
body.id = Number(id);
await this.repository.save(body);
return await this.repository.findOne(id, { relations: ['products'] });
}
}
Таблица компании
- id : 1 описание : яблоко
- id : 2 описание : Google
Таблица элементов
- id : 1 описание : iPhone companyId: 1
- id : 2 описание : Google Pixel companyId: 2
POST http://localhost:3040/orders Запрос кузова: Obs .: heПользователь сообщает iPhone, который является продуктом, который он знает, и заставляет идентификатор продукта 2 быть неизвестным продуктом, потому что API GET проверяет, какие продукты видны Apple, в этом случае только iPhone
{
"company": 1,
"description": "Order 001",
"products": [
{
"id": 1,
"description": "iPhone"
},
{
"id": 2
}
]
}
Body Response: Obs .: даже сообщая продукт другой компании, по возвращении API представлен Google Pixel, который не может быть записан по заказу Apple.Здесь должно появиться сообщение об ошибке
{
"id": 2,
"description": "Order 001",
"products": [
{
"id": 1,
"description": "iPhone"
},
{
"id": 2,
"description": "Google Pixel"
}
]
}
Таблицы результатов
Таблица заказов
- id : 1 описание : Заказ 001 companyId : 1
Заказ Таблица продукции
- orderId : 2 productId : 1
- orderId : 2 productId : 2