UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

190 lines (189 loc) 10.1 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.sendOrder = sendOrder; const createDebug = require("debug"); // import { createMaskedCustomer } from '../../factory/order'; const factory_1 = require("../delivery/factory"); const findPlaceOrderTransaction_1 = require("./findPlaceOrderTransaction"); const onOrderStatusChanged_1 = require("./onOrderStatusChanged"); const factory = require("../../factory"); const debug = createDebug('chevre-domain:service:order'); /** * 注文を配送する */ function sendOrder(params) { // tslint:disable-next-line:max-func-body-length return (repos // settings: Settings ) => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c; if (typeof params.useOnOrderStatusChanged !== 'boolean') { throw new factory.errors.Argument('useOnOrderStatusChanged', 'must be boolean'); } if (typeof ((_a = params.object.acceptedOffers) === null || _a === void 0 ? void 0 : _a.limit) !== 'number') { throw new factory.errors.Argument('object.acceptedOffers.limit', 'must be number'); } if (typeof ((_b = params.object.acceptedOffers) === null || _b === void 0 ? void 0 : _b.page) !== 'number') { throw new factory.errors.Argument('object.acceptedOffers.page', 'must be number'); } if (params.object.acceptedOffers.limit <= 0) { throw new factory.errors.Argument('object.acceptedOffers.limit', 'must be greater than 1'); } if (params.object.acceptedOffers.page <= 0) { throw new factory.errors.Argument('object.acceptedOffers.page', 'must be greater than 1'); } try { const orderNumber = params.object.orderNumber; const confirmationNumber = params.object.confirmationNumber; const placeOrderTransaction = yield (0, findPlaceOrderTransaction_1.findPlaceOrderTransaction)({ project: { id: params.project.id }, confirmationNumber, orderNumber })({ transaction: repos.transaction }); // 注文取得 let order = yield repos.order.projectFieldsByOrderNumber({ orderNumber, project: { id: params.project.id }, inclusion: ['confirmationNumber', 'project', 'typeOf', 'seller', 'orderNumber', 'price', 'priceCurrency', 'orderDate', 'customer'] }); // プロジェクト条件検証 if (order.project.id !== params.project.id) { throw new factory.errors.NotFound('Order'); } // 確認番号検証 if (order.confirmationNumber !== confirmationNumber) { throw new factory.errors.NotFound('Order'); } // const maskedCustomer = createMaskedCustomer(order, { noProfile: true }); const simpleOrder = { typeOf: order.typeOf, // seller: { // id: order.seller.id, // typeOf: order.seller.typeOf, // name: order.seller.name // }, // 廃止(2024-03-06~) // customer: { typeOf: maskedCustomer.typeOf, id: maskedCustomer.id }, // 廃止(2024-03-06~) orderNumber: order.orderNumber, // price: order.price, // priceCurrency: order.priceCurrency, orderDate: order.orderDate }; const { limit, page } = params.object.acceptedOffers; const sendOrderObject = Object.assign(Object.assign({}, simpleOrder), { acceptedOffers: { limit, page } }); const sendOrderActionAttributes = { agent: (typeof ((_c = params.agent) === null || _c === void 0 ? void 0 : _c.typeOf) === 'string') ? params.agent : order.project, object: sendOrderObject, // potentialActions: {}, project: order.project, recipient: { id: order.customer.id, typeOf: order.customer.typeOf }, typeOf: factory.actionType.SendAction }; const action = yield repos.action.start(sendOrderActionAttributes); let creatingOwnershipInfos = []; let createdOwnershipInfos = []; let allOffersDelivered = false; let acceptedOffers; // 所有権生成を最小化(2024-03-01~) let createOwnerships = false; switch (order.customer.typeOf) { case factory.creativeWorkType.WebApplication: break; default: createOwnerships = true; } try { const offerIndexBase = (limit * (page - 1)); const searchSlicedAcceptedOffersResult = yield repos.acceptedOffer.searchSlicedAcceptedOffersByOrderNumber({ $slice: [offerIndexBase, limit], orderNumber: { $eq: order.orderNumber }, project: { id: { $eq: order.project.id } } }); acceptedOffers = searchSlicedAcceptedOffersResult.acceptedOffers; debug('delivering...', order.orderNumber, acceptedOffers.map((offer) => `${offer.itemOffered.id}`), params.object.acceptedOffers, 'offerIndexBase:', offerIndexBase); // 所有権作成 if (createOwnerships) { creatingOwnershipInfos = (0, factory_1.createOwnershipInfosFromOrder)({ order: Object.assign(Object.assign({}, order), { acceptedOffers }), offerIndexBase }); createdOwnershipInfos = yield Promise.all(creatingOwnershipInfos.map((creatingOwnershipInfo) => __awaiter(this, void 0, void 0, function* () { const { id } = yield repos.ownershipInfo.createIfNotExistByIdentifier(creatingOwnershipInfo); return Object.assign({ id }, (typeof creatingOwnershipInfo.identifier === 'string') ? { identifier: creatingOwnershipInfo.identifier } : undefined); }))); } // const deliveredCount = limit * page; // debug(deliveredCount, 'delivered.', order.orderNumber, params.object.acceptedOffers); if (acceptedOffers.length === 0) { order = yield repos.order.changeStatus({ project: { id: order.project.id }, orderNumber, orderStatus: factory.orderStatus.OrderDelivered, previousOrderStatus: params.object.previousOrderStatus }); allOffersDelivered = true; } } catch (error) { try { yield repos.action.giveUp({ typeOf: sendOrderActionAttributes.typeOf, id: action.id, error }); } catch (_) { // no op } throw error; } const result = createdOwnershipInfos; yield repos.action.completeWithVoid({ typeOf: sendOrderActionAttributes.typeOf, id: action.id, result: result }); debug('allOffersDelivered?:', allOffersDelivered, order.orderNumber); if (params.useOnOrderStatusChanged) { if (allOffersDelivered) { yield (0, onOrderStatusChanged_1.onOrderDelivered)({ order: { id: order.id, customer: order.customer, orderDate: order.orderDate, orderNumber: order.orderNumber, project: order.project, typeOf: order.typeOf, orderStatus: factory.orderStatus.OrderDelivered, price: order.price, priceCurrency: order.priceCurrency }, placeOrderTransaction })(repos); } else { yield (0, onOrderStatusChanged_1.onOrderDeliveredPartially)({ order: Object.assign(Object.assign({}, order), { acceptedOffers: params.object.acceptedOffers, orderStatus: params.object.previousOrderStatus, deliveredAcceptedOffers: acceptedOffers }) })(repos); } } } catch (error) { let throwsError = true; // すでにOrderReturnedだった場合、OrderDelivered->OrderReturnedの処理自体は成功しているので、後処理を続行する const currentOrder = yield repos.order.projectFieldsByOrderNumber({ orderNumber: params.object.orderNumber, project: { id: params.project.id }, inclusion: ['orderStatus'] }); if ((currentOrder === null || currentOrder === void 0 ? void 0 : currentOrder.orderStatus) === factory.orderStatus.OrderReturned) { throwsError = false; } if (throwsError) { throw error; } } }); }