diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 0a2470343..f03d3ef9e 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.15.2", + "version": "2.15.3", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/home.ts b/packages/hydrooj/src/handler/home.ts index 5f1dac755..fffe63574 100644 --- a/packages/hydrooj/src/handler/home.ts +++ b/packages/hydrooj/src/handler/home.ts @@ -297,6 +297,7 @@ class HomeDomainCreateHandler extends Handler { gravatar = gravatar || this.user.gravatar || this.user.mail || 'guest@hydro.local'; const domainId = await domain.add(id, this.user._id, name, bulletin); await domain.edit(domainId, { gravatar }); + await domain.setUserRole(domainId, this.user._id, 'admin'); this.response.redirect = this.url('domain_dashboard', { domainId }); this.response.body = { domainId }; } diff --git a/packages/hydrooj/src/model/domain.ts b/packages/hydrooj/src/model/domain.ts index 7efb668e3..f5b771369 100644 --- a/packages/hydrooj/src/model/domain.ts +++ b/packages/hydrooj/src/model/domain.ts @@ -140,6 +140,7 @@ export async function getDomainUser(domainId: string, udoc: DomainUserArg) { if (udoc.priv & PRIV.PRIV_MANAGE_ALL_DOMAIN) dudoc.role = 'admin'; dudoc.role = dudoc.role || 'default'; const ddoc = await get(domainId); + if (ddoc.owner === udoc._id) dudoc.role = 'admin'; dudoc.perm = ddoc.roles[dudoc.role] ? BigInt(ddoc.roles[dudoc.role]) : BUILTIN_ROLES[dudoc.role]; @@ -167,13 +168,17 @@ export async function incUserInDomain(domainId: string, uid: number, field: stri } export async function getDictUserByDomainId(uid: number) { - const dudocs = await collUser.find({ uid }).toArray(); + const [dudocs, ddocs] = await Promise.all([ + collUser.find({ uid }).toArray(), + coll.find({ owner: uid }).toArray(), + ]); const dudict = {}; for (const dudoc of dudocs) { // eslint-disable-next-line no-await-in-loop dudict[dudoc.domainId] = await get(dudoc.domainId); dudict[dudoc.domainId].role = dudoc.role; } + for (const ddoc of ddocs) dudict[ddoc._id] = 'admin'; return dudict; }