anya/config/index.ts

61 lines
1.6 KiB
TypeScript
Raw Permalink Normal View History

2024-10-06 13:56:33 +05:30
import fs from "fs";
import { z } from "zod";
import path from "path";
export const dataDir = path.join(process.env.ANYA_DIR || "./");
export const pathInDataDir = (filename: string) => path.join(dataDir, filename);
interface PlatformIdentity {
platform: "discord" | "whatsapp" | "email" | "events";
id: string; // Platform-specific user ID
}
export interface UserConfig {
name: string;
identities: PlatformIdentity[];
2024-10-07 17:26:33 +05:30
friends?: {
2024-10-06 13:56:33 +05:30
related_as: string[];
user: UserConfig;
}[];
roles: string[]; // Roles assigned to the user
}
// Define Zod schemas for validation
const PlatformIdentitySchema = z.object({
platform: z.enum(["discord", "whatsapp", "email", "events"]),
id: z.string(),
});
const UserConfigSchema: z.ZodType<UserConfig> = z.lazy(() =>
z.object({
name: z.string(),
identities: z.array(PlatformIdentitySchema),
2024-10-07 17:26:33 +05:30
friends: z
2024-10-06 13:56:33 +05:30
.array(
z.object({
related_as: z.array(z.string()),
user: UserConfigSchema, // recursive schema for relatives
})
)
.optional(),
roles: z.array(z.string()),
})
);
// Schema for the full configuration file
const ConfigSchema = z.object({
users: z.array(UserConfigSchema),
rolePermissions: z.record(z.string(), z.array(z.string())),
});
// Load user configuration data from file
const userConfigPath = pathInDataDir("user-config.json");
const rawData = fs.readFileSync(userConfigPath, "utf-8");
const parsedData = JSON.parse(rawData);
// Validate the parsed JSON using the Zod schema
const configData = ConfigSchema.parse(parsedData);
// Export the validated data
export const { users: userConfigs, rolePermissions } = configData;