@chevre/domain
Version:
Chevre Domain Library for Node.js
80 lines (79 loc) • 4.29 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.returnMoneyTransfer = returnMoneyTransfer;
const moment = require("moment");
const util = require("util");
const factory = require("../../../factory");
const MoneyTransferAssetTransactionService = require("../../assetTransaction/moneyTransfer");
/**
* 入金を返却する
*/
function returnMoneyTransfer(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const action = yield repos.action.start(params);
try {
// 取引番号で通貨転送取引を検索
const transactionNumber = params.object.object.transactionNumber;
const existingAssetTransactions = yield repos.assetTransaction.search({
limit: 1,
page: 1,
project: { id: { $eq: params.project.id } },
typeOf: factory.assetTransactionType.MoneyTransfer,
transactionNumber: { $eq: transactionNumber }
});
// 資産取引が存在すれば、出金取引を実行
const depositTransaction = existingAssetTransactions.shift();
if (depositTransaction !== undefined) {
// 冪等性の確保
// 入金時の資産取引に対して一意な識別子をMoneyTransfer資産取引指定する
const identifier2withdrawAssetTransaction = util.format('%s:%s:%s', params.project.id, 'returnMoneyTransfer', depositTransaction.transactionNumber);
// まず取引番号発行
const publishTransactionNumber4returnMoneyTransferResult = yield repos.transactionNumber.publishByTimestamp({ startDate: new Date() });
const withdrawTransaction = yield MoneyTransferAssetTransactionService.start({
identifier: identifier2withdrawAssetTransaction,
project: depositTransaction.project,
transactionNumber: publishTransactionNumber4returnMoneyTransferResult.transactionNumber,
typeOf: factory.assetTransactionType.MoneyTransfer,
expires: moment()
.add(1, 'minute')
.toDate(),
agent: depositTransaction.agent,
recipient: depositTransaction.recipient,
object: {
amount: depositTransaction.object.amount,
fromLocation: {
typeOf: depositTransaction.object.toLocation.typeOf,
identifier: depositTransaction.object.toLocation.identifier
},
toLocation: depositTransaction.object.fromLocation,
pendingTransaction: {
typeOf: factory.account.transactionType.Withdraw,
transactionNumber: publishTransactionNumber4returnMoneyTransferResult.transactionNumber
}
}
})(repos);
yield MoneyTransferAssetTransactionService.confirm({ id: withdrawTransaction.id })(repos);
}
}
catch (error) {
try {
yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error });
}
catch (__) {
// no op
}
throw error;
}
const actionResult = {};
yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result: actionResult });
});
}