48 lines
1.8 KiB
TypeScript
48 lines
1.8 KiB
TypeScript
import type { NotificationService, SendNotificationCommand } from '@core/notifications/application/ports/NotificationService';
|
|
import type { INotificationRepository } from '@core/notifications/domain/repositories/INotificationRepository';
|
|
import type { INotificationPreferenceRepository } from '@core/notifications/domain/repositories/INotificationPreferenceRepository';
|
|
import type { NotificationGatewayRegistry } from '@core/notifications/application/ports/NotificationGateway';
|
|
import { SendNotificationUseCase } from '@core/notifications/application/use-cases/SendNotificationUseCase';
|
|
import type { Logger } from '@core/shared/application';
|
|
import type { UseCaseOutputPort } from '@core/shared/application/UseCaseOutputPort';
|
|
|
|
class NoOpOutputPort implements UseCaseOutputPort<any> {
|
|
present(_result: any): void {
|
|
// No-op for adapter
|
|
}
|
|
}
|
|
|
|
export class NotificationServiceAdapter implements NotificationService {
|
|
private readonly useCase: SendNotificationUseCase;
|
|
private readonly logger: Logger;
|
|
|
|
constructor(
|
|
notificationRepository: INotificationRepository,
|
|
preferenceRepository: INotificationPreferenceRepository,
|
|
gatewayRegistry: NotificationGatewayRegistry,
|
|
logger: Logger,
|
|
) {
|
|
this.logger = logger;
|
|
this.useCase = new SendNotificationUseCase(
|
|
notificationRepository,
|
|
preferenceRepository,
|
|
gatewayRegistry,
|
|
new NoOpOutputPort(),
|
|
logger,
|
|
);
|
|
}
|
|
|
|
async sendNotification(command: SendNotificationCommand): Promise<void> {
|
|
const result = await this.useCase.execute(command);
|
|
|
|
if (result.isErr()) {
|
|
const error = result.error;
|
|
if (error) {
|
|
this.logger.error('Failed to send notification', new Error(error.details.message));
|
|
throw new Error(error.details.message);
|
|
} else {
|
|
throw new Error('Unknown error sending notification');
|
|
}
|
|
}
|
|
}
|
|
} |