@chevre/domain 25.0.0-alpha.7 → 25.0.0-alpha.9

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.
@@ -3,6 +3,10 @@ import { IVirtuals } from '../virtuals';
3
3
  import { factory } from '../../../factory';
4
4
  type IDocType = Omit<factory.order.IOrder, 'id'> & {
5
5
  acceptedOffers?: factory.order.IAcceptedOffer[];
6
+ /**
7
+ * 注文取引IDとして再定義(2026-06-22~)
8
+ */
9
+ identifier?: string;
6
10
  };
7
11
  type IModel = Model<IDocType, Record<string, never>, Record<string, never>, IVirtuals>;
8
12
  type ISchemaDefinition = SchemaDefinition<IDocType>;
@@ -25,7 +25,8 @@ const schemaDefinition = {
25
25
  previousOrderStatus: String,
26
26
  orderDate: { type: Date, required: true },
27
27
  dateReturned: Date,
28
- orderedItem: [mongoose_1.SchemaTypes.Mixed]
28
+ orderedItem: [mongoose_1.SchemaTypes.Mixed],
29
+ identifier: String, // 注文取引IDとして再定義(2026-06-22~)
29
30
  // 以下廃止(2026-06-13~)
30
31
  // identifier: SchemaTypes.Mixed, // 廃止するためにMixed化(2026-06-12~)
31
32
  // isGift: Boolean,
@@ -69,6 +70,14 @@ const indexes = [
69
70
  // }
70
71
  // }
71
72
  // ],
73
+ [
74
+ // 注文取引IDはユニークなはず
75
+ { identifier: 1 },
76
+ {
77
+ unique: true,
78
+ name: 'uniqueIdentifier'
79
+ }
80
+ ],
72
81
  [
73
82
  // 注文番号はユニークなはず
74
83
  { orderNumber: 1 },
@@ -111,7 +111,6 @@ export interface IJWTSetting {
111
111
  algorithm: Algorithm;
112
112
  }
113
113
  export interface IOrderNumberSetting {
114
- validFrom: Date;
115
114
  /**
116
115
  * fpe暗号鍵
117
116
  */
@@ -120,11 +119,6 @@ export interface IOrderNumberSetting {
120
119
  * "A"
121
120
  */
122
121
  version: string;
123
- versioningForceProjects?: string[];
124
- /**
125
- * 強制的にバージョニング不使用のプロジェクト
126
- */
127
- versioningExceptionProjects?: string[];
128
122
  }
129
123
  export interface ITransactionNumberSetting {
130
124
  validFrom: Date;
@@ -140,12 +140,14 @@ export declare class OrderRepo {
140
140
  })[]>;
141
141
  getCursor(conditions: any, projection: any): import("mongoose").Cursor<import("mongoose").Document<unknown, Record<string, never>, IDocType, import("./mongoose/virtuals").IVirtuals, {}> & Omit<factory.order.IOrder, "id"> & {
142
142
  acceptedOffers?: factory.order.IAcceptedOffer[];
143
+ identifier?: string;
143
144
  } & {
144
145
  _id: import("mongoose").Types.ObjectId;
145
146
  } & {
146
147
  __v: number;
147
148
  }, import("mongoose").QueryOptions<IDocType>, (import("mongoose").Document<unknown, Record<string, never>, IDocType, import("./mongoose/virtuals").IVirtuals, {}> & Omit<factory.order.IOrder, "id"> & {
148
149
  acceptedOffers?: factory.order.IAcceptedOffer[];
150
+ identifier?: string;
149
151
  } & {
150
152
  _id: import("mongoose").Types.ObjectId;
151
153
  } & {
@@ -4,13 +4,17 @@ import { AcceptedOfferInReserveRepo } from './acceptedOfferInReserve';
4
4
  type IOrderInTransaction = Pick<factory.order.IOrder, 'orderNumber' | 'project'> & {
5
5
  typeOf: factory.transactionType.PlaceOrder;
6
6
  orderDate: Date;
7
+ /**
8
+ * 注文取引IDとして再定義(2026-06-22~)
9
+ */
10
+ identifier: string;
7
11
  acceptedOffers: factory.order.IAcceptedOffer[];
8
12
  customer?: factory.order.ICustomer;
9
13
  };
10
14
  /**
11
15
  * typeOf: Orderへドキュメント変換時の編集フィールド
12
16
  */
13
- export type IPlacingOrder = Pick<factory.order.IOrder, 'broker' | 'confirmationNumber' | 'orderDate' | 'orderNumber' | 'orderStatus' | 'orderedItem' | 'paymentMethods' | 'price' | 'priceCurrency' | 'seller' | 'typeOf'> & {
17
+ export type IPlacingOrder = Pick<factory.order.IOrder, 'confirmationNumber' | 'orderDate' | 'orderNumber' | 'orderStatus' | 'orderedItem' | 'paymentMethods' | 'price' | 'priceCurrency' | 'seller' | 'typeOf'> & {
14
18
  url?: never;
15
19
  identifier?: never;
16
20
  name?: never;
@@ -22,6 +26,10 @@ export type IPlacingOrder = Pick<factory.order.IOrder, 'broker' | 'confirmationN
22
26
  * 上書きしてはいけない
23
27
  */
24
28
  customer?: never;
29
+ /**
30
+ * 上書きしてはいけない
31
+ */
32
+ broker?: never;
25
33
  };
26
34
  export type IMinimizedReservationFor = Pick<factory.order.IEventAsReservationFor, 'endDate' | 'id' | 'startDate' | 'typeOf'> & {
27
35
  location: Pick<factory.order.IEventAsReservationFor['location'], 'branchCode' | 'typeOf'>;
@@ -70,7 +78,7 @@ export declare class OrderInTransactionRepo extends AcceptedOfferInReserveRepo {
70
78
  * 注文documentがなければ作成し、受け入れられたオファーを追加する
71
79
  * このメソッドでdocumentが初めて生成される(typeOf:PlaceOrderとして)
72
80
  */
73
- acceptOffer(params: Pick<IOrderInTransaction, 'orderNumber' | 'project'> & {
81
+ acceptOffer(params: Pick<IOrderInTransaction, 'orderNumber' | 'project' | 'identifier'> & {
74
82
  acceptedOffers: IMinimizedAcceptedOffer[] | factory.order.ICOAAcceptedOffer[];
75
83
  broker?: factory.order.IBroker;
76
84
  }): Promise<import("mongoose").UpdateWriteOpResult | undefined>;
@@ -87,7 +95,7 @@ export declare class OrderInTransactionRepo extends AcceptedOfferInReserveRepo {
87
95
  };
88
96
  };
89
97
  }): Promise<import("mongoose").UpdateWriteOpResult | undefined>;
90
- setCustomer(params: Pick<IOrderInTransaction, 'orderNumber' | 'project'> & {
98
+ setCustomer(params: Pick<IOrderInTransaction, 'orderNumber' | 'project' | 'identifier'> & {
91
99
  customer: factory.order.ICustomer;
92
100
  }): Promise<import("mongoose").UpdateWriteOpResult>;
93
101
  /**
@@ -109,7 +109,8 @@ class OrderInTransactionRepo extends acceptedOfferInReserve_1.AcceptedOfferInRes
109
109
  typeOf: factory_1.factory.transactionType.PlaceOrder,
110
110
  orderDate: new Date(), // orderDate required(2024-12-09~)
111
111
  orderNumber: params.orderNumber,
112
- project: params.project
112
+ project: params.project,
113
+ identifier: params.identifier // 取引ID(2026-06-22~)
113
114
  };
114
115
  return this.orderModel.updateOne({
115
116
  typeOf: { $eq: factory_1.factory.transactionType.PlaceOrder },
@@ -182,7 +183,8 @@ class OrderInTransactionRepo extends acceptedOfferInReserve_1.AcceptedOfferInRes
182
183
  typeOf: factory_1.factory.transactionType.PlaceOrder,
183
184
  orderDate: new Date(), // orderDate required(2024-12-09~)
184
185
  orderNumber,
185
- project
186
+ project,
187
+ identifier: params.identifier // 取引ID(2026-06-22~)
186
188
  };
187
189
  const setKeys = { customer };
188
190
  return this.orderModel.updateOne(filter, {
@@ -5,6 +5,9 @@ import type { Connection } from 'mongoose';
5
5
  export declare class OrderNumberRepo {
6
6
  private readonly counterRepo;
7
7
  private readonly settingModel;
8
+ private static cachedSettings;
9
+ private static cacheExpiry;
10
+ private static readonly CACHE_TTL_MS;
8
11
  constructor(params: {
9
12
  connection: Connection;
10
13
  });
@@ -22,6 +25,7 @@ export declare class OrderNumberRepo {
22
25
  orderDate: Date;
23
26
  }): Promise<string>;
24
27
  decrypt(id: string): Promise<string>;
28
+ clearSettingCache(): void;
25
29
  /**
26
30
  * 注文番号生成設定を検索する
27
31
  */
@@ -17,36 +17,25 @@ const ORDER_NUMBER_SEPARATOR = '-';
17
17
  class OrderNumberRepo {
18
18
  counterRepo;
19
19
  settingModel;
20
+ // static にすることで、クラスが何回 new されてもメモリ上で1つだけ保持される
21
+ static cachedSettings;
22
+ static cacheExpiry = 0;
23
+ static CACHE_TTL_MS = 10 * 60 * 1000; // 10分
20
24
  constructor(params) {
21
25
  this.counterRepo = new transactionNumberCounter_1.TransactionNumberCounterRepo(params);
22
26
  this.settingModel = params.connection.model(setting_1.modelName, (0, setting_1.createSchema)());
23
27
  }
24
- // public static GENERATE_VERSION0(timestamp: string, seq: number): string {
25
- // let orderNumber = `${timestamp}${seq}`;
26
- // // checkdigit
27
- // const cd = cdigit.luhn.compute(orderNumber);
28
- // orderNumber = fpe({ password: cd })
29
- // .encrypt(orderNumber);
30
- // orderNumber = `${cd}${orderNumber}`;
31
- // return orderNumber;
32
- // }
33
28
  /**
34
29
  * 注文日時から新しい注文番号を発行する
35
30
  * グローバルユニークである前提
36
31
  */
37
32
  async issueOrderNumber(params) {
38
- const { fpeSecret, version, validFrom
39
- // versioningForceProjects
40
- // versioningExceptionProjects
41
- } = await this.findSetting();
33
+ const { fpeSecret, version } = await this.findSetting();
42
34
  const timestamp = (0, moment_timezone_1.default)(params.orderDate)
43
35
  .valueOf()
44
36
  .toString();
45
- // const projectPrefix = params.project.alternateName
46
- // .toUpperCase();
47
37
  const projectPrefix = params.project.alternateName
48
38
  .toUpperCase().at(0);
49
- // const dataFeedIdentifier = `${projectPrefix}:${timestamp}`;
50
39
  const dataFeedIdentifier = timestamp; // reconsider increment scope(2026-02-21~)
51
40
  const dataFeedExpires = (0, moment_timezone_1.default)(params.orderDate)
52
41
  .add(1, 'minute') // ミリ秒でカウントしていくので、注文日時後1分で十分
@@ -57,32 +46,16 @@ class OrderNumberRepo {
57
46
  expires: dataFeedExpires
58
47
  });
59
48
  let orderNumber;
60
- const useVersioning = (validFrom instanceof Date && (0, moment_timezone_1.default)(validFrom)
61
- .isSameOrBefore(params.orderDate));
62
- if (typeof fpeSecret === 'string' && typeof version === 'string' && useVersioning) {
63
- const transactionFactory = new transactionNumber_1.TransactionNumberFactory({ fpeSecret, version });
64
- orderNumber = transactionFactory.generate(timestamp, incrReply);
65
- orderNumber = `${projectPrefix}${orderNumber}`; // 桁数をversion0に合わせるためにエイリアスの1文字目のみを採用
66
- orderNumber = `${[
67
- orderNumber.slice(0, 4),
68
- orderNumber.slice(4, 11),
69
- orderNumber.slice(11)
70
- ].join(ORDER_NUMBER_SEPARATOR)}`;
71
- }
72
- else {
73
- // discontinue version0(2026-02-13~)
74
- throw new factory_1.factory.errors.NotImplemented('orderNumber with no version discontinued');
75
- // orderNumber = OrderNumberRepo.GENERATE_VERSION0(timestamp, incrReply);
76
- // orderNumber = `${projectPrefix}${orderNumber}`;
77
- // orderNumber = `${[
78
- // // tslint:disable-next-line:no-magic-numbers
79
- // orderNumber.slice(0, 4),
80
- // // tslint:disable-next-line:no-magic-numbers
81
- // orderNumber.slice(4, 11),
82
- // // tslint:disable-next-line:no-magic-numbers
83
- // orderNumber.slice(11)
84
- // ].join(ORDER_NUMBER_SEPARATOR)}`;
85
- }
49
+ // const useVersioning: boolean = (validFrom instanceof Date && moment(validFrom)
50
+ // .isSameOrBefore(params.orderDate));
51
+ const transactionFactory = new transactionNumber_1.TransactionNumberFactory({ fpeSecret, version });
52
+ orderNumber = transactionFactory.generate(timestamp, incrReply);
53
+ orderNumber = `${projectPrefix}${orderNumber}`; // 桁数をversion0に合わせるためにエイリアスの1文字目のみを採用
54
+ orderNumber = `${[
55
+ orderNumber.slice(0, 4),
56
+ orderNumber.slice(4, 11),
57
+ orderNumber.slice(11)
58
+ ].join(ORDER_NUMBER_SEPARATOR)}`;
86
59
  return orderNumber;
87
60
  }
88
61
  async decrypt(id) {
@@ -97,41 +70,40 @@ class OrderNumberRepo {
97
70
  throw new factory_1.factory.errors.NotImplemented('no version not implemented');
98
71
  }
99
72
  }
73
+ clearSettingCache() {
74
+ OrderNumberRepo.cacheExpiry = 0;
75
+ OrderNumberRepo.cachedSettings = undefined;
76
+ }
100
77
  /**
101
78
  * 注文番号生成設定を検索する
102
79
  */
103
80
  async findSetting() {
81
+ const now = Date.now();
82
+ // キャッシュ参照(2026-06-22~)
83
+ if (OrderNumberRepo.cachedSettings !== undefined && now < OrderNumberRepo.cacheExpiry) {
84
+ return OrderNumberRepo.cachedSettings;
85
+ }
104
86
  const filterQuery = { 'project.id': { $eq: '*' } };
105
- const projection = {
87
+ const setting = await this.settingModel.findOne(filterQuery, {
106
88
  _id: 0,
107
89
  orderNumber: 1
108
- };
109
- const setting = await this.settingModel.findOne(filterQuery, projection)
90
+ })
110
91
  .lean()
111
92
  .exec();
112
93
  if (setting === null || setting.orderNumber === undefined) {
113
- return {
114
- // versioningForceProjects: []
115
- // versioningExceptionProjects: []
116
- };
94
+ throw new factory_1.factory.errors.NotFound('setting.orderNumber');
117
95
  }
118
- const { fpeSecret, version, validFrom } = setting.orderNumber;
96
+ const { fpeSecret, version } = setting.orderNumber;
119
97
  if (typeof fpeSecret !== 'string' || fpeSecret === '') {
120
98
  throw new factory_1.factory.errors.NotFound('setting.orderNumber.secret');
121
99
  }
122
100
  if (typeof version !== 'string' || version === '') {
123
101
  throw new factory_1.factory.errors.NotFound('setting.orderNumber.version');
124
102
  }
125
- if (!(validFrom instanceof Date)) {
126
- throw new factory_1.factory.errors.NotFound('setting.orderNumber.validFrom must be Date');
127
- }
128
- return {
129
- fpeSecret, version, validFrom
130
- // versioningForceProjects: [
131
- // ...(Array.isArray(versioningForceProjects)) ? versioningForceProjects : []
132
- // ]
133
- // versioningExceptionProjects: (Array.isArray(versioningExceptionProjects)) ? versioningExceptionProjects : []
134
- };
103
+ // キャッシュを更新
104
+ OrderNumberRepo.cachedSettings = { fpeSecret, version };
105
+ OrderNumberRepo.cacheExpiry = now + OrderNumberRepo.CACHE_TTL_MS;
106
+ return OrderNumberRepo.cachedSettings;
135
107
  }
136
108
  }
137
109
  exports.OrderNumberRepo = OrderNumberRepo;
@@ -10,6 +10,7 @@ export declare function acceptOffer(params: {
10
10
  project: {
11
11
  id: string;
12
12
  };
13
+ placeOrderId: string;
13
14
  acceptedOffers: IMinimizedAcceptedOffer[] | factory.order.ICOAAcceptedOffer[];
14
15
  broker?: factory.order.IBroker;
15
16
  }): IAcceptOfferOperation<void>;
@@ -13,6 +13,7 @@ function acceptOffer(params) {
13
13
  await repos.orderInTransaction.acceptOffer({
14
14
  orderNumber: params.orderNumber,
15
15
  project: { id: params.project.id, typeOf: factory_1.factory.organizationType.Project },
16
+ identifier: params.placeOrderId,
16
17
  acceptedOffers: params.acceptedOffers,
17
18
  ...((params.broker !== undefined) && { broker: params.broker })
18
19
  });
@@ -66,6 +66,7 @@ function authorize(params, options) {
66
66
  await (0, any_1.acceptOffer)({
67
67
  orderNumber,
68
68
  project: transaction.project,
69
+ placeOrderId: transaction.id,
69
70
  acceptedOffers: minimizedAcceptedOffers,
70
71
  ...((typeof params.object.broker?.typeOf === 'string') && { broker: params.object.broker })
71
72
  })(repos);
@@ -119,6 +119,7 @@ function authorize(params) {
119
119
  await (0, any_1.acceptOffer)({
120
120
  orderNumber,
121
121
  project: transaction.project,
122
+ placeOrderId: params.transaction.id,
122
123
  acceptedOffers: acceptedOffers4result
123
124
  })(repos);
124
125
  // }
@@ -154,6 +154,7 @@ function changeOffers(params) {
154
154
  await (0, any_1.acceptOffer)({
155
155
  orderNumber,
156
156
  project: transaction.project,
157
+ placeOrderId: params.transaction.id,
157
158
  acceptedOffers: acceptedOffers4result
158
159
  })(repos);
159
160
  // }
@@ -95,7 +95,9 @@ function createPlacingOrder(params) {
95
95
  // discontinue(2026-06-11~)
96
96
  // const name: string | undefined =
97
97
  // (typeof transaction.object.name === 'string') ? transaction.object.name : undefined;
98
- const broker = (typeof transaction.object.broker?.typeOf === 'string') ? transaction.object.broker : undefined;
98
+ // discontinue(2026-06-22~)
99
+ // const broker: factory.order.IBroker | undefined =
100
+ // (typeof transaction.object.broker?.typeOf === 'string') ? transaction.object.broker : undefined;
99
101
  const { paymentMethods, price } = createPaymentMethods({ authorizePaymentActions });
100
102
  const eventReservationAcceptedOffers = [];
101
103
  params.acceptedOffers.forEach((acceptedOffer) => {
@@ -125,6 +127,6 @@ function createPlacingOrder(params) {
125
127
  .toDate(),
126
128
  orderedItem, // 2024-06-18~
127
129
  // ...(typeof name === 'string') ? { name } : undefined, // discontinue(2026-06-11~)
128
- ...(typeof broker?.typeOf === 'string') ? { broker } : undefined // 2024-06-17~
130
+ // ...(typeof broker?.typeOf === 'string') ? { broker } : undefined // discontinue(2026-06-22~)
129
131
  };
130
132
  }
@@ -13,7 +13,6 @@ type IStartPlaceOrderParams = factory.transaction.placeOrder.IStartParamsWithout
13
13
  */
14
14
  clientUser: factory.transaction.placeOrder.IClientUserBeforeStart;
15
15
  };
16
- broker?: factory.order.IBroker;
17
16
  };
18
17
  declare function createStartParams(params: IStartPlaceOrderParams, expiresInSeconds: number, passport: IVerifiedPassport | undefined, seller: Pick<factory.seller.ISeller, 'id' | 'name' | 'typeOf' | 'project' | 'additionalProperty'>, customerType?: string): factory.transaction.placeOrder.IStartParams;
19
18
  export { AGENT_IDENTIFIER_NAME_PASSPORT, createStartParams, IStartPlaceOrderParams };
@@ -5,10 +5,8 @@ exports.createStartParams = createStartParams;
5
5
  const factory_1 = require("../../../../factory");
6
6
  const AGENT_IDENTIFIER_NAME_PASSPORT = 'passport';
7
7
  exports.AGENT_IDENTIFIER_NAME_PASSPORT = AGENT_IDENTIFIER_NAME_PASSPORT;
8
- function createStartParams(params, expiresInSeconds, passport, seller,
9
- // broker?: factory.order.IBroker,
10
- customerType) {
11
- const { broker } = params;
8
+ function createStartParams(params, expiresInSeconds, passport, seller, customerType) {
9
+ // const { broker } = params;
12
10
  // let clientUser: Omit<factory.clientUser.IClientUser, 'scope' | 'scopes'> | undefined;
13
11
  let instrument;
14
12
  if (typeof params.object.clientUser?.client_id === 'string') {
@@ -21,7 +19,7 @@ customerType) {
21
19
  // ...(typeof passport?.scope === 'string') ? { passport } : undefined, // discontinue(2026-06-10~)
22
20
  // ...(typeof clientUser?.client_id === 'string') ? { clientUser } : undefined, // discontinue(2026-06-10~)
23
21
  // ...(typeof params.object?.name === 'string') ? { name: params.object?.name } : undefined, // discontinue(2026-06-11~)
24
- ...(typeof broker?.typeOf === 'string') ? { broker: broker } : undefined,
22
+ // ...(typeof broker?.typeOf === 'string') ? { broker: broker } : undefined, // discontinue(2026-06-22~)
25
23
  ...(typeof params.object.customer?.typeOf === 'string') ? { customer: params.object.customer } : undefined,
26
24
  ...(typeof customerType === 'string') ? { customerType } : undefined
27
25
  };
@@ -94,6 +94,7 @@ function updateAgent(params) {
94
94
  await repos.orderInTransaction.setCustomer({
95
95
  orderNumber,
96
96
  project: transaction.project,
97
+ identifier: params.id,
97
98
  customer: customerInOrder
98
99
  });
99
100
  }
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "dependencies": {
12
12
  "@aws-sdk/client-cognito-identity-provider": "3.600.0",
13
13
  "@aws-sdk/credential-providers": "3.600.0",
14
- "@chevre/factory": "9.0.0-alpha.2",
14
+ "@chevre/factory": "9.0.0-alpha.3",
15
15
  "@motionpicture/coa-service": "10.0.0",
16
16
  "@motionpicture/gmo-service": "6.1.0-alpha.0",
17
17
  "@sendgrid/client": "8.1.4",
@@ -91,5 +91,5 @@
91
91
  "postversion": "git push origin --tags",
92
92
  "prepublishOnly": "npm run clean && npm run build"
93
93
  },
94
- "version": "25.0.0-alpha.7"
94
+ "version": "25.0.0-alpha.9"
95
95
  }