initial
This commit is contained in:
83
ts/config/config-manager.ts
Normal file
83
ts/config/config-manager.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
/**
|
||||
* 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',
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user