@chevre/domain
Version:
Chevre Domain Library for Node.js
140 lines (139 loc) • 6.57 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.deleteOrder = deleteOrder;
const factory_1 = require("../delivery/factory");
const factory = require("../../factory");
/**
* 注文に関わるリソースを削除する
* 冪等性を確保すること
*/
function deleteOrder(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const orders = yield repos.order.projectFields({
limit: 1,
page: 1,
orderNumbers: [params.object.orderNumber]
}, { inclusion: ['orderDate', 'project', 'customer', 'orderNumber', 'seller', 'broker'] });
const order = orders.shift();
if (order === undefined) {
// すでに削除済
return;
}
if (typeof order.id !== 'string') {
throw new factory.errors.Internal(`order.id undefined. orderNumber: ${params.object.orderNumber}`);
}
// 注文アイテムの予約を削除
yield deleteReservationsByOrder(order)(repos);
// 所有権削除
try {
yield deleteOwnershipInfosByOrder(order)(repos);
}
catch (error) {
// tslint:disable-next-line:no-console
console.error('deleteOwnershipInfosByOrder throws', error);
}
// 経理レポート削除
yield repos.accountingReport.deleteByOrderNumber({ mainEntity: { orderNumber: order.orderNumber } });
// メモ削除(2024-02-15~)
yield repos.note.deleteManyByAbout({
about: {
id: order.id,
typeOf: factory.order.OrderType.Order
}
});
// 注文削除
yield repos.order.deleteByOrderNumber({ orderNumber: order.orderNumber });
// deletePerson(2024-12-25~)
yield deletePersonIfNecessary(order)(repos);
});
}
function deletePersonIfNecessary(order) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
var _a;
// 代理注文を除く
const isCustomerPerson = order.customer.typeOf === factory.personType.Person
&& typeof ((_a = order.broker) === null || _a === void 0 ? void 0 : _a.typeOf) !== 'string';
if (isCustomerPerson) {
const ordersByPerson = yield repos.order.projectFields({
limit: 1,
page: 1,
customer: { ids: [order.customer.id] }
}, { inclusion: ['orderNumber'] });
if (ordersByPerson.length === 0) {
const setting = yield repos.setting.findOne({ project: { id: { $eq: '*' } } }, ['userPoolIdNew']);
if (typeof (setting === null || setting === void 0 ? void 0 : setting.userPoolIdNew) !== 'string') {
throw new factory.errors.NotFound('setting.userPoolIdNew');
}
const deletePersonTask = {
project: { typeOf: factory.organizationType.Project, id: order.project.id },
name: factory.taskName.DeletePerson,
status: factory.taskStatus.Ready,
runsAt: new Date(),
remainingNumberOfTries: 10,
numberOfTried: 0,
executionResults: [],
data: {
id: order.customer.id,
agent: {
id: order.project.id,
typeOf: factory.organizationType.Project,
name: factory.organizationType.Project
},
physically: true,
userPoolId: setting.userPoolIdNew,
// project: { id: order.project.id },
migrate: false,
useUsernameAsGMOMemberId: false,
executeBackground: true
}
};
yield repos.task.saveMany([deletePersonTask], { emitImmediately: true });
}
}
});
}
function deleteReservationsByOrder(order) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const acceptedOffers = yield repos.acceptedOffer.searchAcceptedOffersByOrderNumber({
orderNumber: { $eq: order.orderNumber },
project: { id: { $eq: order.project.id } },
acceptedOffers: {
itemOffered: { typeOf: { $in: [factory.reservationType.BusReservation, factory.reservationType.EventReservation] } }
}
});
const reservationIds = acceptedOffers.map((o) => String(o.itemOffered.id));
if (reservationIds.length > 0) {
yield repos.reservation.deleteByIds({ project: { id: order.project.id }, ids: reservationIds });
}
});
}
function deleteOwnershipInfosByOrder(order) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const now = new Date();
const ownershipInfos = (0, factory_1.createOwnershipInfosFromOrder)({
order: Object.assign(Object.assign({}, order), { acceptedOffers: yield repos.acceptedOffer.searchAcceptedOffersByOrderNumber({
orderNumber: { $eq: order.orderNumber },
project: { id: { $eq: order.project.id } }
}) }),
offerIndexBase: 0
});
const ownershipIdentifiers = ownershipInfos.map((o) => String(o.identifier));
if (ownershipIdentifiers.length > 0) {
yield repos.ownershipInfo.deleteExpiredByIdentifiers({
project: { id: order.project.id },
identifiers: ownershipIdentifiers,
// 所有期限切れのもの(ownedThroughの存在しないものは削除してはいけない)
ownedThrough: { $lt: now }
});
}
});
}