@chevre/domain 23.2.0-alpha.6 → 23.2.0-alpha.60

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 (133) hide show
  1. package/example/src/chevre/acceptedPaymentMethodOffer/adminAcceptedPaymentMethodOffers.ts +25 -17
  2. package/example/src/chevre/confirmationNumber/testRandomness.ts +49 -0
  3. package/example/src/chevre/emailMessage/createEmailMessageText.ts +63 -0
  4. package/example/src/chevre/event/importEventsFromCOAByTitle.ts +2 -2
  5. package/example/src/chevre/event/unsetSuperEventVideoFormat.ts +30 -0
  6. package/example/src/chevre/eventSeries/unsetVideoFormat.ts +31 -0
  7. package/example/src/chevre/{upsertScreeningEventSeriesByVersion.ts → eventSeries/upsertScreeningEventSeriesByVersion.ts} +47 -43
  8. package/example/src/chevre/{upsertOfferCatalogItemsByIdentifier.ts → offerCatalog/upsertOfferCatalogItemsByIdentifier.ts} +6 -3
  9. package/example/src/chevre/{upsertOfferCatalogsByIdentifier.ts → offerCatalog/upsertOfferCatalogsByIdentifier.ts} +8 -3
  10. package/example/src/chevre/{upsertOffersByIdentifier.ts → offers/upsertOffersByIdentifier.ts} +5 -3
  11. package/example/src/chevre/orderNumber/decryptOrderNumber.ts +14 -0
  12. package/example/src/chevre/orderNumber/testRandomness.ts +54 -0
  13. package/example/src/chevre/place/adminEntranceGates.ts +69 -0
  14. package/example/src/chevre/place/checkEntranceGatesCount.ts +82 -0
  15. package/example/src/chevre/place/findRooms.ts +24 -0
  16. package/example/src/chevre/place/findSections.ts +28 -0
  17. package/example/src/chevre/place/migrateSectionIdentifier.ts +92 -0
  18. package/example/src/chevre/place/seatsJson2csv.ts +63 -0
  19. package/example/src/chevre/place/upsertMovieTheatersByBranchCode.ts +41 -0
  20. package/example/src/chevre/place/upsertRoomsByBranchCode.ts +40 -0
  21. package/example/src/chevre/place/upsertSeatSectionsByBranchCode.ts +56 -0
  22. package/example/src/chevre/reIndex.ts +1 -1
  23. package/example/src/chevre/roles/addAdminAcceptedPaymentMethodReadPermissionIfNotExists.ts +33 -0
  24. package/example/src/chevre/roles/addAdminAcceptedPaymentMethodWritePermissionIfNotExists.ts +33 -0
  25. package/example/src/chevre/roles/addAdminMovieReadPermissionIfNotExists.ts +49 -0
  26. package/example/src/chevre/roles/addAdminRoomReadPermissionIfNotExists.ts +34 -0
  27. package/example/src/chevre/roles/addAdminRoomWritePermissionIfNotExists.ts +34 -0
  28. package/example/src/chevre/settings/addOrderNumberSetting.ts +44 -0
  29. package/example/src/chevre/settings/addTransactionNumberSetting.ts +40 -0
  30. package/example/src/chevre/transactionNumber/publishByTimestamp.ts +23 -0
  31. package/example/src/chevre/transactionNumber/testRandomness.ts +42 -0
  32. package/example/src/chevre/unsetUnnecessaryFields.ts +8 -4
  33. package/lib/chevre/emailMessageBuilder.js +1 -0
  34. package/lib/chevre/factory/event.d.ts +1 -1
  35. package/lib/chevre/factory/event.js +11 -5
  36. package/lib/chevre/factory/transactionNumber.d.ts +19 -0
  37. package/lib/chevre/factory/transactionNumber.js +54 -0
  38. package/lib/chevre/repo/acceptedPaymentMethod.d.ts +41 -8
  39. package/lib/chevre/repo/acceptedPaymentMethod.js +72 -27
  40. package/lib/chevre/repo/aggregateOffer.d.ts +6 -1
  41. package/lib/chevre/repo/aggregateOffer.js +11 -3
  42. package/lib/chevre/repo/aggregateOrder.js +0 -93
  43. package/lib/chevre/repo/aggregateReservation.d.ts +0 -1
  44. package/lib/chevre/repo/aggregateReservation.js +0 -2
  45. package/lib/chevre/repo/confirmationNumber.d.ts +1 -0
  46. package/lib/chevre/repo/confirmationNumber.js +32 -25
  47. package/lib/chevre/repo/event.d.ts +3 -3
  48. package/lib/chevre/repo/event.js +20 -8
  49. package/lib/chevre/repo/eventOffer.d.ts +8 -0
  50. package/lib/chevre/repo/eventOffer.js +11 -0
  51. package/lib/chevre/repo/eventSeries.d.ts +18 -25
  52. package/lib/chevre/repo/eventSeries.js +155 -101
  53. package/lib/chevre/repo/mongoose/schemas/aggregateReservation.js +0 -1
  54. package/lib/chevre/repo/mongoose/schemas/eventSeries.js +13 -25
  55. package/lib/chevre/repo/mongoose/schemas/offerCatalog.js +2 -8
  56. package/lib/chevre/repo/mongoose/schemas/offerCatalogItem.js +28 -2
  57. package/lib/chevre/repo/mongoose/schemas/place.d.ts +6 -2
  58. package/lib/chevre/repo/mongoose/schemas/setting.d.ts +40 -0
  59. package/lib/chevre/repo/mongoose/schemas/setting.js +3 -0
  60. package/lib/chevre/repo/offerCatalog.d.ts +14 -1
  61. package/lib/chevre/repo/offerCatalog.js +41 -19
  62. package/lib/chevre/repo/offerCatalogItem.d.ts +10 -1
  63. package/lib/chevre/repo/offerCatalogItem.js +32 -17
  64. package/lib/chevre/repo/orderNumber.d.ts +7 -0
  65. package/lib/chevre/repo/orderNumber.js +110 -34
  66. package/lib/chevre/repo/place/entranceGate.d.ts +57 -0
  67. package/lib/chevre/repo/place/entranceGate.js +172 -0
  68. package/lib/chevre/repo/place/movieTheater.d.ts +40 -3
  69. package/lib/chevre/repo/place/movieTheater.js +77 -6
  70. package/lib/chevre/repo/place/screeningRoom.d.ts +60 -31
  71. package/lib/chevre/repo/place/screeningRoom.js +227 -135
  72. package/lib/chevre/repo/place/seat.d.ts +47 -45
  73. package/lib/chevre/repo/place/seat.js +175 -45
  74. package/lib/chevre/repo/place/section.d.ts +60 -30
  75. package/lib/chevre/repo/place/section.js +337 -127
  76. package/lib/chevre/repo/serviceOutputIdentifier.d.ts +3 -1
  77. package/lib/chevre/repo/serviceOutputIdentifier.js +42 -27
  78. package/lib/chevre/repo/setting.d.ts +1 -1
  79. package/lib/chevre/repo/setting.js +2 -2
  80. package/lib/chevre/repo/task.d.ts +1 -1
  81. package/lib/chevre/repo/transactionNumber.d.ts +5 -0
  82. package/lib/chevre/repo/transactionNumber.js +63 -27
  83. package/lib/chevre/repository.d.ts +8 -0
  84. package/lib/chevre/repository.js +16 -0
  85. package/lib/chevre/service/assetTransaction/reserve/start/factory/createStartParams.js +10 -2
  86. package/lib/chevre/service/event/processUpdateMovieTheater.d.ts +1 -1
  87. package/lib/chevre/service/event/processUpdateMovieTheater.js +13 -11
  88. package/lib/chevre/service/event/saveScreeningEventSeries.js +4 -5
  89. package/lib/chevre/service/event/saveScreeningEvents.d.ts +2 -2
  90. package/lib/chevre/service/event/saveScreeningEvents.js +16 -12
  91. package/lib/chevre/service/offer/event/authorize/factory.js +9 -1
  92. package/lib/chevre/service/offer/event/searchEventTicketOffers.js +7 -4
  93. package/lib/chevre/service/offer/event/searchOfferAppliesToMovieTicket.js +9 -6
  94. package/lib/chevre/service/offer/event/searchOffersByIds.js +7 -4
  95. package/lib/chevre/service/offer/eventServiceByCOA/authorize/factory.js +7 -1
  96. package/lib/chevre/service/offer/onEventChanged.js +10 -6
  97. package/lib/chevre/service/offer/product.js +1 -1
  98. package/lib/chevre/service/offer.d.ts +5 -0
  99. package/lib/chevre/service/offer.js +34 -9
  100. package/lib/chevre/service/order/onOrderStatusChanged/onOrderCancelled/factory.d.ts +1 -1
  101. package/lib/chevre/service/order/onOrderStatusChanged/onOrderDeliveredPartially/factory.d.ts +1 -1
  102. package/lib/chevre/service/order/onOrderStatusChanged/onOrderReturned/factory.d.ts +1 -1
  103. package/lib/chevre/service/task/createEvent/createEventBySchedule/factory.d.ts +2 -2
  104. package/lib/chevre/service/task/createEvent/createEventBySchedule/factory.js +5 -3
  105. package/lib/chevre/service/task/createEvent/createEventBySchedule/schedule2events.js +4 -2
  106. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByAggregateOffer.d.ts +13 -0
  107. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByAggregateOffer.js +53 -0
  108. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByEventSeries.d.ts +13 -0
  109. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByEventSeries.js +56 -0
  110. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByMovieTheater.d.ts +15 -0
  111. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByMovieTheater.js +58 -0
  112. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByOfferCatalog.d.ts +17 -0
  113. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByOfferCatalog.js +75 -0
  114. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByProduct.d.ts +19 -0
  115. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByProduct.js +60 -0
  116. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByRoom.d.ts +20 -0
  117. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesByRoom.js +51 -0
  118. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesBySeller.d.ts +27 -0
  119. package/lib/chevre/service/task/onResourceDeleted/deleteResourcesBySeller.js +100 -0
  120. package/lib/chevre/service/task/onResourceDeleted.d.ts +6 -0
  121. package/lib/chevre/service/task/onResourceDeleted.js +168 -0
  122. package/lib/chevre/service/task/onResourceUpdated.js +205 -42
  123. package/lib/chevre/service/task/syncResourcesFromCOA.js +4 -2
  124. package/lib/chevre/service/taskHandler.js +1 -0
  125. package/package.json +10 -8
  126. package/example/src/chevre/event/upsertManyScreeningEventByIdentifier.ts +0 -191
  127. package/example/src/chevre/eventSeries/migrateEventSeriesUnacceptedPaymentMethod.ts +0 -93
  128. package/example/src/chevre/offers/createSampleOffers.ts +0 -154
  129. package/example/src/chevre/settings/addSettings.ts +0 -46
  130. package/lib/chevre/service/eventOld.d.ts +0 -60
  131. package/lib/chevre/service/eventOld.js +0 -864
  132. package/lib/chevre/service/task/onResourceUpdated/onResourceDeleted.d.ts +0 -45
  133. package/lib/chevre/service/task/onResourceUpdated/onResourceDeleted.js +0 -447
@@ -8,7 +8,7 @@ const settings_1 = require("../../../settings");
8
8
  const modelName = 'OfferCatalog';
9
9
  exports.modelName = modelName;
10
10
  const schemaDefinition = {
11
- project: mongoose_1.SchemaTypes.Mixed,
11
+ project: { type: mongoose_1.SchemaTypes.Mixed, required: true },
12
12
  _id: String,
13
13
  identifier: {
14
14
  type: String,
@@ -22,7 +22,7 @@ const schemaDefinition = {
22
22
  required: true
23
23
  },
24
24
  itemListElement: [mongoose_1.SchemaTypes.Mixed],
25
- itemOffered: mongoose_1.SchemaTypes.Mixed,
25
+ itemOffered: { type: mongoose_1.SchemaTypes.Mixed, required: true },
26
26
  additionalProperty: [mongoose_1.SchemaTypes.Mixed],
27
27
  dateSynced: Date // 追加(2023-09-13~)
28
28
  // createdAt: SchemaTypes.Mixed,
@@ -60,12 +60,6 @@ const indexes = [
60
60
  name: 'searchByIdentifier'
61
61
  }
62
62
  ],
63
- [
64
- { 'project.id': 1, identifier: 1 },
65
- {
66
- name: 'searchByProjectId-v20220721'
67
- }
68
- ],
69
63
  [
70
64
  { 'itemListElement.typeOf': 1, identifier: 1 },
71
65
  {
@@ -8,7 +8,7 @@ const settings_1 = require("../../../settings");
8
8
  const modelName = 'OfferCatalogItem';
9
9
  exports.modelName = modelName;
10
10
  const schemaDefinition = {
11
- project: mongoose_1.SchemaTypes.Mixed,
11
+ project: { type: mongoose_1.SchemaTypes.Mixed, required: true },
12
12
  identifier: {
13
13
  type: String,
14
14
  required: true
@@ -21,7 +21,7 @@ const schemaDefinition = {
21
21
  required: true
22
22
  },
23
23
  itemListElement: [mongoose_1.SchemaTypes.Mixed],
24
- itemOffered: mongoose_1.SchemaTypes.Mixed,
24
+ itemOffered: { type: mongoose_1.SchemaTypes.Mixed, required: true },
25
25
  additionalProperty: [mongoose_1.SchemaTypes.Mixed],
26
26
  dateSynced: Date,
27
27
  relatedOffer: mongoose_1.SchemaTypes.Mixed
@@ -61,6 +61,32 @@ const indexes = [
61
61
  unique: true,
62
62
  name: 'uniqueIdentifier'
63
63
  }
64
+ ],
65
+ [
66
+ { identifier: 1 },
67
+ { name: 'identifier' }
68
+ ],
69
+ [
70
+ { 'itemOffered.typeOf': 1, identifier: 1 },
71
+ { name: 'itemOfferedTypeOf' }
72
+ ],
73
+ [
74
+ { 'itemListElement.typeOf': 1, identifier: 1 },
75
+ {
76
+ name: 'itemListElementTypeOf',
77
+ partialFilterExpression: {
78
+ 'itemListElement.typeOf': { $exists: true }
79
+ }
80
+ }
81
+ ],
82
+ [
83
+ { 'itemListElement.id': 1, identifier: 1 },
84
+ {
85
+ name: 'itemListElementId',
86
+ partialFilterExpression: {
87
+ 'itemListElement.id': { $exists: true }
88
+ }
89
+ }
64
90
  ]
65
91
  ];
66
92
  exports.indexes = indexes;
@@ -1,9 +1,13 @@
1
1
  import { IndexDefinition, IndexOptions, Model, Schema, SchemaDefinition } from 'mongoose';
2
2
  import * as factory from '../../../factory';
3
- type IDocType = factory.place.screeningRoom.IPlace & {
3
+ type ISeatSection = Pick<factory.place.screeningRoomSection.IPlace, 'additionalProperty' | 'branchCode' | 'name' | 'typeOf'> & {
4
+ containsPlace?: factory.place.seat.IPlace[];
5
+ };
6
+ type IDocType = Omit<factory.place.screeningRoom.IPlace, 'containsPlace'> & {
4
7
  description?: any;
5
8
  openingHoursSpecification?: any;
6
9
  smokingAllowed?: boolean;
10
+ containsPlace: ISeatSection[];
7
11
  };
8
12
  type IModel = Model<IDocType>;
9
13
  type ISchemaDefinition = SchemaDefinition<IDocType>;
@@ -11,4 +15,4 @@ type ISchema = Schema<IDocType, IModel, {}, {}, {}, {}, ISchemaDefinition, IDocT
11
15
  declare const modelName = "Place";
12
16
  declare const indexes: [d: IndexDefinition, o: IndexOptions][];
13
17
  declare function createSchema(): ISchema;
14
- export { createSchema, IModel, indexes, modelName };
18
+ export { createSchema, IDocType, IModel, indexes, modelName };
@@ -110,6 +110,43 @@ export interface IJWTSetting {
110
110
  */
111
111
  algorithm: Algorithm;
112
112
  }
113
+ export interface IOrderNumberSetting {
114
+ validFrom: Date;
115
+ /**
116
+ * fpe暗号鍵
117
+ */
118
+ fpeSecret: string;
119
+ /**
120
+ * "A"
121
+ */
122
+ version: string;
123
+ versioningForceProjects?: string[];
124
+ /**
125
+ * 強制的にバージョニング不使用のプロジェクト
126
+ */
127
+ versioningExceptionProjects?: string[];
128
+ }
129
+ export interface ITransactionNumberSetting {
130
+ validFrom: Date;
131
+ /**
132
+ * fpe暗号鍵
133
+ */
134
+ fpeSecret: string;
135
+ /**
136
+ * "1"
137
+ */
138
+ version: string;
139
+ }
140
+ export interface IServiceOutputIdentifierSetting {
141
+ /**
142
+ * fpe暗号鍵
143
+ */
144
+ fpeSecret: string;
145
+ /**
146
+ * "1"
147
+ */
148
+ version: string;
149
+ }
113
150
  export interface ISetting {
114
151
  defaultSenderEmail?: string;
115
152
  jwt?: IJWTSetting;
@@ -121,12 +158,15 @@ export interface ISetting {
121
158
  informResource?: factory.project.IInformParams[];
122
159
  };
123
160
  onTransactionStatusChanged?: IOnTransactionStatusChanged;
161
+ orderNumber?: IOrderNumberSetting;
124
162
  project: {
125
163
  id: string;
126
164
  typeOf: factory.organizationType.Project;
127
165
  };
128
166
  quota?: IQuotaSettings;
167
+ serviceOutputIdentifier?: IServiceOutputIdentifierSetting;
129
168
  storage?: IStorageSettings;
169
+ transactionNumber?: ITransactionNumberSetting;
130
170
  /**
131
171
  * 通知設定
132
172
  */
@@ -17,8 +17,11 @@ const schemaDefinition = {
17
17
  onTaskStatusChanged: mongoose_1.SchemaTypes.Mixed,
18
18
  onResourceUpdated: mongoose_1.SchemaTypes.Mixed,
19
19
  onTransactionStatusChanged: mongoose_1.SchemaTypes.Mixed,
20
+ orderNumber: mongoose_1.SchemaTypes.Mixed,
20
21
  quota: mongoose_1.SchemaTypes.Mixed,
22
+ serviceOutputIdentifier: mongoose_1.SchemaTypes.Mixed,
21
23
  storage: mongoose_1.SchemaTypes.Mixed,
24
+ transactionNumber: mongoose_1.SchemaTypes.Mixed,
22
25
  triggerWebhook: mongoose_1.SchemaTypes.Mixed,
23
26
  useInformResourceTypes: [String],
24
27
  userPoolIdOld: String,
@@ -35,7 +35,20 @@ export declare class OfferCatalogRepo {
35
35
  $unset?: {
36
36
  [key in keyof factory.offerCatalog.IOfferCatalog]?: 1;
37
37
  };
38
- }[]): Promise<{
38
+ }[], options: {
39
+ /**
40
+ * support only update(2026-01-30~)
41
+ */
42
+ update: boolean;
43
+ /**
44
+ * プロダクトタイプでfilter(2026-01-30~)
45
+ */
46
+ productType: factory.product.ProductType;
47
+ /**
48
+ * アイテムタイプでfilter(2026-02-03~)
49
+ */
50
+ itemListElementType: factory.offerCatalog.IItemListElement['typeOf'];
51
+ }): Promise<{
39
52
  bulkWriteResult: BulkWriteResult;
40
53
  modifiedCatalogs: {
41
54
  id: string;
@@ -195,11 +195,9 @@ class OfferCatalogRepo {
195
195
  /**
196
196
  * コードをキーにして冪等置換(2023-12-14~)
197
197
  */
198
- upsertManyByIdentifier(params
199
- // options?: {
200
- // }
201
- ) {
198
+ upsertManyByIdentifier(params, options) {
202
199
  return __awaiter(this, void 0, void 0, function* () {
200
+ const { itemListElementType, productType, update } = options;
203
201
  const uniqid = yield Promise.resolve().then(() => require('uniqid'));
204
202
  const bulkWriteOps = [];
205
203
  const queryFilters = [];
@@ -209,28 +207,52 @@ class OfferCatalogRepo {
209
207
  if (typeof identifier !== 'string' || identifier.length === 0) {
210
208
  throw new factory.errors.ArgumentNull('identifier');
211
209
  }
210
+ // 指定されたproductTypeを強制する
211
+ if (setFields.itemOffered.typeOf !== productType) {
212
+ throw new factory.errors.Argument('itemOffered.typeOf', `not matched with productType: ${productType}`);
213
+ }
214
+ // 指定されたitemListElementTypeを強制する
215
+ const everyElementTypeMatched = setFields.itemListElement.every((element) => element.typeOf === itemListElementType);
216
+ if (!everyElementTypeMatched) {
217
+ throw new factory.errors.Argument('itemListElement.typeOf', `not matched with itemListElementType: ${itemListElementType}`);
218
+ }
212
219
  // リソースのユニークネスを保証するfilter
213
220
  const filter = {
214
221
  'project.id': { $eq: project.id },
215
- identifier: { $eq: identifier }
222
+ identifier: { $eq: identifier },
223
+ 'itemOffered.typeOf': { $exists: true, $eq: productType }, // プロダクトタイプを変更させないためにフィルター追加(2026-01-30~)
224
+ 'itemListElement.typeOf': { $exists: true, $eq: itemListElementType } // アイテムタイプを変更させないためにフィルター追加(2026-02-03~)
216
225
  };
217
226
  queryFilters.push({
218
227
  'project.id': { $eq: project.id },
219
- identifier: { $eq: identifier }
228
+ identifier: { $eq: identifier },
229
+ 'itemOffered.typeOf': { $exists: true, $eq: productType }, // プロダクトタイプを変更させないためにフィルター追加(2026-01-30~)
230
+ 'itemListElement.typeOf': { $exists: true, $eq: itemListElementType } // アイテムタイプを変更させないためにフィルター追加(2026-02-03~)
220
231
  });
221
- const newId = uniqid();
222
- const setOnInsert = {
223
- identifier,
224
- project,
225
- typeOf,
226
- _id: newId
227
- };
228
- const updateOne = {
229
- filter,
230
- update: Object.assign({ $setOnInsert: setOnInsert, $set: setFields }, ($unset !== undefined) ? { $unset } : undefined),
231
- upsert: true
232
- };
233
- bulkWriteOps.push({ updateOne });
232
+ if (update === true) {
233
+ const updateOne = {
234
+ filter,
235
+ update: Object.assign({ $set: setFields }, ($unset !== undefined) ? { $unset } : undefined),
236
+ upsert: false
237
+ };
238
+ bulkWriteOps.push({ updateOne });
239
+ }
240
+ else {
241
+ // デフォルトはupsert操作
242
+ const newId = uniqid();
243
+ const setOnInsert = {
244
+ identifier,
245
+ project,
246
+ typeOf,
247
+ _id: newId
248
+ };
249
+ const updateOne = {
250
+ filter,
251
+ update: Object.assign({ $setOnInsert: setOnInsert, $set: setFields }, ($unset !== undefined) ? { $unset } : undefined),
252
+ upsert: true
253
+ };
254
+ bulkWriteOps.push({ updateOne });
255
+ }
234
256
  });
235
257
  }
236
258
  if (bulkWriteOps.length > 0) {
@@ -32,7 +32,16 @@ export declare class OfferCatalogItemRepo {
32
32
  $unset?: {
33
33
  [key in keyof factory.offerCatalog.IOfferCatalog]?: 1;
34
34
  };
35
- }[]): Promise<{
35
+ }[], options: {
36
+ /**
37
+ * support only update(2026-01-30~)
38
+ */
39
+ update: boolean;
40
+ /**
41
+ * プロダクトタイプでfilter(2026-01-30~)
42
+ */
43
+ productType: factory.product.ProductType;
44
+ }): Promise<{
36
45
  bulkWriteResult: BulkWriteResult;
37
46
  modifiedCatalogs: {
38
47
  id: string;
@@ -159,11 +159,9 @@ class OfferCatalogItemRepo {
159
159
  /**
160
160
  * コードをキーにして冪等置換(2023-12-14~)
161
161
  */
162
- upsertManyByIdentifier(params
163
- // options?: {
164
- // }
165
- ) {
162
+ upsertManyByIdentifier(params, options) {
166
163
  return __awaiter(this, void 0, void 0, function* () {
164
+ const { productType, update } = options;
167
165
  const bulkWriteOps = [];
168
166
  const queryFilters = [];
169
167
  if (Array.isArray(params)) {
@@ -172,26 +170,43 @@ class OfferCatalogItemRepo {
172
170
  if (typeof identifier !== 'string' || identifier.length === 0) {
173
171
  throw new factory.errors.ArgumentNull('identifier');
174
172
  }
173
+ // 指定されたproductTypeを強制する
174
+ if (setFields.itemOffered.typeOf !== productType) {
175
+ throw new factory.errors.Argument('itemOffered.typeOf', `not matched with productType: ${productType}`);
176
+ }
175
177
  // リソースのユニークネスを保証するfilter
176
178
  const filter = {
177
179
  'project.id': { $eq: project.id },
178
- identifier: { $eq: identifier }
180
+ identifier: { $eq: identifier },
181
+ 'itemOffered.typeOf': { $exists: true, $eq: productType } // プロダクトタイプを変更させないためにフィルター追加(2026-01-30~)
179
182
  };
180
183
  queryFilters.push({
181
184
  'project.id': { $eq: project.id },
182
- identifier: { $eq: identifier }
185
+ identifier: { $eq: identifier },
186
+ 'itemOffered.typeOf': { $exists: true, $eq: productType } // プロダクトタイプを変更させないためにフィルター追加(2026-01-30~)
183
187
  });
184
- const setOnInsert = {
185
- identifier,
186
- project,
187
- typeOf
188
- };
189
- const updateOne = {
190
- filter,
191
- update: Object.assign({ $setOnInsert: setOnInsert, $set: setFields }, ($unset !== undefined) ? { $unset } : undefined),
192
- upsert: true
193
- };
194
- bulkWriteOps.push({ updateOne });
188
+ if (update === true) {
189
+ const updateOne = {
190
+ filter,
191
+ update: Object.assign({ $set: setFields }, ($unset !== undefined) ? { $unset } : undefined),
192
+ upsert: false
193
+ };
194
+ bulkWriteOps.push({ updateOne });
195
+ }
196
+ else {
197
+ // デフォルトはupsert操作
198
+ const setOnInsert = {
199
+ identifier,
200
+ project,
201
+ typeOf
202
+ };
203
+ const updateOne = {
204
+ filter,
205
+ update: Object.assign({ $setOnInsert: setOnInsert, $set: setFields }, ($unset !== undefined) ? { $unset } : undefined),
206
+ upsert: true
207
+ };
208
+ bulkWriteOps.push({ updateOne });
209
+ }
195
210
  });
196
211
  }
197
212
  if (bulkWriteOps.length > 0) {
@@ -4,9 +4,11 @@ import type { Connection } from 'mongoose';
4
4
  */
5
5
  export declare class OrderNumberRepo {
6
6
  private readonly counterRepo;
7
+ private readonly settingModel;
7
8
  constructor(params: {
8
9
  connection: Connection;
9
10
  });
11
+ static GENERATE_VERSION0(timestamp: string, seq: number): string;
10
12
  /**
11
13
  * タイムスタンプから発行する
12
14
  */
@@ -19,4 +21,9 @@ export declare class OrderNumberRepo {
19
21
  */
20
22
  orderDate: Date;
21
23
  }): Promise<string>;
24
+ decrypt(id: string): Promise<string>;
25
+ /**
26
+ * 注文番号生成設定を検索する
27
+ */
28
+ private findSetting;
22
29
  }
@@ -12,39 +12,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.OrderNumberRepo = void 0;
13
13
  const cdigit = require("cdigit");
14
14
  const moment = require("moment-timezone");
15
- // import { RedisClientType } from 'redis';
16
15
  // tslint:disable-next-line:no-require-imports no-var-requires
17
- const fpe = require('node-fpe');
18
- // import { createSchema as createSettingSchema, modelName as settingModelName } from './mongoose/schemas/setting';
19
- const transactionNumber_1 = require("./mongoose/schemas/transactionNumber");
16
+ const fpe = require('node-fpe-v1');
17
+ const factory = require("../factory");
18
+ const transactionNumber_1 = require("../factory/transactionNumber");
19
+ const setting_1 = require("./mongoose/schemas/setting");
20
+ const transactionNumber_2 = require("./mongoose/schemas/transactionNumber");
20
21
  const transactionNumberCounter_1 = require("./transactionNumberCounter");
21
22
  const ORDER_NUMBER_SEPARATOR = '-';
23
+ const defaultVersioningForceProjects = [
24
+ 'HMX',
25
+ 'SMT',
26
+ 'KOJ'
27
+ ];
22
28
  /**
23
29
  * 注文番号リポジトリ
24
30
  */
25
31
  class OrderNumberRepo {
26
32
  constructor(params) {
27
- // const { connection } = params;
28
- // this.settingModel = connection.model(settingModelName, createSettingSchema());
29
33
  this.counterRepo = new transactionNumberCounter_1.TransactionNumberCounterRepo(params);
34
+ this.settingModel = params.connection.model(setting_1.modelName, (0, setting_1.createSchema)());
35
+ }
36
+ static GENERATE_VERSION0(timestamp, seq) {
37
+ let orderNumber = `${timestamp}${seq}`;
38
+ // checkdigit
39
+ const cd = cdigit.luhn.compute(orderNumber);
40
+ orderNumber = fpe({ password: cd })
41
+ .encrypt(orderNumber);
42
+ orderNumber = `${cd}${orderNumber}`;
43
+ return orderNumber;
30
44
  }
31
- // private static createKey(params: {
32
- // orderDate: Date;
33
- // projectPrefix: string;
34
- // timestamp: string;
35
- // }): string {
36
- // return util.format(
37
- // '%s:%s:%s',
38
- // OrderNumberRepo.REDIS_KEY_PREFIX,
39
- // params.projectPrefix,
40
- // params.timestamp
41
- // );
42
- // }
43
45
  /**
44
46
  * タイムスタンプから発行する
45
47
  */
46
48
  publishByTimestamp(params) {
47
49
  return __awaiter(this, void 0, void 0, function* () {
50
+ const { fpeSecret, version, validFrom, versioningForceProjects, versioningExceptionProjects } = yield this.findSetting();
48
51
  const timestamp = moment(params.orderDate)
49
52
  .valueOf()
50
53
  .toString();
@@ -53,31 +56,104 @@ class OrderNumberRepo {
53
56
  let dataFeedExpires;
54
57
  const dataFeedIdentifier = `${projectPrefix}:${timestamp}`;
55
58
  let incrReply;
56
- // const useMongoBySettings = await this.useMongoBySettings(params);
57
59
  dataFeedExpires = moment(params.orderDate)
58
60
  .add(1, 'minute') // ミリ秒でカウントしていくので、注文日時後1分で十分
59
61
  .toDate();
60
62
  incrReply = yield this.counterRepo.incrementByMongo({
61
63
  identifier: dataFeedIdentifier,
62
- includedInDataCatalog: { identifier: transactionNumber_1.DataCatalogIdentifier.orderNumber },
64
+ includedInDataCatalog: { identifier: transactionNumber_2.DataCatalogIdentifier.orderNumber },
63
65
  expires: dataFeedExpires
64
66
  });
65
- let orderNumber = `${timestamp}${incrReply}`;
66
- // checkdigit
67
- const cd = cdigit.luhn.compute(orderNumber);
68
- orderNumber = fpe({ password: cd })
69
- .encrypt(orderNumber);
70
- orderNumber = `${projectPrefix}${cd}${orderNumber}`;
71
- orderNumber = `${[
72
- // tslint:disable-next-line:no-magic-numbers
73
- orderNumber.slice(0, 4),
74
- // tslint:disable-next-line:no-magic-numbers
75
- orderNumber.slice(4, 11),
76
- // tslint:disable-next-line:no-magic-numbers
77
- orderNumber.slice(11)
78
- ].join(ORDER_NUMBER_SEPARATOR)}`;
67
+ let orderNumber;
68
+ let useVersioning = (validFrom instanceof Date && moment(validFrom)
69
+ .isSameOrBefore(params.orderDate))
70
+ // versioningForceProjectsであれば強制的にversioning(2026-02-05~)
71
+ || versioningForceProjects.includes(projectPrefix);
72
+ // versioningExceptionProjectsであれば強制的にversioning不使用(2026-02-10~)
73
+ if (versioningExceptionProjects.includes(projectPrefix)) {
74
+ useVersioning = false;
75
+ }
76
+ if (typeof fpeSecret === 'string' && typeof version === 'string' && useVersioning) {
77
+ const transactionFactory = new transactionNumber_1.TransactionNumberFactory({ fpeSecret, version });
78
+ orderNumber = transactionFactory.generate(timestamp, incrReply);
79
+ orderNumber = `${projectPrefix.at(0)}${orderNumber}`; // 桁数をversion0に合わせるためにエイリアスの1文字目のみを採用
80
+ orderNumber = `${[
81
+ // tslint:disable-next-line:no-magic-numbers
82
+ orderNumber.slice(0, 4),
83
+ // tslint:disable-next-line:no-magic-numbers
84
+ orderNumber.slice(4, 11),
85
+ // tslint:disable-next-line:no-magic-numbers
86
+ orderNumber.slice(11)
87
+ ].join(ORDER_NUMBER_SEPARATOR)}`;
88
+ }
89
+ else {
90
+ orderNumber = OrderNumberRepo.GENERATE_VERSION0(timestamp, incrReply);
91
+ orderNumber = `${projectPrefix}${orderNumber}`;
92
+ orderNumber = `${[
93
+ // tslint:disable-next-line:no-magic-numbers
94
+ orderNumber.slice(0, 4),
95
+ // tslint:disable-next-line:no-magic-numbers
96
+ orderNumber.slice(4, 11),
97
+ // tslint:disable-next-line:no-magic-numbers
98
+ orderNumber.slice(11)
99
+ ].join(ORDER_NUMBER_SEPARATOR)}`;
100
+ }
79
101
  return orderNumber;
80
102
  });
81
103
  }
104
+ decrypt(id) {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ const { fpeSecret, version } = yield this.findSetting();
107
+ if (typeof fpeSecret === 'string' && typeof version === 'string') {
108
+ const transactionFactory = new transactionNumber_1.TransactionNumberFactory({ fpeSecret, version });
109
+ const originalOrderNumber = id.replace(/-/g, '')
110
+ // tslint:disable-next-line:no-magic-numbers
111
+ .slice(1);
112
+ return transactionFactory.decrypt(originalOrderNumber);
113
+ }
114
+ else {
115
+ throw new factory.errors.NotImplemented('no version not implemented');
116
+ }
117
+ });
118
+ }
119
+ /**
120
+ * 注文番号生成設定を検索する
121
+ */
122
+ findSetting() {
123
+ return __awaiter(this, void 0, void 0, function* () {
124
+ const filterQuery = { 'project.id': { $eq: '*' } };
125
+ const projection = {
126
+ _id: 0,
127
+ orderNumber: 1
128
+ };
129
+ const setting = yield this.settingModel.findOne(filterQuery, projection)
130
+ .lean()
131
+ .exec();
132
+ if (setting === null || setting.orderNumber === undefined) {
133
+ return {
134
+ versioningForceProjects: [],
135
+ versioningExceptionProjects: []
136
+ };
137
+ }
138
+ const { fpeSecret, version, validFrom, versioningForceProjects, versioningExceptionProjects } = setting.orderNumber;
139
+ if (typeof fpeSecret !== 'string' || fpeSecret === '') {
140
+ throw new factory.errors.NotFound('setting.orderNumber.secret');
141
+ }
142
+ if (typeof version !== 'string' || version === '') {
143
+ throw new factory.errors.NotFound('setting.orderNumber.version');
144
+ }
145
+ if (!(validFrom instanceof Date)) {
146
+ throw new factory.errors.NotFound('setting.orderNumber.validFrom must be Date');
147
+ }
148
+ return {
149
+ fpeSecret, version, validFrom,
150
+ versioningForceProjects: [
151
+ ...(Array.isArray(versioningForceProjects)) ? versioningForceProjects : [],
152
+ ...defaultVersioningForceProjects
153
+ ],
154
+ versioningExceptionProjects: (Array.isArray(versioningExceptionProjects)) ? versioningExceptionProjects : []
155
+ };
156
+ });
157
+ }
82
158
  }
83
159
  exports.OrderNumberRepo = OrderNumberRepo;
@@ -0,0 +1,57 @@
1
+ import type { BulkWriteResult } from 'mongodb';
2
+ import { Connection } from 'mongoose';
3
+ import * as factory from '../../factory';
4
+ /**
5
+ * ゲートを操作する組織
6
+ */
7
+ interface IOperator {
8
+ /**
9
+ * 施設ID
10
+ */
11
+ id: string;
12
+ }
13
+ type IEntranceGate = Pick<factory.place.entranceGate.IEntranceGate, 'identifier' | 'name'>;
14
+ type ICreatingEntranceGate = Pick<factory.place.entranceGate.IEntranceGate, 'identifier' | 'name'>;
15
+ interface IUpdateOptions {
16
+ project: {
17
+ id: string;
18
+ };
19
+ }
20
+ /**
21
+ * 施設の入場ゲートリポジトリ
22
+ */
23
+ export declare class EntranceGateRepo {
24
+ /**
25
+ * 施設
26
+ */
27
+ private readonly operator;
28
+ private readonly civicStructureModel;
29
+ constructor(connection: Connection, operater: IOperator);
30
+ /**
31
+ * リポジトリの施設をセットする
32
+ */
33
+ setOperatorId(params: {
34
+ id: string;
35
+ }): void;
36
+ findEntranceGates(params: factory.place.entranceGate.ISearchConditions): Promise<IEntranceGate[]>;
37
+ addEntranceGatesByIdentifierIfNotExist(params: {
38
+ $set: ICreatingEntranceGate;
39
+ }[], options: IUpdateOptions): Promise<{
40
+ bulkWriteResult?: BulkWriteResult;
41
+ }>;
42
+ updateEntranceGatesByIdentifier(params: {
43
+ $set: ICreatingEntranceGate;
44
+ }[], options: IUpdateOptions): Promise<{
45
+ bulkWriteResult?: BulkWriteResult;
46
+ }>;
47
+ deleteEntranceGatesByIdentifier(params: {
48
+ /**
49
+ * ゲートコード
50
+ */
51
+ identifier: string;
52
+ }[], options: IUpdateOptions): Promise<{
53
+ bulkWriteResult?: BulkWriteResult;
54
+ }>;
55
+ private createMatchStages;
56
+ }
57
+ export {};