From 7cfd69b1f7d78401a02c6f555f8f43ccd2c19538 Mon Sep 17 00:00:00 2001 From: Flaminel Date: Thu, 29 May 2025 20:14:07 +0300 Subject: [PATCH] fixed search on events --- code/Data/DataContext.cs | 9 +++ .../Controllers/EventsController.cs | 58 ++----------------- .../src/app/core/services/events.service.ts | 48 --------------- 3 files changed, 14 insertions(+), 101 deletions(-) diff --git a/code/Data/DataContext.cs b/code/Data/DataContext.cs index 60277b49..c69075f8 100644 --- a/code/Data/DataContext.cs +++ b/code/Data/DataContext.cs @@ -38,4 +38,13 @@ public class DataContext : DbContext v => DateTime.SpecifyKind(v, DateTimeKind.Utc) ) {} } + + public static string GetLikePattern(string input) + { + input = input.Replace("[", "[[]") + .Replace("%", "[%]") + .Replace("_", "[_]"); + + return $"%{input}%"; + } } \ No newline at end of file diff --git a/code/Executable/Controllers/EventsController.cs b/code/Executable/Controllers/EventsController.cs index cffc584e..85d2617d 100644 --- a/code/Executable/Controllers/EventsController.cs +++ b/code/Executable/Controllers/EventsController.cs @@ -66,10 +66,12 @@ public class EventsController : ControllerBase // Apply search filter if provided if (!string.IsNullOrWhiteSpace(search)) { + string pattern = DataContext.GetLikePattern(search); query = query.Where(e => - (e.Message != null && e.Message.Contains(search, StringComparison.OrdinalIgnoreCase)) || - (e.Data != null && e.Data.Contains(search, StringComparison.OrdinalIgnoreCase)) || - (e.TrackingId != null && e.TrackingId.ToString().Contains(search, StringComparison.OrdinalIgnoreCase))); + EF.Functions.Like(e.Message, pattern) || + EF.Functions.Like(e.Data, pattern) || + EF.Functions.Like(e.TrackingId.ToString(), pattern) + ); } // Count total matching records for pagination @@ -192,56 +194,6 @@ public class EventsController : ControllerBase var severities = Enum.GetNames(typeof(EventSeverity)).ToList(); return Ok(severities); } - - /// - /// Gets the latest events for real-time updates - /// - [HttpGet("latest")] - public async Task>> GetLatestEvents( - [FromQuery] int count = 100, - [FromQuery] string? severity = null, - [FromQuery] string? eventType = null, - [FromQuery] DateTime? after = null, - [FromQuery] string? search = null) - { - var query = _context.Events.AsQueryable(); - - // Apply filters - if (!string.IsNullOrWhiteSpace(severity)) - { - if (Enum.TryParse(severity, true, out var severityEnum)) - query = query.Where(e => e.Severity == severityEnum); - } - - if (!string.IsNullOrWhiteSpace(eventType)) - { - if (Enum.TryParse(eventType, true, out var eventTypeEnum)) - query = query.Where(e => e.EventType == eventTypeEnum); - } - - // Filter for events after a specific timestamp - if (after.HasValue) - { - query = query.Where(e => e.Timestamp > after.Value); - } - - // Apply search filter if provided - if (!string.IsNullOrWhiteSpace(search)) - { - query = query.Where(e => - (e.Message != null && e.Message.Contains(search, StringComparison.OrdinalIgnoreCase)) || - (e.Data != null && e.Data.Contains(search, StringComparison.OrdinalIgnoreCase)) || - (e.TrackingId != null && e.TrackingId.ToString().Contains(search, StringComparison.OrdinalIgnoreCase))); - } - - // Order and limit - var events = await query - .OrderByDescending(e => e.Timestamp) - .Take(Math.Min(count, 1000)) // Cap at 1000 - .ToListAsync(); - - return Ok(events); - } } /// diff --git a/code/UI/src/app/core/services/events.service.ts b/code/UI/src/app/core/services/events.service.ts index bb6c78c8..536dd8e3 100644 --- a/code/UI/src/app/core/services/events.service.ts +++ b/code/UI/src/app/core/services/events.service.ts @@ -68,54 +68,6 @@ export class EventsService { ); } - /** - * Get latest events (for polling) - */ - getLatestEvents(filter: Partial = {}): Observable { - let params = new HttpParams().set('count', '100'); - - // Add timestamp filter if we have a last event timestamp - if (this.lastEventTimestamp) { - params = params.set('after', this.lastEventTimestamp.toISOString()); - } - - // Add optional filters if they exist - params = this.addFiltersToParams(params, filter); - - return this.http.get(`${this.apiUrl}/latest`, { params }) - .pipe( - tap(newEvents => { - if (newEvents.length > 0) { - // Update the last event timestamp - const newestEvent = newEvents.reduce((prev, current) => { - return new Date(current.timestamp) > new Date(prev.timestamp) ? current : prev; - }); - this.lastEventTimestamp = new Date(newestEvent.timestamp); - - // Update the events list if we already have events loaded - const currentEvents = this.events.value; - if (currentEvents) { - // Combine old and new events, respecting pagination - const combinedItems = [...newEvents, ...currentEvents.items] - .sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()) - .slice(0, currentEvents.pageSize); - - // Update the events subject - this.events.next({ - ...currentEvents, - items: combinedItems, - totalCount: currentEvents.totalCount + newEvents.length - }); - } - } - }), - catchError(error => { - console.error('Error getting latest events:', error); - return of([]); - }) - ); - } - /** * Helper to add filters to HttpParams */