Skip to content
页面信息
📝 描述域(租户/组织)模型,提供域 CRUD、用户角色成员管理和角色权限管理
📥 导入import { DomainModel } from 'hydrooj'

DomainModel ​

域(租户/组织)模型,提供域 CRUD、用户角色成员管理、角色权限管理和加入设置。

DomainModel 是纯静态类。所有方法均通过类本身调用(如 DomainModel.get(...))。


类型导出 ​

DomainDoc ​

定义在 packages/hydrooj/src/interface.ts:

typescript
interface DomainDoc extends Record<string, any> {
    _id: string;          // 域 ID
    owner: number;        // 所有者 UID
    roles: Dictionary<string>;  // 角色名 → 权限 bigint 字符串
    avatar: string;       // 域头像 URL
    bulletin: string;     // 域公告文本
    _join?: any;          // 加入设置(method, role, expire, code)
    host?: string[];      // 自定义 host 头
}

注意:DomainDoc 继承 Record<string, any>,因此允许任意附加字段。


常量 ​

加入方式 ​

常量值说明
JOIN_METHOD_NONE0不允许任何用户加入此域
JOIN_METHOD_ALL1允许任何用户加入此域
JOIN_METHOD_CODE2允许任何用户通过邀请码加入

加入有效期 ​

常量值说明
JOIN_EXPIRATION_KEEP_CURRENT0保持当前有效期
JOIN_EXPIRATION_UNLIMITED-1永不过期
(数字键)3, 24, 72, 168, 7203 小时 / 1 天 / 3 天 / 1 周 / 1 个月

方法 ​

域 CRUD ​

add(domainId: string, owner: number, name: string, bulletin: string): Promise<string> ​

创建新域,指定所有者、名称和公告;将所有者设为 root 角色。

参数类型默认值说明
domainIdstring—域 ID
ownernumber—所有者 UID
namestring—域名称
bulletinstring—域公告文本
返回值Promise<string>

get(domainId: string): Promise<DomainDoc | null> ​

按 ID 获取域(对 lower 字段不区分大小写查找),带 LRU 缓存。

参数类型默认值说明
domainIdstring—域 ID
返回值Promise<DomainDoc | null>

getByHost(host: string): Promise<DomainDoc | null> ​

按 host 字段获取域,带 LRU 缓存(也缓存 null 未命中)。

参数类型默认值说明
hoststring—自定义 host 头值
返回值Promise<DomainDoc | null>

getMulti(query?: Filter<DomainDoc>): FindCursor<DomainDoc> ​

获取匹配过滤器的域游标。

参数类型默认值说明
queryFilter<DomainDoc>{}MongoDB 过滤条件
返回值FindCursor<DomainDoc>

getList(domainIds: string[]): Promise<Record<string, DomainDoc | null>> ​

以域 ID 为键的字典形式获取多个域(内部使用 get,遵循缓存)。

参数类型默认值说明
domainIdsstring[]—域 ID 数组
返回值Promise<Record<string, DomainDoc | null>>

edit(domainId: string, $set: Partial<DomainDoc>): Promise<DomainDoc | null> ​

按 ID 更新域字段;广播缓存失效。

参数类型默认值说明
domainIdstring—域 ID
$setPartial<DomainDoc>—要更新的字段
返回值Promise<DomainDoc | null>

inc(domainId: string, field: NumberKeys<DomainDoc>, n: number): Promise<number | null> ​

原子性递增域上的数值字段;广播缓存失效。

参数类型默认值说明
domainIdstring—域 ID
fieldNumberKeys<DomainDoc>—要递增的数值字段名
nnumber—递增量
返回值Promise<number | null>

getPrefixSearch(prefix: string, limit?: number): Promise<DomainDoc[]> ​

按 ID 或名称前缀搜索域(正则,不区分大小写);默认限制 50。

参数类型默认值说明
prefixstring—搜索前缀
limitnumber50返回数量上限
返回值Promise<DomainDoc[]>

del(domainId: string): Promise<void> ​

删除域及所有用户关联;触发 domain/delete 事件并使缓存失效。

参数类型默认值说明
domainIdstring—域 ID
返回值Promise<void>

域用户管理 ​

countUser(domainId: string, role?: string): Promise<number> ​

统计域中的已加入用户,可选按角色过滤。

参数类型默认值说明
domainIdstring—域 ID
rolestring—可选角色过滤
返回值Promise<number>

getDomainUser(domainId: string, udoc: { _id: number, priv: number }): Promise<any> ​

获取域用户记录,包含有效角色和计算后的 perm(考虑用户特权如 PRIV_MANAGE_ALL_DOMAIN)。

参数类型默认值说明
domainIdstring—域 ID
udoc{ _id: number, priv: number }—用户文档(至少含 _id 和 priv)
返回值Promise<any>

getDomainUserMulti(domainId: string, uids: number[]): FindCursor<any> ​

按 UID 获取多个域用户记录的游标。

参数类型默认值说明
domainIdstring—域 ID
uidsnumber[]—用户 ID 数组
返回值FindCursor<any>

getDictUserByDomainId(uid: number): Promise<Record<string, any>> ​

获取用户的所有已加入域用户记录,以 domainId 为键。

参数类型默认值说明
uidnumber—用户 ID
返回值Promise<Record<string, any>>

setUserRole(domainId: string, uid: MaybeArray<number>, role: string, autojoin?: boolean): Promise<any> ​

设置域中的用户角色;支持单个或批量 UID;可选自动加入。

参数类型默认值说明
domainIdstring—域 ID
uidMaybeArray<number>—单个或批量用户 ID
rolestring—目标角色名
autojoinbooleanfalse是否自动加入域
返回值Promise<any>

setJoin(domainId: string, uid: MaybeArray<number>, join: boolean): Promise<void> ​

设置域中用户的加入状态。

参数类型默认值说明
domainIdstring—域 ID
uidMaybeArray<number>—单个或批量用户 ID
joinboolean—加入状态
返回值Promise<void>

setUserInDomain(domainId: string, uid: number, params: any): Promise<any> ​

设置域用户记录的指定字段(upsert)。

参数类型默认值说明
domainIdstring—域 ID
uidnumber—用户 ID
paramsany—要设置的字段
返回值Promise<any>

updateUserInDomain(domainId: string, uid: number, update: any): Promise<any> ​

对域用户记录应用任意 MongoDB 更新(upsert)。

参数类型默认值说明
domainIdstring—域 ID
uidnumber—用户 ID
updateany—MongoDB 更新操作
返回值Promise<any>

setMultiUserInDomain(domainId: string, query: any, params: any): Promise<any> ​

批量使用 $set 更新匹配查询的域用户(upsert)。

参数类型默认值说明
domainIdstring—域 ID
queryany—匹配条件
paramsany—要设置的字段
返回值Promise<any>

getMultiUserInDomain(domainId: string, query?: any): FindCursor<any> ​

获取匹配查询的域用户游标。

参数类型默认值说明
domainIdstring—域 ID
queryany{}匹配条件
返回值FindCursor<any>

incUserInDomain(domainId: string, uid: number, field: string, n: number = 1): Promise<any> ​

对域用户记录执行读-改-写递增数值字段;返回更新后的文档。

参数类型默认值说明
domainIdstring—域 ID
uidnumber—用户 ID
fieldstring—要递增的字段名
nnumber1递增量
返回值Promise<any>

角色管理 ​

getRoles(domainId: string | DomainDoc, count?: boolean): Promise<any[]> ​

获取域的所有角色(内置 + 自定义),可选附带每角色的用户计数。

参数类型默认值说明
domainIdstring | DomainDoc—域 ID 或域文档
countbooleanfalse是否附带每角色用户计数
返回值Promise<any[]>

setRoles(domainId: string, roles: Dictionary<bigint | string>): Promise<any> ​

设置多个角色及其权限(合并到已有角色中)。

参数类型默认值说明
domainIdstring—域 ID
rolesDictionary<bigint | string>—角色名 → 权限映射
返回值Promise<any>

addRole(domainId: string, name: string, permission: bigint): Promise<any> ​

添加具有指定权限的新自定义角色。

参数类型默认值说明
domainIdstring—域 ID
namestring—角色名
permissionbigint—角色权限
返回值Promise<any>

deleteRoles(domainId: string, roles: string[]): Promise<void> ​

删除角色并将所有受影响的用户重置为 default 角色。

参数类型默认值说明
domainIdstring—域 ID
rolesstring[]—要删除的角色名数组
返回值Promise<void>

加入设置 ​

getJoinSettings(ddoc: DomainDoc, roles: string[]): any | null ​

如果域允许加入且角色被允许,则获取加入设置;加入被禁用或已过期时返回 null。

参数类型默认值说明
ddocDomainDoc—域文档
rolesstring[]—允许加入的角色列表
返回值any | null

属性 ​

属性类型说明
collCollectionMongoDB domain 集合
collUserCollectionMongoDB domain.user 集合

事件 ​

事件参数说明
domain/createddoc: DomainDoc域创建时触发(DB 插入前)
domain/before-getquery: Filter<DomainDoc>域查询前触发;允许修改查询条件
domain/getddoc: DomainDoc域成功获取后触发
domain/before-updatedomainId, $set域更新前触发
domain/updatedomainId, $set, ddoc域更新后触发(含更新后的文档)
domain/deletedomainId域删除后触发
domain/delete-cachedomainId跨集群广播使域缓存失效

备注 ​

  • 使用 LRUCache,最大 1000 条目,TTL 300000ms(5 分钟)。
  • 缓存键:ID 查找使用 id::{lower},host 查找使用 host::{host}。
  • 缓存通过 domain/delete-cache 广播(跨集群)在编辑、递增、角色变更和删除时失效。
  • getByHost 缓存 null 结果(未找到 host 对应的域)。