@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.
@@ -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.updateMany({
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
  }
@@ -40,6 +40,8 @@ export declare class MongoRepository {
40
40
  findById<T extends factory.transactionType>(params: {
41
41
  typeOf: T;
42
42
  id: string;
43
+ inclusion?: string[];
44
+ exclusion?: string[];
43
45
  }): Promise<factory.transaction.ITransaction<T>>;
44
46
  /**
45
47
  * 進行中の取引を取得する
@@ -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);
@@ -28,6 +28,7 @@ export declare function exportTasks<T extends factory.assetTransactionType>(para
28
28
  typeOf?: {
29
29
  $in: T[];
30
30
  };
31
+ id?: string;
31
32
  tasksExportAction?: {
32
33
  agent: {
33
34
  name: string;
@@ -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: factory.transactionType.PlaceOrder,
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
- taskAttributes.push(...triggerWebhookTaskAttributes, deleteTransactionTask);
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, voidPaymentTaskAttributes, voidMoneyTransferTaskAttributes);
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
@@ -117,5 +117,5 @@
117
117
  "postversion": "git push origin --tags",
118
118
  "prepublishOnly": "npm run clean && npm run build && npm test && npm run doc"
119
119
  },
120
- "version": "21.2.0-alpha.27"
120
+ "version": "21.2.0-alpha.29"
121
121
  }