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