Files
gridpilot.gg/adapters/notifications/gateways/EmailNotificationGateway.ts
2025-12-22 22:46:15 +01:00

76 lines
2.0 KiB
TypeScript

/**
* Infrastructure Adapter: EmailNotificationAdapter (Stub)
*
* Handles email notifications.
* Currently a stub - to be implemented when email integration is needed.
*/
import type { Notification } from '@core/notifications/domain/entities/Notification';
import type {
NotificationGateway,
NotificationDeliveryResult
} from '@core/notifications/application/ports/NotificationGateway';
import type { NotificationChannel } from '@core/notifications/domain/types/NotificationTypes';
export interface EmailAdapterConfig {
smtpHost?: string;
smtpPort?: number;
smtpUser?: string;
smtpPassword?: string;
fromAddress?: string;
}
export class EmailNotificationAdapter implements NotificationGateway {
private readonly channel: NotificationChannel = 'email';
private config: EmailAdapterConfig;
constructor(config: EmailAdapterConfig = {}) {
this.config = config;
}
async send(notification: Notification): Promise<NotificationDeliveryResult> {
if (!this.isConfigured()) {
return {
success: false,
channel: this.channel,
error: 'Email SMTP not configured',
attemptedAt: new Date(),
};
}
// TODO: Implement actual email sending
// For now, this is a stub that logs and returns success
console.log(`[Email Stub] Would send email:`, {
to: notification.recipientId, // Would need to resolve to actual email
subject: notification.title,
body: notification.body,
type: notification.type,
});
return {
success: true,
channel: this.channel,
externalId: `email-stub-${notification.id}`,
attemptedAt: new Date(),
};
}
supportsChannel(channel: NotificationChannel): boolean {
return channel === this.channel;
}
isConfigured(): boolean {
return !!(this.config.smtpHost && this.config.fromAddress);
}
getChannel(): NotificationChannel {
return this.channel;
}
/**
* Update SMTP configuration
*/
configure(config: EmailAdapterConfig): void {
this.config = { ...this.config, ...config };
}
}