UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

232 lines (231 loc) 11.3 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.AcceptedOfferRepo = void 0; const factory = require("../factory"); const order_1 = require("./mongoose/schemas/order"); const order_2 = require("./order"); const settings_1 = require("../settings"); /** * 注文オファーリポジトリ */ class AcceptedOfferRepo { constructor(connection) { this.orderModel = connection.model(order_1.modelName, (0, order_1.createSchema)()); } /** * オファー展開の注文検索 */ searchWithUnwoundAcceptedOffers(params, projection) { return __awaiter(this, void 0, void 0, function* () { var _a; const conditions = order_2.OrderRepo.CREATE_MONGO_CONDITIONS(params); const aggregate = this.orderModel.aggregate(); // pipelineの順序に注意 // @see https://docs.mongodb.com/manual/reference/operator/aggregation/sort/ // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore else */ if (typeof ((_a = params.sort) === null || _a === void 0 ? void 0 : _a.orderDate) === 'number') { aggregate.sort({ orderDate: params.sort.orderDate }); } aggregate.unwind('$acceptedOffers'); conditions.forEach((c) => { aggregate.match(c); }); aggregate.project(Object.assign(Object.assign({}, projection), { acceptedOffers: ['$acceptedOffers'] })); if (typeof params.limit === 'number' && params.limit > 0) { const page = (typeof params.page === 'number' && params.page > 0) ? params.page : 1; aggregate.limit(params.limit * page) .skip(params.limit * (page - 1)); } return aggregate // .allowDiskUse(true) // false化(2023-11-30~) .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS }) .exec(); }); } aggreateOwnershipInfosByOrder(filter) { return __awaiter(this, void 0, void 0, function* () { const aggregate = this.orderModel.aggregate([ { $unwind: { path: '$acceptedOffers', includeArrayIndex: 'acceptedOfferIndex' } }, { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } }, { $match: { typeOf: { $eq: factory.order.OrderType.Order } } }, { $project: { _id: 0, // acceptedOfferIndex: '$acceptedOfferIndex', // itemOfferedTypeOf: '$acceptedOffers.itemOffered.typeOf', // customerId: '$customer.id', // orderNumber: '$orderNumber', identifier: { $concat: ['$customer.id', '-', '$acceptedOffers.itemOffered.typeOf', '-', '$orderNumber', '-', { $toString: '$acceptedOfferIndex' }] } } } ]); return aggregate .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS }) .exec(); }); } /** * 注文オファーを展開して検索する */ searchAcceptedOffersByOrderNumber(filter, inclusion) { return __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q; const matchStages = [ { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } }, { $match: { 'project.id': { $eq: filter.project.id.$eq } } }, { $match: { typeOf: { $eq: factory.order.OrderType.Order } } } ]; const itemOfferedIdEq = (_c = (_b = (_a = filter.acceptedOffers) === null || _a === void 0 ? void 0 : _a.itemOffered) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.$eq; if (typeof itemOfferedIdEq === 'string') { matchStages.push({ $match: { 'acceptedOffers.itemOffered.id': { $exists: true, $eq: itemOfferedIdEq } } }); } const itemOfferedTypeOfIn = (_f = (_e = (_d = filter.acceptedOffers) === null || _d === void 0 ? void 0 : _d.itemOffered) === null || _e === void 0 ? void 0 : _e.typeOf) === null || _f === void 0 ? void 0 : _f.$in; if (Array.isArray(itemOfferedTypeOfIn)) { matchStages.push({ $match: { 'acceptedOffers.itemOffered.typeOf': { $exists: true, $in: itemOfferedTypeOfIn } } }); } const resevationForIdIn = (_k = (_j = (_h = (_g = filter.acceptedOffers) === null || _g === void 0 ? void 0 : _g.itemOffered) === null || _h === void 0 ? void 0 : _h.reservationFor) === null || _j === void 0 ? void 0 : _j.id) === null || _k === void 0 ? void 0 : _k.$in; if (Array.isArray(resevationForIdIn)) { matchStages.push({ $match: { 'acceptedOffers.itemOffered.reservationFor.id': { $exists: true, $in: resevationForIdIn } } }); } const ticketedSeatNumberIn = (_q = (_p = (_o = (_m = (_l = filter.acceptedOffers) === null || _l === void 0 ? void 0 : _l.itemOffered) === null || _m === void 0 ? void 0 : _m.reservedTicket) === null || _o === void 0 ? void 0 : _o.ticketedSeat) === null || _p === void 0 ? void 0 : _p.seatNumber) === null || _q === void 0 ? void 0 : _q.$in; if (Array.isArray(ticketedSeatNumberIn)) { matchStages.push({ $match: { 'acceptedOffers.itemOffered.reservedTicket.ticketedSeat.seatNumber': { $exists: true, $in: ticketedSeatNumberIn } } }); } const aggregate = this.orderModel.aggregate([ // if (typeof params.sort?.orderDate === 'number') { // aggregate.sort({ orderDate: params.sort.orderDate }); // } { $unwind: { path: '$acceptedOffers' // includeArrayIndex: 'elementIndex' } }, ...matchStages ]); if (Array.isArray(inclusion) && inclusion.length > 0) { const specifiedProjection = { _id: 0 }; inclusion.forEach((key) => { specifiedProjection[key] = `$acceptedOffers.${key}`; }); aggregate.project(specifiedProjection); } else { aggregate.project({ _id: 0, itemOffered: '$acceptedOffers.itemOffered', priceSpecification: '$acceptedOffers.priceSpecification', typeOf: '$acceptedOffers.typeOf', id: '$acceptedOffers.id', offeredThrough: '$acceptedOffers.offeredThrough', name: '$acceptedOffers.name', serialNumber: '$acceptedOffers.serialNumber' }); } if (typeof filter.limit === 'number' && filter.limit > 0) { const page = (typeof filter.page === 'number' && filter.page > 0) ? filter.page : 1; aggregate.limit(filter.limit * page) .skip(filter.limit * (page - 1)); } return aggregate .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS }) .exec(); }); } /** * 注文オファーをsliceして検索する(2024-01-10~) */ searchSlicedAcceptedOffersByOrderNumber(filter) { return __awaiter(this, void 0, void 0, function* () { const aggregate = this.orderModel.aggregate([ { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } }, { $match: { 'project.id': { $eq: filter.project.id.$eq } } }, { $match: { typeOf: { $eq: factory.order.OrderType.Order } } }, { $project: { _id: 0, acceptedOffers: { $slice: ['$acceptedOffers', ...filter.$slice] }, numAcceptedOffers: { $size: '$acceptedOffers' } } } ]); const result = (yield aggregate .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS }) .exec()).shift(); if (result === undefined) { throw new factory.errors.NotFound(factory.order.OrderType.Order); } return result; }); } countByOrderNumber(filter) { return __awaiter(this, void 0, void 0, function* () { const aggregate = this.orderModel.aggregate([ { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } }, { $match: { 'project.id': { $eq: filter.project.id.$eq } } }, { $match: { typeOf: { $eq: factory.order.OrderType.Order } } }, { $project: { _id: 0, numAcceptedOffers: { $size: '$acceptedOffers' } } } ]); const result = (yield aggregate .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS }) .exec()).shift(); if (result === undefined) { throw new factory.errors.NotFound(factory.order.OrderType.Order); } return result; }); } /** * 特定のフィールド値リストを検索する */ distinctValues(filter, field) { return __awaiter(this, void 0, void 0, function* () { if (!Array.isArray(filter.orderNumber.$in) || filter.orderNumber.$in.length === 0) { return []; } const filterQuery = { orderNumber: { $in: filter.orderNumber.$in }, typeOf: { $eq: factory.order.OrderType.Order } }; filterQuery[field] = { $exists: true }; return this.orderModel.distinct(field, filterQuery) .setOptions({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS }) .exec(); }); } } exports.AcceptedOfferRepo = AcceptedOfferRepo;