RoleResolverPower 场景
用一个 resolve 场景说明为什么某些点必须只有一个最终答案
场景
你希望某条链路里有人可以问:
- “当前这个用户的角色是什么?”
这种问题不是多 Power 协同改值,而是必须有一个唯一答案。
这就是 resolve 的典型场景。
示例
import {
Power,
type PowerResolveHook,
} from "@downcity/city/power";
class RoleResolverPower extends Power {
readonly name = "role_resolver";
readonly title = "Role Resolver";
readonly description = "Resolves one final role for a user.";
private readonly resolveRole: PowerResolveHook = async ({ value }) => {
const body = value as { userId?: unknown };
const userId = String(body.userId || "").trim();
if (!userId) {
throw new Error("userId is required");
}
if (userId === "owner") return "admin";
return "member";
};
readonly resolves = {
"auth.resolve_role": this.resolveRole,
};
}
// City 已登记并把 role_resolver 绑定到 entry 的 Agent/Workspace。
const role = await city.powers.scope({ agent_id: agent.id, workspace_id: workspace.id }).resolve<{ userId: string }, string>(
"auth.resolve_role",
{ userId: "owner" },
);为什么不能有两个 resolver
因为这类点的语义不是:
- 大家都来补一点
而是:
- 最终到底谁说了算
所以当前实现里,同一个 resolve 点重复注册会直接报错。