@chevre/domain
Version:
Chevre Domain Library for Node.js
209 lines (208 loc) • 13.5 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.changeOffers = changeOffers;
const moment = require("moment");
const any_1 = require("../any");
const factory_1 = require("./authorize/factory");
const validateAcceptedOffers_1 = require("./authorize/validateAcceptedOffers");
const factory = require("../../../factory");
/**
* COA興行オファー承認のオファーを変更
*/
function changeOffers(params) {
// tslint:disable-next-line:max-func-body-length
return (repos) => __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d;
const transaction = yield repos.transaction.projectFieldsInProgressById({
typeOf: factory.transactionType.PlaceOrder,
id: params.transaction.id
}, ['typeOf', 'agent', 'project', 'seller']);
if (transaction.agent.id !== params.agent.id) {
throw new factory.errors.Forbidden('Transaction not yours');
}
const orderNumber = yield repos.transaction.findInProgressOrderNumberById({ id: params.transaction.id });
if (typeof orderNumber !== 'string') {
// 事前に発行されているはず
throw new factory.errors.NotFound('transaction.object.orderNumber');
}
// 取引内のアクションかどうか確認
const authorizeAction = yield repos.action.findById({ typeOf: factory.actionType.AuthorizeAction, id: params.id });
if (authorizeAction.purpose.typeOf !== transaction.typeOf || authorizeAction.purpose.id !== transaction.id) {
throw new factory.errors.Argument('Transaction', 'Action not found in the transaction');
}
if (authorizeAction.result === undefined) {
throw new factory.errors.NotFound('authorizeAction.result');
}
const originalAcceptActionId = authorizeAction.object.id;
if (typeof originalAcceptActionId !== 'string' || originalAcceptActionId === '') {
throw new factory.errors.NotFound('authorizeAction.object.id');
}
const originalAcceptResult = (_a = (yield repos.action.search({
limit: 1,
page: 1,
project: { id: { $eq: authorizeAction.project.id } },
id: { $in: [originalAcceptActionId] },
typeOf: { $eq: factory.actionType.AcceptAction }
}, ['result'])).shift()) === null || _a === void 0 ? void 0 : _a.result;
if (originalAcceptResult === undefined) {
throw new factory.errors.NotFound(`${factory.actionType.AcceptAction}.result`);
}
validate4changeOffer({ action: authorizeAction, object: params.object, originalAcceptAction: { result: originalAcceptResult } });
// 座席情報に関しては元のacceptedOffersで自動補完する(リクエストでは正しく指定されないので注意)(2023-03-20~)
params.object.acceptedOffer = params.object.acceptedOffer.map((offer) => {
// remove dependency authorizeAction.object.acceptedOffer(2024-06-19~)
// const originalAcceptedOfferBySeatNumber = authorizeAction.object.acceptedOffer.find((originalOffer) => {
const originalAcceptedOfferBySeatNumber = originalAcceptResult.object.acceptedOffer.find((originalOffer) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
return ((_d = (_c = (_b = (_a = originalOffer.itemOffered) === null || _a === void 0 ? void 0 : _a.serviceOutput) === null || _b === void 0 ? void 0 : _b.reservedTicket) === null || _c === void 0 ? void 0 : _c.ticketedSeat) === null || _d === void 0 ? void 0 : _d.seatSection)
=== ((_g = (_f = (_e = offer.itemOffered.serviceOutput) === null || _e === void 0 ? void 0 : _e.reservedTicket) === null || _f === void 0 ? void 0 : _f.ticketedSeat) === null || _g === void 0 ? void 0 : _g.seatSection)
&& ((_k = (_j = (_h = originalOffer.itemOffered.serviceOutput) === null || _h === void 0 ? void 0 : _h.reservedTicket) === null || _j === void 0 ? void 0 : _j.ticketedSeat) === null || _k === void 0 ? void 0 : _k.seatNumber)
=== ((_o = (_m = (_l = offer.itemOffered.serviceOutput) === null || _l === void 0 ? void 0 : _l.reservedTicket) === null || _m === void 0 ? void 0 : _m.ticketedSeat) === null || _o === void 0 ? void 0 : _o.seatNumber);
});
if (originalAcceptedOfferBySeatNumber === undefined) {
throw new factory.errors.Argument('offers', 'seatSection or seatNumber not matched.');
}
return Object.assign(Object.assign({}, offer), { ticketInfo: Object.assign(Object.assign({}, offer.ticketInfo), { spseatAdd1: originalAcceptedOfferBySeatNumber.ticketInfo.spseatAdd1, spseatAdd2: originalAcceptedOfferBySeatNumber.ticketInfo.spseatAdd2, spseatKbn: originalAcceptedOfferBySeatNumber.ticketInfo.spseatKbn }) });
});
// イベント取得属性最適化(2023-01-23~)
const 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 { acceptedOffers } = yield (0, validateAcceptedOffers_1.validateAcceptedOffers)({
object: params.object,
project: { id: transaction.project.id },
screeningEvent,
availablePaymentMethodTypes,
seatingTypes,
videoFormatTypes
})(repos);
// 供給情報と価格を変更してからDB更新
// authorizeAction.object.acceptedOffer = acceptedOffers; // discontinue acceptedOffers(2024-06-21~)
// recipe依存へ変更(2024-06-11~)
// const updTmpReserveSeatResult = authorizeAction.result?.responseBody;
const recipe = yield repos.action.findRecipeByAction({
project: { id: transaction.project.id },
recipeFor: { id: originalAcceptActionId }
});
const updTmpReserveSeatResult = (_d = (_c = (_b = recipe === null || recipe === void 0 ? void 0 : recipe.step[0]) === null || _b === void 0 ? void 0 : _b.itemListElement[0]) === null || _c === void 0 ? void 0 : _c.itemListElement[0]) === null || _d === void 0 ? void 0 : _d.afterMedia;
if (updTmpReserveSeatResult === undefined) {
throw new factory.errors.NotFound('afterMedia by recipe');
}
const { price, eligibleMonetaryAmount } = (0, factory_1.offers2resultPrice)(acceptedOffers);
const acceptedOffers4result = (0, factory_1.responseBody2acceptedOffers4result)({
project: { id: authorizeAction.project.id },
responseBody: updTmpReserveSeatResult,
acceptedOffer: acceptedOffers,
event: screeningEvent,
seller: transaction.seller,
bookingTime: moment(authorizeAction.startDate)
.toDate(),
totalPrice: price
});
const actionResult = Object.assign(Object.assign({}, authorizeAction.result), { price: price, amount: eligibleMonetaryAmount });
// ActiveActionStatus->CompletedActionStatusで再実装(2024-01-15~)
yield repos.action.reStart({ id: authorizeAction.id, typeOf: authorizeAction.typeOf });
try {
// まずvoidAcceptedOffer
// const orderNumberByTransaction = transaction.object.orderNumber;
const orderNumberByTransaction = orderNumber; // transaction.objectへのアクセス回避(2024-05-30~)
if (typeof orderNumberByTransaction === 'string') {
yield (0, any_1.voidAcceptedOffer)({
// authorizeActions: [authorizeAction],
authorizeActionsWithInstrument: [authorizeAction],
orderNumber: orderNumberByTransaction
})(repos);
}
// 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: authorizeAction.typeOf, id: authorizeAction.id, error });
}
catch (__) {
// no op
}
throw error;
}
// 承認アクションを再完了
yield repos.action.reCompleteAuthorizeEventOfferAction({
id: params.id,
object: authorizeAction.object,
result: actionResult
});
return {
id: params.id,
instrument: authorizeAction.instrument,
result: actionResult
};
});
}
function validate4changeOffer(params) {
// アクション中のイベント識別子と座席リストが合っているかどうか確認
const authorizeAction = params.action;
const originalAcceptAction = params.originalAcceptAction;
const originalAuthorizeActionObject = originalAcceptAction.result.object;
// 完了ステータスのアクションのみ更新可能
if (authorizeAction.actionStatus !== factory.actionStatusType.CompletedActionStatus) {
throw new factory.errors.NotFound('authorizeAction');
}
// tslint:disable-next-line:no-single-line-block-comment
/* istanbul ignore if */
// if (authorizeAction.object.event === undefined) {
// throw new factory.errors.NotFound('authorizeAction.object.event');
// }
// イベントが一致しているかどうか
// if (authorizeAction.object.event.id !== params.object.event.id) {
// throw new factory.errors.Argument('Event', 'Event ID not matched.');
// }
if (originalAuthorizeActionObject.event.id !== params.object.event.id) {
throw new factory.errors.Argument('Event', 'Event ID not matched.');
}
// 座席セクションと座席番号が一致しているかどうか
const acceptedOfferParams = (Array.isArray(params.object.acceptedOffer)) ? params.object.acceptedOffer : [];
// const allSeatsExisted = authorizeAction.object.acceptedOffer.every((originalAcceptedOffer) => {
const allSeatsExisted = originalAuthorizeActionObject.acceptedOffer.every((originalAcceptedOffer) => {
return acceptedOfferParams.some((o) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
const newSeatSection = (_c = (_b = (_a = o.itemOffered.serviceOutput) === null || _a === void 0 ? void 0 : _a.reservedTicket) === null || _b === void 0 ? void 0 : _b.ticketedSeat) === null || _c === void 0 ? void 0 : _c.seatSection;
const newSeatNumber = (_f = (_e = (_d = o.itemOffered.serviceOutput) === null || _d === void 0 ? void 0 : _d.reservedTicket) === null || _e === void 0 ? void 0 : _e.ticketedSeat) === null || _f === void 0 ? void 0 : _f.seatNumber;
return ((_k = (_j = (_h = (_g = originalAcceptedOffer.itemOffered) === null || _g === void 0 ? void 0 : _g.serviceOutput) === null || _h === void 0 ? void 0 : _h.reservedTicket) === null || _j === void 0 ? void 0 : _j.ticketedSeat) === null || _k === void 0 ? void 0 : _k.seatSection) === newSeatSection
&& ((_o = (_m = (_l = originalAcceptedOffer.itemOffered.serviceOutput) === null || _l === void 0 ? void 0 : _l.reservedTicket) === null || _m === void 0 ? void 0 : _m.ticketedSeat) === null || _o === void 0 ? void 0 : _o.seatNumber) === newSeatNumber;
});
});
const allSeatsMatched = (acceptedOfferParams.length === originalAuthorizeActionObject.acceptedOffer.length) && allSeatsExisted;
if (!allSeatsMatched) {
throw new factory.errors.Argument('offers', 'seatSection or seatNumber not matched.');
}
}