@chevre/domain
Version:
Chevre Domain Library for Node.js
94 lines (93 loc) • 5.58 kB
JavaScript
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.checkMovieTicket = checkMovieTicket;
const errorHandler_1 = require("../../../errorHandler");
const factory = require("../../../factory");
const factory_1 = require("./factory");
const processPurchaseNumberAuth_1 = require("./processPurchaseNumberAuth");
/**
* 決済カード認証
*/
function checkMovieTicket(params) {
return (repos, settings) => __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d, _e, _f;
// 不要な属性がリクエストに含まれているのでmovieTicketsを最適化(2024-03-15~)
const movieTicketsBeforeOptimize = (_a = params.object[0]) === null || _a === void 0 ? void 0 : _a.movieTickets;
if (!Array.isArray(movieTicketsBeforeOptimize)) {
throw new factory.errors.Argument('object.movieTickets must be an array');
}
const movieTickets = movieTicketsBeforeOptimize.map(({ accessCode, category, identifier, serviceOutput }) => {
return {
accessCode, category, identifier,
serviceOutput: { reservationFor: serviceOutput.reservationFor } // 最適化(2024-03-15~)
};
});
const firstObject = params.object.shift(); // object.length:1なのでこれでok
if (firstObject === undefined) {
throw new factory.errors.ArgumentNull('object');
}
const { id, typeOf, paymentMethod, seller } = firstObject;
const optimizedCheckObject = [{
id, typeOf, seller, movieTickets,
paymentMethod: { typeOf: paymentMethod.typeOf } // 最適化(2024-03-15~)
}];
const paymentMethodType = (_b = optimizedCheckObject[0]) === null || _b === void 0 ? void 0 : _b.paymentMethod.typeOf; // 決済方法区分
const paymentServiceId = (_c = optimizedCheckObject[0]) === null || _c === void 0 ? void 0 : _c.id;
const actionAttributes = Object.assign(Object.assign({ project: params.project, typeOf: factory.actionType.CheckAction, agent: params.agent, object: optimizedCheckObject }, (typeof ((_d = params.purpose) === null || _d === void 0 ? void 0 : _d.typeOf) === 'string') ? { purpose: params.purpose } : undefined), (typeof ((_e = params.sameAs) === null || _e === void 0 ? void 0 : _e.id) === 'string')
? { sameAs: { id: params.sameAs.id, typeOf: 'Task' } } // タスク関連付け(2024-05-21~)
: undefined);
const action = yield repos.action.start(actionAttributes);
let processPurchaseNumberAuthResult;
let recipe;
try {
const eventIds = [...new Set(optimizedCheckObject.reduce((a, b) => [
...a,
...(Array.isArray(b.movieTickets)) ? b.movieTickets.map((ticket) => ticket.serviceOutput.reservationFor.id) : []
], []))];
if (eventIds.length !== 1) {
throw new factory.errors.Argument('movieTickets', 'Number of events must be 1');
}
const screeningEvent = yield repos.event.projectEventFieldsById({ id: eventIds[0] }, ['typeOf', 'project', 'coaInfo', 'startDate', 'offers.offeredThrough', 'superEvent.workPerformed.identifier']);
const sellerId = (_f = optimizedCheckObject[0]) === null || _f === void 0 ? void 0 : _f.seller.id;
const paymentAccepted = yield repos.paymentAccepted.isAcceptedBySeller({
seller: { id: sellerId },
codeValue: paymentMethodType
});
if (paymentAccepted !== true) {
throw new factory.errors.Argument('transactionId', `payment not accepted [${paymentMethodType}]`);
}
processPurchaseNumberAuthResult = yield (0, processPurchaseNumberAuth_1.processPurchaseNumberAuth)({
movieTickets, screeningEvent, paymentServiceId,
seller: { id: sellerId }
})(repos, settings);
// add recipe(2024-06-07~)
recipe = (0, factory_1.processPurchaseNumberAuthResult2checkRecipe)({
processPurchaseNumberAuthResult,
project: { id: params.project.id }
});
}
catch (error) {
// アクション保管用のエラーと両方保管(2024-05-22~)
const errors = [(0, errorHandler_1.handleMvtkReserveError)(error), error];
try {
yield repos.action.giveUp({ typeOf: actionAttributes.typeOf, id: action.id, error: errors });
}
catch (__) {
// 失敗したら仕方ない
}
throw errors[0];
}
const result = {};
yield repos.action.completeWithVoid({ typeOf: actionAttributes.typeOf, id: action.id, result, recipe });
return { result: processPurchaseNumberAuthResult };
});
}
;