@chevre/domain
Version:
Chevre Domain Library for Node.js
312 lines (311 loc) • 16.9 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.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);
}
}
});
}
;