feat: topology, and improves handling

This commit is contained in:
2026-02-17 18:12:02 +07:00
parent e8dbefde43
commit d14f043e7c
145 changed files with 4213 additions and 2861 deletions

View File

@@ -1,4 +1,5 @@
import type { DomainEvent } from "../domain/events/domain-event";
import { logger } from "./logger";
type EventHandler<T extends DomainEvent = DomainEvent> = (event: T) => void | Promise<void>;
@@ -14,7 +15,7 @@ export class EventBus {
if (!this.handlers.has(eventName)) {
this.handlers.set(eventName, new Set());
}
this.handlers.get(eventName)!.add(handler as EventHandler);
this.handlers.get(eventName)?.add(handler as EventHandler);
return () => {
this.handlers.get(eventName)?.delete(handler as EventHandler);
};
@@ -28,7 +29,7 @@ export class EventBus {
try {
await handler(event);
} catch (error) {
console.error(`[EventBus] Error in handler for ${eventName}:`, error);
logger.error({ err: error, eventName }, "Error executing event handler");
}
}
}

View File

@@ -1,4 +1,6 @@
import "./server-event.handler";
import "./user-event.handler";
console.log("[EventBus] All event handlers registered");
import { logger } from "../logger";
logger.debug("All domain event handlers registered");

View File

@@ -1,22 +1,23 @@
import { wsService } from "../../application/di-container";
import {
ServerCreatedEvent,
ServerDeletedEvent,
ServerUpdatedEvent,
} from "../../domain/events/server-lifecycle.events";
import { eventBus } from "../event-bus";
import { wsService } from "../../application/di-container";
import { logger } from "../logger";
eventBus.subscribe(ServerCreatedEvent, async (event) => {
console.log(`[Event] Server created: ${event.serverId} (${event.serverType})`);
logger.info({ serverId: event.serverId, serverType: event.serverType }, "Server created event");
wsService.broadcast("create", event.serverType, event.serverId);
});
eventBus.subscribe(ServerUpdatedEvent, async (event) => {
console.log(`[Event] Server updated: ${event.serverId}`);
logger.info({ serverId: event.serverId }, "Server updated event");
wsService.broadcast("update", "server", event.serverId);
});
eventBus.subscribe(ServerDeletedEvent, async (event) => {
console.log(`[Event] Server deleted: ${event.serverId}`);
logger.info({ serverId: event.serverId }, "Server deleted event");
wsService.broadcast("delete", "server", event.serverId);
});

View File

@@ -3,17 +3,19 @@ import {
UserUnsuspendedEvent,
} from "../../domain/events/server-lifecycle.events";
import { eventBus } from "../event-bus";
import { logger } from "../logger";
eventBus.subscribe(UserSuspendedEvent, async (event) => {
if (event.suspendedUntil) {
console.log(
`[Event] User suspended: ${event.userId} until ${event.suspendedUntil.toISOString()}`
logger.warn(
{ userId: event.userId, suspendedUntil: event.suspendedUntil.toISOString() },
"User suspended with expiry"
);
} else {
console.log(`[Event] User suspended: ${event.userId} indefinitely`);
logger.warn({ userId: event.userId }, "User suspended indefinitely");
}
});
eventBus.subscribe(UserUnsuspendedEvent, async (event) => {
console.log(`[Event] User unsuspended: ${event.userId}`);
logger.info({ userId: event.userId }, "User unsuspended");
});

View File

@@ -0,0 +1,5 @@
import { createLogger } from "@minikura/shared";
export { createLogger };
export const logger = createLogger("backend-api");

View File

@@ -1,5 +1,4 @@
import { prisma, type UpdateSuspensionInput, type UpdateUserInput, type User } from "@minikura/db";
import { UserRole } from "../../../domain/entities/enums";
import type { UserRepository } from "../../../domain/repositories/user.repository";
export class PrismaUserRepository implements UserRepository {