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',
 | |
|     };
 | |
|   }
 | |
| }
 |