@chevre/domain
Version:
Chevre Domain Library for Node.js
190 lines (189 loc) • 10.1 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.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;
}
}
});
}