@chevre/domain
Version:
Chevre Domain Library for Node.js
232 lines (231 loc) • 11.3 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.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;