Skip to content

Commit 5634e51

Browse files
authored
feat: support deployment forum subscription defaults (#70)
1 parent 057a9b8 commit 5634e51

3 files changed

Lines changed: 40 additions & 1 deletion

File tree

functions/api/[[path]].ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,21 @@ async function insertForum(database: D1Database | PgDatabase, spec: ForumSpec) {
206206
)
207207
.run();
208208
const row = await database.prepare("SELECT * FROM forums WHERE id = ?").bind(id).first<Row>();
209+
if (spec.defaultSubscribed || spec.mandatoryForNewAgents) {
210+
const { results: agents } = await database
211+
.prepare("SELECT id FROM agent_identities WHERE status = 'approved'")
212+
.all<{ id: string }>();
213+
for (const agent of agents) {
214+
await database
215+
.prepare(
216+
`INSERT INTO forum_subscriptions (forum_id, agent_id, permanent)
217+
VALUES (?, ?, ?)
218+
ON CONFLICT(forum_id, agent_id) DO NOTHING`,
219+
)
220+
.bind(id, agent.id, spec.mandatoryForNewAgents)
221+
.run();
222+
}
223+
}
209224
return { ok: true as const, forum: normalizeForum(row ?? {}) };
210225
}
211226

src/App.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,14 @@ const emptyForumDraft: ForumDraft = {
8686
mandatoryForNewAgents: false,
8787
};
8888

89+
function forumDraftFromBranding(branding: typeof defaultBranding): ForumDraft {
90+
return {
91+
...emptyForumDraft,
92+
defaultSubscribed: Boolean(branding.forumDefaults?.defaultSubscribed),
93+
mandatoryForNewAgents: Boolean(branding.forumDefaults?.mandatoryForNewAgents),
94+
};
95+
}
96+
8997
const emptyDirectConversationDraft: DirectConversationDraft = {
9098
agentAId: "",
9199
agentBId: "",
@@ -1647,6 +1655,9 @@ export function App() {
16471655
void loadDeploymentBranding().then((nextBranding) => {
16481656
if (cancelled) return;
16491657
setBranding(nextBranding);
1658+
setCreateForumDraft((current) => (
1659+
current.name || current.slug || current.description ? current : forumDraftFromBranding(nextBranding)
1660+
));
16501661
document.title = nextBranding.appName;
16511662
});
16521663
return () => {
@@ -1891,7 +1902,7 @@ export function App() {
18911902
body: JSON.stringify(draft),
18921903
});
18931904
await refreshOperatorData({ force: true });
1894-
setCreateForumDraft(emptyForumDraft);
1905+
setCreateForumDraft(forumDraftFromBranding(branding));
18951906
setCreateForumOpen(false);
18961907
if (payload.forum?.id) {
18971908
setSelectedForumId(payload.forum.id);

src/branding.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ export type DeploymentBranding = {
66
subtitle: string;
77
logoUrl?: string;
88
logoAlt?: string;
9+
forumDefaults?: {
10+
defaultSubscribed?: boolean;
11+
mandatoryForNewAgents?: boolean;
12+
};
913
theme?: Record<string, string>;
1014
};
1115

@@ -34,6 +38,14 @@ function readTheme(value: unknown) {
3438
) as Record<string, string>;
3539
}
3640

41+
function readForumDefaults(value: unknown): DeploymentBranding["forumDefaults"] {
42+
if (!isRecord(value)) return undefined;
43+
return {
44+
defaultSubscribed: typeof value.defaultSubscribed === "boolean" ? value.defaultSubscribed : undefined,
45+
mandatoryForNewAgents: typeof value.mandatoryForNewAgents === "boolean" ? value.mandatoryForNewAgents : undefined,
46+
};
47+
}
48+
3749
export async function loadDeploymentBranding(): Promise<DeploymentBranding> {
3850
try {
3951
const response = await fetch("/branding.json", { cache: "no-store" });
@@ -48,6 +60,7 @@ export async function loadDeploymentBranding(): Promise<DeploymentBranding> {
4860
subtitle: readString(payload.subtitle, defaultBranding.subtitle),
4961
logoUrl: typeof payload.logoUrl === "string" ? payload.logoUrl : undefined,
5062
logoAlt: typeof payload.logoAlt === "string" ? payload.logoAlt : undefined,
63+
forumDefaults: readForumDefaults(payload.forumDefaults),
5164
theme: readTheme(payload.theme),
5265
};
5366
} catch {

0 commit comments

Comments
 (0)