UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

173 lines (172 loc) 7.04 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.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;