@chevre/domain
Version:
Chevre Domain Library for Node.js
76 lines (75 loc) • 3.49 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.start = start;
/**
* 出金取引サービス
*/
const factory = require("../../factory");
/**
* 取引開始
*/
function start(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
// 口座存在確認
const fromAccount = yield repos.account.findByAccountNumber({
accountNumber: params.object.fromLocation.accountNumber
});
const forcibly = (params.object.force === true);
if (!forcibly) {
// 残高検証(2022-10-28~)
if (fromAccount.availableBalance < params.object.amount.value) {
throw new factory.errors.Argument('fromLocation', 'Insufficient balance');
}
}
// 取引ファクトリーで新しい進行中取引オブジェクトを作成
const startParams = Object.assign({ project: { typeOf: params.project.typeOf, id: params.project.id }, typeOf: factory.account.transactionType.Withdraw, agent: params.agent, recipient: params.recipient, object: {
amount: params.object.amount,
fromLocation: {
typeOf: fromAccount.typeOf,
// 廃止(2023-02-16~)
// accountType: fromAccount.accountType,
accountNumber: fromAccount.accountNumber,
name: fromAccount.name
},
description: params.object.description
}, expires: params.expires,
// 必須化(2022-09-26~)
transactionNumber: params.transactionNumber }, (typeof params.identifier === 'string' && params.identifier.length > 0) ? { identifier: params.identifier } : undefined);
// 取引作成
let transaction;
try {
// 取引識別子が指定されていれば、進行中取引のユニークネスを保証する
transaction = yield repos.accountTransaction.startByIdentifier(startParams);
}
catch (error) {
throw error;
}
const pendingTransaction = {
typeOf: transaction.typeOf,
id: transaction.id,
amount: (typeof params.object.amount === 'number')
? params.object.amount
: params.object.amount.value
};
// 残高確保
yield repos.account.authorizeAmount({
accountNumber: params.object.fromLocation.accountNumber,
amount: (typeof params.object.amount === 'number')
? params.object.amount
: params.object.amount.value,
transaction: pendingTransaction,
force: forcibly
});
// 結果返却
return transaction;
});
}
;