@chevre/domain 25.0.0-alpha.9 → 25.1.0-alpha.0

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.
Files changed (95) hide show
  1. package/lib/chevre/repo/message.d.ts +7 -15
  2. package/lib/chevre/repo/message.js +37 -74
  3. package/lib/chevre/repo/mongoose/schemas/message.d.ts +1 -1
  4. package/lib/chevre/repo/mongoose/schemas/order.js +2 -110
  5. package/lib/chevre/repo/mongoose/schemas/setting.d.ts +35 -9
  6. package/lib/chevre/repo/mongoose/schemas/setting.js +3 -2
  7. package/lib/chevre/repo/mongoose/schemas/transaction.js +51 -50
  8. package/lib/chevre/repo/order.d.ts +1 -7
  9. package/lib/chevre/repo/order.js +56 -26
  10. package/lib/chevre/repo/orderInTransaction.d.ts +41 -22
  11. package/lib/chevre/repo/orderInTransaction.js +108 -79
  12. package/lib/chevre/repo/passport.d.ts +5 -2
  13. package/lib/chevre/repo/setting/rateLimit.d.ts +18 -0
  14. package/lib/chevre/repo/setting/rateLimit.js +48 -0
  15. package/lib/chevre/repo/setting/waiter.d.ts +17 -0
  16. package/lib/chevre/repo/setting/waiter.js +39 -0
  17. package/lib/chevre/repo/setting.d.ts +12 -11
  18. package/lib/chevre/repo/setting.js +6 -18
  19. package/lib/chevre/repo/task.d.ts +1 -1
  20. package/lib/chevre/repo/transaction/placeOrder.d.ts +1 -6
  21. package/lib/chevre/repo/transaction/placeOrder.js +37 -26
  22. package/lib/chevre/repo/transaction.d.ts +1 -1
  23. package/lib/chevre/repo/transaction.js +2 -2
  24. package/lib/chevre/repository.d.ts +10 -0
  25. package/lib/chevre/repository.js +22 -0
  26. package/lib/chevre/service/assetTransaction/reserve/start.d.ts +0 -2
  27. package/lib/chevre/service/offer/any.d.ts +1 -3
  28. package/lib/chevre/service/offer/any.js +7 -8
  29. package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre.d.ts +0 -2
  30. package/lib/chevre/service/offer/event/authorize.d.ts +0 -4
  31. package/lib/chevre/service/offer/event/authorize.js +5 -8
  32. package/lib/chevre/service/offer/event/voidTransaction.js +29 -17
  33. package/lib/chevre/service/offer/event/voidTransactionByActionId.js +16 -12
  34. package/lib/chevre/service/offer/eventServiceByCOA/acceptOffer.d.ts +0 -6
  35. package/lib/chevre/service/offer/eventServiceByCOA/acceptOffer.js +10 -12
  36. package/lib/chevre/service/offer/eventServiceByCOA/authorize/factory.d.ts +1 -1
  37. package/lib/chevre/service/offer/eventServiceByCOA/authorize.js +6 -7
  38. package/lib/chevre/service/offer/eventServiceByCOA/changeOffers.js +20 -17
  39. package/lib/chevre/service/order/deleteOrder.d.ts +6 -10
  40. package/lib/chevre/service/order/deleteOrder.js +7 -48
  41. package/lib/chevre/service/order/onOrderStatusChanged/onOrderCancelled/factory.d.ts +1 -1
  42. package/lib/chevre/service/order/onOrderStatusChanged/onOrderDeliveredPartially/factory.d.ts +1 -1
  43. package/lib/chevre/service/order/onOrderStatusChanged/onOrderPaymentDue.d.ts +4 -1
  44. package/lib/chevre/service/order/onOrderStatusChanged/onOrderPaymentDue.js +1 -26
  45. package/lib/chevre/service/order/onOrderStatusChanged/onOrderReturned/factory.d.ts +1 -1
  46. package/lib/chevre/service/order/placeOrder/createPlacingOrderFromExistingTransaction.js +3 -2
  47. package/lib/chevre/service/order/placeOrder/factory.d.ts +1 -1
  48. package/lib/chevre/service/order/placeOrder/factory.js +6 -6
  49. package/lib/chevre/service/order/placeOrder/voidAcceptedOfferIfNecessary.d.ts +1 -3
  50. package/lib/chevre/service/order/placeOrder/voidAcceptedOfferIfNecessary.js +3 -15
  51. package/lib/chevre/service/order/placeOrder.js +6 -6
  52. package/lib/chevre/service/order.d.ts +1 -2
  53. package/lib/chevre/service/order.js +1 -5
  54. package/lib/chevre/service/payment/any/authorize/fixOrderAsNeeded.d.ts +2 -4
  55. package/lib/chevre/service/payment/any/authorize/fixOrderAsNeeded.js +4 -6
  56. package/lib/chevre/service/payment/any/authorize.d.ts +2 -0
  57. package/lib/chevre/service/payment/any/publishPaymentUrl.d.ts +0 -4
  58. package/lib/chevre/service/payment/any/publishPaymentUrl.js +5 -8
  59. package/lib/chevre/service/task/acceptCOAOffer.js +8 -10
  60. package/lib/chevre/service/task/authorizePayment.js +2 -6
  61. package/lib/chevre/service/task/deleteTransaction.js +2 -10
  62. package/lib/chevre/service/task/publishPaymentUrl.js +6 -9
  63. package/lib/chevre/service/taskHandler.js +0 -1
  64. package/lib/chevre/service/transaction/deleteTransaction.d.ts +8 -16
  65. package/lib/chevre/service/transaction/deleteTransaction.js +46 -145
  66. package/lib/chevre/service/transaction/placeOrder/confirm/factory/result.d.ts +7 -2
  67. package/lib/chevre/service/transaction/placeOrder/confirm/potentialActions/sendEmailMessage.d.ts +3 -2
  68. package/lib/chevre/service/transaction/placeOrder/confirm/potentialActions.d.ts +3 -2
  69. package/lib/chevre/service/transaction/placeOrder/confirm.d.ts +2 -5
  70. package/lib/chevre/service/transaction/placeOrder/confirm.js +29 -24
  71. package/lib/chevre/service/transaction/placeOrder/exportTasks/factory.d.ts +2 -3
  72. package/lib/chevre/service/transaction/placeOrder/exportTasks/factory.js +45 -54
  73. package/lib/chevre/service/transaction/placeOrder/exportTasksById.d.ts +0 -4
  74. package/lib/chevre/service/transaction/placeOrder/exportTasksById.js +2 -3
  75. package/lib/chevre/service/transaction/placeOrder/issueOrderNumberIfNotExist.d.ts +5 -0
  76. package/lib/chevre/service/transaction/placeOrder/issueOrderNumberIfNotExist.js +37 -23
  77. package/lib/chevre/service/transaction/placeOrder/start/factory.d.ts +20 -4
  78. package/lib/chevre/service/transaction/placeOrder/start/factory.js +20 -7
  79. package/lib/chevre/service/transaction/placeOrder/start.d.ts +9 -4
  80. package/lib/chevre/service/transaction/placeOrder/start.js +18 -1
  81. package/lib/chevre/service/transaction/placeOrder/updateAgent.d.ts +0 -4
  82. package/lib/chevre/service/transaction/placeOrder/updateAgent.js +19 -22
  83. package/lib/chevre/service/transaction/placeOrder.d.ts +1 -2
  84. package/lib/chevre/service/transaction/placeOrder.js +1 -3
  85. package/lib/chevre/service/transaction.d.ts +0 -4
  86. package/lib/chevre/service/transaction.js +1 -1
  87. package/lib/chevre/service.d.ts +0 -2
  88. package/lib/chevre/service.js +0 -2
  89. package/package.json +2 -2
  90. package/lib/chevre/factory/order.d.ts +0 -2
  91. package/lib/chevre/factory/order.js +0 -5
  92. package/lib/chevre/service/order/placeOrderWithoutTransaction.d.ts +0 -22
  93. package/lib/chevre/service/order/placeOrderWithoutTransaction.js +0 -51
  94. package/lib/chevre/service/task/deletePerson.d.ts +0 -6
  95. package/lib/chevre/service/task/deletePerson.js +0 -465
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OrderRepo = void 0;
4
4
  const factory_1 = require("../factory");
5
5
  const order_1 = require("./mongoose/schemas/order");
6
- const errorHandler_1 = require("../errorHandler");
6
+ // import { isMongoDuplicateError } from '../errorHandler';
7
7
  const settings_1 = require("../settings");
8
8
  /**
9
9
  * ドキュメント検索時に指定可能なprojectionフィールドを厳密に定義する
@@ -239,6 +239,10 @@ class OrderRepo {
239
239
  }
240
240
  });
241
241
  }
242
+ const identifierEq = params.identifier?.$eq;
243
+ if (typeof identifierEq === 'string') {
244
+ andConditions.push({ identifier: { $eq: identifierEq } });
245
+ }
242
246
  if (Array.isArray(params.orderNumbers)) {
243
247
  if (params.orderNumbers.length === 1) {
244
248
  // use $eq(2025-04-01~)
@@ -483,31 +487,37 @@ class OrderRepo {
483
487
  }
484
488
  return andConditions;
485
489
  }
486
- /**
487
- * なければ作成する
488
- */
489
- async createIfNotExist(order) {
490
- try {
491
- // 存在しなければ上書き
492
- // updateOneに変更(2024-01-14~)
493
- // await this.orderModel.findOneAndUpdate(
494
- await this.orderModel.updateOne({ orderNumber: order.orderNumber }, { $setOnInsert: order }, {
495
- // new: true,
496
- upsert: true
497
- })
498
- .exec();
499
- }
500
- catch (error) {
501
- let throwsError = true;
502
- if (await (0, errorHandler_1.isMongoDuplicateError)(error)) {
503
- // すでにorderNumberが存在する場合ok
504
- throwsError = false;
505
- }
506
- if (throwsError) {
507
- throw error;
508
- }
509
- }
510
- }
490
+ // OrderInTransactionリポジトリにて注文ドキュメントが生成されるように変更したのでもう不要
491
+ // /**
492
+ // * なければ作成する
493
+ // */
494
+ // public async createIfNotExist(order: IOrderWithoutAcceptedOffers & {
495
+ // acceptedOffers: factory.order.IAcceptedOffer[];
496
+ // }): Promise<void> {
497
+ // try {
498
+ // // 存在しなければ上書き
499
+ // // updateOneに変更(2024-01-14~)
500
+ // // await this.orderModel.findOneAndUpdate(
501
+ // await this.orderModel.updateOne(
502
+ // { orderNumber: order.orderNumber },
503
+ // { $setOnInsert: order },
504
+ // {
505
+ // // new: true,
506
+ // upsert: true
507
+ // }
508
+ // )
509
+ // .exec();
510
+ // } catch (error) {
511
+ // let throwsError = true;
512
+ // if (await isMongoDuplicateError(error)) {
513
+ // // すでにorderNumberが存在する場合ok
514
+ // throwsError = false;
515
+ // }
516
+ // if (throwsError) {
517
+ // throw error;
518
+ // }
519
+ // }
520
+ // }
511
521
  /**
512
522
  * 注文ステータスを変更する
513
523
  */
@@ -838,6 +848,26 @@ class OrderRepo {
838
848
  })
839
849
  .exec();
840
850
  }
851
+ // public async updateIdentifier4migration(params: {
852
+ // project: { id: string };
853
+ // orderNumber: string;
854
+ // identifier: string;
855
+ // }) {
856
+ // const { orderNumber, project, identifier } = params;
857
+ // return this.orderModel.updateOne(
858
+ // {
859
+ // orderNumber: { $eq: orderNumber },
860
+ // 'project.id': { $eq: project.id },
861
+ // typeOf: { $eq: factory.order.OrderType.Order }
862
+ // },
863
+ // {
864
+ // $set: {
865
+ // ...(typeof identifier === 'string') ? { identifier } : undefined
866
+ // }
867
+ // }
868
+ // )
869
+ // .exec();
870
+ // }
841
871
  async aggregateOrder(params) {
842
872
  const matchConditions = {
843
873
  orderDate: {
@@ -1,7 +1,7 @@
1
1
  import type { Connection } from 'mongoose';
2
2
  import { factory } from '../factory';
3
3
  import { AcceptedOfferInReserveRepo } from './acceptedOfferInReserve';
4
- type IOrderInTransaction = Pick<factory.order.IOrder, 'orderNumber' | 'project'> & {
4
+ export type IOrderInTransaction = Pick<factory.order.IOrder, 'orderNumber' | 'project' | 'broker'> & {
5
5
  typeOf: factory.transactionType.PlaceOrder;
6
6
  orderDate: Date;
7
7
  /**
@@ -10,11 +10,12 @@ type IOrderInTransaction = Pick<factory.order.IOrder, 'orderNumber' | 'project'>
10
10
  identifier: string;
11
11
  acceptedOffers: factory.order.IAcceptedOffer[];
12
12
  customer?: factory.order.ICustomer;
13
+ seller?: factory.order.ISeller;
13
14
  };
14
15
  /**
15
16
  * typeOf: Orderへドキュメント変換時の編集フィールド
16
17
  */
17
- export type IPlacingOrder = Pick<factory.order.IOrder, 'confirmationNumber' | 'orderDate' | 'orderNumber' | 'orderStatus' | 'orderedItem' | 'paymentMethods' | 'price' | 'priceCurrency' | 'seller' | 'typeOf'> & {
18
+ export type IPlacingOrder = Pick<factory.order.IOrder, 'confirmationNumber' | 'orderDate' | 'orderNumber' | 'orderStatus' | 'orderedItem' | 'paymentMethods' | 'price' | 'priceCurrency' | 'typeOf'> & {
18
19
  url?: never;
19
20
  identifier?: never;
20
21
  name?: never;
@@ -30,6 +31,10 @@ export type IPlacingOrder = Pick<factory.order.IOrder, 'confirmationNumber' | 'o
30
31
  * 上書きしてはいけない
31
32
  */
32
33
  broker?: never;
34
+ /**
35
+ * 上書きしてはいけない
36
+ */
37
+ seller?: never;
33
38
  };
34
39
  export type IMinimizedReservationFor = Pick<factory.order.IEventAsReservationFor, 'endDate' | 'id' | 'startDate' | 'typeOf'> & {
35
40
  location: Pick<factory.order.IEventAsReservationFor['location'], 'branchCode' | 'typeOf'>;
@@ -57,12 +62,35 @@ export type IMinimizedAcceptedOffer = Pick<factory.order.IOptimizedAcceptedOffer
57
62
  export declare class OrderInTransactionRepo extends AcceptedOfferInReserveRepo {
58
63
  private readonly orderModel;
59
64
  constructor(connection: Connection);
65
+ createPlaceOrderIfNotExists(params: Pick<IOrderInTransaction, 'orderNumber' | 'project' | 'identifier' | 'broker' | 'seller' | 'customer'>): Promise<import("mongoose").UpdateWriteOpResult | undefined>;
66
+ /**
67
+ * 注文取引から注文番号を参照する
68
+ * 存在しなければNotFoundError
69
+ */
70
+ findOrderNumberByIdentifier(params: {
71
+ identifier: string;
72
+ project: {
73
+ id: string;
74
+ };
75
+ }, options: {
76
+ /**
77
+ * 注文取引タイプのドキュメントのみを参照対象にするかどうか
78
+ */
79
+ onlyPlaceOrder: boolean;
80
+ }): Promise<string>;
81
+ /**
82
+ * 注文ドキュメントからcustomer属性を参照する
83
+ * customer未設定であれば、NotFound
84
+ */
85
+ findCustomerByOrderIdentifier(params: {
86
+ identifier: string;
87
+ }): Promise<factory.order.ICustomer>;
60
88
  /**
61
89
  * 取引進行中の注文からacceptedOffersを検索する
62
90
  * 予約取引から予約ごとの価格仕様も参照する
63
91
  */
64
- findAcceptedOffersWithPriceByOrderNumber(params: {
65
- orderNumber: string;
92
+ findAcceptedOffersWithPriceByIdentifier(params: {
93
+ identifier: string;
66
94
  project: {
67
95
  id: string;
68
96
  };
@@ -73,21 +101,22 @@ export declare class OrderInTransactionRepo extends AcceptedOfferInReserveRepo {
73
101
  * 注文を受注する
74
102
  * typeOf: PlaceOrder -> typeOf: Order
75
103
  */
76
- placeOrder(order: IPlacingOrder): Promise<void>;
104
+ placeOrderByIdentifier(filter: {
105
+ identifier: string;
106
+ }, order: IPlacingOrder): Promise<void>;
77
107
  /**
78
108
  * 注文documentがなければ作成し、受け入れられたオファーを追加する
79
109
  * このメソッドでdocumentが初めて生成される(typeOf:PlaceOrderとして)
80
110
  */
81
- acceptOffer(params: Pick<IOrderInTransaction, 'orderNumber' | 'project' | 'identifier'> & {
111
+ acceptOfferByIdentifier(params: Pick<IOrderInTransaction, 'project' | 'identifier'> & {
82
112
  acceptedOffers: IMinimizedAcceptedOffer[] | factory.order.ICOAAcceptedOffer[];
83
- broker?: factory.order.IBroker;
84
113
  }): Promise<import("mongoose").UpdateWriteOpResult | undefined>;
85
114
  /**
86
115
  * serialNumberからオファーを除外する
87
116
  * ホワイトリストとブラックリスト両方に対応
88
117
  */
89
- voidAcceptedOfferBySerialNumber(params: {
90
- orderNumber: string;
118
+ voidAcceptedOfferByIdentifier(params: {
119
+ identifier: string;
91
120
  acceptedOffers: {
92
121
  serialNumber: {
93
122
  $in?: string[];
@@ -95,20 +124,10 @@ export declare class OrderInTransactionRepo extends AcceptedOfferInReserveRepo {
95
124
  };
96
125
  };
97
126
  }): Promise<import("mongoose").UpdateWriteOpResult | undefined>;
98
- setCustomer(params: Pick<IOrderInTransaction, 'orderNumber' | 'project' | 'identifier'> & {
127
+ setCustomerByIdentifier(params: Pick<IOrderInTransaction, 'project' | 'identifier'> & {
99
128
  customer: factory.order.ICustomer;
100
129
  }): Promise<import("mongoose").UpdateWriteOpResult>;
101
- /**
102
- * 注文ドキュメントからcustomer属性を参照する
103
- * customer未設定であれば、NotFound
104
- */
105
- findCustomerByOrderNumber(params: {
106
- orderNumber: {
107
- $eq: string;
108
- };
109
- }): Promise<factory.order.ICustomer>;
110
- deleteByOrderNumber(params: {
111
- orderNumber: string;
130
+ deleteByIdentifier(params: {
131
+ identifier: string;
112
132
  }): Promise<import("mongodb").DeleteResult>;
113
133
  }
114
- export {};
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OrderInTransactionRepo = void 0;
4
4
  // import { isDeepStrictEqual } from 'util';
5
+ const errorHandler_1 = require("../errorHandler");
5
6
  const factory_1 = require("../factory");
6
7
  const order_1 = require("./mongoose/schemas/order");
7
8
  const acceptedOfferInReserve_1 = require("./acceptedOfferInReserve");
@@ -15,13 +16,86 @@ class OrderInTransactionRepo extends acceptedOfferInReserve_1.AcceptedOfferInRes
15
16
  super(connection);
16
17
  this.orderModel = connection.model(order_1.modelName, (0, order_1.createSchema)());
17
18
  }
19
+ async createPlaceOrderIfNotExists(params) {
20
+ const { orderNumber, project, identifier, broker, seller, customer } = params;
21
+ const setOnInsert = {
22
+ typeOf: factory_1.factory.transactionType.PlaceOrder,
23
+ orderDate: new Date(), // orderDate required(2024-12-09~)
24
+ orderNumber,
25
+ project,
26
+ identifier, // 取引ID(2026-06-22~)
27
+ ...((seller !== undefined) && { seller }),
28
+ ...((customer !== undefined) && { customer }),
29
+ ...((broker !== undefined) && { broker })
30
+ };
31
+ try {
32
+ return this.orderModel.updateOne({
33
+ identifier: { $eq: identifier }, // 取引IDに対してユニークネスを保証する
34
+ }, { $setOnInsert: setOnInsert }, { upsert: true })
35
+ .exec();
36
+ }
37
+ catch (error) {
38
+ let throwsError = true;
39
+ if (await (0, errorHandler_1.isMongoDuplicateError)(error)) {
40
+ // すでにidentifierが存在する場合ok
41
+ throwsError = false;
42
+ }
43
+ if (throwsError) {
44
+ throw error;
45
+ }
46
+ }
47
+ }
48
+ /**
49
+ * 注文取引から注文番号を参照する
50
+ * 存在しなければNotFoundError
51
+ */
52
+ async findOrderNumberByIdentifier(params, options) {
53
+ const { project, identifier } = params;
54
+ const onlyPlaceOrder = options.onlyPlaceOrder === true;
55
+ const doc = await this.orderModel.findOne({
56
+ identifier: { $eq: identifier },
57
+ 'project.id': { $eq: project.id },
58
+ ...((onlyPlaceOrder) && { typeOf: { $eq: factory_1.factory.transactionType.PlaceOrder } })
59
+ }, {
60
+ _id: 0,
61
+ orderNumber: 1
62
+ })
63
+ .lean()
64
+ .exec();
65
+ if (doc === null) {
66
+ throw new factory_1.factory.errors.NotFound('orderInTransaction');
67
+ }
68
+ return doc.orderNumber;
69
+ }
70
+ /**
71
+ * 注文ドキュメントからcustomer属性を参照する
72
+ * customer未設定であれば、NotFound
73
+ */
74
+ async findCustomerByOrderIdentifier(params) {
75
+ const doc = await this.orderModel.findOne({
76
+ identifier: { $eq: params.identifier }
77
+ // typeOf: { $eq: factory.transactionType.PlaceOrder } // 検証しない
78
+ }, {
79
+ _id: 0,
80
+ customer: 1
81
+ })
82
+ .lean()
83
+ .exec();
84
+ if (doc === null) {
85
+ throw new factory_1.factory.errors.NotFound('orderInTransaction');
86
+ }
87
+ if (typeof doc.customer?.typeOf !== 'string') {
88
+ throw new factory_1.factory.errors.NotFound('orderInTransaction.customer');
89
+ }
90
+ return doc.customer;
91
+ }
18
92
  /**
19
93
  * 取引進行中の注文からacceptedOffersを検索する
20
94
  * 予約取引から予約ごとの価格仕様も参照する
21
95
  */
22
- async findAcceptedOffersWithPriceByOrderNumber(params) {
96
+ async findAcceptedOffersWithPriceByIdentifier(params) {
23
97
  const doc = await this.orderModel.findOne({
24
- orderNumber: { $eq: params.orderNumber },
98
+ identifier: { $eq: params.identifier },
25
99
  typeOf: { $eq: factory_1.factory.transactionType.PlaceOrder }
26
100
  }, { acceptedOffers: 1 })
27
101
  .lean()
@@ -59,40 +133,19 @@ class OrderInTransactionRepo extends acceptedOfferInReserve_1.AcceptedOfferInRes
59
133
  };
60
134
  });
61
135
  }
62
- // /**
63
- // * 取引進行中の注文からacceptedOffersを検索する
64
- // */
65
- // public async findAcceptedOffersByOrderNumber(
66
- // params: { orderNumber: { $eq: string } }
67
- // ): Promise<Pick<factory.order.IAcceptedOffer, 'itemOffered' | 'serialNumber'>[]> {
68
- // const doc = await this.orderModel.findOne<HydratedDocument<Pick<factory.order.IAcceptedOffer, 'itemOffered' | 'serialNumber'>>>(
69
- // {
70
- // orderNumber: { $eq: params.orderNumber.$eq },
71
- // typeOf: { $eq: factory.transactionType.PlaceOrder }
72
- // },
73
- // { acceptedOffers: 1 }
74
- // )
75
- // .lean<Pick<IOrderInTransaction, 'acceptedOffers'>>()
76
- // .exec();
77
- // if (doc === null) {
78
- // throw new factory.errors.NotFound('orderInTransaction');
79
- // }
80
- // return doc.acceptedOffers;
81
- // }
82
136
  /**
83
137
  * 注文を受注する
84
138
  * typeOf: PlaceOrder -> typeOf: Order
85
139
  */
86
- async placeOrder(order) {
140
+ async placeOrderByIdentifier(filter, order) {
141
+ const { identifier } = filter;
87
142
  if (!(order.orderDate instanceof Date)) {
88
143
  throw new factory_1.factory.errors.Argument('orderDate', 'must be Date');
89
144
  }
90
- // acceptedOffersを上書きしない
91
- // const { acceptedOffers, ...orderWithoutAcceptedOffers } = order;
92
145
  const setFields = order;
93
146
  // typeOf:PlaceOrderのドキュメントが存在すれば、typeOf:Orderに変更する
94
147
  await this.orderModel.updateOne({
95
- orderNumber: { $eq: order.orderNumber },
148
+ identifier: { $eq: identifier },
96
149
  typeOf: { $eq: factory_1.factory.transactionType.PlaceOrder }
97
150
  }, { $set: setFields }, {})
98
151
  .exec();
@@ -101,49 +154,44 @@ class OrderInTransactionRepo extends acceptedOfferInReserve_1.AcceptedOfferInRes
101
154
  * 注文documentがなければ作成し、受け入れられたオファーを追加する
102
155
  * このメソッドでdocumentが初めて生成される(typeOf:PlaceOrderとして)
103
156
  */
104
- async acceptOffer(params) {
157
+ async acceptOfferByIdentifier(params) {
105
158
  if (!Array.isArray(params.acceptedOffers) || params.acceptedOffers.length === 0) {
106
159
  return;
107
160
  }
108
- const setOnInsert = {
109
- typeOf: factory_1.factory.transactionType.PlaceOrder,
110
- orderDate: new Date(), // orderDate required(2024-12-09~)
111
- orderNumber: params.orderNumber,
112
- project: params.project,
113
- identifier: params.identifier // 取引ID(2026-06-22~)
114
- };
115
- return this.orderModel.updateOne({
161
+ const result = await this.orderModel.updateOne({
116
162
  typeOf: { $eq: factory_1.factory.transactionType.PlaceOrder },
117
- orderNumber: { $eq: params.orderNumber },
163
+ identifier: { $eq: params.identifier },
118
164
  // プロジェクトでもフィルター(注文番号重複バグがあったため)(2026-02-21~)
119
165
  // 万が一異なるプロジェクトで同じ注文番号でオファーを受け入れようとしても、DBにインデックスによってDuplicateKey
120
166
  'project.id': { $eq: params.project.id }
121
167
  }, {
122
- $setOnInsert: setOnInsert,
168
+ // $setOnInsert: setOnInsert, // createPlaceOrderIfNotExistsへ移行(2026-06-24~)
123
169
  $push: {
124
170
  acceptedOffers: {
125
171
  $each: params.acceptedOffers
126
172
  }
127
- },
128
- $set: {
129
- ...((params.broker !== undefined) && {
130
- broker: { id: params.broker.id, typeOf: params.broker.typeOf }
131
- }) // set broker(2026-06-21~)
132
173
  }
133
- }, { upsert: true })
174
+ }, {
175
+ // upsert: true // createPlaceOrderIfNotExistsへ移行(2026-06-24~)
176
+ })
134
177
  .exec();
178
+ if (result.matchedCount !== 1) {
179
+ console.error(params, result);
180
+ throw new factory_1.factory.errors.Internal(`orderInTransaction not found`);
181
+ }
182
+ return result;
135
183
  }
136
184
  /**
137
185
  * serialNumberからオファーを除外する
138
186
  * ホワイトリストとブラックリスト両方に対応
139
187
  */
140
- async voidAcceptedOfferBySerialNumber(params) {
188
+ async voidAcceptedOfferByIdentifier(params) {
141
189
  const serialNumberIn = params.acceptedOffers.serialNumber.$in;
142
190
  const serialNumberNin = params.acceptedOffers.serialNumber.$nin;
143
191
  if (Array.isArray(serialNumberIn) && serialNumberIn.length > 0) {
144
192
  return this.orderModel.updateOne({
145
193
  typeOf: { $eq: factory_1.factory.transactionType.PlaceOrder },
146
- orderNumber: { $eq: params.orderNumber }
194
+ identifier: { $eq: params.identifier }
147
195
  }, {
148
196
  $pull: {
149
197
  acceptedOffers: {
@@ -156,7 +204,7 @@ class OrderInTransactionRepo extends acceptedOfferInReserve_1.AcceptedOfferInRes
156
204
  else if (Array.isArray(serialNumberNin) && serialNumberNin.length > 0) {
157
205
  return this.orderModel.updateOne({
158
206
  typeOf: { $eq: factory_1.factory.transactionType.PlaceOrder },
159
- orderNumber: { $eq: params.orderNumber }
207
+ identifier: { $eq: params.identifier }
160
208
  }, {
161
209
  $pull: {
162
210
  acceptedOffers: {
@@ -170,52 +218,33 @@ class OrderInTransactionRepo extends acceptedOfferInReserve_1.AcceptedOfferInRes
170
218
  return;
171
219
  }
172
220
  }
173
- async setCustomer(params) {
174
- const { customer, orderNumber, project } = params;
221
+ async setCustomerByIdentifier(params) {
222
+ const { customer, identifier, project } = params;
175
223
  const filter = {
176
224
  typeOf: { $eq: factory_1.factory.transactionType.PlaceOrder },
177
- orderNumber: { $eq: orderNumber },
225
+ identifier: { $eq: identifier },
178
226
  // プロジェクトでもフィルター(注文番号重複バグがあったため)(2026-02-21~)
179
227
  // 万が一異なるプロジェクトで同じ注文番号でオファーを受け入れようとしても、DBにインデックスによってDuplicateKey
180
228
  'project.id': { $eq: project.id }
181
229
  };
182
- const setOnInsert = {
183
- typeOf: factory_1.factory.transactionType.PlaceOrder,
184
- orderDate: new Date(), // orderDate required(2024-12-09~)
185
- orderNumber,
186
- project,
187
- identifier: params.identifier // 取引ID(2026-06-22~)
188
- };
189
230
  const setKeys = { customer };
190
- return this.orderModel.updateOne(filter, {
191
- $setOnInsert: setOnInsert,
231
+ const result = await this.orderModel.updateOne(filter, {
232
+ // $setOnInsert: setOnInsert, // createPlaceOrderIfNotExistsへ移行(2026-06-24~)
192
233
  $set: setKeys
193
- }, { upsert: true })
194
- .exec();
195
- }
196
- /**
197
- * 注文ドキュメントからcustomer属性を参照する
198
- * customer未設定であれば、NotFound
199
- */
200
- async findCustomerByOrderNumber(params) {
201
- const doc = await this.orderModel.findOne({
202
- orderNumber: { $eq: params.orderNumber.$eq }
203
- // typeOf: { $eq: factory.transactionType.PlaceOrder } // 検証しない
204
- }, { customer: 1 })
205
- .lean()
234
+ }, {
235
+ // upsert: true // createPlaceOrderIfNotExistsへ移行(2026-06-24~)
236
+ })
206
237
  .exec();
207
- if (doc === null) {
208
- throw new factory_1.factory.errors.NotFound('orderInTransaction');
238
+ if (result.matchedCount !== 1) {
239
+ console.error(params, result);
240
+ throw new factory_1.factory.errors.Internal(`orderInTransaction not found`);
209
241
  }
210
- if (typeof doc.customer?.typeOf !== 'string') {
211
- throw new factory_1.factory.errors.NotFound('orderInTransaction.customer');
212
- }
213
- return doc.customer;
242
+ return result;
214
243
  }
215
- async deleteByOrderNumber(params) {
244
+ async deleteByIdentifier(params) {
216
245
  return this.orderModel.deleteOne({
217
246
  typeOf: { $eq: factory_1.factory.transactionType.PlaceOrder },
218
- orderNumber: { $eq: params.orderNumber }
247
+ identifier: { $eq: params.identifier }
219
248
  })
220
249
  .exec();
221
250
  }
@@ -20,7 +20,6 @@ interface IOptions {
20
20
  secret: string;
21
21
  passportValidator?: IPassportValidator;
22
22
  }
23
- type IStartParams = (factory.transaction.placeOrder.IStartParamsWithoutDetail) & {};
24
23
  /**
25
24
  * 取引許可証リポジトリ
26
25
  */
@@ -34,7 +33,11 @@ export declare class PassportRepo {
34
33
  /**
35
34
  * 許可証トークンがあれば検証する
36
35
  */
37
- validatePassportTokenIfExist(params: Pick<IStartParams, 'object'>): Promise<{
36
+ validatePassportTokenIfExist(params: {
37
+ object?: {
38
+ passport?: factory.transaction.IPassportBeforeStart;
39
+ };
40
+ }): Promise<{
38
41
  passport?: IVerifiedPassport;
39
42
  customerType?: string;
40
43
  }>;
@@ -0,0 +1,18 @@
1
+ import type { Connection } from 'mongoose';
2
+ import { IRateLimitSetting } from '../mongoose/schemas/setting';
3
+ interface IDBOptions {
4
+ connection: Connection;
5
+ }
6
+ /**
7
+ * apisレート制限設定リポジトリ
8
+ */
9
+ export declare class RateLimitSettingRepo {
10
+ private readonly settingModel;
11
+ private static cachedSettings;
12
+ private static cacheExpiry;
13
+ private static readonly CACHE_TTL_MS;
14
+ constructor(options: IDBOptions);
15
+ findRateLimitSetting(): Promise<IRateLimitSetting>;
16
+ addRateLimitSetting(params: IRateLimitSetting): Promise<import("mongoose").UpdateWriteOpResult>;
17
+ }
18
+ export {};
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RateLimitSettingRepo = void 0;
4
+ const factory_1 = require("../../factory");
5
+ const setting_1 = require("../mongoose/schemas/setting");
6
+ /**
7
+ * apisレート制限設定リポジトリ
8
+ */
9
+ class RateLimitSettingRepo {
10
+ settingModel;
11
+ // static にすることで、クラスが何回 new されてもメモリ上で1つだけ保持される
12
+ static cachedSettings;
13
+ static cacheExpiry = 0;
14
+ static CACHE_TTL_MS = 10 * 60 * 1000; // 10分
15
+ constructor(options) {
16
+ const { connection } = options;
17
+ this.settingModel = connection.model(setting_1.modelName, (0, setting_1.createSchema)());
18
+ }
19
+ async findRateLimitSetting() {
20
+ const now = Date.now();
21
+ // キャッシュ参照
22
+ if (RateLimitSettingRepo.cachedSettings !== undefined && now < RateLimitSettingRepo.cacheExpiry) {
23
+ return RateLimitSettingRepo.cachedSettings;
24
+ }
25
+ const settingDoc = await this.settingModel.findOne({ 'project.id': { $eq: '*' } }, {
26
+ _id: 0,
27
+ rateLimit: 1
28
+ })
29
+ .lean()
30
+ .exec();
31
+ if (settingDoc?.rateLimit === undefined) {
32
+ throw new factory_1.factory.errors.NotFound('rateLimitSetting');
33
+ }
34
+ // キャッシュを更新
35
+ RateLimitSettingRepo.cachedSettings = settingDoc.rateLimit;
36
+ RateLimitSettingRepo.cacheExpiry = now + RateLimitSettingRepo.CACHE_TTL_MS;
37
+ return RateLimitSettingRepo.cachedSettings;
38
+ }
39
+ async addRateLimitSetting(params) {
40
+ return this.settingModel.updateOne({ 'project.id': { $eq: '*' } }, {
41
+ $set: {
42
+ rateLimit: params
43
+ }
44
+ })
45
+ .exec();
46
+ }
47
+ }
48
+ exports.RateLimitSettingRepo = RateLimitSettingRepo;
@@ -0,0 +1,17 @@
1
+ import type { Connection } from 'mongoose';
2
+ import { IWaiterSettings } from '../mongoose/schemas/setting';
3
+ interface IDBOptions {
4
+ connection: Connection;
5
+ }
6
+ /**
7
+ * 流入制限設定リポジトリ
8
+ */
9
+ export declare class WaiterSettingRepo {
10
+ private readonly settingModel;
11
+ private static cachedSettings;
12
+ private static cacheExpiry;
13
+ private static readonly CACHE_TTL_MS;
14
+ constructor(options: IDBOptions);
15
+ findWaiterSetting(): Promise<IWaiterSettings | undefined>;
16
+ }
17
+ export {};
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WaiterSettingRepo = void 0;
4
+ const setting_1 = require("../mongoose/schemas/setting");
5
+ /**
6
+ * 流入制限設定リポジトリ
7
+ */
8
+ class WaiterSettingRepo {
9
+ settingModel;
10
+ // static にすることで、クラスが何回 new されてもメモリ上で1つだけ保持される
11
+ static cachedSettings;
12
+ static cacheExpiry = 0;
13
+ static CACHE_TTL_MS = 10 * 60 * 1000; // 10分
14
+ constructor(options) {
15
+ const { connection } = options;
16
+ this.settingModel = connection.model(setting_1.modelName, (0, setting_1.createSchema)());
17
+ }
18
+ async findWaiterSetting() {
19
+ const now = Date.now();
20
+ // キャッシュ参照
21
+ if (WaiterSettingRepo.cachedSettings !== undefined && now < WaiterSettingRepo.cacheExpiry) {
22
+ return WaiterSettingRepo.cachedSettings;
23
+ }
24
+ const settingDoc = await this.settingModel.findOne({ 'project.id': { $eq: '*' } }, {
25
+ _id: 0,
26
+ waiter: 1
27
+ })
28
+ .lean()
29
+ .exec();
30
+ // キャッシュを更新
31
+ if (settingDoc?.waiter !== undefined) {
32
+ console.log('document exist!', settingDoc);
33
+ WaiterSettingRepo.cachedSettings = settingDoc.waiter;
34
+ WaiterSettingRepo.cacheExpiry = now + WaiterSettingRepo.CACHE_TTL_MS;
35
+ }
36
+ return WaiterSettingRepo.cachedSettings;
37
+ }
38
+ }
39
+ exports.WaiterSettingRepo = WaiterSettingRepo;