UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

80 lines (79 loc) 4.29 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.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 }); }); }