Skip to content

Commit a817304

Browse files
authored
Merge pull request #1 from Nestixis/feat/add-possibility-to-pass-database-drive-to-transactional-event-emitter
Feat/ add possibility to pass your own database driver to transactional event emitter
2 parents e87bfc0 + 7da915a commit a817304

File tree

4 files changed

+25
-24
lines changed

4 files changed

+25
-24
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export interface DatabaseDriverPersister {
2+
3+
persist<T>(entity: T): void;
4+
5+
remove<T>(entity: T): void;
6+
7+
flush(): Promise<void>;
8+
}
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
import { InboxOutboxTransportEvent } from '../model/inbox-outbox-transport-event.interface';
2+
import { DatabaseDriverPersister } from './database.driver-persister';
23

3-
4-
export interface DatabaseDriver {
4+
export interface DatabaseDriver extends DatabaseDriverPersister {
55
createInboxOutboxTransportEvent(eventName: string, eventPayload: any, expireAt: number, readyToRetryAfter: number | null): InboxOutboxTransportEvent;
6-
76
findAndExtendReadyToRetryEvents(limit: number): Promise<InboxOutboxTransportEvent[]>;
8-
9-
persist<T>(entity: T): Promise<void>;
10-
11-
remove<T>(entity: T): Promise<void>;
12-
13-
flush(): Promise<void>;
147
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export abstract class InboxOutboxEvent {
22
/**
3-
* @description Should be unique static name of the event
3+
* @description Should be unique name of the event
44
*/
5-
name: string;
5+
public abstract readonly name: string;
66
}

packages/core/src/emitter/transactional-event-emitter.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { Inject, Injectable } from '@nestjs/common';
22
import { DATABASE_DRIVER_FACTORY_TOKEN, DatabaseDriverFactory } from '../driver/database-driver.factory';
3+
import { DatabaseDriver } from '../driver/database.driver';
34
import { InboxOutboxModuleEventOptions, InboxOutboxModuleOptions, MODULE_OPTIONS_TOKEN } from '../inbox-outbox.module-definition';
45
import { IListener } from '../listener/contract/listener.interface';
56
import { ListenerDuplicateNameException } from '../listener/exception/listener-duplicate-name.exception';
67
import { INBOX_OUTBOX_EVENT_PROCESSOR_TOKEN, InboxOutboxEventProcessorContract } from '../processor/inbox-outbox-event-processor.contract';
78
import { EVENT_CONFIGURATION_RESOLVER_TOKEN, EventConfigurationResolverContract } from '../resolver/event-configuration-resolver.contract';
89
import { InboxOutboxEvent } from './contract/inbox-outbox-event.interface';
10+
import { DatabaseDriverPersister } from '../driver/database.driver-persister';
911

1012
export enum TransactionalEventEmitterOperations {
1113
persist = 'persist',
@@ -21,14 +23,15 @@ export class TransactionalEventEmitter {
2123
@Inject(DATABASE_DRIVER_FACTORY_TOKEN) private databaseDriverFactory: DatabaseDriverFactory,
2224
@Inject(INBOX_OUTBOX_EVENT_PROCESSOR_TOKEN) private inboxOutboxEventProcessor: InboxOutboxEventProcessorContract,
2325
@Inject(EVENT_CONFIGURATION_RESOLVER_TOKEN) private eventConfigurationResolver: EventConfigurationResolverContract,
24-
) {}
26+
) {}
2527

2628
async emit(
2729
event: InboxOutboxEvent,
2830
entities: {
2931
operation: TransactionalEventEmitterOperations;
3032
entity: any;
3133
}[],
34+
customDatabaseDriverPersister?: DatabaseDriverPersister,
3235
): Promise<void> {
3336
const eventOptions: InboxOutboxModuleEventOptions = this.options.events.find((optionEvent) => optionEvent.name === event.name);
3437

@@ -39,24 +42,21 @@ export class TransactionalEventEmitter {
3942
const databaseDriver = this.databaseDriverFactory.create(this.eventConfigurationResolver);
4043
const currentTimestamp = new Date().getTime();
4144

42-
const inboxOutboxTransportEvent = databaseDriver.createInboxOutboxTransportEvent(
43-
event.name,
44-
event,
45-
currentTimestamp + eventOptions.listeners.expiresAtTTL,
46-
currentTimestamp + eventOptions.listeners.readyToRetryAfterTTL,
47-
);
45+
const inboxOutboxTransportEvent = databaseDriver.createInboxOutboxTransportEvent(event.name, event, currentTimestamp + eventOptions.listeners.expiresAtTTL, currentTimestamp + eventOptions.listeners.readyToRetryAfterTTL);
46+
47+
const persister = customDatabaseDriverPersister ?? databaseDriver;
4848

4949
entities.forEach((entity) => {
50-
if (entity.operation === 'persist') {
51-
databaseDriver.persist(entity.entity);
50+
if (entity.operation === TransactionalEventEmitterOperations.persist) {
51+
persister.persist(entity.entity);
5252
}
53-
if (entity.operation === 'remove') {
54-
databaseDriver.remove(entity.entity);
53+
if (entity.operation === TransactionalEventEmitterOperations.remove) {
54+
persister.remove(entity.entity);
5555
}
5656
});
5757

58-
databaseDriver.persist(inboxOutboxTransportEvent);
59-
await databaseDriver.flush();
58+
persister.persist(inboxOutboxTransportEvent);
59+
await persister.flush();
6060

6161
this.inboxOutboxEventProcessor.process(eventOptions, inboxOutboxTransportEvent, this.getListeners(event.name));
6262
}

0 commit comments

Comments
 (0)