Menyelesaikan object user dan init base

This commit is contained in:
Mr. Rayyan
2026-07-30 22:47:18 +07:00
parent 3efac50f39
commit fdbfb34842
128 changed files with 6785 additions and 3156 deletions
+14
View File
@@ -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.
+13
View File
@@ -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);
}
}
+3
View File
@@ -0,0 +1,3 @@
import { DomainEvent } from './event.interface';
export type EventHandler = (event: DomainEvent) => Promise<void>;
+17
View File
@@ -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)));
}
}
+5
View File
@@ -0,0 +1,5 @@
export interface DomainEvent {
readonly name: string;
readonly payload: any;
readonly occurredAt: Date;
}