84 lines
1.8 KiB
TypeScript
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',
|
|
};
|
|
}
|
|
}
|