@chevre/domain 21.18.0-alpha.4 → 21.18.0-alpha.41

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 (142) hide show
  1. package/example/src/chevre/aggreateOwnershipInfosByOrder.ts +24 -0
  2. package/example/src/chevre/offerCatalog2offerCatalogItem.ts +4 -0
  3. package/example/src/chevre/searchAcceptedOfferIds.ts +57 -0
  4. package/example/src/chevre/searchOffers.ts +41 -37
  5. package/example/src/chevre/searchOrderAcceptedOffers.ts +12 -12
  6. package/example/src/chevre/searchOrders.ts +36 -19
  7. package/example/src/chevre/searchReservationsByOrder.ts +30 -0
  8. package/example/src/chevre/searchTransactions.ts +41 -0
  9. package/example/src/chevre/transaction/processReturnOrder.ts +1 -0
  10. package/example/src/chevre/upsertMoviesByIdentifier.ts +5 -4
  11. package/example/src/chevre/upsertOfferCatalogsByIdentifier.ts +46 -0
  12. package/example/src/chevre/upsertOffersByIdentifier.ts +94 -0
  13. package/example/src/chevre/upsertScreeningEventSeriesByVersion.ts +104 -0
  14. package/lib/chevre/credentials.d.ts +0 -3
  15. package/lib/chevre/credentials.js +4 -3
  16. package/lib/chevre/repo/acceptedOffer.d.ts +60 -0
  17. package/lib/chevre/repo/acceptedOffer.js +158 -0
  18. package/lib/chevre/repo/creativeWork.d.ts +12 -2
  19. package/lib/chevre/repo/creativeWork.js +39 -25
  20. package/lib/chevre/repo/event.d.ts +15 -0
  21. package/lib/chevre/repo/event.js +66 -0
  22. package/lib/chevre/repo/offer.d.ts +14 -5
  23. package/lib/chevre/repo/offer.js +94 -19
  24. package/lib/chevre/repo/offerCatalog.d.ts +18 -1
  25. package/lib/chevre/repo/offerCatalog.js +51 -39
  26. package/lib/chevre/repo/order.d.ts +14 -54
  27. package/lib/chevre/repo/order.js +46 -180
  28. package/lib/chevre/repo/paymentService.d.ts +30 -0
  29. package/lib/chevre/repo/paymentService.js +75 -0
  30. package/lib/chevre/repo/place.js +14 -10
  31. package/lib/chevre/repo/product.d.ts +41 -10
  32. package/lib/chevre/repo/product.js +94 -47
  33. package/lib/chevre/repo/transaction.d.ts +5 -4
  34. package/lib/chevre/repository.d.ts +10 -7
  35. package/lib/chevre/repository.js +28 -17
  36. package/lib/chevre/service/aggregation/event/aggregateScreeningEvent.js +10 -1
  37. package/lib/chevre/service/aggregation/event/findEventOffers.js +10 -1
  38. package/lib/chevre/service/assetTransaction/moneyTransfer.js +1 -1
  39. package/lib/chevre/service/assetTransaction/pay/potentialActions.d.ts +3 -1
  40. package/lib/chevre/service/assetTransaction/pay/potentialActions.js +3 -3
  41. package/lib/chevre/service/assetTransaction/pay.d.ts +2 -0
  42. package/lib/chevre/service/assetTransaction/pay.js +47 -34
  43. package/lib/chevre/service/assetTransaction/refund/factory.d.ts +1 -1
  44. package/lib/chevre/service/assetTransaction/refund/factory.js +0 -5
  45. package/lib/chevre/service/assetTransaction/refund.js +15 -3
  46. package/lib/chevre/service/assetTransaction/registerService.js +18 -2
  47. package/lib/chevre/service/assetTransaction/reserve/factory/price.js +1 -1
  48. package/lib/chevre/service/assetTransaction/reserve.js +32 -2
  49. package/lib/chevre/service/delivery/factory.d.ts +3 -1
  50. package/lib/chevre/service/delivery/factory.js +4 -2
  51. package/lib/chevre/service/delivery.d.ts +1 -2
  52. package/lib/chevre/service/delivery.js +1 -3
  53. package/lib/chevre/service/event.js +1 -1
  54. package/lib/chevre/service/moneyTransfer.js +11 -1
  55. package/lib/chevre/service/offer/event/factory.d.ts +1 -1
  56. package/lib/chevre/service/offer/event/factory.js +4 -2
  57. package/lib/chevre/service/offer/event/searchEventTicketOffers.js +40 -5
  58. package/lib/chevre/service/offer/product/factory.js +1 -1
  59. package/lib/chevre/service/offer/product/searchProductOffers.js +10 -1
  60. package/lib/chevre/service/offer/product.d.ts +0 -14
  61. package/lib/chevre/service/offer/product.js +61 -44
  62. package/lib/chevre/service/order/confirmPayTransaction.d.ts +2 -0
  63. package/lib/chevre/service/order/confirmPayTransaction.js +1 -0
  64. package/lib/chevre/service/order/createAccountingReportIfNotExist.d.ts +3 -1
  65. package/lib/chevre/service/order/createAccountingReportIfNotExist.js +4 -1
  66. package/lib/chevre/service/order/deleteOrder.d.ts +2 -0
  67. package/lib/chevre/service/order/deleteOrder.js +15 -4
  68. package/lib/chevre/service/order/findPlaceOrderTransaction.d.ts +3 -1
  69. package/lib/chevre/service/order/findPlaceOrderTransaction.js +1 -2
  70. package/lib/chevre/service/order/onAssetTransactionStatusChanged.d.ts +3 -3
  71. package/lib/chevre/service/order/onAssetTransactionStatusChanged.js +15 -9
  72. package/lib/chevre/service/order/onOrderStatusChanged/onOrderCancelled/factory.d.ts +11 -0
  73. package/lib/chevre/service/order/onOrderStatusChanged/onOrderCancelled/factory.js +54 -0
  74. package/lib/chevre/service/order/onOrderStatusChanged/onOrderCancelled.d.ts +10 -0
  75. package/lib/chevre/service/order/onOrderStatusChanged/onOrderCancelled.js +38 -0
  76. package/lib/chevre/service/order/onOrderStatusChanged/onOrderDelivered/factory.d.ts +12 -0
  77. package/lib/chevre/service/order/onOrderStatusChanged/onOrderDelivered/factory.js +111 -0
  78. package/lib/chevre/service/order/onOrderStatusChanged/onOrderDelivered.d.ts +12 -0
  79. package/lib/chevre/service/order/onOrderStatusChanged/onOrderDelivered.js +64 -0
  80. package/lib/chevre/service/order/onOrderStatusChanged/onOrderPaymentDue.d.ts +10 -0
  81. package/lib/chevre/service/order/onOrderStatusChanged/onOrderPaymentDue.js +103 -0
  82. package/lib/chevre/service/order/onOrderStatusChanged/onOrderProcessing/factory.d.ts +23 -0
  83. package/lib/chevre/service/order/onOrderStatusChanged/onOrderProcessing/factory.js +180 -0
  84. package/lib/chevre/service/order/onOrderStatusChanged/onOrderProcessing.d.ts +14 -0
  85. package/lib/chevre/service/order/onOrderStatusChanged/onOrderProcessing.js +214 -0
  86. package/lib/chevre/service/order/onOrderStatusChanged/onOrderReturned/factory.d.ts +10 -0
  87. package/lib/chevre/service/order/onOrderStatusChanged/onOrderReturned/factory.js +110 -0
  88. package/lib/chevre/service/order/onOrderStatusChanged/onOrderReturned.d.ts +14 -0
  89. package/lib/chevre/service/order/onOrderStatusChanged/onOrderReturned.js +164 -0
  90. package/lib/chevre/service/order/onOrderStatusChanged.d.ts +9 -15
  91. package/lib/chevre/service/order/onOrderStatusChanged.js +11 -446
  92. package/lib/chevre/service/order/onOrderUpdated/factory.d.ts +6 -0
  93. package/lib/chevre/service/order/onOrderUpdated/factory.js +45 -0
  94. package/lib/chevre/service/order/onOrderUpdated.js +1 -1
  95. package/lib/chevre/service/order/payOrder.d.ts +2 -2
  96. package/lib/chevre/service/order/placeOrder.d.ts +2 -3
  97. package/lib/chevre/service/order/placeOrder.js +65 -22
  98. package/lib/chevre/service/order/returnOrder.d.ts +2 -2
  99. package/lib/chevre/service/order/returnOrder.js +34 -13
  100. package/lib/chevre/service/order/sendOrder.d.ts +2 -2
  101. package/lib/chevre/service/order/sendOrder.js +19 -6
  102. package/lib/chevre/service/order.d.ts +2 -2
  103. package/lib/chevre/service/order.js +2 -2
  104. package/lib/chevre/service/payment/any.js +1 -1
  105. package/lib/chevre/service/payment/movieTicket/getCredentials.js +1 -2
  106. package/lib/chevre/service/payment/paymentCard.js +9 -2
  107. package/lib/chevre/service/reserve/searchByOrder.d.ts +21 -0
  108. package/lib/chevre/service/reserve/searchByOrder.js +113 -0
  109. package/lib/chevre/service/reserve/verifyToken4reservation.js +0 -11
  110. package/lib/chevre/service/reserve.d.ts +2 -1
  111. package/lib/chevre/service/reserve.js +3 -1
  112. package/lib/chevre/service/task/confirmPayTransaction.js +2 -1
  113. package/lib/chevre/service/task/deleteTransaction.js +2 -0
  114. package/lib/chevre/service/task/onAssetTransactionStatusChanged.js +5 -6
  115. package/lib/chevre/service/task/onAuthorizationCreated.js +9 -18
  116. package/lib/chevre/service/task/onOrderPaymentCompleted.js +5 -6
  117. package/lib/chevre/service/task/onResourceUpdated/onResourceDeleted.js +1 -1
  118. package/lib/chevre/service/task/onResourceUpdated.js +1 -1
  119. package/lib/chevre/service/task/placeOrder.js +10 -17
  120. package/lib/chevre/service/task/returnOrder.js +10 -17
  121. package/lib/chevre/service/task/sendOrder.js +10 -17
  122. package/lib/chevre/service/task/voidRegisterServiceTransaction.js +3 -7
  123. package/lib/chevre/service/transaction/deleteTransaction.d.ts +2 -0
  124. package/lib/chevre/service/transaction/moneyTransfer.js +3 -4
  125. package/lib/chevre/service/transaction/placeOrderInProgress/potentialActions/registerService.d.ts +0 -4
  126. package/lib/chevre/service/transaction/placeOrderInProgress/potentialActions/registerService.js +0 -86
  127. package/lib/chevre/service/transaction/placeOrderInProgress/result.d.ts +1 -1
  128. package/lib/chevre/service/transaction/placeOrderInProgress/validation.d.ts +1 -1
  129. package/lib/chevre/service/transaction/returnOrder/potentialActions/returnMoneyTransfer.d.ts +1 -0
  130. package/lib/chevre/service/transaction/returnOrder/potentialActions/returnMoneyTransfer.js +3 -3
  131. package/lib/chevre/service/transaction/returnOrder/potentialActions.d.ts +1 -0
  132. package/lib/chevre/service/transaction/returnOrder/potentialActions.js +1 -1
  133. package/lib/chevre/service/transaction/returnOrder.d.ts +3 -0
  134. package/lib/chevre/service/transaction/returnOrder.js +73 -55
  135. package/package.json +3 -3
  136. package/example/src/chevre/transaction/findPaymentCardPermit.ts +0 -29
  137. package/lib/chevre/repo/action/registerServiceInProgress.d.ts +0 -29
  138. package/lib/chevre/repo/action/registerServiceInProgress.js +0 -58
  139. package/lib/chevre/service/order/onOrderStatusChanged/factory.d.ts +0 -42
  140. package/lib/chevre/service/order/onOrderStatusChanged/factory.js +0 -467
  141. package/lib/chevre/service/transaction/orderProgramMembership/findPaymentCardPermit.d.ts +0 -26
  142. package/lib/chevre/service/transaction/orderProgramMembership/findPaymentCardPermit.js +0 -65
@@ -41,9 +41,10 @@ exports.credentials = {
41
41
  sendGrid: {
42
42
  apiKey: process.env.SENDGRID_API_KEY
43
43
  },
44
- hub: {
45
- clientId: process.env.HUB_CLIENT_ID
46
- },
44
+ // discontinue(2023-12-12~)
45
+ // hub: {
46
+ // clientId: <string>process.env.HUB_CLIENT_ID
47
+ // },
47
48
  jwt: {
48
49
  secret: process.env.TOKEN_SECRET,
49
50
  issuer: process.env.RESOURCE_SERVER_IDENTIFIER
@@ -0,0 +1,60 @@
1
+ import type { Connection } from 'mongoose';
2
+ import * as factory from '../factory';
3
+ type IProjection4searchWithUnwoundAcceptedOffers = {
4
+ [key in keyof factory.order.IOrder]?: 1;
5
+ } & {
6
+ _id?: 0 | 1;
7
+ };
8
+ type IDistinctField = 'acceptedOffers.id' | 'acceptedOffers.itemOffered.reservationNumber' | 'acceptedOffers.itemOffered.reservationFor.id' | 'acceptedOffers.itemOffered.issuedThrough.id' | 'acceptedOffers.offeredThrough.identifier' | 'acceptedOffers.itemOffered.reservationFor.superEvent.location.branchCode';
9
+ /**
10
+ * 注文オファーリポジトリ
11
+ */
12
+ export declare class MongoRepository {
13
+ private readonly orderModel;
14
+ constructor(connection: Connection);
15
+ /**
16
+ * オファー展開の注文検索
17
+ */
18
+ searchWithUnwoundAcceptedOffers(params: factory.order.ISearchConditions, projection?: IProjection4searchWithUnwoundAcceptedOffers): Promise<factory.order.IOrder[]>;
19
+ aggreateOwnershipInfosByOrder(filter: {
20
+ orderNumber: {
21
+ $eq: string;
22
+ };
23
+ }): Promise<{
24
+ identifier: string;
25
+ }[]>;
26
+ /**
27
+ * 注文オファーを展開して検索する
28
+ */
29
+ searchAcceptedOffersByOrderNumber(filter: {
30
+ limit?: number;
31
+ page?: number;
32
+ orderNumber: {
33
+ $eq: string;
34
+ };
35
+ project: {
36
+ id: {
37
+ $eq: string;
38
+ };
39
+ };
40
+ /**
41
+ * アイテムタイプで絞る場合
42
+ */
43
+ acceptedOffers?: {
44
+ itemOffered?: {
45
+ typeOf?: {
46
+ $in?: string[];
47
+ };
48
+ };
49
+ };
50
+ }, inclusion?: (keyof factory.order.IAcceptedOffer<factory.order.IItemOffered>)[]): Promise<factory.order.IAcceptedOffer<factory.order.IItemOffered>[]>;
51
+ /**
52
+ * 特定のフィールド値リストを検索する
53
+ */
54
+ distinctValues(filter: {
55
+ orderNumber: {
56
+ $in: string[];
57
+ };
58
+ }, field: IDistinctField): Promise<string[]>;
59
+ }
60
+ export {};
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MongoRepository = void 0;
13
+ const order_1 = require("./mongoose/schemas/order");
14
+ const order_2 = require("./order");
15
+ const settings_1 = require("../settings");
16
+ /**
17
+ * 注文オファーリポジトリ
18
+ */
19
+ class MongoRepository {
20
+ constructor(connection) {
21
+ this.orderModel = connection.model(order_1.modelName, (0, order_1.createSchema)());
22
+ }
23
+ /**
24
+ * オファー展開の注文検索
25
+ */
26
+ searchWithUnwoundAcceptedOffers(params, projection) {
27
+ var _a;
28
+ return __awaiter(this, void 0, void 0, function* () {
29
+ const conditions = order_2.MongoRepository.CREATE_MONGO_CONDITIONS(params);
30
+ const aggregate = this.orderModel.aggregate();
31
+ // pipelineの順序に注意
32
+ // @see https://docs.mongodb.com/manual/reference/operator/aggregation/sort/
33
+ // tslint:disable-next-line:no-single-line-block-comment
34
+ /* istanbul ignore else */
35
+ if (typeof ((_a = params.sort) === null || _a === void 0 ? void 0 : _a.orderDate) === 'number') {
36
+ aggregate.sort({ orderDate: params.sort.orderDate });
37
+ }
38
+ aggregate.unwind('$acceptedOffers');
39
+ conditions.forEach((c) => {
40
+ aggregate.match(c);
41
+ });
42
+ aggregate.project(Object.assign(Object.assign({}, projection), { acceptedOffers: ['$acceptedOffers'] }));
43
+ if (typeof params.limit === 'number' && params.limit > 0) {
44
+ const page = (typeof params.page === 'number' && params.page > 0) ? params.page : 1;
45
+ aggregate.limit(params.limit * page)
46
+ .skip(params.limit * (page - 1));
47
+ }
48
+ return aggregate
49
+ // .allowDiskUse(true) // false化(2023-11-30~)
50
+ .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
51
+ .exec();
52
+ });
53
+ }
54
+ aggreateOwnershipInfosByOrder(filter) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ const aggregate = this.orderModel.aggregate([
57
+ {
58
+ $unwind: {
59
+ path: '$acceptedOffers',
60
+ includeArrayIndex: 'acceptedOfferIndex'
61
+ }
62
+ },
63
+ { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
64
+ {
65
+ $project: {
66
+ _id: 0,
67
+ // acceptedOfferIndex: '$acceptedOfferIndex',
68
+ // itemOfferedTypeOf: '$acceptedOffers.itemOffered.typeOf',
69
+ // customerId: '$customer.id',
70
+ // orderNumber: '$orderNumber',
71
+ identifier: {
72
+ $concat: ['$customer.id', '-', '$acceptedOffers.itemOffered.typeOf', '-', '$orderNumber', '-', { $toString: '$acceptedOfferIndex' }]
73
+ }
74
+ }
75
+ }
76
+ ]);
77
+ return aggregate
78
+ .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
79
+ .exec();
80
+ });
81
+ }
82
+ /**
83
+ * 注文オファーを展開して検索する
84
+ */
85
+ searchAcceptedOffersByOrderNumber(filter, inclusion) {
86
+ var _a, _b, _c;
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ const matchStages = [
89
+ { $match: { 'project.id': { $eq: filter.project.id.$eq } } },
90
+ { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } }
91
+ ];
92
+ const itemOfferedTypeOfIn = (_c = (_b = (_a = filter.acceptedOffers) === null || _a === void 0 ? void 0 : _a.itemOffered) === null || _b === void 0 ? void 0 : _b.typeOf) === null || _c === void 0 ? void 0 : _c.$in;
93
+ if (Array.isArray(itemOfferedTypeOfIn)) {
94
+ matchStages.push({
95
+ $match: { 'acceptedOffers.itemOffered.typeOf': { $exists: true, $in: itemOfferedTypeOfIn } }
96
+ });
97
+ }
98
+ const aggregate = this.orderModel.aggregate([
99
+ // if (typeof params.sort?.orderDate === 'number') {
100
+ // aggregate.sort({ orderDate: params.sort.orderDate });
101
+ // }
102
+ {
103
+ $unwind: {
104
+ path: '$acceptedOffers'
105
+ // includeArrayIndex: 'elementIndex'
106
+ }
107
+ },
108
+ ...matchStages
109
+ ]);
110
+ if (Array.isArray(inclusion) && inclusion.length > 0) {
111
+ const specifiedProjection = {
112
+ _id: 0
113
+ };
114
+ inclusion.forEach((key) => {
115
+ specifiedProjection[key] = `$acceptedOffers.${key}`;
116
+ });
117
+ aggregate.project(specifiedProjection);
118
+ }
119
+ else {
120
+ aggregate.project({
121
+ _id: 0,
122
+ itemOffered: '$acceptedOffers.itemOffered',
123
+ priceSpecification: '$acceptedOffers.priceSpecification',
124
+ typeOf: '$acceptedOffers.typeOf',
125
+ id: '$acceptedOffers.id',
126
+ offeredThrough: '$acceptedOffers.offeredThrough',
127
+ name: '$acceptedOffers.name'
128
+ });
129
+ }
130
+ if (typeof filter.limit === 'number' && filter.limit > 0) {
131
+ const page = (typeof filter.page === 'number' && filter.page > 0) ? filter.page : 1;
132
+ aggregate.limit(filter.limit * page)
133
+ .skip(filter.limit * (page - 1));
134
+ }
135
+ return aggregate
136
+ .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
137
+ .exec();
138
+ });
139
+ }
140
+ /**
141
+ * 特定のフィールド値リストを検索する
142
+ */
143
+ distinctValues(filter, field) {
144
+ return __awaiter(this, void 0, void 0, function* () {
145
+ if (!Array.isArray(filter.orderNumber.$in) || filter.orderNumber.$in.length === 0) {
146
+ return [];
147
+ }
148
+ const filterQuery = {
149
+ orderNumber: { $in: filter.orderNumber.$in }
150
+ };
151
+ filterQuery[field] = { $exists: true };
152
+ return this.orderModel.distinct(field, filterQuery)
153
+ .setOptions({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
154
+ .exec();
155
+ });
156
+ }
157
+ }
158
+ exports.MongoRepository = MongoRepository;
@@ -36,12 +36,22 @@ export declare class MongoRepository {
36
36
  /**
37
37
  * コンテンツを保管する
38
38
  */
39
- saveMovie(params: factory.creativeWork.movie.ICreativeWork): Promise<any>;
39
+ saveMovie(params: factory.creativeWork.movie.ICreativeWork & {
40
+ /**
41
+ * ドキュメント作成時には無視される
42
+ */
43
+ $unset?: {
44
+ [key in keyof factory.creativeWork.movie.ICreativeWork]?: 1;
45
+ };
46
+ }): Promise<any>;
40
47
  /**
41
48
  * コードをキーにして冪等作成
42
49
  */
43
50
  upsertMoviesByIdentifier(params: {
44
- attributes: factory.creativeWork.movie.ICreativeWork;
51
+ $set: factory.creativeWork.movie.ICreativeWork;
52
+ $unset?: {
53
+ [key in keyof factory.creativeWork.movie.ICreativeWork]?: 1;
54
+ };
45
55
  }[], options?: {
46
56
  replace?: boolean;
47
57
  }): Promise<{
@@ -121,12 +121,13 @@ class MongoRepository {
121
121
  return __awaiter(this, void 0, void 0, function* () {
122
122
  let doc;
123
123
  if (params.id === '') {
124
- doc = yield this.creativeWorkModel.create(params);
124
+ const { $unset } = params, createParams = __rest(params, ["$unset"]);
125
+ doc = yield this.creativeWorkModel.create(createParams);
125
126
  }
126
127
  else {
127
- // 上書き禁止属性を除外(2022-08-24~)
128
- const { id, identifier, project, typeOf } = params, updateFields = __rest(params, ["id", "identifier", "project", "typeOf"]);
129
- doc = yield this.creativeWorkModel.findOneAndUpdate({ _id: { $eq: params.id } }, updateFields, { upsert: false, new: true })
128
+ // 上書き禁止属性を除外
129
+ const { id, identifier, project, typeOf, $unset } = params, setFields = __rest(params, ["id", "identifier", "project", "typeOf", "$unset"]);
130
+ doc = yield this.creativeWorkModel.findOneAndUpdate({ _id: { $eq: params.id } }, Object.assign({ $set: setFields }, ($unset !== undefined) ? { $unset } : undefined), { upsert: false, new: true })
130
131
  .exec();
131
132
  }
132
133
  if (doc === null) {
@@ -143,42 +144,55 @@ class MongoRepository {
143
144
  return __awaiter(this, void 0, void 0, function* () {
144
145
  const bulkWriteOps = [];
145
146
  if (Array.isArray(params)) {
146
- params.forEach((creatingMovieParams) => {
147
+ // tslint:disable-next-line:cyclomatic-complexity max-func-body-length
148
+ params.forEach(({ $set, $unset }) => {
149
+ // リソースのユニークネスを保証するfilter
150
+ const filter = {
151
+ typeOf: $set.typeOf,
152
+ 'project.id': { $eq: $set.project.id },
153
+ identifier: { $eq: $set.identifier }
154
+ };
147
155
  if ((options === null || options === void 0 ? void 0 : options.replace) === true) {
148
- const _a = creatingMovieParams.attributes, { id } = _a, replaceFields = __rest(_a, ["id"]);
149
- if (typeof replaceFields.identifier !== 'string' || replaceFields.identifier.length === 0) {
156
+ // updateOneで再実装
157
+ // const replacement: WithoutId<factory.creativeWork.movie.ICreativeWork> = replaceFields;
158
+ // const replaceOne: ReplaceOneModel<factory.creativeWork.movie.ICreativeWork> = {
159
+ // filter,
160
+ // replacement,
161
+ // upsert: true
162
+ // };
163
+ // bulkWriteOps.push({ replaceOne });
164
+ const { id, identifier, project, typeOf } = $set, setFields = __rest($set, ["id", "identifier", "project", "typeOf"]);
165
+ if (typeof identifier !== 'string' || identifier.length === 0) {
150
166
  throw new factory.errors.ArgumentNull('identifier');
151
167
  }
152
- const replacement = replaceFields;
153
- const replaceOne = {
154
- filter: {
155
- typeOf: replaceFields.typeOf,
156
- 'project.id': { $eq: replaceFields.project.id },
157
- identifier: { $eq: replaceFields.identifier }
158
- },
159
- replacement,
168
+ const setOnInsert = {
169
+ typeOf,
170
+ project,
171
+ identifier
172
+ };
173
+ const updateFilter = Object.assign({ $setOnInsert: setOnInsert, $set: setFields }, ($unset !== undefined) ? { $unset } : undefined);
174
+ const updateOne = {
175
+ filter,
176
+ update: updateFilter,
160
177
  upsert: true
161
178
  };
162
- bulkWriteOps.push({ replaceOne });
179
+ bulkWriteOps.push({ updateOne });
163
180
  }
164
181
  else {
165
- const _b = creatingMovieParams.attributes, { typeOf, project, identifier, duration, name, additionalProperty, contentRating, headline, distributor, thumbnailUrl, datePublished } = _b, setOnInsertFields = __rest(_b, ["typeOf", "project", "identifier", "duration", "name", "additionalProperty", "contentRating", "headline", "distributor", "thumbnailUrl", "datePublished"]);
182
+ const { typeOf, project, identifier, duration, name, additionalProperty, contentRating, headline, distributor, thumbnailUrl, datePublished } = $set, setOnInsertFields = __rest($set, ["typeOf", "project", "identifier", "duration", "name", "additionalProperty", "contentRating", "headline", "distributor", "thumbnailUrl", "datePublished"]);
166
183
  if (typeof identifier !== 'string' || identifier.length === 0) {
167
184
  throw new factory.errors.ArgumentNull('identifier');
168
185
  }
186
+ const setOnInsert = Object.assign(Object.assign({}, setOnInsertFields), { typeOf,
187
+ project,
188
+ identifier });
169
189
  const updateFilter = {
170
- $setOnInsert: Object.assign(Object.assign({}, setOnInsertFields), { typeOf,
171
- project,
172
- identifier }),
190
+ $setOnInsert: setOnInsert,
173
191
  // 変更可能な属性のみ上書き
174
192
  $set: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (name !== undefined) ? { name } : undefined), (contentRating !== undefined) ? { contentRating } : undefined), (duration !== undefined) ? { duration } : undefined), (headline !== undefined) ? { headline } : undefined), (datePublished !== undefined) ? { datePublished } : undefined), (distributor !== undefined) ? { distributor } : undefined), (typeof thumbnailUrl === 'string') ? { thumbnailUrl } : undefined), (Array.isArray(additionalProperty)) ? { additionalProperty } : [])
175
193
  };
176
194
  const updateOne = {
177
- filter: {
178
- typeOf: typeOf,
179
- 'project.id': { $eq: project.id },
180
- identifier: { $eq: identifier }
181
- },
195
+ filter,
182
196
  update: updateFilter,
183
197
  upsert: true
184
198
  };
@@ -119,6 +119,18 @@ export declare class MongoRepository {
119
119
  createScreeningEventSeriesIfNotExistByWorkPerformed(params: {
120
120
  attributes: factory.event.IAttributes<factory.eventType.ScreeningEventSeries>;
121
121
  }[]): Promise<BulkWriteResult | void>;
122
+ /**
123
+ * コンテンツ+バージョンをキーにして冪等置換
124
+ */
125
+ upsertScreeningEventSeriesByVersion(params: {
126
+ $set: factory.event.IAttributes<factory.eventType.ScreeningEventSeries>;
127
+ $unset?: IUnset<factory.eventType.ScreeningEventSeries>;
128
+ }[]): Promise<{
129
+ bulkWriteResult4insert: BulkWriteResult;
130
+ modifiedEvents: {
131
+ id: string;
132
+ }[];
133
+ } | void>;
122
134
  /**
123
135
  * イベント部分更新
124
136
  */
@@ -135,6 +147,9 @@ export declare class MongoRepository {
135
147
  save<T extends factory.eventType>(params: {
136
148
  id?: string;
137
149
  attributes: factory.event.IAttributes<T>;
150
+ /**
151
+ * ドキュメント作成時には無視される
152
+ */
138
153
  $unset?: IUnset<T>;
139
154
  upsert?: boolean;
140
155
  }): Promise<factory.event.IEvent<T>>;
@@ -605,6 +605,72 @@ class MongoRepository {
605
605
  }
606
606
  });
607
607
  }
608
+ /**
609
+ * コンテンツ+バージョンをキーにして冪等置換
610
+ */
611
+ // tslint:disable-next-line:max-func-body-length
612
+ upsertScreeningEventSeriesByVersion(params
613
+ // options?: {
614
+ // }
615
+ ) {
616
+ return __awaiter(this, void 0, void 0, function* () {
617
+ const uniqid = yield Promise.resolve().then(() => require('uniqid'));
618
+ const bulkWriteOps4insert = [];
619
+ // const bulkWriteOps: AnyBulkWriteOperation<factory.event.IAttributes<factory.eventType.ScreeningEventSeries>>[] = [];
620
+ const queryFilters = [];
621
+ if (Array.isArray(params)) {
622
+ params.forEach(({ $set, $unset }) => {
623
+ const version = $set.workPerformed.version;
624
+ if (typeof version !== 'string' || version.length === 0) {
625
+ throw new factory.errors.ArgumentNull('workPerformed.version');
626
+ }
627
+ // リソースのユニークネスを保証するfilter
628
+ const filter = {
629
+ typeOf: $set.typeOf,
630
+ 'project.id': { $eq: $set.project.id },
631
+ 'location.branchCode': { $exists: true, $eq: $set.location.branchCode },
632
+ 'workPerformed.identifier': { $exists: true, $eq: $set.workPerformed.identifier },
633
+ 'workPerformed.version': { $exists: true, $eq: version }
634
+ };
635
+ queryFilters.push({
636
+ typeOf: $set.typeOf,
637
+ 'project.id': { $eq: $set.project.id },
638
+ 'location.branchCode': { $exists: true, $eq: $set.location.branchCode },
639
+ 'workPerformed.identifier': { $exists: true, $eq: $set.workPerformed.identifier },
640
+ 'workPerformed.version': { $exists: true, $eq: version }
641
+ });
642
+ const { identifier, project, typeOf } = $set, setFields = __rest($set, ["identifier", "project", "typeOf"]);
643
+ const setOnInsert = {
644
+ project,
645
+ typeOf,
646
+ _id: uniqid()
647
+ };
648
+ const updateOne = {
649
+ filter,
650
+ update: Object.assign({ $setOnInsert: setOnInsert, $set: setFields }, ($unset !== undefined) ? { $unset } : undefined),
651
+ upsert: true
652
+ };
653
+ bulkWriteOps4insert.push({ updateOne });
654
+ // updateOneで再実装
655
+ // const replacement: WithoutId<factory.event.IAttributes<factory.eventType.ScreeningEventSeries>> = attributes;
656
+ // const replaceOne: ReplaceOneModel<factory.event.IAttributes<factory.eventType.ScreeningEventSeries>> = {
657
+ // filter,
658
+ // replacement,
659
+ // upsert: true
660
+ // };
661
+ // bulkWriteOps.push({ replaceOne });
662
+ });
663
+ }
664
+ if (bulkWriteOps4insert.length > 0) {
665
+ const bulkWriteResult4insert = yield this.eventModel.bulkWrite(bulkWriteOps4insert, { ordered: false });
666
+ // const bulkWriteResult = await this.eventModel.bulkWrite(bulkWriteOps, { ordered: false });
667
+ // modifiedの場合upsertedIdsに含まれないので、idを検索する
668
+ const modifiedEvents = yield this.eventModel.find({ $or: queryFilters }, { _id: 1 })
669
+ .exec();
670
+ return { bulkWriteResult4insert, modifiedEvents };
671
+ }
672
+ });
673
+ }
608
674
  /**
609
675
  * イベント部分更新
610
676
  */
@@ -1,7 +1,8 @@
1
+ import type { BulkWriteResult } from 'mongodb';
1
2
  import { AnyExpression, Connection, PipelineStage } from 'mongoose';
2
3
  import * as factory from '../factory';
3
4
  type IMatchStage = PipelineStage.Match;
4
- type KeyOfUnitPriceOffer = keyof factory.unitPriceOffer.IUnitPriceOffer;
5
+ type KeyOfUnitPriceOffer = keyof Omit<factory.unitPriceOffer.IUnitPriceOffer, 'id'>;
5
6
  type IProjection = {
6
7
  [key in KeyOfUnitPriceOffer]?: 0 | 1;
7
8
  };
@@ -151,14 +152,22 @@ export declare class MongoRepository {
151
152
  }[]>;
152
153
  count(params: Omit<factory.unitPriceOffer.ISearchConditions, 'limit' | 'page' | 'sort'>): Promise<number>;
153
154
  search(params: factory.unitPriceOffer.ISearchConditions, projection?: IProjection): Promise<IUnitPriceOfferFromAggregateOffer[]>;
154
- save(params: factory.unitPriceOffer.IUnitPriceOffer & {
155
- $unset?: any;
156
- }): Promise<factory.unitPriceOffer.IUnitPriceOffer>;
155
+ save(params: factory.unitPriceOffer.IUnitPriceOffer & {}): Promise<factory.unitPriceOffer.IUnitPriceOffer>;
156
+ /**
157
+ * コードをキーにして冪等置換(2023-12-13~)
158
+ */
159
+ upsertByIdentifier(params: Omit<factory.unitPriceOffer.IUnitPriceOffer, 'id'>[]): Promise<{
160
+ bulkWriteResult4insert: BulkWriteResult;
161
+ bulkWriteResult: BulkWriteResult;
162
+ modifiedOffers: {
163
+ id: string;
164
+ }[];
165
+ } | void>;
157
166
  /**
158
167
  * sskts専用オファー保管
159
168
  */
160
169
  saveManyByIdentifier(params: {
161
- attributes: factory.unitPriceOffer.IUnitPriceOffer;
170
+ attributes: Omit<factory.unitPriceOffer.IUnitPriceOffer, 'id'>;
162
171
  upsert?: boolean;
163
172
  }[]): Promise<void>;
164
173
  /**
@@ -421,7 +421,8 @@ class MongoRepository {
421
421
  },
422
422
  typeOf: '$offers.typeOf',
423
423
  project: '$project',
424
- id: '$offers.id',
424
+ // id: '$offers.id',
425
+ id: '$_id',
425
426
  identifier: '$offers.identifier',
426
427
  name: '$offers.name',
427
428
  description: '$offers.description',
@@ -461,17 +462,24 @@ class MongoRepository {
461
462
  offerIndex: `$${OFFERS_ARRAY_INDEX_NAME}`,
462
463
  parentOffer: {
463
464
  id: '$_id'
464
- }
465
+ },
466
+ id: '$_id' // 強制的に集計オファーIDに変更(2023-12-14~)
465
467
  };
466
468
  positiveProjectionFields.forEach((field) => {
467
- projectStage[field] = `$offers.${field}`;
469
+ // idは上書きしない(2023-12-14~)
470
+ if (field !== 'id') {
471
+ projectStage[field] = `$offers.${field}`;
472
+ }
468
473
  });
469
474
  }
470
475
  else if (negativeProjectionFields.length > 0) {
471
476
  negativeProjectionFields.forEach((field) => {
472
- if (typeof projectStage[field] === 'string') {
473
- // tslint:disable-next-line:no-dynamic-delete
474
- delete projectStage[field];
477
+ // idは除外しない(2023-12-14~)
478
+ if (field !== 'id') {
479
+ if (typeof projectStage[field] === 'string') {
480
+ // tslint:disable-next-line:no-dynamic-delete
481
+ delete projectStage[field];
482
+ }
475
483
  }
476
484
  });
477
485
  }
@@ -757,7 +765,8 @@ class MongoRepository {
757
765
  save(params) {
758
766
  return __awaiter(this, void 0, void 0, function* () {
759
767
  let doc;
760
- const { $unset } = params, paramsWithoutUnset = __rest(params, ["$unset"]);
768
+ // const { $unset, ...paramsWithoutUnset } = params;
769
+ const paramsWithoutUnset = __rest(params, []);
761
770
  let savedUnitPriceOffer;
762
771
  if (params.id === '') {
763
772
  const uniqid = yield Promise.resolve().then(() => require('uniqid'));
@@ -776,7 +785,7 @@ class MongoRepository {
776
785
  page: 1,
777
786
  project: { id: { $eq: params.project.id } },
778
787
  id: { $eq: params.id }
779
- }, { id: 1, identifier: 1, project: 1, typeOf: 1 });
788
+ }, { identifier: 1, project: 1, typeOf: 1 });
780
789
  const originalUnitPriceOffer = unitPriceOffers.shift();
781
790
  if (originalUnitPriceOffer === undefined) {
782
791
  throw new factory.errors.NotFound(factory.offerType.Offer);
@@ -803,6 +812,82 @@ class MongoRepository {
803
812
  return savedUnitPriceOffer;
804
813
  });
805
814
  }
815
+ /**
816
+ * コードをキーにして冪等置換(2023-12-13~)
817
+ */
818
+ upsertByIdentifier(params
819
+ // options?: {
820
+ // replace?: boolean;
821
+ // }
822
+ ) {
823
+ return __awaiter(this, void 0, void 0, function* () {
824
+ const uniqid = yield Promise.resolve().then(() => require('uniqid'));
825
+ const insertBulkWriteOps = [];
826
+ const updateBulkWriteOps = [];
827
+ const queryFilters = [];
828
+ if (Array.isArray(params)) {
829
+ params.forEach((p) => {
830
+ // リソースのユニークネスを保証するfilter
831
+ const filter = {
832
+ 'project.id': { $eq: p.project.id },
833
+ 'offers.identifier': { $exists: true, $eq: p.identifier }
834
+ };
835
+ queryFilters.push({
836
+ 'project.id': { $eq: p.project.id },
837
+ 'offers.identifier': { $exists: true, $eq: p.identifier }
838
+ });
839
+ const newOfferId = uniqid(); // setOnInsert時のみに利用する新ID
840
+ const unitPriceOffer = Object.assign(Object.assign({}, p), { id: newOfferId });
841
+ const aggregateOffer = {
842
+ project: p.project,
843
+ typeOf: factory.offerType.AggregateOffer,
844
+ offers: [unitPriceOffer]
845
+ };
846
+ const setOnInsert = Object.assign(Object.assign({}, aggregateOffer), { _id: newOfferId });
847
+ const updateFilter = { $setOnInsert: setOnInsert };
848
+ const updateOneOnInsert = {
849
+ filter,
850
+ update: updateFilter,
851
+ upsert: true
852
+ };
853
+ insertBulkWriteOps.push({ updateOne: updateOneOnInsert });
854
+ });
855
+ }
856
+ if (insertBulkWriteOps.length > 0) {
857
+ const bulkWriteResult4insert = yield this.aggregateOfferModel.bulkWrite(insertBulkWriteOps, { ordered: false });
858
+ // modifiedの場合upsertedIdsに含まれないので、idを検索する
859
+ const modifiedOffers = yield this.aggregateOfferModel.find({ $or: queryFilters }, { _id: 1, 'offers.identifier': 1 })
860
+ .exec()
861
+ .then((docs) => docs.map((doc) => doc.toObject()));
862
+ params.forEach((p) => {
863
+ const originalAggregateOffer = modifiedOffers.find(((offer) => { var _a; return ((_a = offer.offers[0]) === null || _a === void 0 ? void 0 : _a.identifier) === p.identifier; }));
864
+ if (originalAggregateOffer === undefined) {
865
+ // upsert後なので、必ず存在するはず
866
+ throw new factory.errors.NotFound(`${factory.offerType.AggregateOffer} [${p.identifier}]`);
867
+ }
868
+ // リソースのユニークネスを保証するfilter
869
+ const filter = {
870
+ 'project.id': { $eq: p.project.id },
871
+ 'offers.identifier': { $exists: true, $eq: p.identifier }
872
+ };
873
+ const unitPriceOffer = Object.assign(Object.assign({}, p), { id: originalAggregateOffer.id });
874
+ const setOnUpdate = {
875
+ 'offers.0': unitPriceOffer
876
+ };
877
+ const updateOne = {
878
+ filter,
879
+ update: { $set: setOnUpdate },
880
+ upsert: false
881
+ };
882
+ updateBulkWriteOps.push({ updateOne });
883
+ });
884
+ if (updateBulkWriteOps.length > 0) {
885
+ const bulkWriteResult = yield this.aggregateOfferModel.bulkWrite(updateBulkWriteOps, { ordered: false });
886
+ return { bulkWriteResult4insert, bulkWriteResult, modifiedOffers };
887
+ }
888
+ }
889
+ });
890
+ }
806
891
  /**
807
892
  * sskts専用オファー保管
808
893
  */
@@ -874,7 +959,7 @@ class MongoRepository {
874
959
  const updatingOffers = yield this.search({
875
960
  project: { id: { $eq: params.project.id } },
876
961
  addOn: { itemOffered: { id: { $in: params.addOn.itemOffered.id.$in } } }
877
- }, { id: 1 });
962
+ }, { identifier: 1 });
878
963
  const result = yield this.aggregateOfferModel.updateMany(conditions, {
879
964
  $pull: {
880
965
  'offers.$[offer].addOn': {
@@ -893,16 +978,6 @@ class MongoRepository {
893
978
  return result;
894
979
  });
895
980
  }
896
- // public async deleteById(params: {
897
- // project: { id: string };
898
- // id: string;
899
- // }) {
900
- // await this.aggregateOfferModel.findOneAndRemove(
901
- // { _id: { $eq: params.id } },
902
- // { projection: { _id: 1 } }
903
- // )
904
- // .exec();
905
- // }
906
981
  /**
907
982
  * サブカタログから集計オファーIDリストを検索する
908
983
  */