UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

76 lines (75 loc) 3.49 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.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; }); }