@chevre/domain
Version:
Chevre Domain Library for Node.js
125 lines (124 loc) • 7.14 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.checkInReservation = checkInReservation;
const createDebug = require("debug");
const factory = require("../../factory");
const confirmReservation_1 = require("./confirmReservation");
const onReservationCheckedIn_1 = require("./potentialActions/onReservationCheckedIn");
const debug = createDebug('chevre-domain:service:reserve:checkInReservation');
function checkInReservation(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const now = new Date();
// confirmReservationが間に合わない可能性を考慮する(2023-06-01~)
yield reserveIfNotYet(params)(repos);
// 発券処理(Array対応)
let checkedInReservationIds;
let checkedInResult;
if (Array.isArray(params.object.ids) && params.object.ids.length > 0) {
const existingReservationCount = yield repos.reservation.count({
id: { $in: params.object.ids },
typeOf: factory.reservationType.EventReservation
});
if (existingReservationCount !== params.object.ids.length) {
if (params.options.retryOnReservationNotFound === true) {
throw new factory.errors.NotFound(factory.reservationType.EventReservation, `Some reservations dot not exist. ${params.object.ids.join(',')}`);
}
}
if (existingReservationCount > 0) {
checkedInResult = yield repos.reservation.checkInIfNot({ id: { $in: params.object.ids }, now });
checkedInReservationIds = params.object.ids;
}
}
if (Array.isArray(params.object.reservationNumbers) && params.object.reservationNumbers.length > 0) {
let reservationExists = false;
for (const reservationNumber of params.object.reservationNumbers) {
const existingReservationCount = yield repos.reservation.count({
reservationNumber: { $eq: reservationNumber },
typeOf: factory.reservationType.EventReservation
});
if (existingReservationCount === 0) {
if (params.options.retryOnReservationNotFound === true) {
throw new factory.errors.NotFound(factory.reservationType.EventReservation, `Some reservations dot not exist. ${params.object.reservationNumbers.join(',')}`);
}
}
if (existingReservationCount > 0) {
reservationExists = true;
}
}
if (reservationExists) {
checkedInResult =
yield repos.reservation.checkInIfNot({ reservationNumber: { $in: params.object.reservationNumbers }, now });
}
}
const checkedInForTheFirstTime = typeof (checkedInResult === null || checkedInResult === void 0 ? void 0 : checkedInResult.modifiedCount) === 'number' && checkedInResult.modifiedCount > 0;
if (checkedInResult !== undefined) {
if (Array.isArray(checkedInReservationIds)) {
yield (0, onReservationCheckedIn_1.onReservationCheckedIn)({
project: params.project,
object: {
ids: checkedInReservationIds,
reservedTicket: Object.assign({}, (checkedInForTheFirstTime) ? { dateIssued: now } : undefined)
},
purpose: params.purpose,
instrument: params.instrument
})(repos);
}
else if (Array.isArray(params.object.reservationNumbers) && params.object.reservationNumbers.length > 0) {
yield (0, onReservationCheckedIn_1.onReservationCheckedIn)({
project: params.project,
object: {
reservationNumbers: params.object.reservationNumbers,
reservedTicket: Object.assign({}, (checkedInForTheFirstTime) ? { dateIssued: now } : undefined)
},
purpose: params.purpose,
instrument: params.instrument
})(repos);
}
}
});
}
function reserveIfNotYet(params) {
return (repos
// settings: Settings
) => __awaiter(this, void 0, void 0, function* () {
let reserveTransactions = [];
if (Array.isArray(params.object.ids) && params.object.ids.length > 0) {
reserveTransactions = yield repos.assetTransaction.search({
typeOf: factory.assetTransactionType.Reserve,
object: {
reservations: { id: { $in: params.object.ids } }
},
statuses: [factory.transactionStatusType.Confirmed]
}, ['transactionNumber']);
debug(reserveTransactions.length, 'reserveTransactions found in reserveIfNotYet. ids:', params.object.ids, 'reserveTransactions:', JSON.stringify(reserveTransactions));
}
if (Array.isArray(params.object.reservationNumbers) && params.object.reservationNumbers.length > 0) {
reserveTransactions = yield repos.assetTransaction.search({
typeOf: factory.assetTransactionType.Reserve,
object: {
reservationNumber: { $in: params.object.reservationNumbers }
},
statuses: [factory.transactionStatusType.Confirmed]
}, ['transactionNumber']);
debug(reserveTransactions.length, 'reserveTransactions found in reserveIfNotYet. reservationNumbers:', params.object.reservationNumbers, 'reserveTransactions:', JSON.stringify(reserveTransactions));
}
yield Promise.all(reserveTransactions.map((reserveTransaction) => __awaiter(this, void 0, void 0, function* () {
yield (0, confirmReservation_1.confirmReservation)({
// optimize(2024-07-01~)
potentialReserveAction: { object: { reservationNumber: reserveTransaction.transactionNumber } },
useOnReservationConfirmed: false, // ここでは確定予約の存在を担保すればよいだけ
byTask: false
})(repos);
debug('confirmReservation processed in reserveIfNotYet. reservationNumber:', reserveTransaction.transactionNumber);
})));
});
}
;