@chevre/domain
Version:
Chevre Domain Library for Node.js
105 lines (104 loc) • 5.3 kB
JavaScript
"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 }] }
}
});
}
});
}