UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

161 lines (160 loc) 8.14 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.authorize = authorize; const moment = require("moment"); // import { publishOrderNumberIfNotExist } from '../../transaction/placeOrder/publishOrderNumberIfNotExist'; const any_1 = require("../any"); const factory_1 = require("./authorize/factory"); const validateAcceptedOffers_1 = require("./authorize/validateAcceptedOffers"); const factory = require("../../../factory"); /** * COA興行オファー承認 */ function authorize(params) { // tslint:disable-next-line:max-func-body-length return (repos) => __awaiter(this, void 0, void 0, function* () { var _a; const transaction = yield repos.transaction.projectFieldsInProgressById({ typeOf: factory.transactionType.PlaceOrder, id: params.transaction.id }, ['agent', 'project', 'seller', 'typeOf', 'instrument']); if (transaction.agent.id !== params.agent.id) { throw new factory.errors.Forbidden('Transaction not yours'); } // クライアント検証(2024-02-07~) const instrumentId = (_a = transaction.instrument) === null || _a === void 0 ? void 0 : _a.id; if (typeof instrumentId === 'string' && instrumentId !== params.store.id) { throw new factory.errors.Forbidden('client not match that of the transaction'); } let screeningEvent; let acceptedOffers; const pendingTransaction = { theaterCode: params.result.requestBody.theaterCode, dateJouei: params.result.requestBody.dateJouei, titleCode: params.result.requestBody.titleCode, titleBranchNum: params.result.requestBody.titleBranchNum, timeBegin: params.result.requestBody.timeBegin, tmpReserveNum: params.result.responseBody.tmpReserveNum, transactionNumber: params.result.responseBody.tmpReserveNum, typeOf: factory.assetTransactionType.COAReserveTransaction }; try { screeningEvent = yield repos.event.projectEventFieldsById({ id: params.object.event.id }, [ 'coaInfo', 'doorTime', 'endDate', 'location', 'startDate', 'superEvent', 'typeOf', 'identifier', 'name' ] // optimize(2024-07-18~) ); const availablePaymentMethodTypes = yield repos.categoryCode.projectFields({ project: { id: { $eq: transaction.project.id } }, inCodeSet: { identifier: { $eq: factory.categoryCode.CategorySetIdentifier.PaymentMethodType } } }, []); const seatingTypes = yield repos.categoryCode.projectFields({ project: { id: { $eq: transaction.project.id } }, inCodeSet: { identifier: { $eq: factory.categoryCode.CategorySetIdentifier.SeatingType } } }, []); const videoFormatTypes = yield repos.categoryCode.projectFields({ project: { id: { $eq: transaction.project.id } }, inCodeSet: { identifier: { $eq: factory.categoryCode.CategorySetIdentifier.VideoFormatType } } }, []); // COA仮予約後にリクエストが来る前提 const validateAcceptedOffersResult = yield (0, validateAcceptedOffers_1.validateAcceptedOffers)({ object: params.object, project: { id: transaction.project.id }, screeningEvent, availablePaymentMethodTypes, seatingTypes, videoFormatTypes })(repos); acceptedOffers = validateAcceptedOffersResult.acceptedOffers; } catch (error) { // アクション開始前に例外がthrowされてもCOA仮予約を取り消す機会をつくるためにFailedアクションを作成する(2023-09-12~) const failedActionAttributes = (0, factory_1.createAuthorizeSeatReservationActionAttributes)({ acceptAction: params.object.acceptAction, // acceptedOffers: [], event: { id: params.object.event.id, typeOf: factory.eventType.ScreeningEvent }, transaction, pendingTransaction }); const failedAction = yield repos.action.start(failedActionAttributes); yield repos.action.giveUp({ typeOf: failedAction.typeOf, id: failedAction.id, error }); throw error; } // const now = new Date(); // const orderNumber = await publishOrderNumberIfNotExist({ // project: { id: transaction.project.id }, // id: transaction.id, // object: { orderDate: now } // })(repos); const orderNumber = yield repos.transaction.findInProgressOrderNumberById({ id: params.transaction.id }); if (typeof orderNumber !== 'string') { // 事前に発行されているはず throw new factory.errors.NotFound('transaction.object.orderNumber'); } let result; // 承認アクションを開始 const actionAttributes = (0, factory_1.createAuthorizeSeatReservationActionAttributes)({ acceptAction: params.object.acceptAction, // acceptedOffers, event: { id: screeningEvent.id, typeOf: screeningEvent.typeOf }, transaction, pendingTransaction }); const action = yield repos.action.start(actionAttributes); try { // 座席仮予約からオファー情報を生成する const { price, eligibleMonetaryAmount } = (0, factory_1.offers2resultPrice)(acceptedOffers); const acceptedOffers4result = (0, factory_1.responseBody2acceptedOffers4result)({ project: { id: transaction.project.id }, responseBody: params.result.responseBody, acceptedOffer: acceptedOffers, event: screeningEvent, seller: transaction.seller, bookingTime: moment(action.startDate) .toDate(), totalPrice: price }); result = { typeOf: factory.offerType.AggregateOffer, // add(2024-06-18~) price: price, priceCurrency: factory.priceCurrency.JPY, amount: eligibleMonetaryAmount // requestBody: params.result.requestBody, // discontinue(2024-06-11~) // responseBody: params.result.responseBody, // discontinue(2024-06-11~) // acceptedOffers: [] // discontinue(2024-06-17~) }; // add orderInTransaction(2024-01-15~) // if (params.options.useCreateOrderOnOfferAccepted) { yield (0, any_1.acceptOffer)({ orderNumber, project: transaction.project, acceptedOffers: acceptedOffers4result })(repos); // } } catch (error) { try { yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error }); } catch (__) { // no op } throw error; } yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result }); return { id: action.id, instrument: actionAttributes.instrument, result }; }); }