@chevre/domain 23.1.0-alpha.2 → 23.1.0-alpha.21
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.
- package/example/src/chevre/assetTransaction/processReserve.ts +8 -3
- package/example/src/chevre/authorizeEventServiceOffer.ts +7 -5
- package/example/src/chevre/eventOffer/adminEventOffers.ts +67 -0
- package/example/src/chevre/eventOffer/publishEventOfferToken.ts +98 -0
- package/example/src/chevre/member/migrateMemberIdentifier.ts +99 -0
- package/example/src/chevre/project/unsetProjectSettings.ts +73 -0
- package/example/src/chevre/reIndex.ts +2 -2
- package/example/src/chevre/roles/{addAdminSellerEventIfNotExists.ts → addAdminSellerEventOfferIfNotExists.ts} +1 -1
- package/lib/chevre/repo/authorization.d.ts +3 -2
- package/lib/chevre/repo/authorization.js +13 -5
- package/lib/chevre/repo/event.d.ts +2 -1
- package/lib/chevre/repo/event.js +4 -4
- package/lib/chevre/repo/eventOffer.d.ts +1 -1
- package/lib/chevre/repo/eventOffer.js +14 -8
- package/lib/chevre/repo/member.d.ts +18 -1
- package/lib/chevre/repo/member.js +14 -8
- package/lib/chevre/repo/mongoose/schemas/eventOffer.js +39 -35
- package/lib/chevre/repo/mongoose/schemas/member.js +10 -0
- package/lib/chevre/service/assetTransaction/pay/factory.d.ts +1 -1
- package/lib/chevre/service/assetTransaction/pay/factory.js +8 -3
- package/lib/chevre/service/assetTransaction/pay.d.ts +2 -1
- package/lib/chevre/service/assetTransaction/pay.js +1 -1
- package/lib/chevre/service/assetTransaction/reserve/start.d.ts +6 -0
- package/lib/chevre/service/assetTransaction/reserve/start.js +5 -1
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/fixExtendedEventOffer.d.ts +22 -0
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/fixExtendedEventOffer.js +63 -0
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateIssuedOfferIfExists.d.ts +7 -2
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateIssuedOfferIfExists.js +32 -32
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateMemberTierIfExists.d.ts +1 -1
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateMemberTierIfExists.js +10 -54
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/verifyTicketTokenAsNeeded.d.ts +23 -0
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/verifyTicketTokenAsNeeded.js +62 -0
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest.d.ts +36 -1
- package/lib/chevre/service/assetTransaction/reserve/validateStartRequest.js +23 -27
- package/lib/chevre/service/offer/event/authorize/factory.d.ts +0 -3
- package/lib/chevre/service/offer/event/authorize/factory.js +4 -3
- package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre/requestedProgramMembershipUsed2permit.js +42 -25
- package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre.d.ts +4 -0
- package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre.js +4 -4
- package/lib/chevre/service/offer/event/authorize.d.ts +3 -0
- package/lib/chevre/service/offer/event/authorize.js +10 -5
- package/lib/chevre/service/offer/event/issueEventOfferTicket.d.ts +48 -0
- package/lib/chevre/service/offer/event/issueEventOfferTicket.js +123 -0
- package/lib/chevre/service/offer/event.d.ts +2 -1
- package/lib/chevre/service/offer/event.js +3 -1
- package/lib/chevre/service/payment/any/authorize/fixTransactionNumber.d.ts +9 -0
- package/lib/chevre/service/payment/any/authorize/fixTransactionNumber.js +22 -11
- package/lib/chevre/service/payment/any/authorize/handlePrePublishedPaymentMethodIdOnAuthorizing.d.ts +19 -2
- package/lib/chevre/service/payment/any/authorize/handlePrePublishedPaymentMethodIdOnAuthorizing.js +87 -9
- package/lib/chevre/service/payment/any/factory.d.ts +20 -3
- package/lib/chevre/service/payment/any/factory.js +26 -6
- package/lib/chevre/service/payment/any/publishPaymentUrl/fixTransactionNumberOnPublishPaymentUrl.d.ts +4 -0
- package/lib/chevre/service/payment/any/publishPaymentUrl/fixTransactionNumberOnPublishPaymentUrl.js +15 -11
- package/lib/chevre/service/payment/any/verifyTicketTokenAsNeeded.d.ts +6 -3
- package/lib/chevre/service/payment/any/verifyTicketTokenAsNeeded.js +19 -27
- package/lib/chevre/service/payment/any.d.ts +1 -1
- package/lib/chevre/service/payment/any.js +22 -13
- package/lib/chevre/service/payment/factory.js +0 -5
- package/lib/chevre/service/payment/movieTicket/authorize.js +0 -5
- package/lib/chevre/service/transaction/placeOrder/confirm/publishCode.js +1 -1
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/factory.d.ts +9 -0
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/factory.js +2 -0
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/validateInvoiceReferencesOrder.d.ts +8 -0
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/validateInvoiceReferencesOrder.js +45 -0
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/validatePrice.d.ts +3 -0
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/validatePrice.js +38 -0
- package/lib/chevre/service/transaction/placeOrder/confirm/validation.d.ts +2 -8
- package/lib/chevre/service/transaction/placeOrder/confirm/validation.js +5 -35
- package/package.json +3 -3
- package/example/src/chevre/upsertManyEventsByAdditionalProperty.ts +0 -193
|
@@ -20,13 +20,13 @@ function validateMemberTier(params) {
|
|
|
20
20
|
const tierIdentifier = (_b = (_a = verifiedValidForMemberTier.member) === null || _a === void 0 ? void 0 : _a.memberOf) === null || _b === void 0 ? void 0 : _b.identifier;
|
|
21
21
|
const memberProgramIdentifier = (_e = (_d = (_c = verifiedValidForMemberTier.member) === null || _c === void 0 ? void 0 : _c.memberOf) === null || _d === void 0 ? void 0 : _d.isTierOf) === null || _e === void 0 ? void 0 : _e.identifier;
|
|
22
22
|
if (typeof tierIdentifier !== 'string') {
|
|
23
|
-
throw new factory.errors.Argument('
|
|
23
|
+
throw new factory.errors.Argument('ticketedOffer.validForMemberTier', 'tier identifier must be string');
|
|
24
24
|
}
|
|
25
25
|
if (typeof memberProgramIdentifier !== 'string') {
|
|
26
|
-
throw new factory.errors.Argument('
|
|
26
|
+
throw new factory.errors.Argument('ticketedOffer.validForMemberTier', 'member program must be string');
|
|
27
27
|
}
|
|
28
28
|
if (memberProgramIdentifier !== memberProgramIdentifierMustBe) {
|
|
29
|
-
throw new factory.errors.Argument('
|
|
29
|
+
throw new factory.errors.Argument('ticketedOffer.validForMemberTier', 'member program not matched');
|
|
30
30
|
}
|
|
31
31
|
const sellerId = event.offers.seller.id;
|
|
32
32
|
if (typeof sellerId !== 'string' || sellerId === '') {
|
|
@@ -47,22 +47,6 @@ function validateMemberTier(params) {
|
|
|
47
47
|
if (productOfferForMemberTier === undefined) {
|
|
48
48
|
throw new factory.errors.NotFound(factory.offerType.Offer, 'valid product offers for member tier not found');
|
|
49
49
|
}
|
|
50
|
-
// let validThroughMoment: moment.Moment;
|
|
51
|
-
// let validFromMoment: moment.Moment;
|
|
52
|
-
// validThroughMoment = moment(productOfferForMemberTier.validThrough, ROLE_DATE_FORMAT, true);
|
|
53
|
-
// validFromMoment = moment(productOfferForMemberTier.validFrom, ROLE_DATE_FORMAT, true);
|
|
54
|
-
// if (acceptedDate.isBefore(validFromMoment)) {
|
|
55
|
-
// throw new factory.errors.Argument(
|
|
56
|
-
// 'reservationFor.offers.validForMemberTier',
|
|
57
|
-
// `the offer id valid from ${validFromMoment}`
|
|
58
|
-
// );
|
|
59
|
-
// }
|
|
60
|
-
// if (acceptedDate.isAfter(validThroughMoment)) {
|
|
61
|
-
// throw new factory.errors.Argument(
|
|
62
|
-
// 'reservationFor.offers.validForMemberTier',
|
|
63
|
-
// `the offer id valid through ${validThroughMoment}`
|
|
64
|
-
// );
|
|
65
|
-
// }
|
|
66
50
|
});
|
|
67
51
|
}
|
|
68
52
|
function verifyMemberTierToken(params) {
|
|
@@ -88,10 +72,10 @@ function verifyMemberTierToken(params) {
|
|
|
88
72
|
catch (error) {
|
|
89
73
|
// JWTエラーをハンドリング
|
|
90
74
|
if (error instanceof jwt.TokenExpiredError) {
|
|
91
|
-
throw new factory.errors.Argument('
|
|
75
|
+
throw new factory.errors.Argument('ticketedOffer.validForMemberTier', `invalid token. [${error.message} expiredAt:${error.expiredAt}]`);
|
|
92
76
|
}
|
|
93
77
|
else if (error instanceof jwt.JsonWebTokenError) {
|
|
94
|
-
throw new factory.errors.Argument('
|
|
78
|
+
throw new factory.errors.Argument('ticketedOffer.validForMemberTier', `invalid token. [${error.message}]`);
|
|
95
79
|
}
|
|
96
80
|
throw error;
|
|
97
81
|
}
|
|
@@ -101,7 +85,7 @@ function verifyMemberTierToken(params) {
|
|
|
101
85
|
function validateMemberTierIfExists(params) {
|
|
102
86
|
// tslint:disable-next-line:cyclomatic-complexity max-func-body-length
|
|
103
87
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
104
|
-
var _a, _b, _c
|
|
88
|
+
var _a, _b, _c;
|
|
105
89
|
const { event, makesOfferOnApplication } = params;
|
|
106
90
|
const acceptedDate = moment(params.now);
|
|
107
91
|
const eventOffers = event.offers;
|
|
@@ -109,16 +93,16 @@ function validateMemberTierIfExists(params) {
|
|
|
109
93
|
// support validForMemberTier(2025-05-14~)
|
|
110
94
|
const validForMemberTierExists = ((_a = makesOfferOnApplication.validForMemberTier) === null || _a === void 0 ? void 0 : _a.typeOf) === 'MemberProgramTier';
|
|
111
95
|
if (validForMemberTierExists) {
|
|
112
|
-
const tokenizedMemberProgramTier = (
|
|
96
|
+
const tokenizedMemberProgramTier = (_b = params.acceptedEventOffer) === null || _b === void 0 ? void 0 : _b.validForMemberTier;
|
|
113
97
|
const validForMemberTierToken = tokenizedMemberProgramTier === null || tokenizedMemberProgramTier === void 0 ? void 0 : tokenizedMemberProgramTier.token;
|
|
114
|
-
const memberProgramIdentifierMustBe = (
|
|
98
|
+
const memberProgramIdentifierMustBe = (_c = tokenizedMemberProgramTier === null || tokenizedMemberProgramTier === void 0 ? void 0 : tokenizedMemberProgramTier.isTierOf) === null || _c === void 0 ? void 0 : _c.identifier;
|
|
115
99
|
// ティアトークンが必須
|
|
116
100
|
if (typeof validForMemberTierToken !== 'string' || validForMemberTierToken === '') {
|
|
117
|
-
throw new factory.errors.ArgumentNull('
|
|
101
|
+
throw new factory.errors.ArgumentNull('ticketedOffer.validForMemberTier.token');
|
|
118
102
|
}
|
|
119
103
|
// メンバープログラムコード指定が必須
|
|
120
104
|
if (typeof memberProgramIdentifierMustBe !== 'string' || memberProgramIdentifierMustBe === '') {
|
|
121
|
-
throw new factory.errors.ArgumentNull('
|
|
105
|
+
throw new factory.errors.ArgumentNull('ticketedOffer.validForMemberTier.isTierOf.identifier');
|
|
122
106
|
}
|
|
123
107
|
// 有効メンバープログラムティアが存在する場合、オファーコレクションコードが必須
|
|
124
108
|
const aggregateOfferIdentifier = eventOffers.identifier;
|
|
@@ -152,33 +136,5 @@ function validateMemberTierIfExists(params) {
|
|
|
152
136
|
memberProgramIdentifierMustBe, aggregateOfferIdentifier
|
|
153
137
|
})(repos);
|
|
154
138
|
}
|
|
155
|
-
// tslint:disable-next-line:no-suspicious-comment
|
|
156
|
-
// TODO オファートークン検証(2025-10-21~)
|
|
157
|
-
// const offerTokenIssuer = makesOfferOnApplication.issuedBy?.identifier;
|
|
158
|
-
// const offerTokenRequired = typeof offerTokenIssuer === 'string';
|
|
159
|
-
// if (offerTokenRequired) {
|
|
160
|
-
// const offerToken = params.object.reservationFor?.offers?.token;
|
|
161
|
-
// if (typeof offerToken !== 'string' || offerToken === '') {
|
|
162
|
-
// throw new factory.errors.ArgumentNull('object.reservationFor.offers.token');
|
|
163
|
-
// }
|
|
164
|
-
// const issuer = await repos.issuer.findByIdentifier({
|
|
165
|
-
// project: { id: params.event.project.id },
|
|
166
|
-
// identifier: offerTokenIssuer
|
|
167
|
-
// });
|
|
168
|
-
// if (typeof issuer.tokenSecret !== 'string' || issuer.tokenSecret === '') {
|
|
169
|
-
// throw new factory.errors.NotFound('issuer.tokenSecret');
|
|
170
|
-
// }
|
|
171
|
-
// const verifiedOffer = await verifyOfferToken({
|
|
172
|
-
// secret: issuer.tokenSecret,
|
|
173
|
-
// issuer: issuer.url,
|
|
174
|
-
// token: offerToken
|
|
175
|
-
// });
|
|
176
|
-
// await validateOfferToken({
|
|
177
|
-
// acceptedDate,
|
|
178
|
-
// verifiedOffer,
|
|
179
|
-
// makesOfferOnApplication,
|
|
180
|
-
// object: params.object
|
|
181
|
-
// })();
|
|
182
|
-
// }
|
|
183
139
|
});
|
|
184
140
|
}
|
|
@@ -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,62 @@
|
|
|
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
|
+
// イベントIDを検証
|
|
50
|
+
const eventIdMustBe = authorizedObject.itemOffered.serviceOutput.reservationFor.id;
|
|
51
|
+
if (eventIdMustBe !== event.id) {
|
|
52
|
+
throw new factory.errors.Argument('ticketToken', 'event.id not matched');
|
|
53
|
+
}
|
|
54
|
+
acceptedEventOffer = authorizedObject;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
throw new factory.errors.Argument('ticketToken', 'must be Offer');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { acceptedEventOffer };
|
|
61
|
+
});
|
|
62
|
+
}
|
|
@@ -1,11 +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';
|
|
6
|
+
import type { MemberRepo } from '../../../repo/member';
|
|
5
7
|
import type { MemberProgramRepo } from '../../../repo/memberProgram';
|
|
6
8
|
import type { ProductOfferRepo } from '../../../repo/productOffer';
|
|
9
|
+
import type { TicketRepo } from '../../../repo/ticket';
|
|
7
10
|
declare function validateStartRequest(params: {
|
|
8
11
|
object: factory.assetTransaction.reserve.IObjectWithoutDetail;
|
|
12
|
+
instrument: factory.assetTransaction.reserve.IInstrument[];
|
|
9
13
|
event: Pick<IMinimizedIndividualEvent, 'offers' | 'id' | 'project' | 'identifier'>;
|
|
10
14
|
/**
|
|
11
15
|
* アプリケーションごとのオファーを検証するかどうか
|
|
@@ -20,9 +24,40 @@ declare function validateStartRequest(params: {
|
|
|
20
24
|
id?: string;
|
|
21
25
|
};
|
|
22
26
|
}): (repos: {
|
|
27
|
+
authorization: AuthorizationRepo;
|
|
23
28
|
eventOffer: EventOfferRepo;
|
|
24
29
|
issuer: IssuerRepo;
|
|
30
|
+
member: MemberRepo;
|
|
25
31
|
memberProgram: MemberProgramRepo;
|
|
26
32
|
productOffer: ProductOfferRepo;
|
|
33
|
+
ticket: TicketRepo;
|
|
27
34
|
}) => Promise<void>;
|
|
28
|
-
|
|
35
|
+
/**
|
|
36
|
+
* アプリケーションに対して有効なイベントオファーが存在するかどうかを検証する
|
|
37
|
+
*/
|
|
38
|
+
declare function validEventOfferByApplicationExists(params: {
|
|
39
|
+
event: Pick<IMinimizedIndividualEvent, 'offers' | 'id' | 'project' | 'identifier'>;
|
|
40
|
+
now: Date;
|
|
41
|
+
availableAt: {
|
|
42
|
+
/**
|
|
43
|
+
* 販売アプリケーションID
|
|
44
|
+
*/
|
|
45
|
+
id: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* オファー承認時のticketTokenから生成されたイベントオファー
|
|
49
|
+
*/
|
|
50
|
+
acceptedEventOffer?: factory.authorization.IOfferAsObject;
|
|
51
|
+
/**
|
|
52
|
+
* オファー承認時の予約数
|
|
53
|
+
* 0であれば特に何も検証されない
|
|
54
|
+
*/
|
|
55
|
+
numAcceptedOffers: number;
|
|
56
|
+
}): (repos: {
|
|
57
|
+
eventOffer: EventOfferRepo;
|
|
58
|
+
issuer: IssuerRepo;
|
|
59
|
+
member: MemberRepo;
|
|
60
|
+
memberProgram: MemberProgramRepo;
|
|
61
|
+
productOffer: ProductOfferRepo;
|
|
62
|
+
}) => Promise<void>;
|
|
63
|
+
export { validateStartRequest, validEventOfferByApplicationExists };
|
|
@@ -10,10 +10,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.validateStartRequest = validateStartRequest;
|
|
13
|
+
exports.validEventOfferByApplicationExists = validEventOfferByApplicationExists;
|
|
13
14
|
const moment = require("moment");
|
|
14
15
|
const factory = require("../../../factory");
|
|
16
|
+
const fixExtendedEventOffer_1 = require("./validateStartRequest/fixExtendedEventOffer");
|
|
15
17
|
const validateIssuedOfferIfExists_1 = require("./validateStartRequest/validateIssuedOfferIfExists");
|
|
16
18
|
const validateMemberTierIfExists_1 = require("./validateStartRequest/validateMemberTierIfExists");
|
|
19
|
+
const verifyTicketTokenAsNeeded_1 = require("./validateStartRequest/verifyTicketTokenAsNeeded");
|
|
17
20
|
function validateStartRequest(params) {
|
|
18
21
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
19
22
|
var _a;
|
|
@@ -23,11 +26,20 @@ function validateStartRequest(params) {
|
|
|
23
26
|
if (typeof ((_a = params.store) === null || _a === void 0 ? void 0 : _a.id) !== 'string') {
|
|
24
27
|
throw new factory.errors.NotFound('store.id');
|
|
25
28
|
}
|
|
26
|
-
|
|
29
|
+
// ticketTokenから、acceptedEventOfferを生成(2025-11-18~)
|
|
30
|
+
const { acceptedEventOffer } = yield (0, verifyTicketTokenAsNeeded_1.verifyTicketTokenAsNeeded)({
|
|
27
31
|
event,
|
|
28
32
|
now,
|
|
29
33
|
availableAt: { id: params.store.id },
|
|
30
|
-
object: params.object
|
|
34
|
+
object: params.object,
|
|
35
|
+
instrument: params.instrument
|
|
36
|
+
})(repos);
|
|
37
|
+
yield validEventOfferByApplicationExists({
|
|
38
|
+
event,
|
|
39
|
+
now,
|
|
40
|
+
availableAt: { id: params.store.id },
|
|
41
|
+
acceptedEventOffer,
|
|
42
|
+
numAcceptedOffers: (Array.isArray(params.object.acceptedOffer)) ? params.object.acceptedOffer.length : 0
|
|
31
43
|
})(repos);
|
|
32
44
|
}
|
|
33
45
|
if (params.validateEvent === true) {
|
|
@@ -36,12 +48,11 @@ function validateStartRequest(params) {
|
|
|
36
48
|
});
|
|
37
49
|
}
|
|
38
50
|
/**
|
|
39
|
-
*
|
|
51
|
+
* アプリケーションに対して有効なイベントオファーが存在するかどうかを検証する
|
|
40
52
|
*/
|
|
41
|
-
function
|
|
53
|
+
function validEventOfferByApplicationExists(params) {
|
|
42
54
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
43
|
-
|
|
44
|
-
const { event, availableAt } = params;
|
|
55
|
+
const { event, availableAt, acceptedEventOffer, numAcceptedOffers } = params;
|
|
45
56
|
const acceptedDate = moment(params.now);
|
|
46
57
|
const eventOffers = event.offers;
|
|
47
58
|
// アプリケーションごとの設定を参照する(2022-11-19~)
|
|
@@ -70,29 +81,14 @@ function validateApplicationOffer(params) {
|
|
|
70
81
|
}
|
|
71
82
|
// support extensibleEventOffer(2025-11-11~)
|
|
72
83
|
if (eventOffers.typeOf === factory.offerType.AggregateOffer) {
|
|
73
|
-
|
|
74
|
-
const eventOfferIdentifierMustBe = (_b = (_a = params.object.reservationFor) === null || _a === void 0 ? void 0 : _a.offers) === null || _b === void 0 ? void 0 : _b.identifier;
|
|
75
|
-
if (typeof eventOfferIdentifierMustBe !== 'string' || eventOfferIdentifierMustBe === '') {
|
|
76
|
-
throw new factory.errors.ArgumentNull('reservationFor.offers.identifier');
|
|
77
|
-
}
|
|
78
|
-
const existingEventOffer = (yield repos.eventOffer.findEventOffers({
|
|
79
|
-
limit: 1,
|
|
80
|
-
page: 1,
|
|
81
|
-
project: { id: { $eq: event.project.id } }, // プロジェクト
|
|
82
|
-
validFrom: { $lte: acceptedDate.toDate() },
|
|
83
|
-
validThrough: { $gte: acceptedDate.toDate() },
|
|
84
|
-
itemOffered: { id: { $eq: event.id } }, // 対象イベント
|
|
85
|
-
identifier: { $eq: eventOfferIdentifierMustBe } // オファーコード
|
|
86
|
-
}, ['identifier', 'itemOffered', 'offeredBy', 'typeOf', 'validFrom', 'validThrough'])).shift();
|
|
87
|
-
if (existingEventOffer === undefined) {
|
|
88
|
-
throw new factory.errors.NotFound(`eventOffer: ${eventOfferIdentifierMustBe}`);
|
|
89
|
-
}
|
|
84
|
+
const existingEventOffer = yield (0, fixExtendedEventOffer_1.fixExtendedEventOffer)(params)(repos);
|
|
90
85
|
// 拡張可能なオファー設定の場合のみ、オファートークンを検証する(2025-11-11~)
|
|
91
86
|
yield (0, validateIssuedOfferIfExists_1.validateIssuedOfferIfExists)({
|
|
92
87
|
event,
|
|
93
88
|
now: params.now,
|
|
94
|
-
|
|
95
|
-
|
|
89
|
+
eventOffer: existingEventOffer,
|
|
90
|
+
acceptedEventOffer,
|
|
91
|
+
numAcceptedOffers
|
|
96
92
|
})(repos);
|
|
97
93
|
}
|
|
98
94
|
else {
|
|
@@ -101,8 +97,8 @@ function validateApplicationOffer(params) {
|
|
|
101
97
|
yield (0, validateMemberTierIfExists_1.validateMemberTierIfExists)({
|
|
102
98
|
event,
|
|
103
99
|
now: params.now,
|
|
104
|
-
|
|
105
|
-
|
|
100
|
+
makesOfferOnApplication,
|
|
101
|
+
acceptedEventOffer
|
|
106
102
|
})(repos);
|
|
107
103
|
}
|
|
108
104
|
});
|
|
@@ -7,9 +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
|
-
};
|
|
13
10
|
};
|
|
14
11
|
broker?: factory.reservation.IBroker<factory.reservationType>;
|
|
15
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
|
|
11
|
+
var _a;
|
|
12
12
|
const { transaction, transactionNumber } = params;
|
|
13
13
|
const { seller } = transaction;
|
|
14
14
|
const acceptedTicketOffersWithoutDetail = (Array.isArray(params.acceptedOffers))
|
|
@@ -48,8 +48,9 @@ function createReserveTransactionStartParams(params) {
|
|
|
48
48
|
// }
|
|
49
49
|
// ]
|
|
50
50
|
};
|
|
51
|
-
const
|
|
52
|
-
|
|
51
|
+
const object = Object.assign({ acceptedOffer: acceptedTicketOffersWithoutDetail, reservationFor: {
|
|
52
|
+
id: params.event.id
|
|
53
|
+
} }, (params.broker !== undefined) ? { broker: params.broker } : undefined);
|
|
53
54
|
return {
|
|
54
55
|
project: { typeOf: factory.organizationType.Project, id: params.project.id },
|
|
55
56
|
typeOf: factory.assetTransactionType.Reserve,
|
|
@@ -17,7 +17,7 @@ const factory = require("../../../../../factory");
|
|
|
17
17
|
function requestedProgramMembershipUsed2permit(params) {
|
|
18
18
|
// tslint:disable-next-line:cyclomatic-complexity max-func-body-length
|
|
19
19
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
20
|
-
var _a, _b
|
|
20
|
+
var _a, _b;
|
|
21
21
|
let programMembershipUsedAsPermit;
|
|
22
22
|
const { programMembershipUsed, placeOrder } = params;
|
|
23
23
|
// discontinue token as fromLocation(ticketTokenへ移行するべき)(2024-12-18~)
|
|
@@ -51,34 +51,51 @@ function requestedProgramMembershipUsed2permit(params) {
|
|
|
51
51
|
const permitOwnershipInfo = object;
|
|
52
52
|
const ownedGoodType = (_a = permitOwnershipInfo.typeOfGood) === null || _a === void 0 ? void 0 : _a.typeOf;
|
|
53
53
|
if (ownedGoodType === factory.permit.PermitType.Permit) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
54
|
+
// discontinue(2025-11-14~)
|
|
55
|
+
throw new factory.errors.Argument('programMembershipUsed', `ownershipInfo.typeOfGood.typeOf: ${ownedGoodType} discontinued`);
|
|
56
|
+
// const issuedThroughTypeOf = permitOwnershipInfo.typeOfGood.issuedThrough?.typeOf;
|
|
57
|
+
// if (issuedThroughTypeOf === factory.service.paymentService.PaymentServiceType.FaceToFace) {
|
|
58
|
+
// programMembershipUsedAsPermit = {
|
|
59
|
+
// identifier: permitOwnershipInfo.typeOfGood.identifier,
|
|
60
|
+
// issuedThrough: { typeOf: issuedThroughTypeOf },
|
|
61
|
+
// typeOf: factory.permit.PermitType.Permit
|
|
62
|
+
// };
|
|
63
|
+
// } else if (issuedThroughTypeOf === factory.product.ProductType.MembershipService
|
|
64
|
+
// || issuedThroughTypeOf === factory.service.paymentService.PaymentServiceType.CreditCard) {
|
|
65
|
+
// if (typeof permitOwnershipInfo.typeOfGood.issuedThrough?.id !== 'string') {
|
|
66
|
+
// throw new factory.errors.Argument(
|
|
67
|
+
// 'programMembershipUsed',
|
|
68
|
+
// 'ownershipInfo.typeOfGood.issuedThrough.id undefined'
|
|
69
|
+
// );
|
|
70
|
+
// }
|
|
71
|
+
// programMembershipUsedAsPermit = {
|
|
72
|
+
// identifier: permitOwnershipInfo.typeOfGood.identifier,
|
|
73
|
+
// issuedThrough: { id: permitOwnershipInfo.typeOfGood.issuedThrough.id, typeOf: issuedThroughTypeOf },
|
|
74
|
+
// typeOf: factory.permit.PermitType.Permit
|
|
75
|
+
// };
|
|
76
|
+
// } else {
|
|
77
|
+
// throw new factory.errors.Argument(
|
|
78
|
+
// 'programMembershipUsed',
|
|
79
|
+
// `invalid issuedThrough.typeOf: ${issuedThroughTypeOf}`
|
|
80
|
+
// );
|
|
81
|
+
// }
|
|
82
|
+
}
|
|
83
|
+
else if (ownedGoodType === factory.service.paymentService.PaymentServiceType.FaceToFace) {
|
|
84
|
+
const paymentMethodId = permitOwnershipInfo.typeOfGood.serviceOutput.paymentMethodId;
|
|
85
|
+
if (typeof paymentMethodId !== 'string' || paymentMethodId === '') {
|
|
86
|
+
throw new factory.errors.Argument('programMembershipUsed', 'paymentMethodId required');
|
|
75
87
|
}
|
|
88
|
+
programMembershipUsedAsPermit = {
|
|
89
|
+
identifier: paymentMethodId,
|
|
90
|
+
issuedThrough: { typeOf: ownedGoodType },
|
|
91
|
+
typeOf: factory.permit.PermitType.Permit
|
|
92
|
+
};
|
|
76
93
|
}
|
|
77
94
|
else if (ownedGoodType === factory.service.paymentService.PaymentServiceType.CreditCard) {
|
|
78
95
|
// CreditCard決済の場合、決済方法所有権を受け入れる(2025-11-11~)
|
|
79
|
-
const paymentServiceId = (
|
|
96
|
+
const paymentServiceId = (_b = permitOwnershipInfo.typeOfGood) === null || _b === void 0 ? void 0 : _b.id;
|
|
80
97
|
const paymentMethodId = permitOwnershipInfo.typeOfGood.serviceOutput.paymentMethodId;
|
|
81
|
-
if (typeof
|
|
98
|
+
if (typeof paymentServiceId !== 'string' || paymentServiceId === '') {
|
|
82
99
|
throw new factory.errors.Argument('programMembershipUsed', 'paymentServiceId required');
|
|
83
100
|
}
|
|
84
101
|
if (typeof paymentMethodId !== 'string' || paymentMethodId === '') {
|
|
@@ -91,7 +108,7 @@ function requestedProgramMembershipUsed2permit(params) {
|
|
|
91
108
|
};
|
|
92
109
|
}
|
|
93
110
|
else {
|
|
94
|
-
throw new factory.errors.Argument('programMembershipUsed',
|
|
111
|
+
throw new factory.errors.Argument('programMembershipUsed', `ownershipInfo.typeOfGood.typeOf: ${ownedGoodType} invalid`);
|
|
95
112
|
}
|
|
96
113
|
}
|
|
97
114
|
}
|
|
@@ -8,6 +8,7 @@ import type { EventRepo, IMinimizedIndividualEvent } from '../../../../repo/even
|
|
|
8
8
|
import type { EventOfferRepo } from '../../../../repo/eventOffer';
|
|
9
9
|
import { EventSeriesRepo } from '../../../../repo/eventSeries';
|
|
10
10
|
import type { IssuerRepo } from '../../../../repo/issuer';
|
|
11
|
+
import type { MemberRepo } from '../../../../repo/member';
|
|
11
12
|
import type { MemberProgramRepo } from '../../../../repo/memberProgram';
|
|
12
13
|
import type { OfferRepo } from '../../../../repo/offer/unitPriceInCatalog';
|
|
13
14
|
import type { OfferCatalogRepo } from '../../../../repo/offerCatalog';
|
|
@@ -29,6 +30,7 @@ declare function processStartReserve4chevre(params: {
|
|
|
29
30
|
event: Pick<IMinimizedIndividualEvent, 'id'> & {
|
|
30
31
|
offers?: {
|
|
31
32
|
validForMemberTier?: factory.assetTransaction.reserve.ITokenizedMemberProgramTier;
|
|
33
|
+
identifier?: string;
|
|
32
34
|
};
|
|
33
35
|
};
|
|
34
36
|
broker?: factory.reservation.IBroker<factory.reservationType>;
|
|
@@ -42,6 +44,7 @@ declare function processStartReserve4chevre(params: {
|
|
|
42
44
|
validateEventOfferPeriod: boolean;
|
|
43
45
|
validateEvent: boolean;
|
|
44
46
|
orderNumber: string;
|
|
47
|
+
instrument: factory.action.reserve.ITicketAsInstrument[];
|
|
45
48
|
}, options: {
|
|
46
49
|
/**
|
|
47
50
|
* 最大n日前から予約可能
|
|
@@ -56,6 +59,7 @@ declare function processStartReserve4chevre(params: {
|
|
|
56
59
|
eventOffer: EventOfferRepo;
|
|
57
60
|
eventSeries: EventSeriesRepo;
|
|
58
61
|
issuer: IssuerRepo;
|
|
62
|
+
member: MemberRepo;
|
|
59
63
|
memberProgram: MemberProgramRepo;
|
|
60
64
|
offer: OfferRepo;
|
|
61
65
|
offerCatalog: OfferCatalogRepo;
|
|
@@ -20,21 +20,21 @@ function processStartReserve4chevre(params, options) {
|
|
|
20
20
|
// jwt: JWTCredentials;
|
|
21
21
|
// }
|
|
22
22
|
) => __awaiter(this, void 0, void 0, function* () {
|
|
23
|
-
var _a, _b;
|
|
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
|
-
acceptedOffers: params.acceptedOffers, event:
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
acceptedOffers: params.acceptedOffers, event: {
|
|
29
|
+
id: event.id
|
|
30
|
+
}, transaction,
|
|
32
31
|
transactionNumber }, (params.broker !== undefined) ? { broker: params.broker } : undefined));
|
|
33
32
|
const startParamObject = yield validateObjectWithoutDetail(startParams, { id: params.transaction.id })(repos);
|
|
34
33
|
const startReserveTransactionResult = yield ReserveTransactionService.start(Object.assign(Object.assign({}, startParams), { object: startParamObject,
|
|
35
34
|
// discontinue preSearchedEvent(2024-07-17~)
|
|
36
35
|
// preSearchedEvent: event,
|
|
37
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~)
|
|
38
38
|
{ orderNumber: params.orderNumber, typeOf: factory.order.OrderType.Order },
|
|
39
39
|
{ id: transaction.id, typeOf: transaction.typeOf }
|
|
40
40
|
] }), options)(repos, settings);
|
|
@@ -8,6 +8,7 @@ import type { EventRepo } from '../../../repo/event';
|
|
|
8
8
|
import type { EventOfferRepo } from '../../../repo/eventOffer';
|
|
9
9
|
import { EventSeriesRepo } from '../../../repo/eventSeries';
|
|
10
10
|
import type { IssuerRepo } from '../../../repo/issuer';
|
|
11
|
+
import type { MemberRepo } from '../../../repo/member';
|
|
11
12
|
import type { MemberProgramRepo } from '../../../repo/memberProgram';
|
|
12
13
|
import type { OfferRepo } from '../../../repo/offer/unitPriceInCatalog';
|
|
13
14
|
import type { OfferCatalogRepo } from '../../../repo/offerCatalog';
|
|
@@ -36,6 +37,7 @@ interface IAuthorizeRepos {
|
|
|
36
37
|
eventOffer: EventOfferRepo;
|
|
37
38
|
eventSeries: EventSeriesRepo;
|
|
38
39
|
issuer: IssuerRepo;
|
|
40
|
+
member: MemberRepo;
|
|
39
41
|
memberProgram: MemberProgramRepo;
|
|
40
42
|
stockHolder: StockHolderRepo;
|
|
41
43
|
offer: OfferRepo;
|
|
@@ -78,6 +80,7 @@ declare function authorize(params: {
|
|
|
78
80
|
typeOf: factory.organizationType.Project;
|
|
79
81
|
};
|
|
80
82
|
object: IObjectWithoutDetail;
|
|
83
|
+
instrument: factory.action.reserve.ITicketAsInstrument[];
|
|
81
84
|
agent: {
|
|
82
85
|
id: string;
|
|
83
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
|
|
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,9 +98,14 @@ 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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
const event = {
|
|
102
|
+
id: params.object.reservationFor.id,
|
|
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
|
+
};
|
|
104
109
|
return { transaction, event };
|
|
105
110
|
});
|
|
106
111
|
}
|