feat: use mongoose-sequence to increment order number

This commit is contained in:
RustamRu 2025-02-02 14:51:55 +03:00
parent b3d4aa3c86
commit 759aad2d80
5 changed files with 55 additions and 21 deletions

28
package-lock.json generated
View File

@ -25,6 +25,7 @@
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"mongodb": "^6.12.0", "mongodb": "^6.12.0",
"mongoose": "^8.9.2", "mongoose": "^8.9.2",
"mongoose-sequence": "^6.0.1",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"pbkdf2-password": "^1.2.1", "pbkdf2-password": "^1.2.1",
"rotating-file-stream": "^3.2.5", "rotating-file-stream": "^3.2.5",
@ -2133,6 +2134,12 @@
"dev": true, "dev": true,
"license": "MIT" "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": { "node_modules/asynckit": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@ -5642,6 +5649,12 @@
"url": "https://github.com/sponsors/sindresorhus" "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": { "node_modules/lodash.includes": {
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "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": { "node_modules/mongoose/node_modules/ms": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@ -8160,4 +8186,4 @@
} }
} }
} }
} }

View File

@ -39,6 +39,7 @@
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"mongodb": "^6.12.0", "mongodb": "^6.12.0",
"mongoose": "^8.9.2", "mongoose": "^8.9.2",
"mongoose-sequence": "^6.0.1",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"pbkdf2-password": "^1.2.1", "pbkdf2-password": "^1.2.1",
"rotating-file-stream": "^3.2.5", "rotating-file-stream": "^3.2.5",

View File

@ -1,5 +1,6 @@
const { Schema, model } = require('mongoose') const { Schema, model } = require('mongoose')
const { orderStatus } = require('./const') const { orderStatus } = require('./const')
const { OrderNumberModel } = require('./order.number')
const schema = new Schema({ const schema = new Schema({
phone: { phone: {
@ -28,9 +29,6 @@ const schema = new Schema({
required: true required: true
}, },
orderNumber: { orderNumber: {
type: String,
required: true,
unique: true
}, },
status: { status: {
type: String, 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', { schema.set('toJSON', {
virtuals: true, virtuals: true,
versionKey: false, versionKey: false,

View File

@ -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)

View File

@ -74,21 +74,6 @@ const VALIDATION_MESSAGES = {
}, },
} }
/**
* Generates the next order number incrementing the last order number
* @returns {Promise<string>}
*/
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) => { router.post('/create', async (req, res, next) => {
const bodyErrors = [] const bodyErrors = []
@ -144,9 +129,7 @@ router.post('/create', async (req, res, next) => {
startWashTime: washing.begin, startWashTime: washing.begin,
endWashTime: washing.end, endWashTime: washing.end,
location: washing.location, location: washing.location,
orderNumber: await generateOrderNumber(),
status: orderStatus.PROGRESS, status: orderStatus.PROGRESS,
master: '',
notes: '', notes: '',
created: new Date().toISOString(), created: new Date().toISOString(),
}) })