@chevre/domain
Version:
Chevre Domain Library for Node.js
80 lines (79 loc) • 4.84 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.verifyTicketTokenAsNeeded = verifyTicketTokenAsNeeded;
const factory = require("../../../factory");
function verifyTicketTokenAsNeeded(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
var _a, _b;
const { paymentServiceType, object, project } = params;
const { issuedThrough, ticketToken } = object;
let permitOrInvoice;
// メンバーシップチケットが指定された場合、メンバーシップコードへ変換する
if (typeof ticketToken === 'string' && ticketToken !== '') {
switch (paymentServiceType) {
case factory.service.paymentService.PaymentServiceType.CreditCard:
case factory.service.paymentService.PaymentServiceType.MovieTicket:
case factory.service.paymentService.PaymentServiceType.FaceToFace:
const ticket = (yield repos.ticket.projectFields({
limit: 1,
page: 1,
project: { id: { $eq: project.id } },
ticketToken: { $eq: ticketToken }
}, ['ticketToken'])).shift();
if (ticket === undefined) {
throw new factory.errors.NotFound('Ticket');
}
// 承認を参照
const validAuthorization = yield repos.authorization.findValidOneByCode({
project: { id: params.project.id },
code: ticket.ticketToken
});
const authorizedObject = validAuthorization.object;
// audience検証
if (((_a = validAuthorization.audience) === null || _a === void 0 ? void 0 : _a.typeOf) !== factory.transactionType.PlaceOrder
|| validAuthorization.audience.id !== params.purpose.id) {
throw new factory.errors.Argument('ticketToken', 'audience not matched with placeOrder');
}
if (authorizedObject.typeOf === 'OwnershipInfo') {
const { typeOfGood } = authorizedObject;
if (((_b = typeOfGood.issuedThrough) === null || _b === void 0 ? void 0 : _b.typeOf) !== paymentServiceType) {
throw new factory.errors.Argument('ticketToken', 'paymentServiceType not matched');
}
// FaceToFace以外の場合、発行サービスIDを検証
if (typeOfGood.issuedThrough.typeOf !== factory.service.paymentService.PaymentServiceType.FaceToFace) {
if (typeOfGood.issuedThrough.id !== issuedThrough.id) {
throw new factory.errors.Argument('ticketToken', 'issuedThrough.id not matched');
}
}
if (typeOfGood.typeOf === factory.permit.PermitType.Permit) {
permitOrInvoice = { identifier: typeOfGood.identifier, typeOf: factory.permit.PermitType.Permit };
}
else if (typeOfGood.typeOf === 'Invoice') {
// support paymentServiceType.MovieTicket(2024-11-23~)
permitOrInvoice = { paymentMethodId: typeOfGood.paymentMethodId, typeOf: 'Invoice' };
}
else {
throw new factory.errors.Argument('ticketToken', 'must be Permit or Invoice');
}
}
else {
throw new factory.errors.Argument('ticketToken', 'must be OwnershipInfo');
}
break;
default:
// no op
throw new factory.errors.NotImplemented(`ticketToken issued through ${paymentServiceType} not implemented`);
}
}
return { permitOrInvoice };
});
}
;