UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

105 lines (104 loc) 5.3 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.syncOfferCatalog = syncOfferCatalog; const factory = require("../../../factory"); /** * カタログのitemListElementを集計オファーへ同期する */ function syncOfferCatalog(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { // if (params.ids.length !== 1) { // throw new factory.errors.Argument('id', 'id.length must be 1'); // } var _a; if (params.isDeleted) { for (const offerCatalogId of params.ids) { // カタログを含む全集計オファーからカタログを除外 yield repos.aggregateOffer.pullIncludedInDataCatalog({ project: { id: params.project.id }, $pull: { includedInDataCatalog: { $elemMatch: { id: { $eq: offerCatalogId } } } } }); } } else { for (const offerCatalogId of params.ids) { let offerCatalogs = []; if (params.isOfferCatalogItem) { offerCatalogs = yield repos.offerCatalogItem.projectFields({ id: { $in: [offerCatalogId] } }, ['id', 'itemListElementTypeOf']); } else { offerCatalogs = yield repos.offerCatalog.projectFields({ id: { $in: [offerCatalogId] } }, ['id', 'itemListElementTypeOf']); } const itemListElementTypeOf = (_a = offerCatalogs.shift()) === null || _a === void 0 ? void 0 : _a.itemListElementTypeOf; switch (itemListElementTypeOf) { case factory.offerType.Offer: // includedInDataCatalogを単価オファーへ同期 yield syncOfferCatalogOfOffer2offer({ id: offerCatalogId, project: { id: params.project.id }, isOfferCatalogItem: params.isOfferCatalogItem })(repos); // 同期済記録を補完 if (params.isOfferCatalogItem) { yield repos.offerCatalogItem.updateDateSynced({ id: offerCatalogId, dateSynced: new Date() }); } else { yield repos.offerCatalog.updateDateSynced({ id: offerCatalogId, dateSynced: new Date() }); } break; case 'OfferCatalog': // 特に何もしない yield repos.offerCatalog.updateDateSynced({ id: offerCatalogId, dateSynced: new Date() }); break; default: // no op } } } }); } function syncOfferCatalogOfOffer2offer(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { // 集計オファーIDリストを検索 let aggregateOfferIds; if (params.isOfferCatalogItem) { const { itemListElement } = yield repos.offerCatalogItem.findItemListElementById({ id: params.id, project: { id: params.project.id } }); aggregateOfferIds = itemListElement.map((element) => element.id); } else { const { itemListElement } = yield repos.offerCatalog.findItemListElementById({ id: params.id, project: { id: params.project.id } }); aggregateOfferIds = itemListElement.map((element) => element.id); } // カタログを含み、かつ、新しいカタログに含まれない集計オファーからカタログを除外 yield repos.aggregateOffer.pullIncludedInDataCatalog(Object.assign({ project: { id: params.project.id }, $pull: { includedInDataCatalog: { $elemMatch: { id: { $eq: params.id } } } } }, (aggregateOfferIds.length > 0) ? { id: { $nin: aggregateOfferIds } } : undefined)); if (aggregateOfferIds.length > 0) { // 新しいカタログに含まれる全集計オファーにカタログを追加 yield repos.aggregateOffer.pushIncludedInDataCatalog({ project: { id: params.project.id }, id: { $in: aggregateOfferIds }, $push: { includedInDataCatalog: { $each: [{ id: params.id }] } } }); } }); }