vendure-simplified-collections-plugin
Version:
This `vendure` plugin allows you to maintain a two way relation between products and collections. `Vendure` by default only allows you to manage relations between your inventory and collections from the side of collections only. It complements this featur
156 lines (155 loc) • 8.32 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProductIdCollectionFilterUpdateService = void 0;
const common_1 = require("@nestjs/common");
const core_1 = require("@vendure/core");
const typeorm_1 = require("typeorm");
const helpers_1 = __importDefault(require("../helpers"));
let ProductIdCollectionFilterUpdateService = class ProductIdCollectionFilterUpdateService {
constructor(connections, collectionService) {
this.connections = connections;
this.collectionService = collectionService;
}
async handleExistingCollectionUpdated(ctx, productId, updatedIds) {
const collectionRepo = this.connections.getRepository(ctx, core_1.Collection);
const alreadyContainingCollectionsUpdateInputs = [];
const newContainingCollectionsUpdateInputs = [];
const existingCollectionsWithThisProduct = await collectionRepo.find({ where: {
productVariants: { productId }
} });
const newCollectionsWithThisProduct = await collectionRepo.find({ where: {
id: (0, typeorm_1.In)(updatedIds.filter((i) => !existingCollectionsWithThisProduct.find((c) => c.id == i)).map((i) => (0, helpers_1.default)(i)))
} });
//if exists in existingCollectionsWithThisProduct but not in updatedIds, removed
for (let collection of existingCollectionsWithThisProduct) {
let input = {
id: collection.id
};
let adjusted = [];
if (!updatedIds.find((i) => i == collection.id)) {
const thisCollectionsProductIdCollectionFilterIndex = collection.filters?.findIndex((f) => f.code === core_1.productIdCollectionFilter.code);
const thisCollectionsProductIdCollectionFilter = collection.filters[thisCollectionsProductIdCollectionFilterIndex];
if (thisCollectionsProductIdCollectionFilter?.args?.length) {
let productIdArgs = thisCollectionsProductIdCollectionFilter
.args.find((i) => i.name === "productIds");
if (productIdArgs) {
let ids = JSON.parse(productIdArgs.value).filter((i) => i != productId);
productIdArgs.value = JSON.stringify(ids);
thisCollectionsProductIdCollectionFilter.args[thisCollectionsProductIdCollectionFilterIndex] = {
name: productIdArgs.name,
value: productIdArgs.value
};
adjusted = [{
arguments: thisCollectionsProductIdCollectionFilter.args,
code: thisCollectionsProductIdCollectionFilter.code
}];
input.filters = adjusted;
}
}
alreadyContainingCollectionsUpdateInputs.push(input);
}
}
for (let newCollection of newCollectionsWithThisProduct) {
let input = {
id: newCollection.id
};
let adjusted = [];
const thisCollectionsProductIdCollectionFilterIndex = newCollection.filters?.findIndex((f) => f.code === core_1.productIdCollectionFilter.code);
const thisCollectionsProductIdCollectionFilter = newCollection.filters[thisCollectionsProductIdCollectionFilterIndex];
if (thisCollectionsProductIdCollectionFilter?.args?.length) {
let productIdArgs = thisCollectionsProductIdCollectionFilter
.args.find((i) => i.name === "productIds");
if (productIdArgs) {
let ids = JSON.parse(productIdArgs.value);
ids.push(productId);
productIdArgs.value = JSON.stringify(ids);
thisCollectionsProductIdCollectionFilter.args[thisCollectionsProductIdCollectionFilterIndex] = {
name: productIdArgs.name,
value: productIdArgs.value
};
adjusted = [{
arguments: thisCollectionsProductIdCollectionFilter.args,
code: thisCollectionsProductIdCollectionFilter.code
}];
input.filters = adjusted;
}
else {
let ids = [productId];
const newProductIdArgs = {
name: "productIds",
value: JSON.stringify(ids)
};
thisCollectionsProductIdCollectionFilter.args.push(newProductIdArgs);
thisCollectionsProductIdCollectionFilter.args.push({
name: "combineWithAnd",
value: "false"
});
adjusted = [{
arguments: thisCollectionsProductIdCollectionFilter.args,
code: thisCollectionsProductIdCollectionFilter.code
}];
input.filters = adjusted;
}
}
else {
let ids = [productId];
const newProductIdArgs = {
name: "productIds",
value: JSON.stringify(ids)
};
if (thisCollectionsProductIdCollectionFilter) {
thisCollectionsProductIdCollectionFilter.args = [
newProductIdArgs,
{
name: "combineWithAnd",
value: "false"
}
];
adjusted = [{
arguments: thisCollectionsProductIdCollectionFilter.args,
code: thisCollectionsProductIdCollectionFilter.code
}];
input.filters = adjusted;
}
else {
const newthisCollectionsProductIdCollectionFilter = {
args: [newProductIdArgs, {
name: "combineWithAnd",
value: "false"
}],
code: core_1.productIdCollectionFilter.code
};
adjusted = [{
arguments: newthisCollectionsProductIdCollectionFilter.args,
code: newthisCollectionsProductIdCollectionFilter.code
}];
input.filters = adjusted;
}
}
newContainingCollectionsUpdateInputs.push(input);
}
const awaitAbleActions = [];
for (let combined of [...newContainingCollectionsUpdateInputs, ...alreadyContainingCollectionsUpdateInputs]) {
awaitAbleActions.push(this.collectionService.update(ctx, combined));
}
await Promise.all(awaitAbleActions);
}
};
ProductIdCollectionFilterUpdateService = __decorate([
(0, common_1.Injectable)(),
__metadata("design:paramtypes", [core_1.TransactionalConnection,
core_1.CollectionService])
], ProductIdCollectionFilterUpdateService);
exports.ProductIdCollectionFilterUpdateService = ProductIdCollectionFilterUpdateService;