From 185330402eec99228a9a39249f904f68d75dac34 Mon Sep 17 00:00:00 2001 From: "Janus C. H. Knudsen" Date: Fri, 21 Nov 2025 23:33:48 +0100 Subject: [PATCH] Refactor event payload types and event handling Extracts common event payload interfaces for entity saved, deleted, and audit logged events Improves type safety and reduces code duplication by centralizing event payload definitions --- src/storage/BaseEntityService.ts | 14 ++++++++------ src/storage/audit/AuditService.ts | 21 ++++++--------------- src/types/EventTypes.ts | 28 +++++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/storage/BaseEntityService.ts b/src/storage/BaseEntityService.ts index 3d83070..c889885 100644 --- a/src/storage/BaseEntityService.ts +++ b/src/storage/BaseEntityService.ts @@ -1,10 +1,10 @@ -import { ISync, EntityType, SyncStatus } from '../types/CalendarTypes'; +import { ISync, EntityType, SyncStatus, IEventBus } from '../types/CalendarTypes'; import { IEntityService } from './IEntityService'; import { SyncPlugin } from './SyncPlugin'; import { IndexedDBContext } from './IndexedDBContext'; -import { IEventBus } from '../types/CalendarTypes'; import { CoreEvents } from '../constants/CoreEvents'; import { diff } from 'json-diff-ts'; +import { IEntitySavedPayload, IEntityDeletedPayload } from '../types/EventTypes'; /** * BaseEntityService - Abstract base class for all entity services @@ -171,13 +171,14 @@ export abstract class BaseEntityService implements IEntityServi request.onsuccess = () => { // Emit ENTITY_SAVED event - this.eventBus.emit(CoreEvents.ENTITY_SAVED, { + const payload: IEntitySavedPayload = { entityType: this.entityType, entityId, operation: isCreate ? 'create' : 'update', changes, timestamp: Date.now() - }); + }; + this.eventBus.emit(CoreEvents.ENTITY_SAVED, payload); resolve(); }; @@ -201,12 +202,13 @@ export abstract class BaseEntityService implements IEntityServi request.onsuccess = () => { // Emit ENTITY_DELETED event - this.eventBus.emit(CoreEvents.ENTITY_DELETED, { + const payload: IEntityDeletedPayload = { entityType: this.entityType, entityId: id, operation: 'delete', timestamp: Date.now() - }); + }; + this.eventBus.emit(CoreEvents.ENTITY_DELETED, payload); resolve(); }; diff --git a/src/storage/audit/AuditService.ts b/src/storage/audit/AuditService.ts index 9ddbdd7..238ed87 100644 --- a/src/storage/audit/AuditService.ts +++ b/src/storage/audit/AuditService.ts @@ -3,6 +3,7 @@ import { IndexedDBContext } from '../IndexedDBContext'; import { IAuditEntry } from '../../types/AuditTypes'; import { EntityType, IEventBus } from '../../types/CalendarTypes'; import { CoreEvents } from '../../constants/CoreEvents'; +import { IEntitySavedPayload, IEntityDeletedPayload, IAuditLoggedPayload } from '../../types/EventTypes'; /** * AuditService - Entity service for audit entries @@ -52,13 +53,7 @@ export class AuditService extends BaseEntityService { /** * Handle ENTITY_SAVED event - create audit entry */ - private async handleEntitySaved(payload: { - entityType: EntityType; - entityId: string; - operation: 'create' | 'update'; - changes: any; - timestamp: number; - }): Promise { + private async handleEntitySaved(payload: IEntitySavedPayload): Promise { // Don't audit audit entries (prevent infinite loops) if (payload.entityType === 'Audit') return; @@ -80,12 +75,7 @@ export class AuditService extends BaseEntityService { /** * Handle ENTITY_DELETED event - create audit entry */ - private async handleEntityDeleted(payload: { - entityType: EntityType; - entityId: string; - operation: 'delete'; - timestamp: number; - }): Promise { + private async handleEntityDeleted(payload: IEntityDeletedPayload): Promise { // Don't audit audit entries (prevent infinite loops) if (payload.entityType === 'Audit') return; @@ -123,13 +113,14 @@ export class AuditService extends BaseEntityService { request.onsuccess = () => { // Emit AUDIT_LOGGED instead of ENTITY_SAVED - this.eventBus.emit(CoreEvents.AUDIT_LOGGED, { + const payload: IAuditLoggedPayload = { auditId: entity.id, entityType: entity.entityType, entityId: entity.entityId, operation: entity.operation, timestamp: entity.timestamp - }); + }; + this.eventBus.emit(CoreEvents.AUDIT_LOGGED, payload); resolve(); }; diff --git a/src/types/EventTypes.ts b/src/types/EventTypes.ts index 919c1b6..6b5a37e 100644 --- a/src/types/EventTypes.ts +++ b/src/types/EventTypes.ts @@ -3,7 +3,7 @@ */ import { IColumnBounds } from "../utils/ColumnDetectionUtils"; -import { ICalendarEvent } from "./CalendarTypes"; +import { ICalendarEvent, EntityType } from "./CalendarTypes"; /** * Drag Event Payload Interfaces @@ -103,4 +103,30 @@ export interface IResizeEndEventPayload { export interface INavButtonClickedEventPayload { direction: 'next' | 'previous' | 'today'; newDate: Date; +} + +// Entity saved event payload +export interface IEntitySavedPayload { + entityType: EntityType; + entityId: string; + operation: 'create' | 'update'; + changes: any; + timestamp: number; +} + +// Entity deleted event payload +export interface IEntityDeletedPayload { + entityType: EntityType; + entityId: string; + operation: 'delete'; + timestamp: number; +} + +// Audit logged event payload +export interface IAuditLoggedPayload { + auditId: string; + entityType: EntityType; + entityId: string; + operation: 'create' | 'update' | 'delete'; + timestamp: number; } \ No newline at end of file