From 1881aa9cf218063085224a8585e0cf3f4f0f036e Mon Sep 17 00:00:00 2001 From: RustamRu Date: Sun, 26 Jan 2025 16:29:27 +0300 Subject: [PATCH 1/5] feat: generate order number --- server/routers/dry-wash/model/order.js | 5 +++++ server/routers/dry-wash/order.js | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/server/routers/dry-wash/model/order.js b/server/routers/dry-wash/model/order.js index 6fdaa25..8ee924f 100644 --- a/server/routers/dry-wash/model/order.js +++ b/server/routers/dry-wash/model/order.js @@ -27,6 +27,11 @@ const schema = new Schema({ type: String, required: true }, + orderNumber: { + type: String, + required: true, + unique: true + }, status: { type: String, required: true, diff --git a/server/routers/dry-wash/order.js b/server/routers/dry-wash/order.js index d258fa0..6cdb11f 100644 --- a/server/routers/dry-wash/order.js +++ b/server/routers/dry-wash/order.js @@ -74,6 +74,21 @@ const VALIDATION_MESSAGES = { }, } +/** + * Generates the next order number incrementing the last order number + * @returns {Promise} + */ +const generateOrderNumber = async () => { + const lastOrder = await OrderModel.findOne().sort({ created: -1 }) + if (lastOrder) { + const lastOrderNumber = parseInt(lastOrder.orderNumber ?? '0') + const nextOrderNumber = lastOrderNumber + 1 + return String(nextOrderNumber) + } + + return '1' // number of the very first order +} + router.post('/create', async (req, res, next) => { const bodyErrors = [] @@ -129,6 +144,7 @@ router.post('/create', async (req, res, next) => { startWashTime: washing.begin, endWashTime: washing.end, location: washing.location, + orderNumber: await generateOrderNumber(), status: orderStatus.PROGRESS, notes: '', created: new Date().toISOString(), -- 2.52.0 From b3d4aa3c860351539d525d4cbbc6f2decdd9a7bc Mon Sep 17 00:00:00 2001 From: RustamRu Date: Sun, 26 Jan 2025 18:05:00 +0300 Subject: [PATCH 2/5] feat: add master prop to order by creating --- server/routers/dry-wash/order.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/routers/dry-wash/order.js b/server/routers/dry-wash/order.js index 6cdb11f..0c15b33 100644 --- a/server/routers/dry-wash/order.js +++ b/server/routers/dry-wash/order.js @@ -146,6 +146,7 @@ router.post('/create', async (req, res, next) => { location: washing.location, orderNumber: await generateOrderNumber(), status: orderStatus.PROGRESS, + master: '', notes: '', created: new Date().toISOString(), }) -- 2.52.0 From 759aad2d80109cf4ff12a1f5386b1585ff090716 Mon Sep 17 00:00:00 2001 From: RustamRu Date: Sun, 2 Feb 2025 14:51:55 +0300 Subject: [PATCH 3/5] feat: use mongoose-sequence to increment order number --- package-lock.json | 28 ++++++++++++++++++- package.json | 1 + server/routers/dry-wash/model/order.js | 16 +++++++++-- server/routers/dry-wash/model/order.number.js | 14 ++++++++++ server/routers/dry-wash/order.js | 17 ----------- 5 files changed, 55 insertions(+), 21 deletions(-) create mode 100644 server/routers/dry-wash/model/order.number.js diff --git a/package-lock.json b/package-lock.json index 5470ae5..43f8d65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "jsonwebtoken": "^9.0.2", "mongodb": "^6.12.0", "mongoose": "^8.9.2", + "mongoose-sequence": "^6.0.1", "morgan": "^1.10.0", "pbkdf2-password": "^1.2.1", "rotating-file-stream": "^3.2.5", @@ -2133,6 +2134,12 @@ "dev": true, "license": "MIT" }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5642,6 +5649,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -6041,6 +6054,19 @@ } } }, + "node_modules/mongoose-sequence": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mongoose-sequence/-/mongoose-sequence-6.0.1.tgz", + "integrity": "sha512-uXnLCW9pu2V49Xw8BmdXdeRugd2mv+ntu3nT2Bbm33pNRmmvHE2GKA+8BASKoQt960McLX4VL78wkb492f6MoQ==", + "license": "GPL-2.0", + "dependencies": { + "async": "^3.2.5", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "mongoose": ">=5" + } + }, "node_modules/mongoose/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -8160,4 +8186,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index e77732d..8ef622c 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "jsonwebtoken": "^9.0.2", "mongodb": "^6.12.0", "mongoose": "^8.9.2", + "mongoose-sequence": "^6.0.1", "morgan": "^1.10.0", "pbkdf2-password": "^1.2.1", "rotating-file-stream": "^3.2.5", diff --git a/server/routers/dry-wash/model/order.js b/server/routers/dry-wash/model/order.js index 8ee924f..2939822 100644 --- a/server/routers/dry-wash/model/order.js +++ b/server/routers/dry-wash/model/order.js @@ -1,5 +1,6 @@ const { Schema, model } = require('mongoose') const { orderStatus } = require('./const') +const { OrderNumberModel } = require('./order.number') const schema = new Schema({ phone: { @@ -28,9 +29,6 @@ const schema = new Schema({ required: true }, orderNumber: { - type: String, - required: true, - unique: true }, status: { type: String, @@ -52,6 +50,18 @@ const schema = new Schema({ }, }) +schema.pre('save', async function (next) { + if (this.isNew) { + const counter = await OrderNumberModel.findOneAndUpdate( + { _id: 'orderNumber' }, + { $inc: { sequenceValue: 1 } }, + { new: true, upsert: true } + ) + this.orderNumber = counter.sequenceValue.toString() + } + next() +}) + schema.set('toJSON', { virtuals: true, versionKey: false, diff --git a/server/routers/dry-wash/model/order.number.js b/server/routers/dry-wash/model/order.number.js new file mode 100644 index 0000000..195d617 --- /dev/null +++ b/server/routers/dry-wash/model/order.number.js @@ -0,0 +1,14 @@ +const { Schema, model } = require('mongoose') + +const schema = new Schema({ + _id: { + type: String, + required: true, + }, + sequenceValue: { + type: Number, + default: 0 + } +}) + +exports.OrderNumberModel = model('dry-wash-order-number', schema) \ No newline at end of file diff --git a/server/routers/dry-wash/order.js b/server/routers/dry-wash/order.js index 0c15b33..d258fa0 100644 --- a/server/routers/dry-wash/order.js +++ b/server/routers/dry-wash/order.js @@ -74,21 +74,6 @@ const VALIDATION_MESSAGES = { }, } -/** - * Generates the next order number incrementing the last order number - * @returns {Promise} - */ -const generateOrderNumber = async () => { - const lastOrder = await OrderModel.findOne().sort({ created: -1 }) - if (lastOrder) { - const lastOrderNumber = parseInt(lastOrder.orderNumber ?? '0') - const nextOrderNumber = lastOrderNumber + 1 - return String(nextOrderNumber) - } - - return '1' // number of the very first order -} - router.post('/create', async (req, res, next) => { const bodyErrors = [] @@ -144,9 +129,7 @@ router.post('/create', async (req, res, next) => { startWashTime: washing.begin, endWashTime: washing.end, location: washing.location, - orderNumber: await generateOrderNumber(), status: orderStatus.PROGRESS, - master: '', notes: '', created: new Date().toISOString(), }) -- 2.52.0 From 0d759847bfa78816a66fec7bf6ea455e3ce64e49 Mon Sep 17 00:00:00 2001 From: RustamRu Date: Sun, 2 Feb 2025 15:05:31 +0300 Subject: [PATCH 4/5] fix: order number props --- server/routers/dry-wash/model/order.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/routers/dry-wash/model/order.js b/server/routers/dry-wash/model/order.js index 2939822..84f21a5 100644 --- a/server/routers/dry-wash/model/order.js +++ b/server/routers/dry-wash/model/order.js @@ -29,6 +29,8 @@ const schema = new Schema({ required: true }, orderNumber: { + type: String, + unique: true }, status: { type: String, -- 2.52.0 From 263d1a68869570ab68841348157fcd95b19c9e1a Mon Sep 17 00:00:00 2001 From: RustamRu Date: Sun, 2 Feb 2025 15:10:41 +0300 Subject: [PATCH 5/5] add node_modules/mongoose-sequence to package-lock --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 43f8d65..c39cfa6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6008,6 +6008,19 @@ "url": "https://opencollective.com/mongoose" } }, + "node_modules/mongoose-sequence": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mongoose-sequence/-/mongoose-sequence-6.0.1.tgz", + "integrity": "sha512-uXnLCW9pu2V49Xw8BmdXdeRugd2mv+ntu3nT2Bbm33pNRmmvHE2GKA+8BASKoQt960McLX4VL78wkb492f6MoQ==", + "license": "GPL-2.0", + "dependencies": { + "async": "^3.2.5", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "mongoose": ">=5" + } + }, "node_modules/mongoose/node_modules/mongodb": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.12.0.tgz", @@ -6054,19 +6067,6 @@ } } }, - "node_modules/mongoose-sequence": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/mongoose-sequence/-/mongoose-sequence-6.0.1.tgz", - "integrity": "sha512-uXnLCW9pu2V49Xw8BmdXdeRugd2mv+ntu3nT2Bbm33pNRmmvHE2GKA+8BASKoQt960McLX4VL78wkb492f6MoQ==", - "license": "GPL-2.0", - "dependencies": { - "async": "^3.2.5", - "lodash": "^4.17.21" - }, - "peerDependencies": { - "mongoose": ">=5" - } - }, "node_modules/mongoose/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -8186,4 +8186,4 @@ } } } -} \ No newline at end of file +} -- 2.52.0