UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

140 lines (139 loc) 6.57 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.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 } }); } }); }