UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

74 lines (73 loc) 3.75 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.EventSellerMakesOfferRepo = void 0; const factory = require("../factory"); const settings_1 = require("../settings"); const event_1 = require("./mongoose/schemas/event"); /** * イベントの販売者makesOfferリポジトリ */ class EventSellerMakesOfferRepo { constructor(connection) { this.eventModel = connection.model(event_1.modelName, (0, event_1.createSchema)()); } /** * 指定クライアントのオファーを集計する(2024-10-09~) */ aggregateMakesOffer(conditions) { return __awaiter(this, void 0, void 0, function* () { var _a; const { availableAtOrFrom } = conditions; if (typeof ((_a = availableAtOrFrom === null || availableAtOrFrom === void 0 ? void 0 : availableAtOrFrom.id) === null || _a === void 0 ? void 0 : _a.$eq) !== 'string' || availableAtOrFrom.id.$eq === '') { throw new factory.errors.ArgumentNull('availableAtOrFrom.id.$eq'); } const matchStages = [ { $match: { 'project.id': { $eq: conditions.project.id.$eq } } }, { $match: { 'offers.seller.makesOffer.availableAtOrFrom.id': { $exists: true, $eq: availableAtOrFrom.id.$eq } } } ]; const reservationForIdIn = conditions.itemOffered.serviceOutput.reservationFor.id.$in; if (Array.isArray(reservationForIdIn)) { matchStages.push({ $match: { _id: { $in: reservationForIdIn } } }); } const aggregate = this.eventModel.aggregate([ { $unwind: '$offers.seller.makesOffer' }, ...matchStages, { $sort: { _id: factory.sortType.Ascending } }, { $project: { _id: 0, availabilityEnds: '$offers.seller.makesOffer.availabilityEnds', availabilityStarts: '$offers.seller.makesOffer.availabilityStarts', validFrom: '$offers.seller.makesOffer.validFrom', validThrough: '$offers.seller.makesOffer.validThrough', itemOffered: { serviceOutput: { reservationFor: { id: { $toString: '$_id' } } } } } } ]); if (typeof conditions.limit === 'number' && conditions.limit > 0) { const page = (typeof conditions.page === 'number' && conditions.page > 0) ? conditions.page : 1; aggregate.limit(conditions.limit * page) .skip(conditions.limit * (page - 1)); } return aggregate .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS }) .exec(); }); } } exports.EventSellerMakesOfferRepo = EventSellerMakesOfferRepo;