Menyelesaikan object user dan init base
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
core/events/
|
||||
|
||||
Penjelasan:
|
||||
Folder ini berisi pondasi untuk domain events: definisi event, publisher, dispatcher, dan handler.
|
||||
|
||||
Isi yang direkomendasikan:
|
||||
- event.interface.ts (DomainEvent)
|
||||
- event-publisher.ts (interface dan implementasi sederhana)
|
||||
- event-dispatcher.ts (dispatcher untuk publish/dispatch event)
|
||||
- event-handler.ts (type alias untuk handler)
|
||||
|
||||
Aturan:
|
||||
- Event hanya bermakna untuk komunikasi lintas module atau untuk memisahkan side-effect.
|
||||
- Hindari business logic kompleks di handler; handler sebaiknya mendelegasikan ke application service atau job queue.
|
||||
@@ -0,0 +1,13 @@
|
||||
import { DomainEvent } from './event.interface';
|
||||
|
||||
export class EventDispatcher {
|
||||
private publisher = new (require('./event-publisher').InMemoryEventPublisher)();
|
||||
|
||||
register(handler: (e: DomainEvent) => Promise<void>) {
|
||||
this.publisher.register(handler);
|
||||
}
|
||||
|
||||
async dispatch(event: DomainEvent) {
|
||||
await this.publisher.publish(event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
import { DomainEvent } from './event.interface';
|
||||
|
||||
export type EventHandler = (event: DomainEvent) => Promise<void>;
|
||||
@@ -0,0 +1,17 @@
|
||||
import { DomainEvent } from './event.interface';
|
||||
|
||||
export interface EventPublisher {
|
||||
publish(event: DomainEvent): Promise<void>;
|
||||
}
|
||||
|
||||
export class InMemoryEventPublisher implements EventPublisher {
|
||||
private handlers: Array<(e: DomainEvent) => Promise<void>> = [];
|
||||
|
||||
register(handler: (e: DomainEvent) => Promise<void>) {
|
||||
this.handlers.push(handler);
|
||||
}
|
||||
|
||||
async publish(event: DomainEvent) {
|
||||
await Promise.all(this.handlers.map((h) => h(event)));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
export interface DomainEvent {
|
||||
readonly name: string;
|
||||
readonly payload: any;
|
||||
readonly occurredAt: Date;
|
||||
}
|
||||
Reference in New Issue
Block a user