Files
ROLAC/API/ROLAC.API/Hubs/AttendanceHub.cs
T
2026-06-20 19:43:15 -07:00

40 lines
1.4 KiB
C#

using Microsoft.AspNetCore.SignalR;
using ROLAC.API.Services;
namespace ROLAC.API.Hubs;
/// <summary>
/// Real-time hub backing the public Sunday attendance counter. Anonymous
/// (no [Authorize]) so volunteers can use it without logging in. Every
/// increment is broadcast to all connected clients so multiple people can
/// count the same Sunday together and see each other's changes instantly.
/// </summary>
public class AttendanceHub : Hub
{
private readonly IMealAttendanceService _svc;
public AttendanceHub(IMealAttendanceService svc) => _svc = svc;
// Push the current counts to a client the moment it connects.
public override async Task OnConnectedAsync()
{
var counts = await _svc.GetOrCreateAsync(_svc.Today);
await Clients.Caller.SendAsync("ReceiveCounts", counts);
await base.OnConnectedAsync();
}
// Apply a batched delta for one age group, then broadcast the new totals to everyone.
public async Task Increment(string category, int delta)
{
var counts = await _svc.IncrementAsync(_svc.Today, category, delta);
await Clients.All.SendAsync("ReceiveCounts", counts);
}
// Overwrite one age group with an absolute value, then broadcast the new totals to everyone.
public async Task SetCount(string category, int value)
{
var counts = await _svc.SetAsync(_svc.Today, category, value);
await Clients.All.SendAsync("ReceiveCounts", counts);
}
}