@chevre/domain
Version:
Chevre Domain Library for Node.js
161 lines (160 loc) • 8.14 kB
JavaScript
"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
};
});
}