mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
core: domain-join: bug fixes & add i18n
Co-authored-by: panda <panda_dtdyy@outlook.com>
This commit is contained in:
1 parent
b9dbdc39ca
commit
e9c5bf5900
6 files changed
+70
-20
No files matched your search
@@ -101,24 +101,68 @@ class DomainUserHandler extends ManageHandler {
|
||||
@requireSudo
|
||||
@param('format', Types.Range(['default', 'raw']), true)
|
||||
async get({ domainId }, format = 'default') {
|
||||
const rudocs = {};
|
||||
const [dudocs, roles] = await Promise.all([
|
||||
domain.getMultiUserInDomain(domainId, {
|
||||
$and: [
|
||||
{ role: { $nin: ['default', 'guest'] } },
|
||||
{ role: { $ne: null } },
|
||||
],
|
||||
}).toArray(),
|
||||
domain.collUser.aggregate([
|
||||
{
|
||||
$match: {
|
||||
$or: [{
|
||||
join: true,
|
||||
}, {
|
||||
role: {
|
||||
$nin: ['default', 'guest'],
|
||||
$ne: null,
|
||||
},
|
||||
}],
|
||||
domainId,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'user',
|
||||
let: { uid: '$uid' },
|
||||
pipeline: [
|
||||
{
|
||||
$match: {
|
||||
$expr: { $eq: ['$_id', '$$uid'] },
|
||||
priv: { $bitsAllSet: PRIV.PRIV_USER_PROFILE },
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
_id: 1,
|
||||
uname: 1,
|
||||
avatar: 1,
|
||||
},
|
||||
},
|
||||
],
|
||||
as: 'user',
|
||||
},
|
||||
},
|
||||
{ $unwind: '$user' },
|
||||
{
|
||||
$project: {
|
||||
user: 1,
|
||||
role: 1,
|
||||
join: 1,
|
||||
displayName: this.user.hasPerm(PERM.PERM_VIEW_DISPLAYNAME),
|
||||
},
|
||||
},
|
||||
]).toArray(),
|
||||
domain.getRoles(domainId),
|
||||
]);
|
||||
// TODO: switch to getListForRender for better performance
|
||||
const udict = await user.getList(domainId, dudocs.map((dudoc) => dudoc.uid));
|
||||
const users = dudocs.filter((dudoc) => udict[dudoc.uid].priv & PRIV.PRIV_USER_PROFILE);
|
||||
const joined = Object.fromEntries(dudocs.map((dudoc) => [dudoc.uid, dudoc.join]));
|
||||
const users = dudocs.map((dudoc) => {
|
||||
const u = {
|
||||
...dudoc,
|
||||
...dudoc.user,
|
||||
};
|
||||
delete u.user;
|
||||
return u;
|
||||
});
|
||||
const rudocs = {};
|
||||
for (const role of roles) rudocs[role._id] = users.filter((udoc) => udoc.role === role._id);
|
||||
this.response.template = format === 'raw' ? 'domain_user_raw.html' : 'domain_user.html';
|
||||
this.response.body = {
|
||||
roles, rudocs, domain: this.domain, joined,
|
||||
roles, rudocs, domain: this.domain,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -286,7 +330,7 @@ class DomainJoinHandler extends Handler {
|
||||
]);
|
||||
const assignedRole = this.user.hasPriv(PRIV.PRIV_MANAGE_ALL_DOMAIN)
|
||||
? 'root'
|
||||
: dudoc?.role;
|
||||
: dudoc?.role || 'default';
|
||||
if (dudoc?.join) throw new DomainJoinAlreadyMemberError(target, this.user._id);
|
||||
const r = await domain.getRoles(ddoc);
|
||||
const roles = r.map((role) => role._id);
|
||||
|
||||
@@ -59,7 +59,7 @@ class DomainModel {
|
||||
};
|
||||
await bus.parallel('domain/create', ddoc);
|
||||
await coll.insertOne(ddoc);
|
||||
await DomainModel.setUserRole(domainId, owner, 'root');
|
||||
await DomainModel.setUserRole(domainId, owner, 'root', true);
|
||||
return domainId;
|
||||
}
|
||||
|
||||
@@ -133,9 +133,10 @@ class DomainModel {
|
||||
}
|
||||
|
||||
@ArgMethod
|
||||
static async setUserRole(domainId: string, uid: MaybeArray<number>, role: string) {
|
||||
static async setUserRole(domainId: string, uid: MaybeArray<number>, role: string, autojoin = false) {
|
||||
const update = { $set: { role, ...(autojoin ? { join: true } : {}) } };
|
||||
if (!(uid instanceof Array)) {
|
||||
const res = await collUser.findOneAndUpdate({ domainId, uid }, { $set: { role } }, { upsert: true, returnDocument: 'after' });
|
||||
const res = await collUser.findOneAndUpdate({ domainId, uid }, update, { upsert: true, returnDocument: 'after' });
|
||||
const udoc = await UserModel.getById(domainId, uid);
|
||||
deleteUserCache(udoc);
|
||||
return res;
|
||||
@@ -144,7 +145,7 @@ class DomainModel {
|
||||
.project<{ _id: number, mail: string, uname: string }>({ mail: 1, uname: 1 })
|
||||
.toArray();
|
||||
for (const udoc of affected) deleteUserCache(udoc);
|
||||
return await collUser.updateMany({ domainId, uid: { $in: uid } }, { $set: { role } }, { upsert: true });
|
||||
return await collUser.updateMany({ domainId, uid: { $in: uid } }, update, { upsert: true });
|
||||
}
|
||||
|
||||
static async getRoles(domainId: string, count?: boolean): Promise<any[]>;
|
||||
|
||||
@@ -707,7 +707,7 @@ export const coreScripts: MigrationScript[] = [
|
||||
async function _91_92() {
|
||||
await domain.collUser.updateMany({}, { $set: { join: true } });
|
||||
await domain.coll.updateMany(
|
||||
{ _join: { $or: [{ $exists: false }, { $eq: null }] } },
|
||||
{ $or: [{ _join: { $exists: false } }, { _join: { $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)
|
||||
|
||||
Reference in new issue
Block a user