Files
mailer/ts/config/config-manager.ts
2025-10-24 08:09:29 +00:00

84 lines
1.8 KiB
TypeScript

/**
* 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<IMailerConfig> {
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<void> {
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',
};
}
}