@chevre/domain 21.2.0-alpha.27 → 21.2.0-alpha.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/chevre/eventEmitter/assetTransaction.d.ts +21 -0
- package/lib/chevre/eventEmitter/assetTransaction.js +28 -0
- package/lib/chevre/eventEmitter.d.ts +2 -1
- package/lib/chevre/eventEmitter.js +3 -1
- package/lib/chevre/repo/assetTransaction.js +55 -3
- package/lib/chevre/repo/transaction.d.ts +2 -0
- package/lib/chevre/repo/transaction.js +19 -0
- package/lib/chevre/service/assetTransaction.d.ts +1 -0
- package/lib/chevre/service/assetTransaction.js +2 -6
- package/lib/chevre/service/payment/any.js +24 -9
- package/lib/chevre/service/transaction/placeOrder/exportTasks/factory.js +16 -16
- package/package.json +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import * as factory from '../factory';
|
|
4
|
+
interface IListenArgsOnAssetTransactionStatusChanged {
|
|
5
|
+
/**
|
|
6
|
+
* 取引ID
|
|
7
|
+
*/
|
|
8
|
+
id: string;
|
|
9
|
+
typeOf: factory.assetTransactionType;
|
|
10
|
+
status: factory.transactionStatusType;
|
|
11
|
+
}
|
|
12
|
+
type IOnAssetTransactionStatusChangedListener = (listenArgs: IListenArgsOnAssetTransactionStatusChanged) => void;
|
|
13
|
+
/**
|
|
14
|
+
* 資産取引イベントエミッター
|
|
15
|
+
*/
|
|
16
|
+
declare class AssetTransactionEventEmitter extends EventEmitter {
|
|
17
|
+
onAssetTransactionStatusChanged(listner: IOnAssetTransactionStatusChangedListener): void;
|
|
18
|
+
emitAssetTransactionStatusChanged(args: IListenArgsOnAssetTransactionStatusChanged): void;
|
|
19
|
+
}
|
|
20
|
+
declare const assetTransactionEventEmitter: AssetTransactionEventEmitter;
|
|
21
|
+
export { IListenArgsOnAssetTransactionStatusChanged, assetTransactionEventEmitter };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assetTransactionEventEmitter = void 0;
|
|
4
|
+
const events_1 = require("events");
|
|
5
|
+
const settings_1 = require("../settings");
|
|
6
|
+
var EventName;
|
|
7
|
+
(function (EventName) {
|
|
8
|
+
EventName["OnAssetTransactionStatusChanged"] = "OnAssetTransactionStatusChanged";
|
|
9
|
+
})(EventName || (EventName = {}));
|
|
10
|
+
/**
|
|
11
|
+
* 資産取引イベントエミッター
|
|
12
|
+
*/
|
|
13
|
+
class AssetTransactionEventEmitter extends events_1.EventEmitter {
|
|
14
|
+
onAssetTransactionStatusChanged(listner) {
|
|
15
|
+
this.on(EventName.OnAssetTransactionStatusChanged, listner);
|
|
16
|
+
}
|
|
17
|
+
emitAssetTransactionStatusChanged(args) {
|
|
18
|
+
if (settings_1.USE_EVENT_EMITTERS) {
|
|
19
|
+
this.emit(EventName.OnAssetTransactionStatusChanged, args);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const assetTransactionEventEmitter = new AssetTransactionEventEmitter();
|
|
24
|
+
exports.assetTransactionEventEmitter = assetTransactionEventEmitter;
|
|
25
|
+
assetTransactionEventEmitter.on('error', (err) => {
|
|
26
|
+
// tslint:disable-next-line:no-console
|
|
27
|
+
console.error('assetTransactionEventEmitter listened an error.', err);
|
|
28
|
+
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { assetTransactionEventEmitter } from './eventEmitter/assetTransaction';
|
|
1
2
|
import { taskEventEmitter } from './eventEmitter/task';
|
|
2
3
|
import { transactionEventEmitter } from './eventEmitter/transaction';
|
|
3
|
-
export { taskEventEmitter as task, transactionEventEmitter as transaction };
|
|
4
|
+
export { assetTransactionEventEmitter as assetTransaction, taskEventEmitter as task, transactionEventEmitter as transaction };
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.transaction = exports.task = void 0;
|
|
3
|
+
exports.transaction = exports.task = exports.assetTransaction = void 0;
|
|
4
|
+
const assetTransaction_1 = require("./eventEmitter/assetTransaction");
|
|
5
|
+
Object.defineProperty(exports, "assetTransaction", { enumerable: true, get: function () { return assetTransaction_1.assetTransactionEventEmitter; } });
|
|
4
6
|
const task_1 = require("./eventEmitter/task");
|
|
5
7
|
Object.defineProperty(exports, "task", { enumerable: true, get: function () { return task_1.taskEventEmitter; } });
|
|
6
8
|
const transaction_1 = require("./eventEmitter/transaction");
|
|
@@ -13,6 +13,7 @@ exports.MongoRepository = void 0;
|
|
|
13
13
|
const moment = require("moment");
|
|
14
14
|
const assetTransaction_1 = require("./mongoose/schemas/assetTransaction");
|
|
15
15
|
const factory = require("../factory");
|
|
16
|
+
const assetTransaction_2 = require("../eventEmitter/assetTransaction");
|
|
16
17
|
/**
|
|
17
18
|
* 資産取引リポジトリ
|
|
18
19
|
*/
|
|
@@ -336,6 +337,11 @@ class MongoRepository {
|
|
|
336
337
|
throw new factory.errors.NotFound(this.transactionModel.modelName);
|
|
337
338
|
}
|
|
338
339
|
}
|
|
340
|
+
assetTransaction_2.assetTransactionEventEmitter.emitAssetTransactionStatusChanged({
|
|
341
|
+
id: params.id,
|
|
342
|
+
typeOf: params.typeOf,
|
|
343
|
+
status: factory.transactionStatusType.Confirmed
|
|
344
|
+
});
|
|
339
345
|
});
|
|
340
346
|
}
|
|
341
347
|
/**
|
|
@@ -383,17 +389,51 @@ class MongoRepository {
|
|
|
383
389
|
*/
|
|
384
390
|
reexportTasks(params) {
|
|
385
391
|
return __awaiter(this, void 0, void 0, function* () {
|
|
386
|
-
yield this.transactionModel.
|
|
392
|
+
const reexportingTransactions = yield this.transactionModel.find({
|
|
387
393
|
tasksExportationStatus: { $eq: factory.transactionTasksExportationStatus.Exporting },
|
|
388
394
|
updatedAt: {
|
|
389
395
|
$lt: moment()
|
|
390
396
|
.add(-params.intervalInMinutes, 'minutes')
|
|
391
397
|
.toDate()
|
|
392
398
|
}
|
|
393
|
-
}, {
|
|
394
|
-
tasksExportationStatus: factory.transactionTasksExportationStatus.Unexported
|
|
395
399
|
})
|
|
400
|
+
.select({
|
|
401
|
+
_id: 1,
|
|
402
|
+
typeOf: 1,
|
|
403
|
+
status: 1
|
|
404
|
+
})
|
|
405
|
+
.setOptions({ maxTimeMS: 10000 })
|
|
396
406
|
.exec();
|
|
407
|
+
if (reexportingTransactions.length > 0) {
|
|
408
|
+
for (const reexportingTransaction of reexportingTransactions) {
|
|
409
|
+
yield this.transactionModel.updateOne({
|
|
410
|
+
_id: { $eq: reexportingTransaction.id },
|
|
411
|
+
tasksExportationStatus: { $eq: factory.transactionTasksExportationStatus.Exporting }
|
|
412
|
+
}, {
|
|
413
|
+
tasksExportationStatus: factory.transactionTasksExportationStatus.Unexported
|
|
414
|
+
})
|
|
415
|
+
.exec();
|
|
416
|
+
assetTransaction_2.assetTransactionEventEmitter.emitAssetTransactionStatusChanged({
|
|
417
|
+
id: reexportingTransaction.id,
|
|
418
|
+
typeOf: reexportingTransaction.typeOf,
|
|
419
|
+
status: reexportingTransaction.status
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// await this.transactionModel.updateMany(
|
|
424
|
+
// {
|
|
425
|
+
// tasksExportationStatus: { $eq: factory.transactionTasksExportationStatus.Exporting },
|
|
426
|
+
// updatedAt: {
|
|
427
|
+
// $lt: moment()
|
|
428
|
+
// .add(-params.intervalInMinutes, 'minutes')
|
|
429
|
+
// .toDate()
|
|
430
|
+
// }
|
|
431
|
+
// },
|
|
432
|
+
// {
|
|
433
|
+
// tasksExportationStatus: factory.transactionTasksExportationStatus.Unexported
|
|
434
|
+
// }
|
|
435
|
+
// )
|
|
436
|
+
// .exec();
|
|
397
437
|
});
|
|
398
438
|
}
|
|
399
439
|
/**
|
|
@@ -441,6 +481,13 @@ class MongoRepository {
|
|
|
441
481
|
endDate: new Date()
|
|
442
482
|
})
|
|
443
483
|
.exec();
|
|
484
|
+
expiringTransactions.forEach((expiringTransaction) => {
|
|
485
|
+
assetTransaction_2.assetTransactionEventEmitter.emitAssetTransactionStatusChanged({
|
|
486
|
+
id: expiringTransaction.id,
|
|
487
|
+
typeOf: expiringTransaction.typeOf,
|
|
488
|
+
status: factory.transactionStatusType.Expired
|
|
489
|
+
});
|
|
490
|
+
});
|
|
444
491
|
}
|
|
445
492
|
});
|
|
446
493
|
}
|
|
@@ -489,6 +536,11 @@ class MongoRepository {
|
|
|
489
536
|
else {
|
|
490
537
|
transaction = doc.toObject();
|
|
491
538
|
}
|
|
539
|
+
assetTransaction_2.assetTransactionEventEmitter.emitAssetTransactionStatusChanged({
|
|
540
|
+
id: transaction.id,
|
|
541
|
+
typeOf: params.typeOf,
|
|
542
|
+
status: factory.transactionStatusType.Canceled
|
|
543
|
+
});
|
|
492
544
|
return transaction;
|
|
493
545
|
});
|
|
494
546
|
}
|
|
@@ -273,10 +273,29 @@ class MongoRepository {
|
|
|
273
273
|
*/
|
|
274
274
|
findById(params) {
|
|
275
275
|
return __awaiter(this, void 0, void 0, function* () {
|
|
276
|
+
let projection = {};
|
|
277
|
+
if (Array.isArray(params.inclusion) && params.inclusion.length > 0) {
|
|
278
|
+
params.inclusion.forEach((field) => {
|
|
279
|
+
projection[field] = 1;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
projection = {
|
|
284
|
+
__v: 0,
|
|
285
|
+
createdAt: 0,
|
|
286
|
+
updatedAt: 0
|
|
287
|
+
};
|
|
288
|
+
if (Array.isArray(params.exclusion) && params.exclusion.length > 0) {
|
|
289
|
+
params.exclusion.forEach((field) => {
|
|
290
|
+
projection[field] = 0;
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
276
294
|
const doc = yield this.transactionModel.findOne({
|
|
277
295
|
_id: { $eq: params.id },
|
|
278
296
|
typeOf: { $eq: params.typeOf }
|
|
279
297
|
})
|
|
298
|
+
.select(projection)
|
|
280
299
|
.exec();
|
|
281
300
|
if (doc === null) {
|
|
282
301
|
throw new factory.errors.NotFound(this.transactionModel.modelName);
|
|
@@ -33,17 +33,13 @@ exports.reserve = ReserveTransactionService;
|
|
|
33
33
|
function exportTasks(params) {
|
|
34
34
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
35
35
|
var _a;
|
|
36
|
-
const transaction = yield repos.assetTransaction.startExportTasks({
|
|
37
|
-
typeOf: params.typeOf,
|
|
38
|
-
status: params.status,
|
|
39
|
-
tasksExportAction: {
|
|
36
|
+
const transaction = yield repos.assetTransaction.startExportTasks(Object.assign({ typeOf: params.typeOf, status: params.status, tasksExportAction: {
|
|
40
37
|
agent: {
|
|
41
38
|
name: (typeof ((_a = params.tasksExportAction) === null || _a === void 0 ? void 0 : _a.agent.name) === 'string')
|
|
42
39
|
? params.tasksExportAction.agent.name
|
|
43
40
|
: settings_1.DEFAULT_TASKS_EXPORT_AGENT_NAME
|
|
44
41
|
}
|
|
45
|
-
}
|
|
46
|
-
});
|
|
42
|
+
} }, (typeof params.id === 'string') ? { id: params.id } : undefined));
|
|
47
43
|
if (transaction === null) {
|
|
48
44
|
return;
|
|
49
45
|
}
|
|
@@ -52,10 +52,18 @@ exports.voidPayTransaction = voidPayTransaction;
|
|
|
52
52
|
function invalidatePaymentUrl(params) {
|
|
53
53
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
54
54
|
var _a, _b, _c, _d, _e;
|
|
55
|
+
if (params.purpose.typeOf !== factory.transactionType.PlaceOrder) {
|
|
56
|
+
throw new factory.errors.Argument('purpose.typeOf', `must be ${factory.transactionType.PlaceOrder}`);
|
|
57
|
+
}
|
|
55
58
|
const transaction = yield repos.transaction.findById({
|
|
56
59
|
typeOf: params.purpose.typeOf,
|
|
57
60
|
id: params.purpose.id
|
|
58
61
|
});
|
|
62
|
+
// 確定取引に対応(2023-05-03~)
|
|
63
|
+
if (transaction.status === factory.transactionStatusType.Confirmed) {
|
|
64
|
+
// no op
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
59
67
|
const paymentMethodIdByPaymentUrl = (_a = transaction.object.paymentMethods) === null || _a === void 0 ? void 0 : _a.paymentMethodId;
|
|
60
68
|
const paymentMethodType = (_b = transaction.object.paymentMethods) === null || _b === void 0 ? void 0 : _b.typeOf;
|
|
61
69
|
if (typeof paymentMethodIdByPaymentUrl === 'string' && paymentMethodIdByPaymentUrl.length > 0
|
|
@@ -70,12 +78,10 @@ function invalidatePaymentUrl(params) {
|
|
|
70
78
|
? transaction.seller.name
|
|
71
79
|
: String((_c = transaction.seller.name) === null || _c === void 0 ? void 0 : _c.ja),
|
|
72
80
|
id: transaction.seller.id
|
|
73
|
-
// project: transaction.seller.project
|
|
74
81
|
},
|
|
75
82
|
recipient: { typeOf: transaction.agent.typeOf, name: transaction.agent.name },
|
|
76
83
|
object: [{
|
|
77
84
|
typeOf: factory.service.paymentService.PaymentServiceType.CreditCard,
|
|
78
|
-
// tslint:disable-next-line:max-line-length
|
|
79
85
|
id: (_e = (_d = transaction.object.paymentMethods) === null || _d === void 0 ? void 0 : _d.issuedThrough) === null || _e === void 0 ? void 0 : _e.id,
|
|
80
86
|
paymentMethod: {
|
|
81
87
|
additionalProperty: [],
|
|
@@ -103,10 +109,11 @@ function processVoidPayTransaction(params) {
|
|
|
103
109
|
transaction = yield repos.transaction.findInProgressById({ typeOf: params.purpose.typeOf, id: params.purpose.id });
|
|
104
110
|
}
|
|
105
111
|
else {
|
|
106
|
-
transaction = yield repos.transaction.findById({
|
|
112
|
+
transaction = (yield repos.transaction.findById({
|
|
107
113
|
typeOf: params.purpose.typeOf,
|
|
108
|
-
id: params.purpose.id
|
|
109
|
-
|
|
114
|
+
id: params.purpose.id,
|
|
115
|
+
inclusion: ['id', 'typeOf', 'status']
|
|
116
|
+
}));
|
|
110
117
|
}
|
|
111
118
|
// 承認アクションを取得
|
|
112
119
|
let authorizeActions;
|
|
@@ -122,7 +129,7 @@ function processVoidPayTransaction(params) {
|
|
|
122
129
|
const authorizeActionsOnTransaction = yield repos.action.searchByPurpose({
|
|
123
130
|
typeOf: factory.actionType.AuthorizeAction,
|
|
124
131
|
purpose: {
|
|
125
|
-
typeOf:
|
|
132
|
+
typeOf: transaction.typeOf,
|
|
126
133
|
id: transaction.id
|
|
127
134
|
}
|
|
128
135
|
});
|
|
@@ -131,12 +138,20 @@ function processVoidPayTransaction(params) {
|
|
|
131
138
|
return ((_a = a.object) === null || _a === void 0 ? void 0 : _a.typeOf) === factory.action.authorize.paymentMethod.any.ResultType.Payment
|
|
132
139
|
&& ((_b = a.instrument) === null || _b === void 0 ? void 0 : _b.identifier) === factory.action.authorize.paymentMethod.any.ServiceIdentifier.Chevre;
|
|
133
140
|
});
|
|
141
|
+
switch (transaction.status) {
|
|
142
|
+
case factory.transactionStatusType.InProgress:
|
|
143
|
+
throw new factory.errors.NotImplemented(`${transaction.status} not implemented`);
|
|
144
|
+
// 確定取引に対応(2023-05-03~)
|
|
145
|
+
case factory.transactionStatusType.Confirmed:
|
|
146
|
+
// アクションステータスを検証する
|
|
147
|
+
authorizeActions = authorizeActions.filter((a) => a.actionStatus !== factory.actionStatusType.CompletedActionStatus);
|
|
148
|
+
break;
|
|
149
|
+
default:
|
|
150
|
+
// no op
|
|
151
|
+
}
|
|
134
152
|
}
|
|
135
153
|
const errors = [];
|
|
136
154
|
for (const action of authorizeActions) {
|
|
137
|
-
// 直列にゆっくり処理する場合↓
|
|
138
|
-
// tslint:disable-next-line:no-magic-numbers
|
|
139
|
-
// await new Promise((resolve) => setTimeout(() => { resolve(); }, 1000));
|
|
140
155
|
// 失敗するケースがあっても、残りが少なくとも処理されるようにエラーハンドリング
|
|
141
156
|
try {
|
|
142
157
|
// 取引が存在すれば中止
|
|
@@ -78,7 +78,21 @@ function createTasks(params) {
|
|
|
78
78
|
object: transaction
|
|
79
79
|
}
|
|
80
80
|
};
|
|
81
|
-
|
|
81
|
+
// 確定取引にも決済承認中止タスクを追加(2023-05-03~)
|
|
82
|
+
const voidPaymentTaskAttributes = {
|
|
83
|
+
project: transaction.project,
|
|
84
|
+
name: factory.taskName.VoidPayTransaction,
|
|
85
|
+
status: factory.taskStatus.Ready,
|
|
86
|
+
runsAt: taskRunsAt,
|
|
87
|
+
remainingNumberOfTries: 10,
|
|
88
|
+
numberOfTried: 0,
|
|
89
|
+
executionResults: [],
|
|
90
|
+
data: {
|
|
91
|
+
project: transaction.project,
|
|
92
|
+
purpose: { typeOf: transaction.typeOf, id: transaction.id }
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
taskAttributes.push(...triggerWebhookTaskAttributes, deleteTransactionTask, voidPaymentTaskAttributes);
|
|
82
96
|
switch (transaction.status) {
|
|
83
97
|
case factory.transactionStatusType.Confirmed:
|
|
84
98
|
const potentialActions = transaction.potentialActions;
|
|
@@ -107,7 +121,6 @@ function createTasks(params) {
|
|
|
107
121
|
};
|
|
108
122
|
taskAttributes.push(placeOrderTaskAttributes);
|
|
109
123
|
break;
|
|
110
|
-
// 期限切れor中止の場合は、タスクリストを作成する
|
|
111
124
|
case factory.transactionStatusType.Canceled:
|
|
112
125
|
case factory.transactionStatusType.Expired:
|
|
113
126
|
const voidReserveTaskAttributes = {
|
|
@@ -136,19 +149,6 @@ function createTasks(params) {
|
|
|
136
149
|
purpose: { typeOf: transaction.typeOf, id: transaction.id }
|
|
137
150
|
}
|
|
138
151
|
};
|
|
139
|
-
const voidPaymentTaskAttributes = {
|
|
140
|
-
project: transaction.project,
|
|
141
|
-
name: factory.taskName.VoidPayTransaction,
|
|
142
|
-
status: factory.taskStatus.Ready,
|
|
143
|
-
runsAt: taskRunsAt,
|
|
144
|
-
remainingNumberOfTries: 10,
|
|
145
|
-
numberOfTried: 0,
|
|
146
|
-
executionResults: [],
|
|
147
|
-
data: {
|
|
148
|
-
project: transaction.project,
|
|
149
|
-
purpose: { typeOf: transaction.typeOf, id: transaction.id }
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
152
|
const voidMoneyTransferTaskAttributes = {
|
|
153
153
|
project: transaction.project,
|
|
154
154
|
name: factory.taskName.VoidMoneyTransferTransaction,
|
|
@@ -162,7 +162,7 @@ function createTasks(params) {
|
|
|
162
162
|
purpose: { typeOf: transaction.typeOf, id: transaction.id }
|
|
163
163
|
}
|
|
164
164
|
};
|
|
165
|
-
taskAttributes.push(voidReserveTaskAttributes, voidRegisterServiceTaskAttributes,
|
|
165
|
+
taskAttributes.push(voidReserveTaskAttributes, voidRegisterServiceTaskAttributes, voidMoneyTransferTaskAttributes);
|
|
166
166
|
break;
|
|
167
167
|
default:
|
|
168
168
|
throw new factory.errors.NotImplemented(`Transaction status "${transaction.status}" not implemented.`);
|
package/package.json
CHANGED