using MediatR; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.SignalR; using SignalRChat.Hubs; using Sledgemapper.Api.Data; using Sledgemapper.Clients; using Sledgemapper.Shared.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading; using System.Threading.Tasks; namespace Sledgemapper.Api.Handlers { public class NewTileNotification: INotification { public double Timestamp { get; private set; } public Tile Tile { get; private set; } public string SessionName { get; private set; } public NewTileNotification(string sessionName, Tile tile) { Tile = tile; Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); SessionName = sessionName; } } public class SendNewTileMessage : INotificationHandler { private readonly IHubContext _hub; public SendNewTileMessage(IHubContext hub) => _hub = hub; public async Task Handle(NewTileNotification notification, CancellationToken cancellationToken) { await _hub.Clients.Groups(notification.SessionName).NewTile(notification.Tile); } } public class SaveNewTile : INotificationHandler { private readonly MyDbContext _dbcontext; public SaveNewTile(MyDbContext dbcontext) => _dbcontext = dbcontext; public async Task Handle(NewTileNotification notification, CancellationToken cancellationToken) { var jsonString = JsonSerializer.Serialize(notification.Tile); _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog { Operation = "N", SessionName = notification.SessionName, Type = "T", Timestamp = notification.Timestamp, Object = jsonString }); await _dbcontext.SaveChangesAsync(); } } }