UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

80 lines (79 loc) 4.84 kB
"use strict"; 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 }; }); }