Browse Source

feat(config): add comment email and notify preference keys

Made-with: Cursor
main
npmrun 3 weeks ago
parent
commit
671137b40b
  1. 32
      server/service/config/registry.test.ts
  2. 66
      server/service/config/registry.ts

32
server/service/config/registry.test.ts

@ -0,0 +1,32 @@
import { describe, expect, test } from "bun:test";
import { getConfigDefinition, validateConfigValue } from "./registry";
describe("comment email config validation", () => {
test("accepts a valid commentMailFromEmail", () => {
expect(validateConfigValue("commentMailFromEmail" as never, "noreply@example.com")).toBe(true);
});
test("rejects an invalid commentMailFromEmail", () => {
expect(validateConfigValue("commentMailFromEmail" as never, "invalid-email")).toBe(false);
});
test("validates commentNotifyEnabled as boolean", () => {
expect(validateConfigValue("commentNotifyEnabled" as never, true)).toBe(true);
expect(validateConfigValue("commentNotifyEnabled" as never, false)).toBe(true);
expect(validateConfigValue("commentNotifyEnabled" as never, "true")).toBe(false);
});
test("enforces commentSmtpPort boundaries", () => {
expect(validateConfigValue("commentSmtpPort" as never, 0)).toBe(false);
expect(validateConfigValue("commentSmtpPort" as never, 65536)).toBe(false);
expect(validateConfigValue("commentSmtpPort" as never, 465)).toBe(true);
});
test("defines commentNotifyEnabled as user-overridable both-scope key", () => {
const definition = getConfigDefinition("commentNotifyEnabled" as never);
expect(definition.scope).toBe("both");
expect(definition.valueType).toBe("boolean");
expect(definition.defaultValue).toBe(true);
expect(definition.userOverridable).toBe(true);
});
});

66
server/service/config/registry.ts

@ -15,6 +15,14 @@ function defineConfig<T extends SupportedValue>(config: ConfigDefinition<T>): Co
return config; return config;
} }
function isValidEmail(value: string): boolean {
const trimmed = value.trim();
if (!trimmed.length) {
return true;
}
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmed);
}
const CONFIG_REGISTRY = { const CONFIG_REGISTRY = {
siteName: defineConfig<string>({ siteName: defineConfig<string>({
key: "siteName", key: "siteName",
@ -96,6 +104,64 @@ const CONFIG_REGISTRY = {
} }
}, },
}), }),
commentEmailNotifyEnabled: defineConfig<boolean>({
key: "commentEmailNotifyEnabled",
scope: "global",
valueType: "boolean",
defaultValue: false,
userOverridable: false,
}),
commentMailFromEmail: defineConfig<string>({
key: "commentMailFromEmail",
scope: "global",
valueType: "string",
defaultValue: "",
userOverridable: false,
validate: (value: string) => isValidEmail(value),
}),
commentSmtpHost: defineConfig<string>({
key: "commentSmtpHost",
scope: "global",
valueType: "string",
defaultValue: "",
userOverridable: false,
}),
commentSmtpPort: defineConfig<number>({
key: "commentSmtpPort",
scope: "global",
valueType: "number",
defaultValue: 465,
userOverridable: false,
validate: (value: number) => Number.isInteger(value) && value >= 1 && value <= 65535,
}),
commentSmtpSecure: defineConfig<boolean>({
key: "commentSmtpSecure",
scope: "global",
valueType: "boolean",
defaultValue: true,
userOverridable: false,
}),
commentSmtpUser: defineConfig<string>({
key: "commentSmtpUser",
scope: "global",
valueType: "string",
defaultValue: "",
userOverridable: false,
}),
commentSmtpPass: defineConfig<string>({
key: "commentSmtpPass",
scope: "global",
valueType: "string",
defaultValue: "",
userOverridable: false,
}),
commentNotifyEnabled: defineConfig<boolean>({
key: "commentNotifyEnabled",
scope: "both",
valueType: "boolean",
defaultValue: true,
userOverridable: true,
}),
} as const; } as const;
export type KnownConfigKey = keyof typeof CONFIG_REGISTRY; export type KnownConfigKey = keyof typeof CONFIG_REGISTRY;

Loading…
Cancel
Save