From f5a9660d9abb60677e716d3719b7836d745c1ca0 Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 21 Mar 2024 08:35:18 +0800 Subject: [PATCH] core: setup: prefer mongo connection uri --- packages/hydrooj/package.json | 2 ++ packages/hydrooj/src/entry/setup.ts | 47 +++++------------------------ packages/hydrooj/src/service/db.ts | 4 ++- 3 files changed, 12 insertions(+), 41 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 46e2c4f5f..ff6bb56b2 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -41,6 +41,7 @@ "mime-types": "^2.1.35", "moment-timezone": "^0.5.45", "mongodb": "^5.9.2", + "mongodb-uri": "^0.9.7", "nanoid": "^5.0.6", "nodemailer": "^6.9.11", "notp": "^2.0.3", @@ -66,6 +67,7 @@ "@types/koa-static-cache": "^5.1.4", "@types/lodash": "^4.14.202", "@types/mime-types": "^2.1.4", + "@types/mongodb-uri": "^0", "@types/nodemailer": "^6.4.14", "@types/notp": "^2.0.5", "@types/saslprep": "^1.0.3", diff --git a/packages/hydrooj/src/entry/setup.ts b/packages/hydrooj/src/entry/setup.ts index f777f4614..8e9ea17d0 100644 --- a/packages/hydrooj/src/entry/setup.ts +++ b/packages/hydrooj/src/entry/setup.ts @@ -6,6 +6,7 @@ import fs from 'fs-extra'; import Koa, { Context } from 'koa'; import Body from 'koa-body'; import { MongoClient, WriteConcern } from 'mongodb'; +import mongoUri from 'mongodb-uri'; import { Logger } from '../logger'; const logger = new Logger('setup'); @@ -18,10 +19,7 @@ async function get(ctx: Context) { - - - Setup @@ -34,32 +32,8 @@ async function get(ctx: Context) {
-
-
- -
-
- -
-
- -
-
-
@@ -78,18 +52,13 @@ async function get(ctx: Context) { } async function post(ctx: Context) { - const { - host, port, name, username, password, - } = (ctx.request as any).body; - let mongourl = 'mongodb://'; - if (username) mongourl += `${username}:${password}@`; - mongourl += `${host}:${port}/${name}`; try { - const Database = await MongoClient.connect(mongourl, { + const url = mongoUri.parse(ctx.request.body?.url); + const Database = await MongoClient.connect((ctx.request as any).body, { readPreference: 'nearest', writeConcern: new WriteConcern('majority'), }); - const db = Database.db(name); + const db = Database.db(url.database); const coll = db.collection('system'); await Promise.all([ coll.updateOne( @@ -104,9 +73,7 @@ async function post(ctx: Context) { ), ]); fs.ensureDirSync(path.resolve(os.homedir(), '.hydro')); - fs.writeFileSync(path.resolve(os.homedir(), '.hydro', 'config.json'), JSON.stringify({ - host, port, name, username, password, - })); + fs.writeFileSync(path.resolve(os.homedir(), '.hydro', 'config.json'), JSON.stringify({ url })); ctx.body = '

Done! Hydro is now starting.

'; resolve?.(); } catch (e) { diff --git a/packages/hydrooj/src/service/db.ts b/packages/hydrooj/src/service/db.ts index abb027b3b..fde7d8bb9 100644 --- a/packages/hydrooj/src/service/db.ts +++ b/packages/hydrooj/src/service/db.ts @@ -2,6 +2,7 @@ import { Collection, Db, IndexDescription, MongoClient, } from 'mongodb'; +import mongoUri from 'mongodb-uri'; import { Time } from '@hydrooj/utils'; import { Logger } from '../logger'; import options from '../options'; @@ -38,6 +39,7 @@ class MongoService { async start() { const opts = options() || {}; let mongourl = MongoService.buildUrl(opts); + const url = mongoUri.parse(mongourl); if (process.env.CI) { const { MongoMemoryServer } = require('mongodb-memory-server'); const mongod = await MongoMemoryServer.create(); @@ -45,7 +47,7 @@ class MongoService { } this.opts = opts; this.client = await MongoClient.connect(mongourl); - this.db = this.client.db(opts.name || 'hydro'); + this.db = this.client.db(url.database || 'hydro'); await bus.parallel('database/connect', this.db); setInterval(() => this.fixExpireAfter(), Time.hour); }