@chevre/domain 23.1.0-alpha.8 → 23.1.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.
Files changed (25) hide show
  1. package/example/src/chevre/assetTransaction/processReserve.ts +7 -3
  2. package/example/src/chevre/authorizeEventServiceOffer.ts +6 -5
  3. package/example/src/chevre/member/migrateMemberIdentifier.ts +20 -15
  4. package/example/src/chevre/reIndex.ts +2 -2
  5. package/lib/chevre/repo/mongoose/schemas/eventOffer.js +39 -35
  6. package/lib/chevre/repo/mongoose/schemas/member.js +10 -0
  7. package/lib/chevre/service/assetTransaction/reserve/start.d.ts +4 -0
  8. package/lib/chevre/service/assetTransaction/reserve/start.js +4 -1
  9. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/fixExtendedEventOffer.d.ts +1 -0
  10. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/fixExtendedEventOffer.js +2 -2
  11. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateIssuedOfferIfExists.d.ts +1 -0
  12. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateIssuedOfferIfExists.js +3 -3
  13. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateMemberTierIfExists.d.ts +1 -0
  14. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateMemberTierIfExists.js +3 -3
  15. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/verifyTicketTokenAsNeeded.d.ts +23 -0
  16. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/verifyTicketTokenAsNeeded.js +64 -0
  17. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest.d.ts +5 -0
  18. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest.js +16 -4
  19. package/lib/chevre/service/offer/event/authorize/factory.d.ts +0 -4
  20. package/lib/chevre/service/offer/event/authorize/factory.js +2 -5
  21. package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre.d.ts +1 -0
  22. package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre.js +2 -7
  23. package/lib/chevre/service/offer/event/authorize.d.ts +1 -0
  24. package/lib/chevre/service/offer/event/authorize.js +7 -7
  25. package/package.json +3 -3
@@ -76,8 +76,8 @@ async function main() {
76
76
  reservationFor: {
77
77
  id: EVENT_ID,
78
78
  offers: {
79
- token: OFFER_TOKEN,
80
- identifier: 'LegacyReservation'
79
+ // token: OFFER_TOKEN,
80
+ // identifier: 'LegacyReservation'
81
81
  }
82
82
  }
83
83
  },
@@ -88,7 +88,9 @@ async function main() {
88
88
  validateEvent: false,
89
89
  validateEventOfferPeriod: true,
90
90
  validateAppliesToMovieTicket: true,
91
- instrument: [],
91
+ instrument: [
92
+ ...(typeof OFFER_TOKEN === 'string') ? [{ ticketToken: OFFER_TOKEN, typeOf: <'Ticket'>'Ticket' }] : []
93
+ ],
92
94
  availableAtOrFrom: { id: APPLICATION_ID }
93
95
  // stockHoldUntilDaysAfterEventEnd: STOCK_HOLD_UNTIL_DAYS_AFTER_EVENT_END
94
96
  },
@@ -96,6 +98,7 @@ async function main() {
96
98
  )(
97
99
  {
98
100
  advanceBookingRequirement: await chevre.repository.AdvanceBookingRequirement.createInstance(mongoose.connection),
101
+ authorization: await chevre.repository.Authorization.createInstance(mongoose.connection),
99
102
  project: await chevre.repository.Project.createInstance(mongoose.connection),
100
103
  stockHolder: await chevre.repository.StockHolder.createInstance({ connection: mongoose.connection }),
101
104
  event: await chevre.repository.Event.createInstance(mongoose.connection),
@@ -115,6 +118,7 @@ async function main() {
115
118
  seat: await chevre.repository.place.Seat.createInstance(mongoose.connection),
116
119
  setting: await chevre.repository.Setting.createInstance(mongoose.connection),
117
120
  task: await chevre.repository.Task.createInstance(mongoose.connection),
121
+ ticket: await chevre.repository.Ticket.createInstance(mongoose.connection),
118
122
  assetTransaction: await chevre.repository.AssetTransaction.createInstance(mongoose.connection)
119
123
  },
120
124
  new chevre.settings.Settings({
@@ -29,10 +29,10 @@ async function main() {
29
29
  reservationFor: {
30
30
  id: 'bmcvkft63',
31
31
  offers: {
32
- validForMemberTier: {
33
- token: 'xx',
34
- isTierOf: { identifier: 'DefaultMemberProgram' }
35
- }
32
+ // validForMemberTier: {
33
+ // token: 'xx',
34
+ // isTierOf: { identifier: 'DefaultMemberProgram' }
35
+ // }
36
36
  }
37
37
 
38
38
  }
@@ -41,7 +41,8 @@ async function main() {
41
41
  transaction: { id: 'xxx' },
42
42
  validateEventOfferPeriod: true,
43
43
  validateEvent: false,
44
- store: { id: 'xxx' }
44
+ store: { id: 'xxx' },
45
+ instrument: []
45
46
  },
46
47
  {
47
48
  noOfferSpecified: true,
@@ -53,35 +53,40 @@ async function main() {
53
53
  i += 1;
54
54
  const iamMember: chevre.factory.iam.IMember = doc.toObject();
55
55
 
56
- const identifierExists = typeof (<any>iamMember.member).identifier === 'string';
56
+ const applicationIdentifier = iamMember.member.identifier;
57
+ const updatingIdentifier = identifierMap.find(({ id }) => id === iamMember.member.id)?.identifier;
58
+ if (typeof updatingIdentifier !== 'string') {
59
+ throw new Error(`map not found. ${iamMember.member.name}`);
60
+ }
61
+ const identifierExists = typeof applicationIdentifier === 'string';
57
62
 
58
63
  if (identifierExists) {
64
+ if (applicationIdentifier !== updatingIdentifier) {
65
+ throw new Error(`unexpected application identifier. ${iamMember.member.name}`);
66
+ }
67
+
59
68
  console.log(
60
69
  'identifier exists',
61
70
  iamMember.project.id,
62
71
  iamMember.member.name,
63
- (<any>iamMember.member).identifier
72
+ applicationIdentifier
64
73
  );
65
74
  } else {
66
- const updatingIdentifier = identifierMap.find(({ id }) => id === iamMember.member.id)?.identifier;
67
- if (typeof updatingIdentifier !== 'string') {
68
- throw new Error(`map not found. ${iamMember.member.name}`);
69
- }
70
75
  console.log(
71
76
  'migrating identifier...',
72
77
  iamMember.project.id,
73
78
  iamMember.member.name,
74
79
  updatingIdentifier
75
80
  );
76
- // await memberRepo.updateByMemberId({
77
- // project: { id: iamMember.project.id },
78
- // member: {
79
- // id: iamMember.member.id,
80
- // memberOf: iamMember.member.memberOf,
81
- // identifier: updatingIdentifier
82
- // },
83
- // $unset: {}
84
- // });
81
+ await memberRepo.updateByMemberId({
82
+ project: { id: iamMember.project.id },
83
+ member: {
84
+ id: iamMember.member.id,
85
+ memberOf: iamMember.member.memberOf,
86
+ identifier: updatingIdentifier
87
+ },
88
+ $unset: {}
89
+ });
85
90
  updated += 1;
86
91
  }
87
92
  });
@@ -11,8 +11,8 @@ mongoose.Model.on('index', (...args) => {
11
11
  async function main() {
12
12
  await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });
13
13
 
14
- await chevre.repository.CategoryCode.createInstance(mongoose.connection);
15
- // await chevre.repository.MovieTicketType.createInstance(mongoose.connection);
14
+ await chevre.repository.EventOffer.createInstance(mongoose.connection);
15
+ await chevre.repository.Member.createInstance(mongoose.connection);
16
16
  console.log('success!');
17
17
  }
18
18
 
@@ -44,41 +44,45 @@ const schemaOptions = {
44
44
  }
45
45
  };
46
46
  const indexes = [
47
- // [
48
- // { validFrom: 1 },
49
- // { name: 'validFrom' }
50
- // ],
51
- // [
52
- // {
53
- // 'project.id': 1,
54
- // 'itemOffered.id': 1,
55
- // identifier: 1
56
- // },
57
- // {
58
- // name: 'uniqueByItemOfferedAndIdentifier',
59
- // unique: true
60
- // }
61
- // ],
62
- // [
63
- // { 'project.id': 1, validFrom: 1 },
64
- // { name: 'projectId' }
65
- // ],
66
- // [
67
- // { identifier: 1, validFrom: 1 },
68
- // { name: 'identifier' }
69
- // ],
70
- // [
71
- // { 'itemOffered.id': 1, validFrom: 1 },
72
- // { name: 'itemOfferedId' }
73
- // ],
74
- // [
75
- // { 'seller.id': 1, validFrom: 1 },
76
- // { name: 'sellerId' }
77
- // ],
78
- // [
79
- // { validThrough: 1, validFrom: 1 },
80
- // { name: 'validThrough' }
81
- // ]
47
+ [
48
+ { validFrom: 1 },
49
+ { name: 'validFrom' }
50
+ ],
51
+ [
52
+ { validThrough: 1, validFrom: 1 },
53
+ { name: 'validThrough' }
54
+ ],
55
+ [
56
+ {
57
+ 'project.id': 1,
58
+ 'itemOffered.id': 1,
59
+ identifier: 1
60
+ },
61
+ {
62
+ name: 'uniqueByItemOfferedAndIdentifier',
63
+ unique: true
64
+ }
65
+ ],
66
+ [
67
+ { 'project.id': 1, validFrom: 1 },
68
+ { name: 'projectId' }
69
+ ],
70
+ [
71
+ { 'seller.id': 1, validFrom: 1 },
72
+ { name: 'sellerId' }
73
+ ],
74
+ [
75
+ { identifier: 1, validFrom: 1 },
76
+ { name: 'identifier' }
77
+ ],
78
+ [
79
+ { 'itemOffered.id': 1, validFrom: 1 },
80
+ { name: 'itemOfferedId' }
81
+ ],
82
+ [
83
+ { 'availableAtOrFrom.identifier': 1, validFrom: 1 },
84
+ { name: 'availableAtOrFrom' }
85
+ ]
82
86
  ];
83
87
  exports.indexes = indexes;
84
88
  /**
@@ -61,6 +61,16 @@ const indexes = [
61
61
  }
62
62
  }
63
63
  ],
64
+ [
65
+ { 'project.id': 1, 'member.identifier': 1 }, // アプリケーションコード追加(2025-11-17~)
66
+ {
67
+ name: 'uniqueByMemberIdentifier',
68
+ unique: true,
69
+ partialFilterExpression: {
70
+ 'member.identifier': { $exists: true }
71
+ }
72
+ }
73
+ ],
64
74
  [
65
75
  { 'project.id': 1, 'member.id': 1, 'member.memberOf.id': 1 },
66
76
  {
@@ -2,6 +2,7 @@ import * as factory from '../../../factory';
2
2
  import { Settings } from '../../../settings';
3
3
  import type { AdvanceBookingRequirementRepo } from '../../../repo/advanceBookingRequirement';
4
4
  import type { AssetTransactionRepo } from '../../../repo/assetTransaction';
5
+ import type { AuthorizationRepo } from '../../../repo/authorization';
5
6
  import type { EventRepo } from '../../../repo/event';
6
7
  import type { EventOfferRepo } from '../../../repo/eventOffer';
7
8
  import type { EventSeriesRepo } from '../../../repo/eventSeries';
@@ -21,8 +22,10 @@ import type { OfferRateLimitRepo } from '../../../repo/rateLimit/offer';
21
22
  import type { SettingRepo } from '../../../repo/setting';
22
23
  import type { StockHolderRepo } from '../../../repo/stockHolder';
23
24
  import type { TaskRepo } from '../../../repo/task';
25
+ import type { TicketRepo } from '../../../repo/ticket';
24
26
  interface IStartOperationRepos {
25
27
  advanceBookingRequirement: AdvanceBookingRequirementRepo;
28
+ authorization: AuthorizationRepo;
26
29
  stockHolder: StockHolderRepo;
27
30
  event: EventRepo;
28
31
  eventOffer: EventOfferRepo;
@@ -42,6 +45,7 @@ interface IStartOperationRepos {
42
45
  seat: SeatRepo;
43
46
  setting: SettingRepo;
44
47
  task: TaskRepo;
48
+ ticket: TicketRepo;
45
49
  assetTransaction: AssetTransactionRepo;
46
50
  }
47
51
  type IStartOperation<T> = (repos: IStartOperationRepos, settings: Settings) => Promise<T>;
@@ -41,17 +41,20 @@ function start(params, options) {
41
41
  // validationを承認アクション開始前から移行(2023-01-27~)
42
42
  yield (0, validateStartRequest_1.validateStartRequest)({
43
43
  object: params.object,
44
+ instrument: params.instrument,
44
45
  event,
45
46
  validateEventOfferPeriod: params.validateEventOfferPeriod,
46
47
  validateEvent: params.validateEvent,
47
48
  now,
48
49
  store: { id: (_a = params.availableAtOrFrom) === null || _a === void 0 ? void 0 : _a.id }
49
50
  })({
51
+ authorization: repos.authorization,
50
52
  eventOffer: repos.eventOffer,
51
53
  issuer: repos.issuer,
52
54
  member: repos.member,
53
55
  memberProgram: repos.memberProgram,
54
- productOffer: repos.productOffer
56
+ productOffer: repos.productOffer,
57
+ ticket: repos.ticket
55
58
  });
56
59
  // objectに必要な情報をそろえる
57
60
  const { acceptedOffers4transactionObject, objectSubReservations } = yield createObjectAttributes({
@@ -15,6 +15,7 @@ declare function fixExtendedEventOffer(params: {
15
15
  id: string;
16
16
  };
17
17
  object: factory.assetTransaction.reserve.IObjectWithoutDetail;
18
+ acceptedEventOffer?: factory.authorization.IOfferAsObject;
18
19
  }): (repos: {
19
20
  eventOffer: EventOfferRepo;
20
21
  member: MemberRepo;
@@ -17,11 +17,11 @@ const factory = require("../../../../factory");
17
17
  */
18
18
  function fixExtendedEventOffer(params) {
19
19
  return (repos) => __awaiter(this, void 0, void 0, function* () {
20
- var _a, _b;
20
+ var _a;
21
21
  const { event, availableAt } = params;
22
22
  const acceptedDate = moment(params.now);
23
23
  // リクエストによるオファーコード指定が必須
24
- const eventOfferIdentifierMustBe = (_b = (_a = params.object.reservationFor) === null || _a === void 0 ? void 0 : _a.offers) === null || _b === void 0 ? void 0 : _b.identifier;
24
+ const eventOfferIdentifierMustBe = (_a = params.acceptedEventOffer) === null || _a === void 0 ? void 0 : _a.identifier;
25
25
  if (typeof eventOfferIdentifierMustBe !== 'string' || eventOfferIdentifierMustBe === '') {
26
26
  throw new factory.errors.ArgumentNull('reservationFor.offers.identifier');
27
27
  }
@@ -9,6 +9,7 @@ declare function validateIssuedOfferIfExists(params: {
9
9
  now: Date;
10
10
  object: factory.assetTransaction.reserve.IObjectWithoutDetail;
11
11
  eventOffer: Pick<factory.eventOffer.IEventOffer, 'identifier' | 'itemOffered' | 'offeredBy' | 'validFrom' | 'validThrough'>;
12
+ acceptedEventOffer?: factory.authorization.IOfferAsObject;
12
13
  }): (repos: {
13
14
  issuer: IssuerRepo;
14
15
  }) => Promise<void>;
@@ -114,14 +114,14 @@ function validateOfferToken(params) {
114
114
  */
115
115
  function validateIssuedOfferIfExists(params) {
116
116
  return (repos) => __awaiter(this, void 0, void 0, function* () {
117
- var _a, _b, _c, _d, _e;
117
+ var _a, _b, _c;
118
118
  const { event, eventOffer } = params;
119
119
  const acceptedDate = moment(params.now);
120
120
  const offerTokenIssuer = (_a = eventOffer.offeredBy) === null || _a === void 0 ? void 0 : _a.identifier;
121
121
  const offerTokenRequired = typeof offerTokenIssuer === 'string';
122
122
  if (offerTokenRequired) {
123
- const offerIdentifierMustBe = (_c = (_b = params.object.reservationFor) === null || _b === void 0 ? void 0 : _b.offers) === null || _c === void 0 ? void 0 : _c.identifier;
124
- const offerToken = (_e = (_d = params.object.reservationFor) === null || _d === void 0 ? void 0 : _d.offers) === null || _e === void 0 ? void 0 : _e.token;
123
+ const offerIdentifierMustBe = (_b = params.acceptedEventOffer) === null || _b === void 0 ? void 0 : _b.identifier;
124
+ const offerToken = (_c = params.acceptedEventOffer) === null || _c === void 0 ? void 0 : _c.token;
125
125
  if (typeof offerIdentifierMustBe !== 'string' || offerIdentifierMustBe === '') {
126
126
  throw new factory.errors.ArgumentNull('object.reservationFor.offers.identifier');
127
127
  }
@@ -8,6 +8,7 @@ declare function validateMemberTierIfExists(params: {
8
8
  now: Date;
9
9
  object: factory.assetTransaction.reserve.IObjectWithoutDetail;
10
10
  makesOfferOnApplication: factory.event.screeningEvent.ISellerMakesOffer;
11
+ acceptedEventOffer?: factory.authorization.IOfferAsObject;
11
12
  }): (repos: {
12
13
  issuer: IssuerRepo;
13
14
  memberProgram: MemberProgramRepo;
@@ -101,7 +101,7 @@ function verifyMemberTierToken(params) {
101
101
  function validateMemberTierIfExists(params) {
102
102
  // tslint:disable-next-line:cyclomatic-complexity max-func-body-length
103
103
  return (repos) => __awaiter(this, void 0, void 0, function* () {
104
- var _a, _b, _c, _d;
104
+ var _a, _b, _c;
105
105
  const { event, makesOfferOnApplication } = params;
106
106
  const acceptedDate = moment(params.now);
107
107
  const eventOffers = event.offers;
@@ -109,9 +109,9 @@ function validateMemberTierIfExists(params) {
109
109
  // support validForMemberTier(2025-05-14~)
110
110
  const validForMemberTierExists = ((_a = makesOfferOnApplication.validForMemberTier) === null || _a === void 0 ? void 0 : _a.typeOf) === 'MemberProgramTier';
111
111
  if (validForMemberTierExists) {
112
- const tokenizedMemberProgramTier = (_c = (_b = params.object.reservationFor) === null || _b === void 0 ? void 0 : _b.offers) === null || _c === void 0 ? void 0 : _c.validForMemberTier;
112
+ const tokenizedMemberProgramTier = (_b = params.acceptedEventOffer) === null || _b === void 0 ? void 0 : _b.validForMemberTier;
113
113
  const validForMemberTierToken = tokenizedMemberProgramTier === null || tokenizedMemberProgramTier === void 0 ? void 0 : tokenizedMemberProgramTier.token;
114
- const memberProgramIdentifierMustBe = (_d = tokenizedMemberProgramTier === null || tokenizedMemberProgramTier === void 0 ? void 0 : tokenizedMemberProgramTier.isTierOf) === null || _d === void 0 ? void 0 : _d.identifier;
114
+ const memberProgramIdentifierMustBe = (_c = tokenizedMemberProgramTier === null || tokenizedMemberProgramTier === void 0 ? void 0 : tokenizedMemberProgramTier.isTierOf) === null || _c === void 0 ? void 0 : _c.identifier;
115
115
  // ティアトークンが必須
116
116
  if (typeof validForMemberTierToken !== 'string' || validForMemberTierToken === '') {
117
117
  throw new factory.errors.ArgumentNull('reservationFor.offers.validForMemberTier.token');
@@ -0,0 +1,23 @@
1
+ import * as factory from '../../../../factory';
2
+ import { IMinimizedIndividualEvent } from '../../../../factory/event';
3
+ import type { AuthorizationRepo } from '../../../../repo/authorization';
4
+ import type { TicketRepo } from '../../../../repo/ticket';
5
+ type IPermitOrInvoice = Pick<factory.ownershipInfo.IPermitAsGood, 'identifier' | 'typeOf'> | Pick<factory.invoice.IInvoice, 'paymentMethodId' | 'typeOf'>;
6
+ declare function verifyTicketTokenAsNeeded(params: {
7
+ event: Pick<IMinimizedIndividualEvent, 'offers' | 'id' | 'project' | 'identifier'>;
8
+ now: Date;
9
+ availableAt: {
10
+ /**
11
+ * 販売アプリケーションID
12
+ */
13
+ id: string;
14
+ };
15
+ object: factory.assetTransaction.reserve.IObjectWithoutDetail;
16
+ instrument: factory.assetTransaction.reserve.IInstrument[];
17
+ }): (repos: {
18
+ authorization: AuthorizationRepo;
19
+ ticket: TicketRepo;
20
+ }) => Promise<{
21
+ acceptedEventOffer?: factory.authorization.IOfferAsObject;
22
+ }>;
23
+ export { IPermitOrInvoice, verifyTicketTokenAsNeeded };
@@ -0,0 +1,64 @@
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.verifyTicketTokenAsNeeded = verifyTicketTokenAsNeeded;
13
+ const factory = require("../../../../factory");
14
+ // tslint:disable-next-line:max-func-body-length
15
+ function verifyTicketTokenAsNeeded(params) {
16
+ // tslint:disable-next-line:cyclomatic-complexity
17
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
18
+ var _a, _b, _c;
19
+ const { instrument, event } = params;
20
+ let acceptedEventOffer;
21
+ // 興行オファーチケットが指定された場合、オファーへ変換する
22
+ const ticketToken = (_a = instrument.find((eachInstrument) => eachInstrument.typeOf === 'Ticket')) === null || _a === void 0 ? void 0 : _a.ticketToken;
23
+ if (typeof ticketToken === 'string' && ticketToken !== '') {
24
+ const placeOrderIdByInstrument = (_b = instrument.find((eachInstrument) => eachInstrument.typeOf === factory.transactionType.PlaceOrder)) === null || _b === void 0 ? void 0 : _b.id;
25
+ if (typeof placeOrderIdByInstrument !== 'string' || placeOrderIdByInstrument === '') {
26
+ throw new factory.errors.NotFound('instrument as placeOrder');
27
+ }
28
+ const ticket = (yield repos.ticket.projectFields({
29
+ limit: 1,
30
+ page: 1,
31
+ project: { id: { $eq: event.project.id } },
32
+ ticketToken: { $eq: ticketToken }
33
+ }, ['ticketToken'])).shift();
34
+ if (ticket === undefined) {
35
+ throw new factory.errors.NotFound('Ticket');
36
+ }
37
+ // 承認を参照
38
+ const validAuthorization = yield repos.authorization.findValidOneByCode({
39
+ project: { id: event.project.id },
40
+ code: ticket.ticketToken
41
+ });
42
+ const authorizedObject = validAuthorization.object;
43
+ // audience検証
44
+ if (((_c = validAuthorization.audience) === null || _c === void 0 ? void 0 : _c.typeOf) !== factory.transactionType.PlaceOrder
45
+ || validAuthorization.audience.id !== placeOrderIdByInstrument) {
46
+ throw new factory.errors.Argument('ticketToken', 'audience not matched with placeOrder');
47
+ }
48
+ if (authorizedObject.typeOf === factory.offerType.Offer) {
49
+ // tslint:disable-next-line:no-suspicious-comment
50
+ // TODO イベントIDを検証
51
+ // if (typeOfGood.typeOf !== factory.service.paymentService.PaymentServiceType.FaceToFace) {
52
+ // if (typeOfGood.id !== issuedThrough.id) {
53
+ // throw new factory.errors.Argument('ticketToken', 'issuedThrough.id not matched');
54
+ // }
55
+ // }
56
+ acceptedEventOffer = authorizedObject;
57
+ }
58
+ else {
59
+ throw new factory.errors.Argument('ticketToken', 'must be Offer');
60
+ }
61
+ }
62
+ return { acceptedEventOffer };
63
+ });
64
+ }
@@ -1,12 +1,15 @@
1
1
  import * as factory from '../../../factory';
2
2
  import { IMinimizedIndividualEvent } from '../../../factory/event';
3
+ import type { AuthorizationRepo } from '../../../repo/authorization';
3
4
  import type { EventOfferRepo } from '../../../repo/eventOffer';
4
5
  import type { IssuerRepo } from '../../../repo/issuer';
5
6
  import type { MemberRepo } from '../../../repo/member';
6
7
  import type { MemberProgramRepo } from '../../../repo/memberProgram';
7
8
  import type { ProductOfferRepo } from '../../../repo/productOffer';
9
+ import type { TicketRepo } from '../../../repo/ticket';
8
10
  declare function validateStartRequest(params: {
9
11
  object: factory.assetTransaction.reserve.IObjectWithoutDetail;
12
+ instrument: factory.assetTransaction.reserve.IInstrument[];
10
13
  event: Pick<IMinimizedIndividualEvent, 'offers' | 'id' | 'project' | 'identifier'>;
11
14
  /**
12
15
  * アプリケーションごとのオファーを検証するかどうか
@@ -21,10 +24,12 @@ declare function validateStartRequest(params: {
21
24
  id?: string;
22
25
  };
23
26
  }): (repos: {
27
+ authorization: AuthorizationRepo;
24
28
  eventOffer: EventOfferRepo;
25
29
  issuer: IssuerRepo;
26
30
  member: MemberRepo;
27
31
  memberProgram: MemberProgramRepo;
28
32
  productOffer: ProductOfferRepo;
33
+ ticket: TicketRepo;
29
34
  }) => Promise<void>;
30
35
  export { validateStartRequest };
@@ -15,6 +15,7 @@ const factory = require("../../../factory");
15
15
  const fixExtendedEventOffer_1 = require("./validateStartRequest/fixExtendedEventOffer");
16
16
  const validateIssuedOfferIfExists_1 = require("./validateStartRequest/validateIssuedOfferIfExists");
17
17
  const validateMemberTierIfExists_1 = require("./validateStartRequest/validateMemberTierIfExists");
18
+ const verifyTicketTokenAsNeeded_1 = require("./validateStartRequest/verifyTicketTokenAsNeeded");
18
19
  function validateStartRequest(params) {
19
20
  return (repos) => __awaiter(this, void 0, void 0, function* () {
20
21
  var _a;
@@ -24,11 +25,20 @@ function validateStartRequest(params) {
24
25
  if (typeof ((_a = params.store) === null || _a === void 0 ? void 0 : _a.id) !== 'string') {
25
26
  throw new factory.errors.NotFound('store.id');
26
27
  }
28
+ // ticketTokenから、acceptedEventOfferを生成(2025-11-18~)
29
+ const { acceptedEventOffer } = yield (0, verifyTicketTokenAsNeeded_1.verifyTicketTokenAsNeeded)({
30
+ event,
31
+ now,
32
+ availableAt: { id: params.store.id },
33
+ object: params.object,
34
+ instrument: params.instrument
35
+ })(repos);
27
36
  yield validateApplicationOffer({
28
37
  event,
29
38
  now,
30
39
  availableAt: { id: params.store.id },
31
- object: params.object
40
+ object: params.object,
41
+ acceptedEventOffer
32
42
  })(repos);
33
43
  }
34
44
  if (params.validateEvent === true) {
@@ -41,7 +51,7 @@ function validateStartRequest(params) {
41
51
  */
42
52
  function validateApplicationOffer(params) {
43
53
  return (repos) => __awaiter(this, void 0, void 0, function* () {
44
- const { event, availableAt } = params;
54
+ const { event, availableAt, acceptedEventOffer } = params;
45
55
  const acceptedDate = moment(params.now);
46
56
  const eventOffers = event.offers;
47
57
  // アプリケーションごとの設定を参照する(2022-11-19~)
@@ -76,7 +86,8 @@ function validateApplicationOffer(params) {
76
86
  event,
77
87
  now: params.now,
78
88
  object: params.object,
79
- eventOffer: existingEventOffer
89
+ eventOffer: existingEventOffer,
90
+ acceptedEventOffer
80
91
  })(repos);
81
92
  }
82
93
  else {
@@ -86,7 +97,8 @@ function validateApplicationOffer(params) {
86
97
  event,
87
98
  now: params.now,
88
99
  object: params.object,
89
- makesOfferOnApplication
100
+ makesOfferOnApplication,
101
+ acceptedEventOffer
90
102
  })(repos);
91
103
  }
92
104
  });
@@ -7,10 +7,6 @@ declare function createReserveTransactionStartParams(params: {
7
7
  acceptedOffers: factory.assetTransaction.reserve.IAcceptedTicketOfferWithoutDetail[];
8
8
  event: {
9
9
  id: string;
10
- offers?: {
11
- validForMemberTier?: factory.assetTransaction.reserve.ITokenizedMemberProgramTier;
12
- identifier?: string;
13
- };
14
10
  };
15
11
  broker?: factory.reservation.IBroker<factory.reservationType>;
16
12
  transaction: Pick<factory.transaction.ITransaction<factory.transactionType.PlaceOrder>, 'expires' | 'seller'>;
@@ -8,7 +8,7 @@ exports.responseBody2acceptedOffers4result = responseBody2acceptedOffers4result;
8
8
  const moment = require("moment");
9
9
  const factory = require("../../../../factory");
10
10
  function createReserveTransactionStartParams(params) {
11
- var _a, _b, _c;
11
+ var _a;
12
12
  const { transaction, transactionNumber } = params;
13
13
  const { seller } = transaction;
14
14
  const acceptedTicketOffersWithoutDetail = (Array.isArray(params.acceptedOffers))
@@ -48,11 +48,8 @@ function createReserveTransactionStartParams(params) {
48
48
  // }
49
49
  // ]
50
50
  };
51
- const validForMemberTier = (_b = params.event.offers) === null || _b === void 0 ? void 0 : _b.validForMemberTier;
52
- const eventOfferIdentifier = (_c = params.event.offers) === null || _c === void 0 ? void 0 : _c.identifier;
53
51
  const object = Object.assign({ acceptedOffer: acceptedTicketOffersWithoutDetail, reservationFor: {
54
- id: params.event.id,
55
- offers: Object.assign(Object.assign({}, (typeof (validForMemberTier === null || validForMemberTier === void 0 ? void 0 : validForMemberTier.token) === 'string') ? { validForMemberTier } : undefined), (typeof eventOfferIdentifier === 'string') ? { identifier: eventOfferIdentifier } : undefined)
52
+ id: params.event.id
56
53
  } }, (params.broker !== undefined) ? { broker: params.broker } : undefined);
57
54
  return {
58
55
  project: { typeOf: factory.organizationType.Project, id: params.project.id },
@@ -44,6 +44,7 @@ declare function processStartReserve4chevre(params: {
44
44
  validateEventOfferPeriod: boolean;
45
45
  validateEvent: boolean;
46
46
  orderNumber: string;
47
+ instrument: factory.action.reserve.ITicketAsInstrument[];
47
48
  }, options: {
48
49
  /**
49
50
  * 最大n日前から予約可能
@@ -20,19 +20,13 @@ function processStartReserve4chevre(params, options) {
20
20
  // jwt: JWTCredentials;
21
21
  // }
22
22
  ) => __awaiter(this, void 0, void 0, function* () {
23
- var _a, _b, _c;
24
23
  const { event, transaction, transactionNumber } = params;
25
24
  let acceptedOffers4result = [];
26
25
  // 予約取引開始
27
26
  const startParams = (0, factory_1.createReserveTransactionStartParams)(Object.assign({ project: transaction.project,
28
27
  // object: <IObjectWithDetail>action.object,
29
28
  acceptedOffers: params.acceptedOffers, event: {
30
- id: event.id,
31
- offers: Object.assign(Object.assign({}, (typeof ((_b = (_a = event.offers) === null || _a === void 0 ? void 0 : _a.validForMemberTier) === null || _b === void 0 ? void 0 : _b.token) === 'string')
32
- ? { validForMemberTier: event.offers.validForMemberTier }
33
- : undefined), (typeof ((_c = event.offers) === null || _c === void 0 ? void 0 : _c.identifier) === 'string')
34
- ? { identifier: event.offers.identifier }
35
- : undefined)
29
+ id: event.id
36
30
  }, transaction,
37
31
  transactionNumber }, (params.broker !== undefined) ? { broker: params.broker } : undefined));
38
32
  const startParamObject = yield validateObjectWithoutDetail(startParams, { id: params.transaction.id })(repos);
@@ -40,6 +34,7 @@ function processStartReserve4chevre(params, options) {
40
34
  // discontinue preSearchedEvent(2024-07-17~)
41
35
  // preSearchedEvent: event,
42
36
  preSearchedTicketOffers: params.ticketOffers, preSearchedUnitPriceOffers: params.unitPriceOffers, availableAtOrFrom: { id: params.availableAtOrFrom.id }, validateEvent: params.validateEvent, validateEventOfferPeriod: params.validateEventOfferPeriod, validateAppliesToMovieTicket: true, instrument: [
37
+ ...params.instrument, // support Ticket(2025-11-18~)
43
38
  { orderNumber: params.orderNumber, typeOf: factory.order.OrderType.Order },
44
39
  { id: transaction.id, typeOf: transaction.typeOf }
45
40
  ] }), options)(repos, settings);
@@ -80,6 +80,7 @@ declare function authorize(params: {
80
80
  typeOf: factory.organizationType.Project;
81
81
  };
82
82
  object: IObjectWithoutDetail;
83
+ instrument: factory.action.reserve.ITicketAsInstrument[];
83
84
  agent: {
84
85
  id: string;
85
86
  };
@@ -53,7 +53,7 @@ function authorize(params, options) {
53
53
  const action = yield repos.action.start(actionAttributes);
54
54
  try {
55
55
  const processStartReserveResult = yield (0, processStartReserve4chevre_1.processStartReserve4chevre)(Object.assign({ acceptedOffers, event,
56
- transactionNumber, transaction, availableAtOrFrom: { id: params.store.id }, ticketOffers, unitPriceOffers, validateEvent: params.validateEvent === true, validateEventOfferPeriod: params.validateEventOfferPeriod === true, orderNumber }, (typeof ((_a = params.object.broker) === null || _a === void 0 ? void 0 : _a.typeOf) === 'string') ? { broker: params.object.broker } : undefined), options)(repos, settings);
56
+ transactionNumber, transaction, availableAtOrFrom: { id: params.store.id }, ticketOffers, unitPriceOffers, validateEvent: params.validateEvent === true, validateEventOfferPeriod: params.validateEventOfferPeriod === true, orderNumber, instrument: params.instrument }, (typeof ((_a = params.object.broker) === null || _a === void 0 ? void 0 : _a.typeOf) === 'string') ? { broker: params.object.broker } : undefined), options)(repos, settings);
57
57
  acceptedOffers4result = processStartReserveResult.acceptedOffers4result;
58
58
  // add orderInTransaction(2024-01-15~)
59
59
  if (!noOfferSpecified) {
@@ -82,7 +82,7 @@ function authorize(params, options) {
82
82
  }
83
83
  function validateCreateRequest(params) {
84
84
  return (repos) => __awaiter(this, void 0, void 0, function* () {
85
- var _a, _b, _c, _d;
85
+ var _a, _b;
86
86
  const transaction = yield repos.transaction.projectFieldsInProgressById({
87
87
  typeOf: factory.transactionType.PlaceOrder,
88
88
  id: params.transaction.id
@@ -98,13 +98,13 @@ function validateCreateRequest(params) {
98
98
  if (typeof ((_b = params.object.reservationFor) === null || _b === void 0 ? void 0 : _b.id) !== 'string' || params.object.reservationFor.id.length === 0) {
99
99
  throw new factory.errors.ArgumentNull('object.reservationFor.id');
100
100
  }
101
- // support validForMemberTier(2025-05-14~)
102
- const validForMemberTier = (_c = params.object.reservationFor.offers) === null || _c === void 0 ? void 0 : _c.validForMemberTier;
103
- const eventOfferIdentifier = (_d = params.object.reservationFor.offers) === null || _d === void 0 ? void 0 : _d.identifier;
104
101
  const event = {
105
102
  id: params.object.reservationFor.id,
106
- typeOf: factory.eventType.ScreeningEvent, // ひとまずfix(2024-07-17~)
107
- offers: Object.assign(Object.assign({}, (typeof (validForMemberTier === null || validForMemberTier === void 0 ? void 0 : validForMemberTier.token) === 'string') ? { validForMemberTier } : undefined), (typeof eventOfferIdentifier === 'string') ? { identifier: eventOfferIdentifier } : undefined)
103
+ typeOf: factory.eventType.ScreeningEvent // ひとまずfix(2024-07-17~)
104
+ // offers: {
105
+ // ...(typeof validForMemberTier?.token === 'string') ? { validForMemberTier } : undefined,
106
+ // ...(typeof eventOfferIdentifier === 'string') ? { identifier: eventOfferIdentifier } : undefined
107
+ // }
108
108
  };
109
109
  return { transaction, event };
110
110
  });
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": "5.2.0-alpha.11",
15
- "@cinerino/sdk": "12.7.0-alpha.4",
14
+ "@chevre/factory": "5.2.0-alpha.12",
15
+ "@cinerino/sdk": "12.8.0-alpha.2",
16
16
  "@motionpicture/coa-service": "9.6.0",
17
17
  "@motionpicture/gmo-service": "5.4.0-alpha.1",
18
18
  "@sendgrid/client": "8.1.4",
@@ -115,5 +115,5 @@
115
115
  "postversion": "git push origin --tags",
116
116
  "prepublishOnly": "npm run clean && npm run build && npm test && npm run doc"
117
117
  },
118
- "version": "23.1.0-alpha.8"
118
+ "version": "23.1.0-alpha.9"
119
119
  }