using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.Authorization; using LittleShop.Services; using LittleShop.DTOs; namespace LittleShop.Hubs; [Authorize(Policy = "AdminOnly")] public class ActivityHub : Hub { private readonly IBotActivityService _activityService; private readonly ILogger _logger; public ActivityHub(IBotActivityService activityService, ILogger logger) { _activityService = activityService; _logger = logger; } public override async Task OnConnectedAsync() { _logger.LogInformation("Admin connected to activity hub: {ConnectionId}", Context.ConnectionId); // Send initial summary when admin connects var summary = await _activityService.GetLiveActivitySummaryAsync(); await Clients.Caller.SendAsync("InitialSummary", summary); await base.OnConnectedAsync(); } public override Task OnDisconnectedAsync(Exception? exception) { _logger.LogInformation("Admin disconnected from activity hub: {ConnectionId}", Context.ConnectionId); return base.OnDisconnectedAsync(exception); } public async Task GetRecentActivities(int minutesBack = 5) { var activities = await _activityService.GetRecentActivitiesAsync(minutesBack); await Clients.Caller.SendAsync("RecentActivities", activities); } public async Task GetActivityStats(int hoursBack = 24) { var stats = await _activityService.GetActivityTypeStatsAsync(hoursBack); await Clients.Caller.SendAsync("ActivityStats", stats); } public async Task GetSessionActivities(string sessionIdentifier) { var activities = await _activityService.GetActivitiesBySessionAsync(sessionIdentifier); await Clients.Caller.SendAsync("SessionActivities", activities); } }