UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

125 lines (124 loc) 7.14 kB
"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.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); }))); }); }