From dba53de64664c9d8a40fe69de6281c53d1c73641 Mon Sep 17 00:00:00 2001 From: Sabir Hassan Date: Mon, 1 May 2023 19:28:51 +0500 Subject: [PATCH 1/2] fix: use custom logic for handling sequence ids --- api/package-lock.json | 82 ++------------------------- api/package.json | 2 - api/public/swagger.yaml | 2 +- api/src/model/Counter.ts | 15 +++++ api/src/model/Group.ts | 17 ++++-- api/src/model/Permission.ts | 15 ++++- api/src/model/User.ts | 20 +++++-- api/src/utils/getSequenceNextValue.ts | 15 +++++ api/src/utils/index.ts | 1 + 9 files changed, 76 insertions(+), 93 deletions(-) create mode 100644 api/src/model/Counter.ts create mode 100644 api/src/utils/getSequenceNextValue.ts diff --git a/api/package-lock.json b/api/package-lock.json index c38adab5..6f27e06f 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -21,7 +21,6 @@ "jsonwebtoken": "^8.5.1", "ldapjs": "2.3.3", "mongoose": "^6.0.12", - "mongoose-sequence": "^5.3.1", "morgan": "^1.10.0", "multer": "^1.4.5-lts.1", "rate-limiter-flexible": "2.4.1", @@ -43,7 +42,6 @@ "@types/jest": "^26.0.24", "@types/jsonwebtoken": "^8.5.5", "@types/ldapjs": "^2.2.4", - "@types/mongoose-sequence": "^3.0.6", "@types/morgan": "^1.9.3", "@types/multer": "^1.4.7", "@types/node": "^15.12.2", @@ -3216,25 +3214,6 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, - "node_modules/@types/mongoose": { - "version": "5.11.97", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", - "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", - "deprecated": "Mongoose publishes its own types, so you do not need to install this package.", - "dev": true, - "dependencies": { - "mongoose": "*" - } - }, - "node_modules/@types/mongoose-sequence": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/mongoose-sequence/-/mongoose-sequence-3.0.6.tgz", - "integrity": "sha512-S6DD4rSlSnUI9BQvR/ACtekpylSIm0pEKayG9NqOlkUo3Q/AZLBmdi0IozSGPQ8JcB2ZSm81nLdZPhTqyOqrQg==", - "dev": true, - "dependencies": { - "@types/mongoose": "^5.10.5" - } - }, "node_modules/@types/morgan": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.3.tgz", @@ -3672,14 +3651,6 @@ "node": ">=0.8" } }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, "node_modules/async-mutex": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", @@ -8125,7 +8096,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", @@ -8583,18 +8555,6 @@ "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose-sequence": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/mongoose-sequence/-/mongoose-sequence-5.3.1.tgz", - "integrity": "sha512-kQB1ctCdAQT8YdQzoHV0CpBRsO4RNVy03SOkzM6TQKBbGBs1ZgVS4UlKsuvBPaiPt9q5tKgQZvorGJ1awbHDqA==", - "dependencies": { - "async": "^2.5.0", - "lodash": "^4.17.20" - }, - "peerDependencies": { - "mongoose": ">=4" - } - }, "node_modules/mongoose/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -14014,24 +13974,6 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, - "@types/mongoose": { - "version": "5.11.97", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", - "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", - "dev": true, - "requires": { - "mongoose": "*" - } - }, - "@types/mongoose-sequence": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/mongoose-sequence/-/mongoose-sequence-3.0.6.tgz", - "integrity": "sha512-S6DD4rSlSnUI9BQvR/ACtekpylSIm0pEKayG9NqOlkUo3Q/AZLBmdi0IozSGPQ8JcB2ZSm81nLdZPhTqyOqrQg==", - "dev": true, - "requires": { - "@types/mongoose": "^5.10.5" - } - }, "@types/morgan": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.3.tgz", @@ -14409,14 +14351,6 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { - "lodash": "^4.17.14" - } - }, "async-mutex": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", @@ -17760,7 +17694,8 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "lodash.escaperegexp": { "version": "4.1.2", @@ -18126,15 +18061,6 @@ } } }, - "mongoose-sequence": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/mongoose-sequence/-/mongoose-sequence-5.3.1.tgz", - "integrity": "sha512-kQB1ctCdAQT8YdQzoHV0CpBRsO4RNVy03SOkzM6TQKBbGBs1ZgVS4UlKsuvBPaiPt9q5tKgQZvorGJ1awbHDqA==", - "requires": { - "async": "^2.5.0", - "lodash": "^4.17.20" - } - }, "morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", diff --git a/api/package.json b/api/package.json index 2f079632..dc85ac71 100644 --- a/api/package.json +++ b/api/package.json @@ -61,7 +61,6 @@ "jsonwebtoken": "^8.5.1", "ldapjs": "2.3.3", "mongoose": "^6.0.12", - "mongoose-sequence": "^5.3.1", "morgan": "^1.10.0", "multer": "^1.4.5-lts.1", "rate-limiter-flexible": "2.4.1", @@ -80,7 +79,6 @@ "@types/jest": "^26.0.24", "@types/jsonwebtoken": "^8.5.5", "@types/ldapjs": "^2.2.4", - "@types/mongoose-sequence": "^3.0.6", "@types/morgan": "^1.9.3", "@types/multer": "^1.4.7", "@types/node": "^15.12.2", diff --git a/api/public/swagger.yaml b/api/public/swagger.yaml index f0b127f1..66d14e81 100644 --- a/api/public/swagger.yaml +++ b/api/public/swagger.yaml @@ -772,7 +772,7 @@ paths: examples: 'Example 1': value: [{clientId: someClientID1234, clientSecret: someRandomCryptoString, accessTokenExpiration: 86400}, {clientId: someOtherClientID, clientSecret: someOtherRandomCryptoString, accessTokenExpiration: 86400}] - summary: 'Admin only task. Returns the list of all the clients *' + summary: 'Admin only task. Returns the list of all the clients' tags: - Client security: diff --git a/api/src/model/Counter.ts b/api/src/model/Counter.ts new file mode 100644 index 00000000..1dfac3b4 --- /dev/null +++ b/api/src/model/Counter.ts @@ -0,0 +1,15 @@ +import mongoose, { Schema } from 'mongoose' + +const CounterSchema = new Schema({ + id: { + type: String, + required: true, + unique: true + }, + seq: { + type: Number, + required: true + } +}) + +export default mongoose.model('Counter', CounterSchema) diff --git a/api/src/model/Group.ts b/api/src/model/Group.ts index 6ac1a26b..f3cccc6e 100644 --- a/api/src/model/Group.ts +++ b/api/src/model/Group.ts @@ -1,8 +1,7 @@ -import mongoose, { Schema, model, Document, Model } from 'mongoose' +import { Schema, model, Document, Model } from 'mongoose' import { GroupDetailsResponse } from '../controllers' import User, { IUser } from './User' -import { AuthProviderType } from '../utils' -const AutoIncrement = require('mongoose-sequence')(mongoose) +import { AuthProviderType, getSequenceNextValue } from '../utils' export const PUBLIC_GROUP_NAME = 'Public' @@ -44,6 +43,10 @@ const groupSchema = new Schema({ required: true, unique: true }, + groupId: { + type: Number, + unique: true + }, description: { type: String, default: 'Group description.' @@ -59,9 +62,13 @@ const groupSchema = new Schema({ users: [{ type: Schema.Types.ObjectId, ref: 'User' }] }) -groupSchema.plugin(AutoIncrement, { inc_field: 'groupId' }) - // Hooks +groupSchema.pre('save', async function () { + if (this.isNew) { + this.groupId = await getSequenceNextValue('groupId') + } +}) + groupSchema.post('save', function (group: IGroup, next: Function) { group.populate('users', 'id username displayName -_id').then(function () { next() diff --git a/api/src/model/Permission.ts b/api/src/model/Permission.ts index d83ca680..77d0f196 100644 --- a/api/src/model/Permission.ts +++ b/api/src/model/Permission.ts @@ -1,6 +1,6 @@ -import mongoose, { Schema, model, Document, Model } from 'mongoose' -const AutoIncrement = require('mongoose-sequence')(mongoose) +import { Schema, model, Document, Model } from 'mongoose' import { PermissionDetailsResponse } from '../controllers' +import { getSequenceNextValue } from '../utils' interface GetPermissionBy { user?: Schema.Types.ObjectId @@ -23,6 +23,10 @@ interface IPermissionModel extends Model { } const permissionSchema = new Schema({ + permissionId: { + type: Number, + unique: true + }, path: { type: String, required: true @@ -39,7 +43,12 @@ const permissionSchema = new Schema({ group: { type: Schema.Types.ObjectId, ref: 'Group' } }) -permissionSchema.plugin(AutoIncrement, { inc_field: 'permissionId' }) +// Hooks +permissionSchema.pre('save', async function () { + if (this.isNew) { + this.permissionId = await getSequenceNextValue('permissionId') + } +}) // Static Methods permissionSchema.static('get', async function (getBy: GetPermissionBy): Promise< diff --git a/api/src/model/User.ts b/api/src/model/User.ts index a9edf1b3..16690041 100644 --- a/api/src/model/User.ts +++ b/api/src/model/User.ts @@ -1,7 +1,6 @@ -import mongoose, { Schema, model, Document, Model } from 'mongoose' -const AutoIncrement = require('mongoose-sequence')(mongoose) +import { Schema, model, Document, Model } from 'mongoose' import bcrypt from 'bcryptjs' -import { AuthProviderType } from '../utils' +import { AuthProviderType, getSequenceNextValue } from '../utils' export interface UserPayload { /** @@ -66,6 +65,10 @@ const userSchema = new Schema({ required: true, unique: true }, + id: { + type: Number, + unique: true + }, password: { type: String, required: true @@ -107,7 +110,16 @@ const userSchema = new Schema({ } ] }) -userSchema.plugin(AutoIncrement, { inc_field: 'id' }) +// userSchema.plugin(AutoIncrement, { inc_field: 'id' }) + +// Hooks +userSchema.pre('save', async function (next) { + if (this.isNew) { + this.id = await getSequenceNextValue('id') + } + + next() +}) // Static Methods userSchema.static('hashPassword', (password: string): string => { diff --git a/api/src/utils/getSequenceNextValue.ts b/api/src/utils/getSequenceNextValue.ts new file mode 100644 index 00000000..7ce7abbf --- /dev/null +++ b/api/src/utils/getSequenceNextValue.ts @@ -0,0 +1,15 @@ +import Counter from '../model/Counter' + +export const getSequenceNextValue = async (seqName: string) => { + const seqDoc = await Counter.findOne({ id: seqName }) + if (!seqDoc) { + await Counter.create({ id: seqName, seq: 1 }) + return 1 + } + + seqDoc.seq += 1 + + await seqDoc.save() + + return seqDoc.seq +} diff --git a/api/src/utils/index.ts b/api/src/utils/index.ts index 987bfafa..ec211c52 100644 --- a/api/src/utils/index.ts +++ b/api/src/utils/index.ts @@ -14,6 +14,7 @@ export * from './getCertificates' export * from './getDesktopFields' export * from './getPreProgramVariables' export * from './getRunTimeAndFilePath' +export * from './getSequenceNextValue' export * from './getServerUrl' export * from './getTokensFromDB' export * from './instantiateLogger' From ac27a9b894b25e9c74a62697dc5a69cde77c0c7f Mon Sep 17 00:00:00 2001 From: Sabir Hassan Date: Mon, 1 May 2023 19:54:43 +0500 Subject: [PATCH 2/2] chore: remove residue --- api/src/model/User.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/model/User.ts b/api/src/model/User.ts index 16690041..d0537924 100644 --- a/api/src/model/User.ts +++ b/api/src/model/User.ts @@ -110,7 +110,6 @@ const userSchema = new Schema({ } ] }) -// userSchema.plugin(AutoIncrement, { inc_field: 'id' }) // Hooks userSchema.pre('save', async function (next) {