From 9ee59256a910193517a0d8d82eb07e0d11ef8ab9 Mon Sep 17 00:00:00 2001
From: Rustam <kagapov.rustam@yandex.ru>
Date: Sun, 2 Feb 2025 15:11:59 +0300
Subject: [PATCH] feat: generate order number (#69)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Добавил генерацию номера заказа при создании

Co-authored-by: RustamRu <kagapov.rustam@gmail.com>
Reviewed-on: https://git.bro-js.ru/bro-students/multy-stub/pulls/69
Reviewed-by: Primakov Alexandr Alexandrovich <primakovpro@gmail.com>
---
 package-lock.json                             | 26 +++++++++++++++++++
 package.json                                  |  1 +
 server/routers/dry-wash/model/order.js        | 17 ++++++++++++
 server/routers/dry-wash/model/order.number.js | 14 ++++++++++
 4 files changed, 58 insertions(+)
 create mode 100644 server/routers/dry-wash/model/order.number.js

diff --git a/package-lock.json b/package-lock.json
index 5470ae5..c39cfa6 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",
@@ -5995,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",
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 6fdaa25..84f21a5 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: {
@@ -27,6 +28,10 @@ const schema = new Schema({
         type: String,
         required: true
     },
+    orderNumber: {
+        type: String,
+        unique: true
+    },
     status: {
         type: String,
         required: true,
@@ -47,6 +52,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