@chevre/domain
Version:
Chevre Domain Library for Node.js
74 lines (73 loc) • 3.75 kB
JavaScript
"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;