@chevre/domain
Version:
Chevre Domain Library for Node.js
144 lines (143 loc) • 9.28 kB
JavaScript
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.deleteTransaction = exports.returnOrder = exports.placeOrder = exports.moneyTransfer = void 0;
exports.updateAgent = updateAgent;
exports.exportOneTransactionTasksIfExists = exportOneTransactionTasksIfExists;
/**
* 取引サービス
*/
const google_libphonenumber_1 = require("google-libphonenumber");
const factory = require("../factory");
const deleteTransaction_1 = require("./transaction/deleteTransaction");
Object.defineProperty(exports, "deleteTransaction", { enumerable: true, get: function () { return deleteTransaction_1.deleteTransaction; } });
const MoneyTransferTransactionService = require("./transaction/moneyTransfer");
const PlaceOrderTransactionService = require("./transaction/placeOrder");
const publishOrderNumberIfNotExist_1 = require("./transaction/placeOrder/publishOrderNumberIfNotExist");
const ReturnOrderTransactionService = require("./transaction/returnOrder");
exports.moneyTransfer = MoneyTransferTransactionService;
exports.placeOrder = PlaceOrderTransactionService;
exports.returnOrder = ReturnOrderTransactionService;
function fixCustomer(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
var _a;
let formattedTelephone;
try {
const phoneUtil = google_libphonenumber_1.PhoneNumberUtil.getInstance();
const phoneNumber = phoneUtil.parse(params.agent.telephone, params.agent.telephoneRegion);
if (!phoneUtil.isValidNumber(phoneNumber)) {
throw new factory.errors.Argument('telephone', 'Invalid phone number');
}
formattedTelephone = phoneUtil.format(phoneNumber, google_libphonenumber_1.PhoneNumberFormat.E164);
}
catch (error) {
throw new factory.errors.Argument('telephone', error.message);
}
const transaction = yield repos.transaction.projectFieldsInProgressById({
typeOf: params.typeOf,
id: params.id
}, ['agent', 'object', 'typeOf', 'project']);
if (transaction.agent.id !== params.agent.id) {
throw new factory.errors.Forbidden('Transaction not yours');
}
// 注文取引の場合、object.customerにも適用
let customer;
if (transaction.typeOf === factory.transactionType.PlaceOrder) {
// いったんtransaction.object.customer?.typeOfは取引開始時にセットされている前提
const trasactionObject = transaction.object;
if (typeof ((_a = trasactionObject.customer) === null || _a === void 0 ? void 0 : _a.typeOf) === 'string') {
customer = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ typeOf: trasactionObject.customer.typeOf, id: trasactionObject.customer.id }, (Array.isArray(trasactionObject.customer.identifier))
? { identifier: trasactionObject.customer.identifier }
: /* istanbul ignore next */ undefined), (Array.isArray(params.agent.additionalProperty))
? { additionalProperty: params.agent.additionalProperty }
: /* istanbul ignore next */ undefined), (typeof params.agent.age === 'string') ? { age: params.agent.age }
: /* istanbul ignore next */ undefined), (typeof params.agent.address === 'string') ? { address: params.agent.address }
: /* istanbul ignore next */ undefined), (typeof params.agent.email === 'string') ? { email: params.agent.email }
: /* istanbul ignore next */ undefined), (typeof params.agent.familyName === 'string') ? { familyName: params.agent.familyName }
: /* istanbul ignore next */ undefined), (typeof params.agent.gender === 'string') ? { gender: params.agent.gender }
: /* istanbul ignore next */ undefined), (typeof params.agent.givenName === 'string') ? { givenName: params.agent.givenName }
: /* istanbul ignore next */ undefined), (typeof params.agent.name === 'string') ? { name: params.agent.name } : /* istanbul ignore next */ undefined), (typeof formattedTelephone === 'string') ? { telephone: formattedTelephone } : /* istanbul ignore next */ undefined), (typeof params.agent.url === 'string') ? { url: params.agent.url } : /* istanbul ignore next */ undefined);
}
}
return { customer, transaction };
});
}
/**
* 取引人プロフィール更新
*/
function updateAgent(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const { customer, transaction } = yield fixCustomer(params)(repos);
// const newAgent: Pick<factory.transaction.placeOrder.IAgent, 'id'> = {
// id: transaction.agent.id
// };
// discontinue saving in transaction(2024-06-24~)
// await repos.transaction.updateAgent({
// typeOf: params.typeOf,
// id: params.id,
// agent: newAgent,
// ...(customer !== undefined) ? { object: { customer } } : undefined
// });
// also save in orderInTransaction(2024-06-20~)
if (customer !== undefined) {
const orderNumber = yield (0, publishOrderNumberIfNotExist_1.publishOrderNumberIfNotExist)({
project: { id: transaction.project.id },
id: params.id,
object: { orderDate: new Date() }
})(repos);
const customerName = (typeof customer.name === 'string' && customer.name !== '')
? customer.name
: (typeof customer.givenName === 'string' && typeof customer.familyName === 'string'
&& customer.givenName !== '' && customer.familyName !== '')
? `${customer.givenName} ${customer.familyName}`
: undefined;
const customerInOrder = Object.assign(Object.assign(Object.assign({}, customer), { identifier: (Array.isArray(customer.identifier)) ? customer.identifier : [] }), (typeof customerName === 'string') ? { name: customerName } : undefined);
yield repos.orderInTransaction.setCustomer({
orderNumber,
project: transaction.project,
customer: customerInOrder
});
}
// return newAgent;
});
}
function exportOneTransactionTasksIfExists(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
var _a;
const transaction = yield repos.transaction.startExportTasks(Object.assign(Object.assign(Object.assign({ tasksExportAction: {
agent: { name: params.tasksExportAction.agent.name }
}, endDate: { $lt: params.endDate.$lt } }, (typeof params.id === 'string') ? { id: params.id } : undefined), (typeof ((_a = params.status) === null || _a === void 0 ? void 0 : _a.$eq) === 'string') ? { status: params.status } : undefined), (params.sort !== undefined) ? { sort: params.sort } : undefined));
if (transaction === null) {
return;
}
// 失敗してもここでは戻さない(RUNNINGのまま待機)
switch (transaction.typeOf) {
case factory.transactionType.MoneyTransfer:
yield MoneyTransferTransactionService.exportTasksById(Object.assign({ id: transaction.id }, (typeof params.runsTasksAfterInSeconds === 'number')
? { runsTasksAfterInSeconds: params.runsTasksAfterInSeconds }
: undefined))(repos);
break;
case factory.transactionType.PlaceOrder:
yield PlaceOrderTransactionService.exportTasksById(Object.assign({ id: transaction.id, optimizeRedundantTasks: params.optimizeRedundantTasks === true }, (typeof params.runsTasksAfterInSeconds === 'number')
? { runsTasksAfterInSeconds: params.runsTasksAfterInSeconds }
: undefined))(repos);
break;
case factory.transactionType.ReturnOrder:
yield ReturnOrderTransactionService.exportTasksById(Object.assign({ id: transaction.id }, (typeof params.runsTasksAfterInSeconds === 'number')
? { runsTasksAfterInSeconds: params.runsTasksAfterInSeconds }
: undefined))(repos);
break;
default:
}
yield repos.transaction.setTasksExportedById({ id: transaction.id });
return transaction;
});
}
;