/** * Configuration Manager * Handles configuration storage and retrieval */ import * as plugins from '../plugins.ts'; export interface IMailerConfig { domains: IDomainConfig[]; apiKeys: string[]; smtpPort: number; apiPort: number; hostname: string; } export interface IDomainConfig { domain: string; dnsMode: 'forward' | 'internal-dns' | 'external-dns'; cloudflare?: { apiToken: string; }; } export class ConfigManager { private configPath: string; private config: IMailerConfig | null = null; constructor(configPath?: string) { this.configPath = configPath || plugins.path.join(Deno.env.get('HOME') || '/root', '.mailer', 'config.json'); } /** * Load configuration from disk */ async load(): Promise { try { const data = await Deno.readTextFile(this.configPath); this.config = JSON.parse(data); return this.config!; } catch (error) { // Return default config if file doesn't exist this.config = this.getDefaultConfig(); return this.config; } } /** * Save configuration to disk */ async save(config: IMailerConfig): Promise { this.config = config; // Ensure directory exists const dir = plugins.path.dirname(this.configPath); await Deno.mkdir(dir, { recursive: true }); // Write config await Deno.writeTextFile(this.configPath, JSON.stringify(config, null, 2)); } /** * Get current configuration */ getConfig(): IMailerConfig { if (!this.config) { throw new Error('Configuration not loaded. Call load() first.'); } return this.config; } /** * Get default configuration */ private getDefaultConfig(): IMailerConfig { return { domains: [], apiKeys: [], smtpPort: 25, apiPort: 8080, hostname: 'localhost', }; } }