refactor: share directory config listers

This commit is contained in:
Peter Steinberger
2026-03-26 22:58:23 +00:00
parent 4151b48d6c
commit bfad32aa16
8 changed files with 205 additions and 152 deletions

View File

@@ -1,5 +1,7 @@
import { describe, expect, it } from "vitest";
import {
createInspectedDirectoryEntriesLister,
createResolvedDirectoryEntriesLister,
listDirectoryEntriesFromSources,
listInspectedDirectoryEntriesFromSources,
listDirectoryGroupEntriesFromMapKeysAndAllowFrom,
@@ -128,6 +130,21 @@ describe("listInspectedDirectoryEntriesFromSources", () => {
});
});
describe("createInspectedDirectoryEntriesLister", () => {
it("builds a reusable inspected-account lister", async () => {
const listGroups = createInspectedDirectoryEntriesLister({
kind: "group",
inspectAccount: () => ({ ids: [["room:a"], ["room:b", "room:a"]] }),
resolveSources: (account) => account.ids,
normalizeId: (entry) => entry.replace(/^room:/i, ""),
});
await expect(listGroups({ cfg: {} as never, query: "a" })).resolves.toEqual([
{ kind: "group", id: "a" },
]);
});
});
describe("resolved account directory helpers", () => {
const cfg = {} as never;
const resolveAccount = () => ({
@@ -174,4 +191,18 @@ describe("resolved account directory helpers", () => {
expectUserDirectoryEntries(entries);
});
it("builds a reusable resolved-account lister", async () => {
const listUsers = createResolvedDirectoryEntriesLister({
kind: "user",
resolveAccount,
resolveSources: (account) => [account.allowFrom, ["user:carla", "user:alice"]],
normalizeId: (entry) => entry.replace(/^user:/i, ""),
});
await expect(listUsers({ cfg, query: "a", limit: 2 })).resolves.toEqual([
{ kind: "user", id: "alice" },
{ kind: "user", id: "carla" },
]);
});
});

View File

@@ -121,6 +121,22 @@ export function listInspectedDirectoryEntriesFromSources<InspectedAccount>(
});
}
export function createInspectedDirectoryEntriesLister<InspectedAccount>(params: {
kind: "user" | "group";
inspectAccount: (
cfg: OpenClawConfig,
accountId?: string | null,
) => InspectedAccount | null | undefined;
resolveSources: (account: InspectedAccount) => Iterable<unknown>[];
normalizeId: (entry: string) => string | null | undefined;
}) {
return async (configParams: DirectoryConfigParams): Promise<ChannelDirectoryEntry[]> =>
listInspectedDirectoryEntriesFromSources({
...configParams,
...params,
});
}
export function listResolvedDirectoryEntriesFromSources<ResolvedAccount>(
params: DirectoryConfigParams & {
kind: "user" | "group";
@@ -139,6 +155,19 @@ export function listResolvedDirectoryEntriesFromSources<ResolvedAccount>(
});
}
export function createResolvedDirectoryEntriesLister<ResolvedAccount>(params: {
kind: "user" | "group";
resolveAccount: (cfg: OpenClawConfig, accountId?: string | null) => ResolvedAccount;
resolveSources: (account: ResolvedAccount) => Iterable<unknown>[];
normalizeId: (entry: string) => string | null | undefined;
}) {
return async (configParams: DirectoryConfigParams): Promise<ChannelDirectoryEntry[]> =>
listResolvedDirectoryEntriesFromSources({
...configParams,
...params,
});
}
export function listDirectoryUserEntriesFromAllowFrom(params: {
allowFrom?: readonly unknown[];
query?: string | null;

View File

@@ -14,6 +14,8 @@ export {
export {
applyDirectoryQueryAndLimit,
collectNormalizedDirectoryIds,
createInspectedDirectoryEntriesLister,
createResolvedDirectoryEntriesLister,
listDirectoryEntriesFromSources,
listDirectoryGroupEntriesFromMapKeys,
listDirectoryGroupEntriesFromMapKeysAndAllowFrom,