@chevre/domain 24.0.0-alpha.62 → 24.0.0-alpha.64

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,7 @@ import * as factory from '../../factory';
3
3
  type ISubReservationAsFindResult = Pick<factory.reservation.eventReservation.IReservation, 'underName' | 'id'> & {
4
4
  price?: factory.reservation.eventReservation.IPrice;
5
5
  reservedTicket?: Pick<factory.reservation.eventReservation.IReservedTicket, 'ticketType'>;
6
+ reservationFor?: factory.assetTransaction.reserve.IReservationFor;
6
7
  };
7
8
  /**
8
9
  * 予約取引リポジトリ
@@ -10,12 +11,6 @@ type ISubReservationAsFindResult = Pick<factory.reservation.eventReservation.IRe
10
11
  export declare class ReserveTransactionRepo {
11
12
  private readonly transactionModel;
12
13
  constructor(connection: Connection);
13
- /**
14
- * 予約取引から予約を検索する
15
- */
16
- findSubReservationsByReservationNumber(params: {
17
- reservationNumber: string;
18
- }): Promise<ISubReservationAsFindResult[]>;
19
14
  /**
20
15
  * 予約取引から予約を検索する
21
16
  * limitはしない
@@ -35,50 +35,54 @@ class ReserveTransactionRepo {
35
35
  constructor(connection) {
36
36
  this.transactionModel = connection.model(assetTransaction_1.modelName, (0, assetTransaction_1.createSchema)());
37
37
  }
38
- /**
39
- * 予約取引から予約を検索する
40
- */
41
- async findSubReservationsByReservationNumber(params) {
42
- const aggregate = this.transactionModel.aggregate([
43
- {
44
- $match: {
45
- typeOf: { $eq: factory.assetTransactionType.Reserve },
46
- transactionNumber: { $eq: params.reservationNumber }
47
- }
48
- },
49
- {
50
- $unwind: {
51
- path: '$object.subReservation'
52
- // includeArrayIndex: 'elementIndex'
53
- }
54
- },
55
- // {
56
- // $match: {
57
- // typeOf: { $eq: factory.assetTransactionType.Reserve },
58
- // transactionNumber: { $eq: params.reservationNumber }
59
- // }
60
- // },
61
- {
62
- $project: {
63
- _id: 0,
64
- id: '$object.subReservation.id',
65
- price: '$object.subReservation.price',
66
- underName: '$object.underName',
67
- reservedTicket: {
68
- ticketType: '$object.subReservation.reservedTicket.ticketType',
69
- }
70
- }
71
- }
72
- ]);
73
- // if (typeof filter.limit === 'number' && filter.limit > 0) {
74
- // const page: number = (typeof filter.page === 'number' && filter.page > 0) ? filter.page : 1;
75
- // aggregate.limit(filter.limit * page)
76
- // .skip(filter.limit * (page - 1));
77
- // }
78
- return aggregate
79
- .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
80
- .exec();
81
- }
38
+ // /**
39
+ // * 予約取引から予約を検索する
40
+ // */
41
+ // public async findSubReservationsByReservationNumber(
42
+ // params: {
43
+ // reservationNumber: string;
44
+ // }
45
+ // ): Promise<ISubReservationAsFindResult[]> {
46
+ // const aggregate = this.transactionModel.aggregate<ISubReservationAsFindResult>([
47
+ // {
48
+ // $match: {
49
+ // typeOf: { $eq: factory.assetTransactionType.Reserve },
50
+ // transactionNumber: { $eq: params.reservationNumber }
51
+ // }
52
+ // },
53
+ // {
54
+ // $unwind: {
55
+ // path: '$object.subReservation'
56
+ // // includeArrayIndex: 'elementIndex'
57
+ // }
58
+ // },
59
+ // // {
60
+ // // $match: {
61
+ // // typeOf: { $eq: factory.assetTransactionType.Reserve },
62
+ // // transactionNumber: { $eq: params.reservationNumber }
63
+ // // }
64
+ // // },
65
+ // {
66
+ // $project: {
67
+ // _id: 0,
68
+ // id: '$object.subReservation.id',
69
+ // price: '$object.subReservation.price',
70
+ // underName: '$object.underName',
71
+ // reservedTicket: {
72
+ // ticketType: '$object.subReservation.reservedTicket.ticketType',
73
+ // }
74
+ // }
75
+ // }
76
+ // ]);
77
+ // // if (typeof filter.limit === 'number' && filter.limit > 0) {
78
+ // // const page: number = (typeof filter.page === 'number' && filter.page > 0) ? filter.page : 1;
79
+ // // aggregate.limit(filter.limit * page)
80
+ // // .skip(filter.limit * (page - 1));
81
+ // // }
82
+ // return aggregate
83
+ // .option({ maxTimeMS: MONGO_MAX_TIME_MS })
84
+ // .exec();
85
+ // }
82
86
  /**
83
87
  * 予約取引から予約を検索する
84
88
  * limitはしない
@@ -112,6 +116,7 @@ class ReserveTransactionRepo {
112
116
  id: '$object.subReservation.id',
113
117
  price: '$object.subReservation.price',
114
118
  underName: '$object.underName',
119
+ reservationFor: '$object.reservationFor',
115
120
  reservedTicket: {
116
121
  ticketType: '$object.subReservation.reservedTicket.ticketType',
117
122
  }
@@ -15,13 +15,9 @@ type ISavingReservedTicket = Omit<factory.assetTransaction.reserve.ISubReservati
15
15
  /**
16
16
  * ドキュメントとして保管する予約
17
17
  */
18
- export type ICreatingReservation = Omit<factory.reservation.eventReservation.IReservation, 'id' | 'price' | 'reservedTicket'> & {
18
+ export type ICreatingReservation = Omit<factory.reservation.eventReservation.IReservation, 'id' | 'reservedTicket'> & {
19
19
  _id: string;
20
- /**
21
- * priceは廃止予定だが、互換性維持対応としてひとまず型を強制的に合わせる
22
- */
23
- price?: factory.reservation.eventReservation.IPrice;
24
- reservedTicket: factory.assetTransaction.reserve.ISubReservationReservedTicket | ISavingReservedTicket;
20
+ reservedTicket: ISavingReservedTicket;
25
21
  };
26
22
  /**
27
23
  * 廃止予定の予約属性
@@ -29,7 +25,7 @@ export type ICreatingReservation = Omit<factory.reservation.eventReservation.IRe
29
25
  export type IDeprecatedField = 'price' | 'underName';
30
26
  export type IKeyOfProjection = Exclude<keyof factory.reservation.eventReservation.IReservation, IDeprecatedField> | 'reservedTicket.dateUsed' | 'reservationFor.id' | 'reservationFor.typeOf';
31
27
  export type IAttendedReservation = Pick<factory.reservation.eventReservation.IReservation, 'id' | 'typeOf' | 'project' | 'modifiedTime'> & {
32
- reservationFor: Pick<factory.reservation.eventReservation.IReservationFor, 'id' | 'typeOf'>;
28
+ reservationFor: Pick<factory.reservation.eventReservation.IReservationForMinimized, 'id' | 'typeOf'>;
33
29
  reservedTicket: Pick<factory.reservation.eventReservation.IReservedTicket, 'dateUsed'>;
34
30
  };
35
31
  export type IReservationAsFindResult = Omit<factory.reservation.eventReservation.IReservation, IDeprecatedField> & {
@@ -28,7 +28,6 @@ const reservation_1 = require("./mongoose/schemas/reservation");
28
28
  const factory = __importStar(require("../factory"));
29
29
  const createMongoConditions_1 = require("./factory/reservation/createMongoConditions");
30
30
  const settings_1 = require("../settings");
31
- const USE_DISCONTINUED_RESERVATION_PRICE = process.env.USE_DISCONTINUED_RESERVATION_PRICE === '1';
32
31
  /**
33
32
  * 予約リポジトリ
34
33
  */
@@ -137,17 +136,15 @@ class ReservationRepo {
137
136
  const bulkWriteOps = [];
138
137
  if (Array.isArray(params.subReservation)) {
139
138
  params.subReservation.forEach((subReservation) => {
140
- const { price, reservedTicket, ...subReservationWithoutPrice } = subReservation;
139
+ const { price: _discontinuePrice, reservedTicket, ...subReservationWithoutPrice } = subReservation;
141
140
  const { ticketType, ...reservedTicketWithoutTicketType } = reservedTicket;
142
141
  // 予約ドキュメントのticketTypeを最小化(2026-04-03~)
143
- const savingReservedTicket = (USE_DISCONTINUED_RESERVATION_PRICE)
144
- ? reservedTicket
145
- : {
146
- ...reservedTicketWithoutTicketType,
147
- ticketType: {
148
- ...((typeof ticketType.id === 'string') && { id: ticketType.id })
149
- }
150
- };
142
+ const savingReservedTicket = {
143
+ ...reservedTicketWithoutTicketType,
144
+ ticketType: {
145
+ ...((typeof ticketType.id === 'string') && { id: ticketType.id })
146
+ }
147
+ };
151
148
  const setOnInsert = {
152
149
  ...subReservationWithoutPrice,
153
150
  typeOf: factory.reservationType.EventReservation,
@@ -165,7 +162,7 @@ class ReservationRepo {
165
162
  reservedTicket: savingReservedTicket,
166
163
  ...(params.underName !== undefined) ? { underName: params.underName } : undefined,
167
164
  ...(typeof params.broker?.typeOf === 'string') ? { broker: params.broker } : undefined,
168
- ...((USE_DISCONTINUED_RESERVATION_PRICE) && { price }) // discontinue price(2026-03-31~)
165
+ // discontinue price(2026-03-31~)
169
166
  };
170
167
  bulkWriteOps.push({
171
168
  updateOne: {
@@ -10,7 +10,7 @@ export declare function createStartParams(params: {
10
10
  transactionNumber: string;
11
11
  transaction?: factory.assetTransaction.ITransaction<factory.assetTransactionType.Reserve>;
12
12
  reservations?: (Pick<factory.reservation.eventReservation.IReservation, 'id' | 'issuedThrough' | 'typeOf' | 'reservationNumber'> & {
13
- reservationFor: Pick<factory.reservation.eventReservation.IReservationFor, 'id' | 'typeOf'>;
13
+ reservationFor: Pick<factory.reservation.eventReservation.IReservationForMinimized, 'id' | 'typeOf'>;
14
14
  })[];
15
15
  }): factory.assetTransaction.IStartParams<factory.assetTransactionType.CancelReservation>;
16
16
  export declare function createPotentialActions(params: {
@@ -19,7 +19,7 @@ export declare function validateStartParams(params: IStartParams): (repos: {
19
19
  }) => Promise<{
20
20
  reserveTransaction: import("@chevre/factory/lib/assetTransaction/reserve").ITransaction | undefined;
21
21
  reservations: (Pick<import("@chevre/factory/lib/reservation/event").IReservation, "id" | "typeOf" | "reservationNumber" | "issuedThrough"> & {
22
- reservationFor: Pick<factory.reservation.eventReservation.IReservationFor, "id" | "typeOf">;
22
+ reservationFor: Pick<factory.reservation.eventReservation.IReservationForMinimized, "id" | "typeOf">;
23
23
  })[] | undefined;
24
24
  }>;
25
25
  /**
@@ -38,7 +38,7 @@ declare function processUnlockOfferRateLimit(params: {
38
38
  reservationNumber: string;
39
39
  reservedTicket: Pick<factory.assetTransaction.reserve.ISubReservationReservedTicket, 'ticketType'>;
40
40
  };
41
- reservationFor: factory.assetTransaction.reserve.IReservationFor;
41
+ reservationFor: Pick<factory.assetTransaction.reserve.IReservationFor, 'id' | 'typeOf' | 'startDate'>;
42
42
  }): (repos: {
43
43
  offerRateLimit: OfferRateLimitRepo;
44
44
  }) => Promise<void>;
@@ -69,6 +69,10 @@ function confirmReservation(params) {
69
69
  if (subReservationByTransaction === undefined) {
70
70
  throw new factory.errors.NotFound('reserveTransaction.object.subReservation');
71
71
  }
72
+ // 予約取引内にreservationForは必ず存在するはず
73
+ if (reserveTransaction.object.reservationFor === undefined) {
74
+ throw new factory.errors.NotFound('reserveTransaction.object.reservationFor');
75
+ }
72
76
  const priceByTransaction = subReservationByTransaction.price;
73
77
  const underNameByTransaction = reserveTransaction.object.underName;
74
78
  const ticketTypeByTransaction = subReservationByTransaction.reservedTicket.ticketType;
@@ -80,7 +84,8 @@ function confirmReservation(params) {
80
84
  reservedTicket: {
81
85
  ...rawReservation.reservedTicket,
82
86
  ticketType: ticketTypeByTransaction
83
- }
87
+ },
88
+ reservationFor: reserveTransaction.object.reservationFor // reservationForは予約取引から参照する(2026-04-05~)
84
89
  };
85
90
  });
86
91
  confirmedReservations = confirmedReservations.map((r) => {
@@ -1,15 +1,21 @@
1
1
  import * as factory from '../../factory';
2
2
  import type { ReserveTransactionRepo } from '../../repo/assetTransaction/reserve';
3
3
  import type { IDeprecatedField, IKeyOfProjection, ReservationRepo } from '../../repo/reservation';
4
- type IReservationAsFindResult = Omit<factory.reservation.eventReservation.IReservation, 'price'> & {
4
+ /**
5
+ * 予約検索レスポンスとしての予約
6
+ * 予約ドキュメントに予約取引の情報を補完する
7
+ */
8
+ type IReservationAsFindResult = Omit<factory.reservation.eventReservation.IReservation, 'price' | 'underName' | 'reservedTicket' | 'reservationFor'> & {
5
9
  price?: factory.reservation.eventReservation.IPrice;
10
+ underName?: factory.assetTransaction.reserve.IUnderName;
11
+ reservedTicket?: factory.assetTransaction.reserve.IObjectSubReservation['reservedTicket'];
12
+ reservationFor?: factory.assetTransaction.reserve.IReservationFor;
6
13
  };
7
14
  /**
8
15
  * 予約を検索する
9
16
  */
10
17
  export declare function findReservations(params: factory.reservation.eventReservation.ISearchConditions, options: {
11
18
  inclusion: Partial<Record<IKeyOfProjection | IDeprecatedField, 1>>;
12
- useReserveTransaction: boolean;
13
19
  }): (repos: {
14
20
  assetTransaction: {
15
21
  reserve: ReserveTransactionRepo;
@@ -5,70 +5,67 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.findReservations = findReservations;
7
7
  const debug_1 = __importDefault(require("debug"));
8
- const util_1 = require("util");
9
8
  const debug = (0, debug_1.default)('chevre-domain:service:reserve:findReservations');
10
9
  /**
11
10
  * 予約を検索する
12
11
  */
13
12
  function findReservations(params, options) {
14
13
  return async (repos) => {
15
- const { inclusion, useReserveTransaction } = options;
16
- let reservations = await repos.reservation.findReservations(params, inclusion);
17
- if (useReserveTransaction) {
18
- if (reservations.length > 0) {
19
- const requirePrice = Object.keys(inclusion).includes('price');
20
- const requireUnderName = Object.keys(inclusion).includes('underName');
21
- const requireReservedTicket = Object.keys(inclusion).includes('reservedTicket');
22
- const reservationIds = reservations.map(({ id }) => id);
23
- const subReservations = await repos.assetTransaction.reserve.findSubReservationsById({
24
- ids: reservationIds
25
- });
26
- // 予約取引から参照した予約数と同じはず
27
- debug('useReserveTransaction: true. reservations.length === subReservations.length?', reservations.length === subReservations.length);
28
- reservations = reservations.map((reservation) => {
29
- const subReservationByTransaction = subReservations.find((s) => s.id === reservation.id);
30
- const priceByTransaction = subReservationByTransaction?.price;
31
- const underNameByTransaction = subReservationByTransaction?.underName;
32
- const ticketTypeByTransaction = subReservationByTransaction?.reservedTicket?.ticketType;
33
- // 予約取引から参照した属性と全く等しいはず
34
- if (requirePrice) {
35
- const priceMatched = (0, util_1.isDeepStrictEqual)(reservation.price, priceByTransaction);
36
- debug('requirePrice. priceMatched?', priceMatched);
37
- if (!priceMatched) {
38
- console.error('priceMatched: false!!!', reservation.id);
39
- }
40
- }
41
- if (requireUnderName) {
42
- const underNameMatched = (0, util_1.isDeepStrictEqual)(reservation.underName, underNameByTransaction);
43
- debug('requireUnderName. underNameMatched?', underNameMatched);
44
- if (!underNameMatched) {
45
- console.error('underNameMatched: false!!!', reservation.id);
46
- }
47
- }
48
- if (requireReservedTicket) {
49
- const ticketTypeMatched = (0, util_1.isDeepStrictEqual)(reservation.reservedTicket.ticketType, ticketTypeByTransaction);
50
- debug('requireReservedTicket. ticketTypeMatched?', ticketTypeMatched);
51
- if (!ticketTypeMatched) {
52
- console.error('ticketTypeMatched: false!!!', reservation.id);
53
- }
54
- }
55
- return {
56
- ...reservation, // 予約ドキュメントはそのまま返す
57
- ...(requirePrice && priceByTransaction !== undefined) ? { price: priceByTransaction } : undefined, // priceがあれば上書き
58
- ...(requireUnderName && underNameByTransaction !== undefined) ? { underName: underNameByTransaction } : undefined, // underNameがあれば上書き
59
- ...(requireReservedTicket && ticketTypeByTransaction !== undefined) // ticketTypeがあれば上書き
60
- ? {
61
- reservedTicket: {
62
- ...reservation.reservedTicket, // 予約ドキュメントのreservedTicketはそのまま返す
63
- ticketType: ticketTypeByTransaction
64
- }
14
+ const { inclusion } = options;
15
+ const rawReservations = await repos.reservation.findReservations(params, inclusion);
16
+ if (rawReservations.length === 0) {
17
+ return [];
18
+ }
19
+ else {
20
+ const requirePrice = Object.keys(inclusion).includes('price');
21
+ const requireUnderName = Object.keys(inclusion).includes('underName');
22
+ const requireReservedTicket = Object.keys(inclusion).includes('reservedTicket');
23
+ const requireReservationFor = Object.keys(inclusion).includes('reservationFor');
24
+ const reservationIds = rawReservations.map(({ id }) => id);
25
+ const subReservations = await repos.assetTransaction.reserve.findSubReservationsById({
26
+ ids: reservationIds
27
+ });
28
+ // 予約取引から参照した予約数と同じはず
29
+ debug('useReserveTransaction: true. reservations.length === subReservations.length?', rawReservations.length === subReservations.length);
30
+ return rawReservations.map((reservation) => {
31
+ const subReservationByTransaction = subReservations.find((s) => s.id === reservation.id);
32
+ const priceByTransaction = subReservationByTransaction?.price;
33
+ const underNameByTransaction = subReservationByTransaction?.underName;
34
+ const ticketTypeByTransaction = subReservationByTransaction?.reservedTicket?.ticketType;
35
+ const reservationForByTransaction = subReservationByTransaction?.reservationFor;
36
+ // 予約ドキュメントを最適化し始めたため、もう等しくない(2026-04-06~)
37
+ // // 予約取引から参照した属性と全く等しいはず
38
+ // if (requirePrice) {
39
+ // }
40
+ // if (requireUnderName) {
41
+ // }
42
+ // if (requireReservedTicket) {
43
+ // }
44
+ // if (requireReservationFor) {
45
+ // const reservationForMatched = isDeepStrictEqual(reservation.reservationFor, reservationForByTransaction);
46
+ // debug('requireReservationFor. reservationForMatched?', reservationForMatched);
47
+ // if (!reservationForMatched) {
48
+ // console.error('reservationForMatched: false!!!', reservation.id);
49
+ // }
50
+ // }
51
+ const { reservationFor, reservedTicket, ...rawReservation4result } = reservation; // eslint-disable-line @typescript-eslint/no-unused-vars
52
+ return {
53
+ ...rawReservation4result, // 予約ドキュメントはそのまま返す
54
+ ...(requirePrice && priceByTransaction !== undefined) ? { price: priceByTransaction } : undefined, // priceがあれば上書き
55
+ ...(requireUnderName && underNameByTransaction !== undefined) ? { underName: underNameByTransaction } : undefined, // underNameがあれば上書き
56
+ ...(requireReservedTicket && ticketTypeByTransaction !== undefined) // ticketTypeがあれば上書き
57
+ ? {
58
+ reservedTicket: {
59
+ ...reservedTicket, // 予約ドキュメントのreservedTicketはそのまま返す
60
+ ticketType: ticketTypeByTransaction
65
61
  }
66
- : undefined
67
- };
68
- });
69
- }
70
- ;
62
+ }
63
+ : undefined,
64
+ ...(requireReservationFor && reservationForByTransaction !== undefined)
65
+ ? { reservationFor: reservationForByTransaction }
66
+ : undefined, // reservationForがあれば上書き(2026-04-06~)
67
+ };
68
+ });
71
69
  }
72
- return reservations;
73
70
  };
74
71
  }
@@ -5,12 +5,13 @@ import * as factory from '../../../factory';
5
5
  import { AuthorizationRepo } from '../../../repo/authorization';
6
6
  import type { SettingRepo } from '../../../repo/setting';
7
7
  import type { TaskRepo } from '../../../repo/task';
8
- export type IConfirmedReservation = Omit<factory.reservation.eventReservation.IReservation, 'price' | 'underName' | 'reservedTicket'> & {
8
+ export type IConfirmedReservation = Omit<factory.reservation.eventReservation.IReservation, 'price' | 'underName' | 'reservedTicket' | 'reservationFor'> & {
9
9
  price?: factory.reservation.eventReservation.IPrice;
10
10
  underName?: Pick<factory.reservation.IUnderName, 'id' | 'typeOf'>;
11
11
  reservedTicket: Omit<factory.assetTransaction.reserve.ISubReservationReservedTicket, 'ticketType'> & {
12
12
  ticketType: factory.reservation.eventReservation.ITicketType;
13
13
  };
14
+ reservationFor: factory.assetTransaction.reserve.IReservationFor;
14
15
  };
15
16
  /**
16
17
  * 予約確定後のアクション
package/package.json CHANGED
@@ -11,8 +11,8 @@
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": "6.2.0-alpha.6",
15
- "@cinerino/sdk": "14.0.0-alpha.4",
14
+ "@chevre/factory": "6.2.0-alpha.7",
15
+ "@cinerino/sdk": "14.0.0-alpha.5",
16
16
  "@motionpicture/coa-service": "9.7.0-alpha.2",
17
17
  "@motionpicture/gmo-service": "5.4.0-alpha.1",
18
18
  "@sendgrid/client": "8.1.4",
@@ -97,5 +97,5 @@
97
97
  "postversion": "git push origin --tags",
98
98
  "prepublishOnly": "npm run clean && npm run build"
99
99
  },
100
- "version": "24.0.0-alpha.62"
100
+ "version": "24.0.0-alpha.64"
101
101
  }