Skip to content

Commit def0260

Browse files
Merge pull request #31 from iExecBlockchainComputing/feature/upgrade-mongoose-to-8.15
chore: upgrade mongoose to 8.16.0
2 parents 3db124c + 97de644 commit def0260

File tree

10 files changed

+499
-2772
lines changed

10 files changed

+499
-2772
lines changed

api/package-lock.json

Lines changed: 161 additions & 2636 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
"koa-ratelimit": "^5.1.0",
4646
"koa-router": "^13.0.1",
4747
"koa2-swagger-ui": "^5.11.0",
48-
"mongoose": "^6.13.8",
48+
"mongoose": "^8.16.0",
4949
"randomstring": "^1.3.1",
5050
"redis": "^4.7.0",
5151
"socket.io": "^4.8.1",

api/src/loaders/mongoose.js

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,48 @@
1+
// loaders/mongoose.js
12
import mongoose from 'mongoose';
23
import { mongo as mongoConfig } from '../config.js';
34
import { logger } from '../utils/logger.js';
45

6+
// Important for compatibility with Mongoose v8+
7+
// Prevents strict query errors when filtering by fields not in schema
8+
mongoose.set('strictQuery', false);
9+
510
const log = logger.extend('mongoose');
611

7-
const mongooseConnections = {};
12+
// Cache for connections
13+
const mongooseConnectionPromises = {};
814

15+
/**
16+
* Returns a Mongoose connection for a given server and db name.
17+
* Caches connections for reuse across calls.
18+
*/
919
const getMongoose = async ({ server = mongoConfig.host, db } = {}) => {
10-
try {
11-
if (db === undefined) {
12-
throw Error('missing db name');
13-
}
14-
if (mongooseConnections[server] && mongooseConnections[server][db]) {
15-
log(`using connection ${server}${db}`);
16-
const connection = await mongooseConnections[server][db];
17-
return connection;
18-
}
19-
log(`creating connection ${server}${db}`);
20-
mongooseConnections[server] = mongooseConnections[server] || {};
21-
mongooseConnections[server][db] = mongoose
22-
.createConnection(`${server}${db}`, {
23-
useNewUrlParser: true,
24-
useUnifiedTopology: true,
25-
autoIndex: mongoConfig.createIndex || false,
26-
})
27-
.asPromise();
28-
const connection = await mongooseConnections[server][db];
29-
log(`opened connection ${server}${db}`);
30-
return connection;
31-
} catch (error) {
32-
log('getMongoose', error);
33-
throw error;
20+
if (!db) throw new Error('Missing db name');
21+
22+
// Return existing connection if present
23+
if (mongooseConnectionPromises[server]?.[db]) {
24+
log(`Using cached connection: ${server}${db}`);
25+
return await mongooseConnectionPromises[server][db];
3426
}
27+
28+
log(`Creating new connection: ${server}${db}`);
29+
const uri = `${server}${db}`;
30+
const connectionPromise = mongoose
31+
.createConnection(uri, {
32+
// Removed deprecated options
33+
// useNewUrlParser and useUnifiedTopology are defaults in Mongoose 8+
34+
35+
autoIndex: mongoConfig.createIndex ?? false, // Create indexes if needed
36+
autoCreate: true, // Ensure collections are auto-created
37+
bufferCommands: false, // ❗ Important for strict connection behavior in Mongoose 8+
38+
})
39+
.asPromise();
40+
41+
// Cache the connection promise
42+
mongooseConnectionPromises[server] = mongooseConnectionPromises[server] || {};
43+
mongooseConnectionPromises[server][db] = connectionPromise;
44+
45+
return await connectionPromise;
3546
};
3647

3748
export { getMongoose };

api/src/services/auth.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,19 @@ const checkAuthorization = async ({
8787
const signerAddress = recoverAddressEIP712(typedData, signature);
8888
if (signerAddress === NULL_ADDRESS) throw Error('Null signerAddress');
8989
log('signerAddress', signerAddress);
90-
if (signerAddress.toLowerCase() !== address.toLowerCase())
90+
91+
if (signerAddress.toLowerCase() !== address.toLowerCase()) {
9192
throw new AuthError('Failed to verify signer, addresses mismatch.');
92-
await current.remove();
93-
return {
94-
address,
95-
chainId,
96-
};
93+
}
94+
95+
await ChallengeModel.deleteOne({ _id: current._id });
96+
97+
return { address, chainId };
9798
} catch (e) {
9899
log('checkAuthorization() error', e);
99-
throw e;
100+
throw e instanceof AuthError
101+
? e
102+
: new AuthError('Authorization check failed');
100103
}
101104
};
102105

api/src/services/order.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1347,7 +1347,7 @@ const unpublishOrders = async ({
13471347
default:
13481348
throw new InternalError('unsupported target');
13491349
}
1350-
await Promise.all(ordersToUnpublish.map((e) => e.delete()));
1350+
await Promise.all(ordersToUnpublish.map((e) => e.deleteOne()));
13511351
return ordersToUnpublish.map((e) => e.toJSON());
13521352
};
13531353

api/test/test-utils.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as apporderModel from '../src/models/apporderModel.js';
88
import * as datasetorderModel from '../src/models/datasetorderModel.js';
99
import * as workerpoolorderModel from '../src/models/workerpoolorderModel.js';
1010
import * as requestorderModel from '../src/models/requestorderModel.js';
11-
11+
import * as challengeModel from '../src/models/challengeModel.js';
1212
const sleep = (ms) =>
1313
new Promise((res) => {
1414
setTimeout(res, ms);
@@ -245,14 +245,21 @@ const dropDB = async (dbName) => {
245245
);
246246
};
247247

248+
/**
249+
* Inserts or updates a challenge in the database using the Mongoose model.
250+
* Ensures compatibility with Mongoose v8 and avoids connection mismatches.
251+
*/
248252
const setChallenge = async (dbName, challenge) => {
249-
const { db } = await getMongoose({ db: dbName });
250-
await db.collection('challenges').findOneAndUpdate(
253+
const ChallengeModel = await challengeModel.getModel(dbName);
254+
await ChallengeModel.findOneAndUpdate(
251255
{ hash: challenge.hash },
252-
{ $set: challenge },
253256
{
254-
upsert: true,
257+
$set: {
258+
...challenge,
259+
address: challenge.address,
260+
},
255261
},
262+
{ upsert: true, new: true },
256263
);
257264
};
258265

0 commit comments

Comments
 (0)