diff --git a/packages/hydrooj/src/model/setting.ts b/packages/hydrooj/src/model/setting.ts index 0921692aa..22c778ddb 100644 --- a/packages/hydrooj/src/model/setting.ts +++ b/packages/hydrooj/src/model/setting.ts @@ -276,6 +276,7 @@ DomainUserSetting( Setting('setting_storage', 'rpdelta', 0, 'number', 'RP.delta', null, FLAG_HIDDEN | FLAG_DISABLED), Setting('setting_storage', 'rank', 0, 'number', 'Rank', null, FLAG_DISABLED | FLAG_HIDDEN), Setting('setting_storage', 'level', 0, 'number', 'level', null, FLAG_HIDDEN | FLAG_DISABLED), + Setting('setting_storage', 'join', 0, 'number', 'join', null, FLAG_HIDDEN | FLAG_DISABLED), ); const ignoreUA = [ diff --git a/packages/hydrooj/src/model/user.ts b/packages/hydrooj/src/model/user.ts index 132dea650..fc31585d2 100644 --- a/packages/hydrooj/src/model/user.ts +++ b/packages/hydrooj/src/model/user.ts @@ -336,6 +336,12 @@ class UserModel { priv, avatar: `gravatar:${mail}`, }); + // eslint-disable-next-line no-await-in-loop + await domain.collUser.updateOne( + { uid, domainId: 'system' }, + { $set: { join: true } }, + { upsert: true }, + ); return uid; } catch (e) { if (e?.code === 11000) { diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index f4bcaab41..1812010d2 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -36,6 +36,8 @@ const unsupportedUpgrade = async function _26_27() { Please use hydrooj@3 to perform these upgrades before upgrading to v4'); }; +const onPrimary = { readPreference: 'primary' } as const; + export const coreScripts: MigrationScript[] = [ // Mark as used async function init() { @@ -703,11 +705,20 @@ export const coreScripts: MigrationScript[] = [ }, // Start Hydro v5 async function _91_92() { - await db.collection('domain.user').updateMany({}, { $set: { join: true } }); - const ddocs = await domain.coll.updateMany( + await domain.collUser.updateMany({}, { $set: { join: true } }); + await domain.coll.updateMany( { _join: { $or: [{ $exists: false }, { $eq: null }] } }, { $set: { _join: { method: domain.JOIN_METHOD_ALL, role: 'default', expire: null }, _migratedJoin: true } }, ); + const domainUser = await domain.coll.find({ domainId: 'system', join: true }, onPrimary) + .project({ uid: 1 }).toArray(); + const otherUsers = await user.coll.find({ _id: { $gt: 1, $nin: domainUser.map((u) => u.uid) } }, onPrimary) + .project({ _id: 1 }).toArray(); + await domain.collUser.updateMany( + { uid: { $in: otherUsers.map((u) => u._id) }, domainId: 'system' }, + { $set: { join: true } }, + { upsert: true }, + ); return true; }, ];