diff --git a/src/modules/nostr-feed/services/FeedService.ts b/src/modules/nostr-feed/services/FeedService.ts index 500f963..d46ab24 100644 --- a/src/modules/nostr-feed/services/FeedService.ts +++ b/src/modules/nostr-feed/services/FeedService.ts @@ -383,6 +383,17 @@ export class FeedService extends BaseService { return } + // Route to ScheduledEventService for completion/RSVP deletions (kind 31925) + if (deletedKind === '31925') { + console.log('🔀 FeedService: Routing kind 5 (deletion of kind 31925) to ScheduledEventService') + if (this.scheduledEventService) { + this.scheduledEventService.handleDeletionEvent(event) + } else { + console.warn('⚠️ FeedService: ScheduledEventService not available') + } + return + } + // Handle post deletions (kind 1) in FeedService if (deletedKind === '1' || !deletedKind) { // Extract event IDs to delete from 'e' tags diff --git a/src/modules/nostr-feed/services/ScheduledEventService.ts b/src/modules/nostr-feed/services/ScheduledEventService.ts index 7524b01..fc97fd1 100644 --- a/src/modules/nostr-feed/services/ScheduledEventService.ts +++ b/src/modules/nostr-feed/services/ScheduledEventService.ts @@ -213,6 +213,46 @@ export class ScheduledEventService extends BaseService { } } + /** + * Handle deletion event (kind 5) for completion events + * Made public so FeedService can route deletion events to this service + */ + public handleDeletionEvent(event: NostrEvent): void { + console.log('🗑️ ScheduledEventService: Received deletion event (kind 5)', event.id) + + try { + // Extract event IDs to delete from 'e' tags + const eventIdsToDelete = event.tags + ?.filter((tag: string[]) => tag[0] === 'e') + .map((tag: string[]) => tag[1]) || [] + + if (eventIdsToDelete.length === 0) { + console.warn('Deletion event missing e tags:', event.id) + return + } + + console.log('🔍 Looking for completions to delete:', eventIdsToDelete) + + // Find and remove completions that match the deleted event IDs + let deletedCount = 0 + for (const [completionKey, completion] of this._completions.entries()) { + // Only delete if: + // 1. The completion event ID matches one being deleted + // 2. The deletion request comes from the same author (NIP-09 validation) + if (eventIdsToDelete.includes(completion.id) && completion.pubkey === event.pubkey) { + this._completions.delete(completionKey) + console.log('✅ Deleted completion:', completionKey, 'event ID:', completion.id) + deletedCount++ + } + } + + console.log(`🗑️ Deleted ${deletedCount} completion(s) from deletion event`) + + } catch (error) { + console.error('Failed to handle deletion event:', error) + } + } + /** * Get all scheduled events */