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
*/