@chevre/domain
Version:
Chevre Domain Library for Node.js
194 lines (193 loc) • 9.85 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.acceptOffer = acceptOffer;
exports.reAcceptOffer = reAcceptOffer;
const errorHandler_1 = require("../../../errorHandler");
const factory = require("../../../factory");
const publishOrderNumberIfNotExist_1 = require("../../transaction/placeOrder/publishOrderNumberIfNotExist");
const authorize_1 = require("./acceptOffer/authorize");
const factory_1 = require("./acceptOffer/factory");
function findCOAInfo(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const searchConditions = {
project: { id: { $eq: params.project.id } },
limit: 1,
page: 1,
typeOf: factory.eventType.ScreeningEvent,
id: { $eq: params.id }
};
const event = (yield repos.event.projectEventFields(searchConditions, ['coaInfo'])).shift();
if (event === undefined) {
throw new factory.errors.NotFound(factory.eventType.ScreeningEvent);
}
if (event.coaInfo === undefined) {
throw new factory.errors.NotFound('coaInfo');
}
const { theaterCode, dateJouei, titleCode, titleBranchNum, timeBegin, timeEnd, screenCode } = event.coaInfo;
return { theaterCode, dateJouei, titleCode, titleBranchNum, timeBegin, timeEnd, screenCode };
});
}
/**
* COA興行オファー採用
*/
function acceptOffer(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
if (typeof params.sameAs.id !== 'string' || params.sameAs.id === '') {
throw new factory.errors.ArgumentNull('sameAs.id');
}
const transaction = yield repos.transaction.projectFieldsInProgressById({
typeOf: factory.transactionType.PlaceOrder,
id: params.purpose.id
}, ['project', 'agent', 'typeOf']);
// publishOrderNumber(2025-03-11~)
yield (0, publishOrderNumberIfNotExist_1.publishOrderNumberIfNotExist)({
project: { id: transaction.project.id },
id: transaction.id,
object: { orderDate: new Date() }
})(repos);
const coaInfo = yield findCOAInfo({ id: params.object.event.id, project: { id: transaction.project.id } })(repos);
const updTmpReserveSeatArgs = (0, factory_1.createUpdTmpReserveSeatArgs)({ object: params.object, coaInfo });
let updTmpReserveSeatResult;
let recipe = (0, factory_1.processUpdTmpReserveSeatResult2recipe)({
processUpdTmpReserveSeatResult: { updTmpReserveSeatArgs },
project: { id: transaction.project.id }
});
let acceptedOffer;
const actionAttributes = {
project: transaction.project,
typeOf: factory.actionType.AcceptAction,
object: params.object,
// agent: { id: transaction.agent.id, typeOf: transaction.agent.typeOf },
agent: { id: params.agent.id, typeOf: params.agent.typeOf },
purpose: { id: transaction.id, typeOf: transaction.typeOf },
sameAs: { id: params.sameAs.id, typeOf: 'Task' },
potentialActions: params.potentialActions,
instrument: {
typeOf: factory.assetTransactionType.COAReserveTransaction
// requestBody: updTmpReserveSeatArgs // discontinue(2024-06-11~)
}
};
const action = yield repos.action.start(actionAttributes, { recipe }); // add recipe(2024-06-11~)
try {
const acceptedOffersWithoutDetails = yield (0, authorize_1.createAcceptedOffersWithoutDetails)({
object: params.object,
coaInfo
})({ reserveService: repos.reserveService });
acceptedOffer = yield (0, authorize_1.validateOffers)(coaInfo, acceptedOffersWithoutDetails, {
identifier: params.object.appliesToSurfrock.identifier,
serviceOutput: { typeOf: params.object.appliesToSurfrock.serviceOutput.typeOf }
},
// params.object.flgMember
(params.isMember) ? factory.action.accept.coaOffer.FlgMember.Member : factory.action.accept.coaOffer.FlgMember.NonMember)({
reserveService: repos.reserveService,
masterService: repos.masterService
});
try {
updTmpReserveSeatResult = yield repos.reserveService.updTmpReserveSeat(updTmpReserveSeatArgs);
recipe = (0, factory_1.processUpdTmpReserveSeatResult2recipe)({
processUpdTmpReserveSeatResult: { updTmpReserveSeatArgs, updTmpReserveSeatResult },
project: { id: transaction.project.id }
});
}
catch (error) {
throw (0, errorHandler_1.handleCOAReserveTemporarilyError)(error);
}
}
catch (error) {
try {
yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error });
}
catch (__) {
// no op
}
throw error;
}
const result = {
object: { acceptedOffer, event: { id: params.object.event.id } },
result: { responseBody: { tmpReserveNum: updTmpReserveSeatResult.tmpReserveNum } },
typeOf: factory.actionType.AuthorizeAction
};
yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result, recipe }); // add recipe(2024-06-11~)
});
}
/**
* COA興行オファー採用変更
*/
function reAcceptOffer(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
var _a;
if (typeof params.sameAs.id !== 'string' || params.sameAs.id === '') {
throw new factory.errors.ArgumentNull('sameAs.id');
}
if (typeof ((_a = params.potentialActions) === null || _a === void 0 ? void 0 : _a.id) !== 'string' || params.potentialActions.id === '') {
throw new factory.errors.ArgumentNull('potentialActions.id');
}
const transaction = yield repos.transaction.projectFieldsInProgressById({
typeOf: factory.transactionType.PlaceOrder,
id: params.purpose.id
}, ['project', 'agent', 'typeOf']);
const orderNumber = yield repos.transaction.findInProgressOrderNumberById({ id: transaction.id });
if (typeof orderNumber !== 'string') {
// 事前に発行されているはず
throw new factory.errors.NotFound('transaction.object.orderNumber');
}
const coaInfo = yield findCOAInfo({ id: params.object.event.id, project: { id: transaction.project.id } })(repos);
// 承認アクション存在検証
yield repos.action.findById({ id: params.potentialActions.id, typeOf: factory.actionType.AuthorizeAction }, ['id'], []);
const actionAttributes = {
project: transaction.project,
typeOf: factory.actionType.AcceptAction,
object: params.object,
// agent: { id: transaction.agent.id, typeOf: transaction.agent.typeOf },
agent: { id: params.agent.id, typeOf: params.agent.typeOf },
purpose: { id: transaction.id, typeOf: transaction.typeOf },
sameAs: { id: params.sameAs.id, typeOf: 'Task' },
potentialActions: params.potentialActions,
instrument: { typeOf: factory.assetTransactionType.COAReserveTransaction }
};
let acceptedOffer;
const action = yield repos.action.start(actionAttributes);
try {
const acceptedOffersWithoutDetails = params.object.acceptedOffer.map((offer) => {
return Object.assign(Object.assign({}, offer), { ticketInfo: Object.assign(Object.assign({}, offer.ticketInfo), { spseatAdd1: 0, spseatAdd2: 0, spseatKbn: '' // 承認時に上書きされるので問題なし
}) });
});
acceptedOffer = yield (0, authorize_1.validateOffers)(coaInfo, acceptedOffersWithoutDetails, {
identifier: params.object.appliesToSurfrock.identifier,
serviceOutput: { typeOf: params.object.appliesToSurfrock.serviceOutput.typeOf }
},
// params.object.flgMember
(params.isMember) ? factory.action.accept.coaOffer.FlgMember.Member : factory.action.accept.coaOffer.FlgMember.NonMember)({
reserveService: repos.reserveService,
masterService: repos.masterService
});
}
catch (error) {
try {
yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error });
}
catch (__) {
// no op
}
throw error;
}
const result = {
id: params.potentialActions.id,
object: {
acceptedOffer,
event: { id: params.object.event.id }
},
typeOf: factory.actionType.AuthorizeAction
};
yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result });
});
}