UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

312 lines (311 loc) 16.9 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.onEventChanged = onEventChanged; const createDebug = require("debug"); const moment = require("moment"); const factory = require("../../factory"); const debug = createDebug('chevre-domain:service:offer:onEventChanged'); /** * イベント変更時処理 */ function onEventChanged(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { if (params.id.length > 0) { const setting = yield repos.setting.findOne({ project: { id: { $eq: '*' } } }, ['onResourceUpdated', 'onEventChanged', 'useInformResourceTypes']); const useInformResourceTypes = setting === null || setting === void 0 ? void 0 : setting.useInformResourceTypes; const useInform = params.useInform === true && Array.isArray(useInformResourceTypes) && useInformResourceTypes.includes(params.typeOf); // ScreeningEventであれば集計タスク -> migrate to agg(2024-10-31~) // inform to agg(2024-10-30~) yield createInform2aggTasks({ project: { id: params.project.id }, ids: params.id, typeOf: params.typeOf, isNew: params.isNew }, setting)(repos); if (useInform) { yield createInformTasks({ project: { id: params.project.id }, ids: params.id, typeOf: params.typeOf }, setting)(repos); } if (params.useSync === true) { switch (params.typeOf) { case factory.eventType.ScreeningEventSeries: // 施設コンテンツを興行イベントへ同期(2023-07-28~) yield syncEventSeries2screeningEvents({ project: { id: params.project.id }, ids: params.id })(repos); break; default: // no op } } if (params.typeOf === factory.eventType.Event || params.typeOf === factory.eventType.ScreeningEvent) { if (repos.pendingReservation !== undefined) { // sync pendingReservations.expires(2025-05-08~) yield syncEventEndDate2pendingReservations({ ids: params.id, typeOf: params.typeOf })({ event: repos.event, pendingReservation: repos.pendingReservation, setting: repos.setting }); } } } }); } function syncEventSeries2screeningEvents(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { const now = new Date(); for (const eventSeriesId of params.ids) { const superEvents = yield repos.eventSeries.projectEventSeriesFields({ limit: 1, page: 1, // typeOf: factory.eventType.ScreeningEventSeries, id: { $eq: eventSeriesId }, project: { id: { $eq: params.project.id } } }, [ 'additionalProperty', 'alternativeHeadline', 'description', 'dubLanguage', 'endDate', 'headline', 'kanaName', 'location', 'name', 'soundFormat', 'startDate', 'subtitleLanguage', 'typeOf', 'videoFormat', 'workPerformed' ]); const superEventFromDB = superEvents.shift(); if (superEventFromDB === undefined) { throw new factory.errors.NotFound(factory.eventType.ScreeningEventSeries); } yield repos.event.syncScreeningEventSeries2screeningEvents({ project: { id: params.project.id }, // superEvent: { id: eventSeriesId }, superEventFromDB, startDate: { $gte: now } }); } }); } function createInformTasks(params, setting) { // tslint:disable-next-line:max-func-body-length return (repos // settings: Settings ) => __awaiter(this, void 0, void 0, function* () { var _a; let events4inform; // const informEvents = settings.onEventChanged.informEvent; const informEvents = (_a = setting === null || setting === void 0 ? void 0 : setting.onResourceUpdated) === null || _a === void 0 ? void 0 : _a.informResource; if (params.typeOf === factory.eventType.Event) { const eventsFromDB = yield repos.event.projectEventFields({ id: { $in: params.ids }, typeOf: params.typeOf }, [ 'project', 'organizer', 'typeOf', 'name', 'doorTime', 'endDate', 'eventStatus', 'location', 'startDate', 'additionalProperty' ] // inclusion(2024-07-30~) ); // 最適化(2024-03-26~) events4inform = eventsFromDB.map(({ project, organizer, typeOf, name, doorTime, endDate, eventStatus, location, startDate, id, additionalProperty }) => { return { project, organizer, typeOf, name, doorTime, endDate, eventStatus, location, startDate, id, additionalProperty }; }); } else if (params.typeOf === factory.eventType.ScreeningEvent) { const screeningEvents4inform = yield repos.event.projectEventFields({ id: { $in: params.ids }, typeOf: params.typeOf }, [ 'project', 'organizer', 'typeOf', 'name', 'doorTime', 'endDate', 'eventStatus', 'location', 'startDate', 'superEvent', 'offers', 'additionalProperty' ] // inclusion(2024-07-30~) ); // 最適化(2024-03-22~) events4inform = screeningEvents4inform.map(({ project, organizer, typeOf, name, doorTime, endDate, eventStatus, location, startDate, superEvent, offers, id, additionalProperty }) => { var _a; return { project, organizer, typeOf, name, doorTime, endDate, eventStatus, location, startDate, superEvent, id, additionalProperty, offers: (((_a = offers.offeredThrough) === null || _a === void 0 ? void 0 : _a.identifier) === factory.service.webAPI.Identifier.COA) ? { typeOf: offers.typeOf, itemOffered: offers.itemOffered } : { typeOf: offers.typeOf, itemOffered: offers.itemOffered, seller: { id: offers.seller.id, typeOf: offers.seller.typeOf, // makesOfferを追加(2024-03-26~) makesOffer: (Array.isArray(offers.seller.makesOffer)) ? offers.seller.makesOffer.map(({ availabilityEnds, availabilityStarts, availableAtOrFrom, validFrom, validThrough }) => { // support availableAtOrFrom as non-array(2024-10-13~) const availableAtOrFrom4inform = (Array.isArray(availableAtOrFrom)) ? availableAtOrFrom : (typeof (availableAtOrFrom === null || availableAtOrFrom === void 0 ? void 0 : availableAtOrFrom.id) === 'string') ? [availableAtOrFrom] : undefined; return Object.assign({ availabilityEnds, availabilityStarts, validFrom, validThrough }, (Array.isArray(availableAtOrFrom4inform)) ? { availableAtOrFrom: availableAtOrFrom4inform } : undefined); }) : [] } } }; }); } else { const screeningEventSeries4inform = yield repos.eventSeries.projectEventSeriesFields({ id: { $in: params.ids } // typeOf: params.typeOf }, [ 'project', 'organizer', 'typeOf', 'name', 'location', 'videoFormat', 'soundFormat', 'workPerformed', 'kanaName', 'eventStatus', 'endDate', 'startDate', 'additionalProperty', 'subtitleLanguage', 'dubLanguage', 'alternativeHeadline', 'description', 'duration', 'headline' ] // inclusion(2024-07-30~) ); // 最適化(2024-03-25~) events4inform = screeningEventSeries4inform.map(({ project, organizer, typeOf, name, location, id, videoFormat, soundFormat, workPerformed, kanaName, eventStatus, endDate, startDate, additionalProperty, subtitleLanguage, dubLanguage, alternativeHeadline, description, duration, headline }) => { return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ project, organizer, typeOf, name, location, id, videoFormat, soundFormat, workPerformed, kanaName, eventStatus }, (endDate !== undefined) ? { endDate } : undefined), (startDate !== undefined) ? { startDate } : undefined), (Array.isArray(additionalProperty)) ? { additionalProperty } : undefined), (subtitleLanguage !== undefined) ? {} : undefined), (dubLanguage !== undefined) ? { dubLanguage } : undefined), (alternativeHeadline !== undefined) ? { alternativeHeadline } : undefined), (description !== undefined) ? { description } : undefined), (typeof duration === 'string') ? { duration } : undefined), (headline !== undefined) ? { headline } : undefined); }); } if (events4inform.length > 0) { const taskRunsAt = new Date(); const informTasks = []; informEvents === null || informEvents === void 0 ? void 0 : informEvents.forEach((informEvent) => { var _a; const informUrl = String((_a = informEvent.recipient) === null || _a === void 0 ? void 0 : _a.url); events4inform.forEach((event4inform) => { var _a; // _idは不要であり、存在すると予期せぬ影響を及ぼす可能性がある delete event4inform._id; const informActionAttributes = { object: event4inform, recipient: { id: '', name: String((_a = informEvent.recipient) === null || _a === void 0 ? void 0 : _a.name), typeOf: factory.creativeWorkType.WebApplication // url: informUrl // discontinue(2025-02-13~) }, target: { httpMethod: 'POST', encodingType: factory.encodingFormat.Application.json, typeOf: 'EntryPoint', urlTemplate: informUrl } }; informTasks.push({ project: event4inform.project, name: factory.taskName.TriggerWebhook, status: factory.taskStatus.Ready, runsAt: taskRunsAt, remainingNumberOfTries: 10, numberOfTried: 0, executionResults: [], data: informActionAttributes }); }); }); if (informTasks.length > 0) { yield repos.task.saveMany(informTasks, { emitImmediately: true }); } } }); } function createInform2aggTasks(params, setting) { return (repos // settings: Settings ) => __awaiter(this, void 0, void 0, function* () { var _a; let event4inform; // const informEvent2agg = settings.onEventChanged.informEvent2agg; const informEvent2agg = (_a = setting === null || setting === void 0 ? void 0 : setting.onEventChanged) === null || _a === void 0 ? void 0 : _a.informEvent2agg; if (params.typeOf === factory.eventType.ScreeningEvent) { event4inform = { id: params.ids, isNew: params.isNew === true, project: { id: params.project.id, typeOf: factory.organizationType.Project }, typeOf: factory.eventType.ScreeningEvent }; } if (event4inform !== undefined) { const informObject = event4inform; if (Array.isArray(informEvent2agg)) { const taskRunsAt = new Date(); const informTasks = informEvent2agg.map((informEvent) => { var _a, _b; const informUrl = String((_a = informEvent.recipient) === null || _a === void 0 ? void 0 : _a.url); const informActionAttributes = { object: informObject, recipient: { id: '', name: String((_b = informEvent.recipient) === null || _b === void 0 ? void 0 : _b.name), typeOf: factory.creativeWorkType.WebApplication // url: informUrl // discontinue(2025-02-13~) }, target: { httpMethod: 'POST', encodingType: factory.encodingFormat.Application.json, typeOf: 'EntryPoint', urlTemplate: informUrl } }; return { project: informObject.project, name: factory.taskName.TriggerWebhook, status: factory.taskStatus.Ready, runsAt: taskRunsAt, remainingNumberOfTries: 10, numberOfTried: 0, executionResults: [], data: informActionAttributes }; }); if (informTasks.length > 0) { yield repos.task.saveMany(informTasks, { emitImmediately: true }); } } } }); } function syncEventEndDate2pendingReservations(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { var _a, _b; const setting = yield repos.setting.findOne({ project: { id: { $eq: '*' } } }, ['storage']); const stockHoldAfterEventEndInDays = (_a = setting === null || setting === void 0 ? void 0 : setting.storage) === null || _a === void 0 ? void 0 : _a.stockHoldAfterEventEndInDays; if (typeof stockHoldAfterEventEndInDays !== 'number') { throw new factory.errors.NotFound('setting.storage.stockHoldAfterEventEndInDays'); } for (const eventId of params.ids) { const events = yield repos.event.projectEventFields({ limit: 1, page: 1, id: { $eq: eventId }, typeOf: params.typeOf }, ['endDate']); const endDate = (_b = events.shift()) === null || _b === void 0 ? void 0 : _b.endDate; if (endDate instanceof Date) { const expires = moment(endDate) .add(stockHoldAfterEventEndInDays, 'days') .toDate(); debug('syncEvent2expires processing...', eventId, endDate, expires); const syncResult = yield repos.pendingReservation.syncEvent2expires({ expires, reservationFor: { id: eventId } }); debug('syncEvent2expires processed.', syncResult); } } }); }