| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- import {
- ChannelService,
- EntityHydrator,
- idsAreEqual,
- Injector,
- Order,
- OrderSellerStrategy,
- RequestContext,
- ShippingLine,
- ShippingLineAssignmentStrategy,
- } from '@vendure/core';
- export class MultivendorShippingLineAssignmentStrategy implements ShippingLineAssignmentStrategy {
- private entityHydrator: EntityHydrator;
- private channelService: ChannelService;
- init(injector: Injector) {
- this.entityHydrator = injector.get(EntityHydrator);
- this.channelService = injector.get(ChannelService);
- }
- async assignShippingLineToOrderLines(ctx: RequestContext, shippingLine: ShippingLine, order: Order) {
- // First we need to ensure the required relations are available
- // to work with.
- const defaultChannel = await this.channelService.getDefaultChannel();
- await this.entityHydrator.hydrate(ctx, shippingLine, { relations: ['shippingMethod.channels'] });
- const { channels } = shippingLine.shippingMethod;
- // We assume that, if a ShippingMethod is assigned to exactly 2 Channels,
- // then one is the default Channel and the other is the seller's Channel.
- if (channels.length === 2) {
- const sellerChannel = channels.find(c => !idsAreEqual(c.id, defaultChannel.id));
- if (sellerChannel) {
- // Once we have established the seller's Channel, we can filter the OrderLines
- // that belong to that Channel. The `sellerChannelId` was previously established
- // in the `OrderSellerStrategy.setOrderLineSellerChannel()` method.
- return order.lines.filter(line => idsAreEqual(line.sellerChannelId, sellerChannel.id));
- }
- }
- return order.lines;
- }
- }
|