@chevre/domain
Version:
Chevre Domain Library for Node.js
10 lines (9 loc) • 221 kB
HTML
<html>
<head>
</head>
<body style="background: transparent;">
<script src="scripts/docstrap.lib.js"></script>
<script src="scripts/lunr.min.js"></script>
<script src="scripts/fulltext-search.js"></script>
<script type="text/x-docstrap-searchdb">
{"service_task.js.html":{"id":"service_task.js.html","title":"Source: service/task.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service/task.js "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); /** * タスクサービス */ const createDebug = require("debug"); const factory = require("../factory"); const debug = createDebug('chevre-domain:service'); exports.ABORT_REPORT_SUBJECT = 'Task aborted !!!'; /** * execute a task by taskName * タスク名でタスクをひとつ実行する * @param taskName タスク名 */ function executeByName(taskName) { return (settings) => __awaiter(this, void 0, void 0, function* () { // 未実行のタスクを取得 let task = null; try { task = yield settings.taskRepo.executeOneByName(taskName); debug('task found', task); } catch (error) { debug('executeByName error:', error); } // タスクがなければ終了 if (task !== null) { yield execute(task)(settings); } }); } exports.executeByName = executeByName; /** * execute a task * タスクを実行する * @param task タスクオブジェクト */ function execute(task) { debug('executing a task...', task); const now = new Date(); return (settings) => __awaiter(this, void 0, void 0, function* () { try { // タスク名の関数が定義されていなければ、TypeErrorとなる const { call } = yield Promise.resolve().then(() => require(`./task/${task.name}`)); yield call(task.data)(settings); const result = { executedAt: now, error: '' }; yield settings.taskRepo.pushExecutionResultById(task.id, factory.taskStatus.Executed, result); } catch (error) { // 実行結果追加 const result = { executedAt: now, error: error.stack }; // 失敗してもここではステータスを戻さない(Runningのまま待機) yield settings.taskRepo.pushExecutionResultById(task.id, task.status, result); } }); } exports.execute = execute; /** * retry tasks in running status * 実行中ステータスのままになっているタスクをリトライする * @param intervalInMinutes 最終トライ日時から何分経過したタスクをリトライするか */ function retry(intervalInMinutes) { return (repos) => __awaiter(this, void 0, void 0, function* () { yield repos.task.retry(intervalInMinutes); }); } exports.retry = retry; /** * abort a task * トライ可能回数が0に達したタスクを実行中止する * @param intervalInMinutes 最終トライ日時から何分経過したタスクを中止するか */ function abort(intervalInMinutes) { return (repos) => __awaiter(this, void 0, void 0, function* () { const abortedTask = yield repos.task.abortOne(intervalInMinutes); if (abortedTask === null) { return; } debug('abortedTask found', abortedTask); // 開発者へ報告 const lastResult = (abortedTask.executionResults.length > 0) ? abortedTask.executionResults[abortedTask.executionResults.length - 1].error : // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore next */ ''; debug('reporting...', lastResult); // await NotificationService.report2developers( // ABORT_REPORT_SUBJECT, // `id:${abortedTask.id} // name:${abortedTask.name} // runsAt:${moment(abortedTask.runsAt).toISOString()} // lastTriedAt:${moment(<Date>abortedTask.lastTriedAt).toISOString()} // numberOfTried:${abortedTask.numberOfTried} // lastResult:${lastResult}` // )(); }); } exports.abort = abort; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"repository.js.html":{"id":"repository.js.html","title":"Source: repository.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: repository.js "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // tslint:disable:max-classes-per-file completed-docs /** * リポジトリー */ const accountTitle_1 = require("./repo/accountTitle"); const action_1 = require("./repo/action"); const creativeWork_1 = require("./repo/creativeWork"); const event_1 = require("./repo/event"); const screeningEvent_1 = require("./repo/itemAvailability/screeningEvent"); const place_1 = require("./repo/place"); const priceSpecification_1 = require("./repo/priceSpecification"); const reservation_1 = require("./repo/reservation"); const reservationNumber_1 = require("./repo/reservationNumber"); const serviceType_1 = require("./repo/serviceType"); const task_1 = require("./repo/task"); const ticketType_1 = require("./repo/ticketType"); const transaction_1 = require("./repo/transaction"); class AccountTitle extends accountTitle_1.MongoRepository { } exports.AccountTitle = AccountTitle; class Action extends action_1.MongoRepository { } exports.Action = Action; class CreativeWork extends creativeWork_1.MongoRepository { } exports.CreativeWork = CreativeWork; class Event extends event_1.MongoRepository { } exports.Event = Event; class Place extends place_1.MongoRepository { } exports.Place = Place; class PriceSpecification extends priceSpecification_1.MongoRepository { } exports.PriceSpecification = PriceSpecification; class Reservation extends reservation_1.MongoRepository { } exports.Reservation = Reservation; class ReservationNumber extends reservationNumber_1.RedisRepository { } exports.ReservationNumber = ReservationNumber; class ServiceType extends serviceType_1.MongoRepository { } exports.ServiceType = ServiceType; class Task extends task_1.MongoRepository { } exports.Task = Task; class TicketType extends ticketType_1.MongoRepository { } exports.TicketType = TicketType; class Transaction extends transaction_1.MongoRepository { } exports.Transaction = Transaction; var itemAvailability; (function (itemAvailability) { class ScreeningEvent extends screeningEvent_1.RedisRepository { } itemAvailability.ScreeningEvent = ScreeningEvent; })(itemAvailability = exports.itemAvailability || (exports.itemAvailability = {})); × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"service_aggregation.js.html":{"id":"service_aggregation.js.html","title":"Source: service/aggregation.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service/aggregation.js "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); /** * 集計サービス */ const createDebug = require("debug"); const factory = require("../factory"); const debug = createDebug('chevre-domain:service'); /** * 上映イベントデータを期間指定で集計する */ // export function aggregateScreeningEvents(params: { // startFrom: Date; // startThrough: Date; // ttl: number; // }): IAggregateScreeningEventOperation<void> { // return async (repos: { // aggregation: ScreeningEventAggregationRepo; // screeningEventAvailability: ScreeningEventAvailabilityRepo; // event: EventRepo; // place: PlaceRepo; // }) => { // // 集計対象イベント検索 // const events = await repos.event.searchScreeningEvents({ // startFrom: params.startFrom, // startThrough: params.startThrough // }); // // イベントの座席情報検索 // const movieTheatersWithoutScreeningRoom = await repos.place.searchMovieTheaters({}); // const movieTheaters = await Promise.all(movieTheatersWithoutScreeningRoom.map(async (m) => { // return repos.place.findMovieTheaterByBranchCode(m.branchCode); // })); // // 収容人数を集計 // const aggregations: IScreeningEventAggregation[] = await Promise.all(events.map(async (e) => { // let maximumAttendeeCapacity: number = 0; // let remainingAttendeeCapacity: number = 0; // const movieTheater = movieTheaters.find((m) => m.branchCode === e.superEvent.location.branchCode); // if (movieTheater === undefined) { // // 基本的にありえないはずだが、万が一劇場が見つからなければcapacityは0のまま // console.error(new Error('Movie theater not found')); // } else { // const screeningRoom = <factory.place.movieTheater.IScreeningRoom | undefined> // movieTheater.containsPlace.find((p) => p.branchCode === e.location.branchCode); // if (screeningRoom === undefined) { // // 基本的にありえないはずだが、万が一スクリーンが見つからなければcapacityは0のまま // console.error(new Error('Screening room not found')); // } else { // maximumAttendeeCapacity = screeningRoom.containsPlace.reduce((a, b) => a + b.containsPlace.length, 0); // const unavailableOffers = await repos.screeningEventAvailability.findUnavailableOffersByEventId({ eventId: e.id }); // remainingAttendeeCapacity = maximumAttendeeCapacity - unavailableOffers.length; // } // } // return { // id: e.id, // maximumAttendeeCapacity: maximumAttendeeCapacity, // remainingAttendeeCapacity: remainingAttendeeCapacity // }; // })); // // 保管 // await repos.aggregation.store(aggregations, params.ttl); // }; // } /** * 上映イベントデータをID指定で集計する */ function aggregateScreeningEvent(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { // 集計対象イベント検索 const event = yield repos.event.findById(params); // 全予約検索 const limit = 100; let page = 0; let numData = limit; const confirmedReservations = []; while (numData === limit) { page += 1; const reservations = yield repos.reservation.searchScreeningEventReservations({ limit: limit, page: page, reservationFor: { typeOf: factory.eventType.ScreeningEvent, id: event.id }, reservationStatuses: [factory.reservationStatusType.ReservationConfirmed] }); numData = reservations.length; debug('numData:', numData); confirmedReservations.push(...reservations); } // イベントの座席情報検索 const movieTheatersWithoutScreeningRoom = yield repos.place.searchMovieTheaters({}); const movieTheaters = yield Promise.all(movieTheatersWithoutScreeningRoom.map((m) => __awaiter(this, void 0, void 0, function* () { return repos.place.findMovieTheaterByBranchCode({ branchCode: m.branchCode }); }))); // 収容人数を集計 let maximumAttendeeCapacity = 0; let remainingAttendeeCapacity = 0; let checkInCount = 0; let attendeeCount = 0; const movieTheater = movieTheaters.find((m) => m.branchCode === event.superEvent.location.branchCode); if (movieTheater === undefined) { // 基本的にありえないはずだが、万が一劇場が見つからなければcapacityは0のまま console.error(new Error('Movie theater not found')); } else { const screeningRoom = movieTheater.containsPlace.find((p) => p.branchCode === event.location.branchCode); if (screeningRoom === undefined) { // 基本的にありえないはずだが、万が一スクリーンが見つからなければcapacityは0のまま console.error(new Error('Screening room not found')); } else { maximumAttendeeCapacity = screeningRoom.containsPlace.reduce((a, b) => a + b.containsPlace.length, 0); remainingAttendeeCapacity = maximumAttendeeCapacity - confirmedReservations.length; checkInCount = confirmedReservations.filter((r) => r.checkedIn).length; attendeeCount = confirmedReservations.filter((r) => r.attended).length; } } const aggregation = { maximumAttendeeCapacity: maximumAttendeeCapacity, remainingAttendeeCapacity: remainingAttendeeCapacity, checkInCount: checkInCount, attendeeCount: attendeeCount }; debug('aggregation:', aggregation); // 保管 yield repos.event.eventModel.findOneAndUpdate({ typeOf: factory.eventType.ScreeningEvent, _id: event.id }, aggregation, { new: true }).exec(); }); } exports.aggregateScreeningEvent = aggregateScreeningEvent; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"service.js.html":{"id":"service.js.html","title":"Source: service.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service.js "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * service module */ const AggregationService = require("./service/aggregation"); const OfferService = require("./service/offer"); const TaskService = require("./service/task"); const CancelReservationTransactionService = require("./service/transaction/cancelReservation"); const ReserveTransactionService = require("./service/transaction/reserve"); exports.aggregation = AggregationService; exports.offer = OfferService; exports.task = TaskService; var transaction; (function (transaction) { transaction.cancelReservation = CancelReservationTransactionService; transaction.reserve = ReserveTransactionService; })(transaction = exports.transaction || (exports.transaction = {})); × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"service_task_aggregateScreeningEvent.js.html":{"id":"service_task_aggregateScreeningEvent.js.html","title":"Source: service/task/aggregateScreeningEvent.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service/task/aggregateScreeningEvent.js "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const event_1 = require("../../repo/event"); const place_1 = require("../../repo/place"); const reservation_1 = require("../../repo/reservation"); const AggregationService = require("../aggregation"); /** * タスク実行関数 */ function call(data) { return (settings) => __awaiter(this, void 0, void 0, function* () { const eventRepo = new event_1.MongoRepository(settings.connection); const placeRepo = new place_1.MongoRepository(settings.connection); const reservationRepo = new reservation_1.MongoRepository(settings.connection); yield AggregationService.aggregateScreeningEvent(data)({ event: eventRepo, place: placeRepo, reservation: reservationRepo }); }); } exports.call = call; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"service_task_cancelPendingReservation.js.html":{"id":"service_task_cancelPendingReservation.js.html","title":"Source: service/task/cancelPendingReservation.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service/task/cancelPendingReservation.js "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const factory = require("../../factory"); const action_1 = require("../../repo/action"); const screeningEvent_1 = require("../../repo/itemAvailability/screeningEvent"); const reservation_1 = require("../../repo/reservation"); const transaction_1 = require("../../repo/transaction"); const ReserveService = require("../reserve"); /** * タスク実行関数 */ function call(data) { return (settings) => __awaiter(this, void 0, void 0, function* () { if (settings.redisClient === undefined) { throw new factory.errors.Argument('settings', 'redisClient required'); } const actionRepo = new action_1.MongoRepository(settings.connection); const reservationRepo = new reservation_1.MongoRepository(settings.connection); const transactionRepo = new transaction_1.MongoRepository(settings.connection); const eventAvailabilityRepo = new screeningEvent_1.RedisRepository(settings.redisClient); yield ReserveService.cancelPendingReservation(data.actionAttributes)({ action: actionRepo, reservation: reservationRepo, transaction: transactionRepo, eventAvailability: eventAvailabilityRepo }); }); } exports.call = call; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"service_task_cancelReservation.js.html":{"id":"service_task_cancelReservation.js.html","title":"Source: service/task/cancelReservation.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service/task/cancelReservation.js "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const factory = require("../../factory"); const action_1 = require("../../repo/action"); const screeningEvent_1 = require("../../repo/itemAvailability/screeningEvent"); const reservation_1 = require("../../repo/reservation"); const task_1 = require("../../repo/task"); const transaction_1 = require("../../repo/transaction"); const ReserveService = require("../reserve"); /** * タスク実行関数 */ function call(data) { return (settings) => __awaiter(this, void 0, void 0, function* () { if (settings.redisClient === undefined) { throw new factory.errors.Argument('settings', 'redisClient required'); } const actionRepo = new action_1.MongoRepository(settings.connection); const reservationRepo = new reservation_1.MongoRepository(settings.connection); const taskRepo = new task_1.MongoRepository(settings.connection); const transactionRepo = new transaction_1.MongoRepository(settings.connection); const eventAvailabilityRepo = new screeningEvent_1.RedisRepository(settings.redisClient); yield ReserveService.cancelReservation(data.actionAttributes)({ action: actionRepo, reservation: reservationRepo, task: taskRepo, transaction: transactionRepo, eventAvailability: eventAvailabilityRepo }); }); } exports.call = call; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"service_task_reserve.js.html":{"id":"service_task_reserve.js.html","title":"Source: service/task/reserve.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service/task/reserve.js "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const action_1 = require("../../repo/action"); const reservation_1 = require("../../repo/reservation"); const task_1 = require("../../repo/task"); const ReserveService = require("../reserve"); /** * タスク実行関数 */ function call(data) { return (settings) => __awaiter(this, void 0, void 0, function* () { const actionRepo = new action_1.MongoRepository(settings.connection); const reservationRepo = new reservation_1.MongoRepository(settings.connection); const taskRepo = new task_1.MongoRepository(settings.connection); yield ReserveService.confirmReservation(data.actionAttributes)({ action: actionRepo, reservation: reservationRepo, task: taskRepo }); }); } exports.call = call; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"service_transaction_reserve.js.html":{"id":"service_transaction_reserve.js.html","title":"Source: service/transaction/reserve.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service/transaction/reserve.js "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); /** * 予約取引サービス */ const createDebug = require("debug"); const factory = require("../../factory"); const OfferService = require("../offer"); const ReserveService = require("../reserve"); const debug = createDebug('chevre-domain:service'); /** * 取引開始 */ // tslint:disable-next-line:max-func-body-length function start(params) { // tslint:disable-next-line:max-func-body-length return (repos) => __awaiter(this, void 0, void 0, function* () { debug('starting transaction...', params); const now = new Date(); // イベント存在確認 const screeningEvent = yield repos.event.findById({ typeOf: factory.eventType.ScreeningEvent, id: params.object.event.id }); // チケット存在確認 const ticketOffers = yield OfferService.searchScreeningEventTicketOffers({ eventId: params.object.event.id })(repos); const ticketTypes = yield repos.ticketType.findByTicketGroupId({ ticketGroupId: screeningEvent.offers.id }); debug('available ticket type:', ticketTypes); // 座席情報取得 const movieTheater = yield repos.place.findMovieTheaterByBranchCode({ branchCode: screeningEvent.superEvent.location.branchCode }); const screeningRoom = movieTheater.containsPlace.find((p) => p.branchCode === screeningEvent.location.branchCode); if (screeningRoom === undefined) { throw new factory.errors.NotFound('Screening Room', `Event location 'Screening Room ${screeningEvent.location.branchCode}' not found`); } const screeningRoomSections = screeningRoom.containsPlace; // 予約番号発行 const reservationNumber = yield repos.reservationNumber.publish({ reserveDate: now, sellerBranchCode: screeningEvent.superEvent.location.branchCode }); // 取引ファクトリーで新しい進行中取引オブジェクトを作成 const tickets = params.object.acceptedOffer.map((offer) => { const ticketOffer = ticketOffers.find((t) => t.id === offer.id); if (ticketOffer === undefined) { throw new factory.errors.NotFound('Ticket Offer'); } let ticketType = ticketTypes.find((t) => t.id === offer.id); // 基本的に券種でID管理されていないオファーは存在しないが、念のため管理されていないケースに対応 if (ticketType === undefined) { const unitPriceSpec = ticketOffer.priceSpecification.priceComponent.find((spec) => { return spec.typeOf === factory.priceSpecificationType.UnitPriceSpecification; }); if (unitPriceSpec === undefined) { throw new factory.errors.Argument('acceptedOffer', `UnitPriceSpecification for ${offer.id} Not Found`); } ticketType = { typeOf: 'Offer', id: ticketOffer.id, name: ticketOffer.name, description: ticketOffer.description, alternateName: ticketOffer.name, priceCurrency: factory.priceCurrency.JPY, availability: factory.itemAvailability.InStock, priceSpecification: unitPriceSpec }; } const screeningRoomSection = screeningRoomSections.find((section) => section.branchCode === offer.ticketedSeat.seatSection); if (screeningRoomSection === undefined) { throw new factory.errors.NotFound('Screening Room Section', `Screening room section ${offer.ticketedSeat.seatSection} not found`); } const seat = screeningRoomSection.containsPlace.find((p) => p.branchCode === offer.ticketedSeat.seatNumber); if (seat === undefined) { throw new factory.errors.NotFound('Seat', `Seat ${offer.ticketedSeat.seatNumber} not found`); } return { typeOf: 'Ticket', dateIssued: now, issuedBy: { typeOf: screeningEvent.location.typeOf, name: screeningEvent.location.name.ja }, totalPrice: ticketOffer.priceSpecification, priceCurrency: factory.priceCurrency.JPY, ticketedSeat: Object.assign({}, offer.ticketedSeat, seat), underName: { typeOf: params.agent.typeOf, name: params.agent.name }, ticketType: ticketType }; }); // 仮予約作成 const reservations = yield Promise.all(tickets.map((ticket, index) => __awaiter(this, void 0, void 0, function* () { return createReservation({ id: `${reservationNumber}-${index}`, reserveDate: now, agent: params.agent, reservationNumber: reservationNumber, screeningEvent: screeningEvent, reservedTicket: ticket }); }))); const startParams = { typeOf: factory.transactionType.Reserve, agent: params.agent, object: { clientUser: params.object.clientUser, event: screeningEvent, reservations: reservations, notes: params.object.notes }, expires: params.expires }; // 取引作成 let transaction; try { transaction = yield repos.transaction.start(startParams); } catch (error) { // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore next */ if (error.name === 'MongoError') { // no op } throw error; } // 座席ロック yield repos.eventAvailability.lock({ eventId: screeningEvent.id, offers: tickets.map((ticket) => { return { seatSection: ticket.ticketedSeat.seatSection, seatNumber: ticket.ticketedSeat.seatNumber }; }), expires: screeningEvent.endDate, holder: transaction.id }); // 予約作成 yield Promise.all(reservations.map((r) => __awaiter(this, void 0, void 0, function* () { yield repos.reservation.reservationModel.create(Object.assign({}, r, { _id: r.id })); }))); return transaction; }); } exports.start = start; function createReservation(params) { return { typeOf: factory.reservationType.EventReservation, id: params.id, additionalTicketText: params.reservedTicket.ticketType.name.ja, modifiedTime: params.reserveDate, numSeats: 1, price: params.reservedTicket.totalPrice, priceCurrency: factory.priceCurrency.JPY, reservationFor: params.screeningEvent, reservationNumber: params.reservationNumber, reservationStatus: factory.reservationStatusType.ReservationPending, reservedTicket: params.reservedTicket, underName: params.agent, checkedIn: false, attended: false }; } /** * 取引確定 */ function confirm(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { debug(`confirming reserve transaction ${params.id}...`); // 取引存在確認 const transaction = yield repos.transaction.findById({ typeOf: factory.transactionType.Reserve, id: params.id }); // 予約アクション属性作成 const reserveActionAttributes = transaction.object.reservations.map((reservation) => { if (params.object !== undefined) { // 予約属性の指定があれば上書き const confirmingReservation = params.object.reservations.find((r) => r.id === reservation.id); if (confirmingReservation !== undefined) { if (confirmingReservation.reservedTicket !== undefined) { if (confirmingReservation.reservedTicket.issuedBy !== undefined) { reservation.reservedTicket.issuedBy = confirmingReservation.reservedTicket.issuedBy; } } if (confirmingReservation.underName !== undefined) { reservation.underName = confirmingReservation.underName; reservation.reservedTicket.underName = confirmingReservation.underName; } } } return { typeOf: factory.actionType.ReserveAction, description: transaction.object.notes, result: {}, object: reservation, agent: transaction.agent, purpose: { typeOf: transaction.typeOf, id: transaction.id } }; }); const potentialActions = { reserve: reserveActionAttributes }; // 取引確定 const result = {}; yield repos.transaction.confirm({ typeOf: factory.transactionType.Reserve, id: transaction.id, result: result, potentialActions: potentialActions }); }); } exports.confirm = confirm; /** * 取引中止 */ function cancel(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { // まず取引状態変更 const transaction = yield repos.transaction.cancel({ typeOf: factory.transactionType.Reserve, id: params.id }); // 本来非同期でタスクが実行されるが、同期的に仮予約取消が実行されていないと、サービス利用側が困る可能性があるので、 // 一応同期的にもcancelPendingReservationを実行しておく try { const actionAttributes = transaction.object.reservations.map((r) => { return { typeOf: factory.actionType.CancelAction, purpose: { typeOf: transaction.typeOf, id: transaction.id }, agent: transaction.agent, object: r }; }); yield ReserveService.cancelPendingReservation(actionAttributes)(repos); } catch (error) { // no op } }); } exports.cancel = cancel; /** * ひとつの取引のタスクをエクスポートする */ function exportTasks(status) { return (repos) => __awaiter(this, void 0, void 0, function* () { const transaction = yield repos.transaction.startExportTasks({ typeOf: factory.transactionType.Reserve, status: status }); if (transaction === null) { return; } // 失敗してもここでは戻さない(RUNNINGのまま待機) yield exportTasksById(transaction)(repos); yield repos.transaction.setTasksExportedById({ id: transaction.id }); }); } exports.exportTasks = exportTasks; /** * ID指定で取引のタスク出力 */ function exportTasksById(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { const transaction = yield repos.transaction.findById({ typeOf: factory.transactionType.Reserve, id: params.id }); const potentialActions = transaction.potentialActions; const taskAttributes = []; switch (transaction.status) { case factory.transactionStatusType.Confirmed: // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore else */ if (potentialActions !== undefined) { // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore else */ if (potentialActions.reserve !== undefined) { const reserveTask = { name: factory.taskName.Reserve, status: factory.taskStatus.Ready, runsAt: new Date(), remainingNumberOfTries: 10, lastTriedAt: null, numberOfTried: 0, executionResults: [], data: { actionAttributes: potentialActions.reserve } }; taskAttributes.push(reserveTask); } } break; case factory.transactionStatusType.Canceled: case factory.transactionStatusType.Expired: const actionAttributes = transaction.object.reservations.map((r) => { return { typeOf: factory.actionType.CancelAction, purpose: { typeOf: transaction.typeOf, id: transaction.id }, agent: transaction.agent, object: r }; }); const cancelPendingReservationTask = { name: factory.taskName.CancelPendingReservation, status: factory.taskStatus.Ready, runsAt: new Date(), remainingNumberOfTries: 10, lastTriedAt: null, numberOfTried: 0, executionResults: [], data: { actionAttributes: actionAttributes } }; taskAttributes.push(cancelPendingReservationTask); break; default: throw new factory.errors.NotImplemented(`Transaction status "${transaction.status}" not implemented.`); } debug('taskAttributes prepared', taskAttributes); return Promise.all(taskAttributes.map((a) => __awaiter(this, void 0, void 0, function* () { return repos.task.save(a); }))); }); } exports.exportTasksById = exportTasksById; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"service_reserve.js.html":{"id":"service_reserve.js.html","title":"Source: service/reserve.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service/reserve.js "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); /** * 予約サービス */ const createDebug = require("debug"); const factory = require("../factory"); const debug = createDebug('chevre-domain:service'); /** * 予約を確定する */ function confirmReservation(actionAttributesList) { return (repos) => __awaiter(this, void 0, void 0, function* () { yield Promise.all(actionAttributesList.map((actionAttributes) => __awaiter(this, void 0, void 0, function* () { // アクション開始 const action = yield repos.action.start(actionAttributes); try { // 予約を確定状態に変更する yield repos.reservation.confirm(actionAttributes.object); } catch (error) { // actionにエラー結果を追加 try { const actionError = Object.assign({}, error, { message: error.message, name: error.name }); yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error: actionError }); } catch (__) { // 失敗したら仕方ない } throw error; } // アクション完了 const actionResult = {}; yield repos.action.complete({ typeOf: action.typeOf, id: action.id, result: actionResult }); }))); const aggregateTask = { name: factory.taskName.AggregateScreeningEvent, status: factory.taskStatus.Ready, runsAt: new Date(), remainingNumberOfTries: 10, lastTriedAt: null, numberOfTried: 0, executionResults: [], data: actionAttributesList[0].object.reservationFor }; yield repos.task.save(aggregateTask); }); } exports.confirmReservation = confirmReservation; /** * 進行中の予約をキャンセルする */ function cancelPendingReservation(actionAttributesList) { return (repos) => __awaiter(this, void 0, void 0, function* () { const reserveTransaction = yield repos.transaction.findById({ typeOf: factory.transactionType.Reserve, id: actionAttributesList[0].purpose.id }); debug('canceling reservations...', actionAttributesList); yield Promise.all(actionAttributesList.map((actionAttributes) => __awaiter(this, void 0, void 0, function* () { // アクション開始 const action = yield repos.action.start(actionAttributes); try { // 予約をキャンセル状態に変更する const reservation = actionAttributes.object; yield repos.reservation.cancel({ id: reservation.id }); // 予約取引がまだ座席を保持していれば座席ロック解除 const lockKey = { eventId: reservation.reservationFor.id, offer: { seatNumber: reservation.reservedTicket.ticketedSeat.seatNumber, seatSection: reservation.reservedTicket.ticketedSeat.seatSection } }; const holder = yield repos.eventAvailability.getHolder(lockKey); if (holder === reserveTransaction.id) { yield repos.eventAvailability.unlock(lockKey); } } catch (error) { // actionにエラー結果を追加 try { const actionError = Object.assign({}, error, { message: error.message, name: error.name }); yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error: actionError }); } catch (__) { // 失敗したら仕方ない } throw error; } // アクション完了 const actionResult = {}; yield repos.action.complete({ typeOf: action.typeOf, id: action.id, result: actionResult }); }))); }); } exports.cancelPendingReservation = cancelPendingReservation; /** * 予約をキャンセルする */ function cancelReservation(actionAttributesList) { return (repos) => __awaiter(this, void 0, void 0, function* () { const cancelReservationTransaction = yield repos.transaction.findById({ typeOf: factory.transactionType.CancelReservation, id: actionAttributesList[0].purpose.id }); debug('canceling reservations...', actionAttributesList); yield Promise.all(actionAttributesList.map((actionAttributes) => __awaiter(this, void 0, void 0, function* () { // アクション開始 const action = yield repos.action.start(actionAttributes); try { // 予約をキャンセル状態に変更する const reservation = actionAttributes.object; yield repos.reservation.cancel({ id: reservation.id }); // 予約取引がまだ座席を保持していれば座席ロック解除 const lockKey = { eventId: reservation.reservationFor.id, offer: { seatNumber: reservation.reservedTicket.ticketedSeat.seatNumber, seatSection: reservation.reservedTicket.ticketedSeat.seatSection } }; const holder = yield repos.eventAvailability.getHolder(lockKey); if (holder === cancelReservationTransaction.object.transaction.id) { yield repos.eventAvailability.unlock(lockKey); } } catch (error) { // actionにエラー結果を追加 try { const actionError = Object.assign({}, error, { message: error.message, name: error.name }); yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error: actionError }); } catch (__) { // 失敗したら仕方ない } throw error; } // アクション完了 const actionResult = {}; yield repos.action.complete({ typeOf: action.typeOf, id: action.id, result: actionResult }); }))); const aggregateTask = { name: factory.taskName.AggregateScreeningEvent, status: factory.taskStatus.Ready, runsAt: new Date(), remainingNumberOfTries: 10, lastTriedAt: null, numberOfTried: 0, executionResults: [], data: actionAttributesList[0].object.reservationFor }; yield repos.task.save(aggregateTask); }); } exports.cancelReservation = cancelReservation; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"service_transaction_cancelReservation.js.html":{"id":"service_transaction_cancelReservation.js.html","title":"Source: service/transaction/cancelReservation.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: service/transaction/cancelReservation.js "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); /** * 予約キャンセル取引サービス */ const createDebug = require("debug"); const factory = require("../../factory"); const debug = createDebug('chevre-domain:service'); /** * 取引開始 */ function start(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { debug('starting transaction...', params); // 予約取引存在確認 const reserveTransaction = yield repos.transaction.findById({ typeOf: factory.transactionType.Reserve, id: params.object.transaction.id }); const startParams = { typeOf: factory.transactionType.CancelReservation, agent: params.agent, object: { clientUser: params.object.clientUser, transaction: reserveTransaction }, expires: params.expires }; // 取引作成 let transaction; try { transaction = yield repos.transaction.start(startParams); } catch (error) { // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore next */ if (error.name === 'MongoError') { // no op } throw error; } // tslint:disable-next-line:no-suspicious-comment // TODO 予約ホールド // await Promise.all(reservations.map(async (r) => { // await repos.reservation.reservationModel.create({ ...r, _id: r.id }); // })); return transaction; }); } exports.start = start; /** * 取引確定 */ function confirm(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { debug(`confirming reserve transaction ${params.id}...`); // 取引存在確認 const transaction = yield repos.transaction.findById({ typeOf: factory.transactionType.CancelReservation, id: params.id }); const reserveTransaction = transaction.object.transaction; // 予約アクション属性作成 const cancelReservationActionAttributes = reserveTransaction.object.reservations.map((r) => { return { typeOf: factory.actionType.CancelAction, // description: transaction.object.notes, result: {}, object: r, agent: transaction.agent, purpose: { typeOf: transaction.typeOf, id: transaction.id } }; }); const potentialActions = { cancelReservation: cancelReservationActionAttributes }; // 取引確定 const result = {}; yield repos.transaction.confirm({ typeOf: factory.transactionType.CancelReservation, id: transaction.id, result: result, potentialActions: potentialActions }); }); } exports.confirm = confirm; /** * ひとつの取引のタスクをエクスポートする */ function exportTasks(status) { return (repos) => __awaiter(this, void 0, void 0, function* () { const transaction = yield repos.transaction.startExportTasks({ typeOf: factory.transactionType.CancelReservation, status: status }); if (transaction === null) { return; } // 失敗してもここでは戻さない(RUNNINGのまま待機) yield exportTasksById(transaction)(repos); yield repos.transaction.setTasksExportedById({ id: transaction.id }); }); } exports.exportTasks = exportTasks; /** * ID指定で取引のタスク出力 */ function exportTasksById(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { const transaction = yield repos.transaction.findById({ typeOf: factory.transactionType.CancelReservation, id: params.id }); const potentialActions = transaction.potentialActions; const taskAttributes = []; switch (transaction.status) { case factory.transactionStatusType.Confirmed: // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore else */ if (potentialActions !== undefined) { // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore else */ if (potentialActions.cancelReservation !== undefined) { const cancelReservationTask = { name: factory.taskName.CancelReservation, status: factory.taskStatus.Ready, runsAt: new Date(), remainingNumberOfTries: 10, lastTriedAt: null, numberOfTried: 0, executionResults: [], data: { actionAttributes: potentialActions.cancelReservation } }; taskAttributes.push(cancelReservationTask); } } break; case factory.transactionStatusType.Canceled: case factory.transactionStatusType.Expired: // const cancelMoneyTransferTask: factory.task.cancelMoneyTransfer.IAttributes = { // name: factory.taskName.CancelMoneyTransfer, // status: factory.taskStatus.Ready, // runsAt: new Date(), // なるはやで実行 // remainingNumberOfTries: 10, // lastTriedAt: null, // numberOfTried: 0, // executionResults: [], // data: { // transaction: { typeOf: transaction.typeOf, id: transaction.id } // } // }; // taskAttributes.push(cancelMoneyTransferTask); break; default: throw new factory.errors.NotImplemented(`Transaction status "${transaction.status}" not implemented.`); } debug('taskAttributes prepared', taskAttributes); return Promise.all(taskAttributes.map((a) => __awaiter(this, void 0, void 0, function* () { return repos.task.save(a); }))); }); } exports.exportTasksById = exportTasksById; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"repo_mongoose_schemaTypes_multilingualString.js.html":{"id":"repo_mongoose_schemaTypes_multilingualString.js.html","title":"Source: repo/mongoose/schemaTypes/multilingualString.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: repo/mongoose/schemaTypes/multilingualString.js "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * 多言語文字列mongooseスキーマタイプ */ exports.default = { en: { type: String, required: false }, ja: { type: String, required: false }, kr: { type: String, required: false } }; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"index.js.html":{"id":"index.js.html","title":"Source: index.js","body":" Chevre Domain Library for Node.js Classes MongoRepositoryRedisRepositoryRepository Global abortaccountTitle_1aggregateScreeningEventAggregationServicecallcancelcancelPendingReservationcancelReservationconfirmconfirmReservationcreateDebugdefaultexecuteexecuteByNameexportTasksexportTasksByIdmongooseredisretryschemasearchScreeningEventTicketOfferssortOrder4executionOfTasksstart Source: index.js "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * index module */ const mongoose = require("mongoose"); const redis = require("redis"); const factory = require("./factory"); const repository = require("./repository"); const service = require("./service"); /** * MongoDBクライアント`mongoose` * @example * const promise = domain.mongoose.connect('mongodb://localhost/myapp', { * useMongoClient: true * }); */ exports.mongoose = mongoose; /** * Redis Cacheクライアント * @example * const client = domain.redis.createClient({ * host: process.env.REDIS_HOST, * port: process.env.REDIS_PORT, * password: process.env.REDIS_KEY, * tls: { servername: process.env.REDIS_HOST } * }); */ exports.redis = redis; exports.factory = factory; exports.repository = repository; exports.service = service; × Search results Close Documentation generated by JSDoc 3.5.5 on Sun Dec 16th 2018 using the DocStrap template. "},"repo_accountTitle.js.html":{"id":"repo_accountTitle.js.html","title":"Source: repo/accountTitle.js","body":" Chevre Domain Library for Node.js C