@chevre/domain
Version:
Chevre Domain Library for Node.js
173 lines (172 loc) • 7.04 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.OrderInTransactionRepo = void 0;
const factory = require("../factory");
const order_1 = require("./mongoose/schemas/order");
/**
* 取引中注文リポジトリ
*/
class OrderInTransactionRepo {
constructor(connection) {
this.orderModel = connection.model(order_1.modelName, (0, order_1.createSchema)());
}
/**
* 取引進行中の注文からacceptedOffersを検索する
*/
findAcceptedOffersByOrderNumber(params) {
return __awaiter(this, void 0, void 0, function* () {
const doc = yield this.orderModel.findOne({
orderNumber: { $eq: params.orderNumber.$eq },
typeOf: { $eq: factory.transactionType.PlaceOrder }
}, { acceptedOffers: 1 })
.lean()
.exec();
if (doc === null) {
throw new factory.errors.NotFound('orderInTransaction');
}
return doc.acceptedOffers;
});
}
/**
* 注文を受注する
*/
placeOrder(order) {
return __awaiter(this, void 0, void 0, function* () {
if (!(order.orderDate instanceof Date)) {
throw new factory.errors.Argument('orderDate', 'must be Date');
}
let setFields;
// acceptedOffersを上書きしない
// const { acceptedOffers, ...orderWithoutAcceptedOffers } = order;
setFields = order;
// typeOf:PlaceOrderのドキュメントが存在すれば、typeOf:Orderに変更する
yield this.orderModel.updateOne({
orderNumber: { $eq: order.orderNumber },
typeOf: { $eq: factory.transactionType.PlaceOrder }
}, { $set: setFields }, {})
.exec();
});
}
acceptOffer(params) {
return __awaiter(this, void 0, void 0, function* () {
if (!Array.isArray(params.acceptedOffers) || params.acceptedOffers.length === 0) {
return;
}
const setOnInsert = {
typeOf: factory.transactionType.PlaceOrder,
orderDate: new Date(), // orderDate required(2024-12-09~)
orderNumber: params.orderNumber,
project: params.project
};
return this.orderModel.updateOne({
typeOf: { $eq: factory.transactionType.PlaceOrder },
orderNumber: { $eq: params.orderNumber }
}, {
$setOnInsert: setOnInsert,
$push: {
acceptedOffers: {
$each: params.acceptedOffers
}
}
}, { upsert: true })
.exec();
});
}
/**
* serialNumberからオファーを除外する
* ホワイトリストとブラックリスト両方に対応
*/
voidAcceptedOfferBySerialNumber(params) {
return __awaiter(this, void 0, void 0, function* () {
const serialNumberIn = params.acceptedOffers.serialNumber.$in;
const serialNumberNin = params.acceptedOffers.serialNumber.$nin;
if (Array.isArray(serialNumberIn) && serialNumberIn.length > 0) {
return this.orderModel.updateOne({
typeOf: { $eq: factory.transactionType.PlaceOrder },
orderNumber: { $eq: params.orderNumber }
}, {
$pull: {
acceptedOffers: {
serialNumber: { $exists: true, $in: serialNumberIn }
}
}
})
.exec();
}
else if (Array.isArray(serialNumberNin) && serialNumberNin.length > 0) {
return this.orderModel.updateOne({
typeOf: { $eq: factory.transactionType.PlaceOrder },
orderNumber: { $eq: params.orderNumber }
}, {
$pull: {
acceptedOffers: {
serialNumber: { $nin: serialNumberNin }
}
}
})
.exec();
}
else {
return;
}
});
}
setCustomer(params) {
return __awaiter(this, void 0, void 0, function* () {
const { customer, orderNumber, project } = params;
const filter = {
typeOf: { $eq: factory.transactionType.PlaceOrder },
orderNumber: { $eq: orderNumber }
};
const setOnInsert = {
typeOf: factory.transactionType.PlaceOrder,
orderDate: new Date(), // orderDate required(2024-12-09~)
orderNumber,
project
};
const setKeys = { customer };
return this.orderModel.updateOne(filter, {
$setOnInsert: setOnInsert,
$set: setKeys
}, { upsert: true })
.exec();
});
}
findCustomerByOrderNumber(params) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
const doc = yield this.orderModel.findOne({
orderNumber: { $eq: params.orderNumber.$eq }
// typeOf: { $eq: factory.transactionType.PlaceOrder } // 検証しない
}, { customer: 1 })
.lean()
.exec();
if (doc === null) {
throw new factory.errors.NotFound('orderInTransaction');
}
if (typeof ((_a = doc.customer) === null || _a === void 0 ? void 0 : _a.typeOf) !== 'string') {
throw new factory.errors.NotFound('orderInTransaction.customer');
}
return doc.customer;
});
}
deleteByOrderNumber(params) {
return __awaiter(this, void 0, void 0, function* () {
return this.orderModel.deleteOne({
typeOf: { $eq: factory.transactionType.PlaceOrder },
orderNumber: { $eq: params.orderNumber }
})
.exec();
});
}
}
exports.OrderInTransactionRepo = OrderInTransactionRepo;