From 06d485e63ae2b0fa55247d3eff1a42384db142ab Mon Sep 17 00:00:00 2001 From: goynov Date: Sat, 7 Feb 2026 11:46:52 +0200 Subject: [PATCH] objects IDs counter refactoring --- backend/app/Db.js | 21 ++++++++------------- backend/app/bl/GameObjectsManager.js | 2 +- backend/app/bl/GamesManager.js | 2 +- backend/app/bl/ScenariosManager.js | 2 +- tests/API.test.js | 4 ++-- tests/backend.test.js | 2 +- 6 files changed, 14 insertions(+), 19 deletions(-) diff --git a/backend/app/Db.js b/backend/app/Db.js index fa34aad..445c5c6 100644 --- a/backend/app/Db.js +++ b/backend/app/Db.js @@ -26,7 +26,7 @@ class Db { try { dbo = db.db(app.config.db.name); this.instance = dbo; - for (let c of ['users', 'user_sessions', 'history', 'log', 'assets', 'scenarios', 'games']){ + for (let c of ['users', 'user_sessions', 'history', 'log', 'assets', 'scenarios', 'games', 'config']){ try { await dbo.createCollection(c); }catch(err){} @@ -250,18 +250,13 @@ class Db { * Gets last asset Id from database, намира последния пореден идентификатор на обект в базата от данни * @returns {Number} Last Asset Id, последен (най-голям) идентификатор */ - async getLastId(collection){ - let ag = await this.aggregate(collection, [ - { - $group:{ - _id: null, - max: { - $max: "$id", - }, - }, - }, - ]); - return ag.max || 0; + async getId(collection){ + let newId = (await dbo.collection('config').findOneAndUpdate( + { 'counter': { $exists: true } }, + { $inc: { 'counter.value': 1 } }, + { upsert: true, returnDocument: 'after' } + )).counter.value; + return newId; } async stop(){ diff --git a/backend/app/bl/GameObjectsManager.js b/backend/app/bl/GameObjectsManager.js index 1b5e292..487e5e9 100644 --- a/backend/app/bl/GameObjectsManager.js +++ b/backend/app/bl/GameObjectsManager.js @@ -30,7 +30,7 @@ class GameObjectsManager{ * @param {GameObject} data Asset data, данни за игровия обект */ this.create = async function(ctx, data){ - data.id = (await db.getLastId(collection)) + 1; + data.id = await db.getId(collection); await db.create(collection, data); if (ctx.files?.file){ await this.addFile(data, ctx.files.file) diff --git a/backend/app/bl/GamesManager.js b/backend/app/bl/GamesManager.js index 729cba4..3c99129 100644 --- a/backend/app/bl/GamesManager.js +++ b/backend/app/bl/GamesManager.js @@ -19,7 +19,7 @@ class GamesManager{ * @param {Game} data the game description, дефиниция на играта */ this.create = async function(ctx, data){ - data.id = (await db.getLastId(collection)) + 1; + data.id = await db.getId(collection); await db.create(collection, data); return data; } diff --git a/backend/app/bl/ScenariosManager.js b/backend/app/bl/ScenariosManager.js index b009a98..d647475 100644 --- a/backend/app/bl/ScenariosManager.js +++ b/backend/app/bl/ScenariosManager.js @@ -20,7 +20,7 @@ class ScenariosManager{ * @param {Scenario} data the scenario, данни за сценария */ this.create = async function(ctx, data){ - data.id = (await db.getLastId(collection)) + 1; + data.id = await db.getId(collection); await db.create(collection, data); return data; } diff --git a/tests/API.test.js b/tests/API.test.js index b20885e..2e9ae20 100644 --- a/tests/API.test.js +++ b/tests/API.test.js @@ -12,7 +12,7 @@ class MockDb { this.data = {}; this.lastId = 0; } - async getLastId() { return this.lastId; } + async getId() { return this.lastId; } async create(collection, obj) { this.lastId++; obj.id = this.lastId; @@ -43,7 +43,7 @@ class GamesManager { init(app) { const db = app.db; this.create = async (ctx, data) => { - data.id = (await db.getLastId()) + 1; + data.id = await db.getId('games'); await db.create('games', data); return data; }; diff --git a/tests/backend.test.js b/tests/backend.test.js index 2ddd210..605f6fd 100644 --- a/tests/backend.test.js +++ b/tests/backend.test.js @@ -45,7 +45,7 @@ function createMockDb() { let store = {}; let lastId = 0; return { - getLastId: vi.fn(async () => lastId), + getId: vi.fn(async () => lastId), create: vi.fn(async (coll, obj) => { lastId++; obj.id = lastId; store[obj.id] = { ...obj }; }), get: vi.fn(async (coll, query) => store[query.id]), update: vi.fn(async (coll, query, obj) => { store[query.id] = { ...store[query.id], ...obj }; }),