Как сделать что бы сообщения пользователей в чате написанном на Blazor добавлялись в БД?
Как сделать что бы сообщения пользователей в чате написанном на Blazor Server добавлялись в БД, и что бы если пользователь, которому было отправлено сообщение, был не онлайн во время отправки сообщения, когда он зашел выскакивало уведомление что есть непрочитанные сообщения?
//Код чата
HubConnection hubConnection;
private List<string> messages = new List<string>();
private List<string> privateMessages = new List<string>();
private string messageForBoard;
private string userName;
private string messageInput;
private string selectedUser;
private List<string> UserList;
private string BoxCss = "none";
private ElementReference elementRef;
[Inject]
public CookiesProvider CookiesProvider { get; set; }
protected override async Task OnInitializedAsync()
{
var container = new CookieContainer();
var cookie = new Cookie()
{
Name = ".AspNetCore.Identity.Application",
Domain = "localhost",
Value = CookiesProvider.Cookie
};
container.Add(cookie);
hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/chathub"), options =>
{
options.Cookies = container;
}).Build();
hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
{
var encodedMsg = $"{user}: {message}";
messages.Add(encodedMsg);
InvokeAsync(() => StateHasChanged());
});
hubConnection.On<string>("ReceiveUserName", (name) =>
{
userName = name;
InvokeAsync(() => StateHasChanged());
});
hubConnection.On<string>("MessageBoard", (message) =>
{
messageForBoard = message;
InvokeAsync(() => StateHasChanged());
});
hubConnection.On<string, string>("ReceivePrivateMessage", (user, message) =>
{
var encodedMsg = $"{user}: {message}";
privateMessages.Add(encodedMsg);
InvokeAsync(() => StateHasChanged());
toastService.ShowInfo($"Текст сообщения: {message}");
});
hubConnection.On<List<string>>("ReceiveInitializeUserList", (list) =>
{
UserList = list;
InvokeAsync(() => StateHasChanged());
});
await hubConnection.StartAsync();
await hubConnection.InvokeAsync("InitializeUserList");
}
protected override void OnAfterRender(bool firstRender)
{
elementRef.FocusAsync();
}
async Task Send() => await hubConnection.SendAsync("SendMessage", selectedUser, messageInput);
public bool IsConnected => hubConnection.State == HubConnectionState.Connected;
public void Dispose()
{
hubConnection.DisposeAsync();
}
public async ValueTask DisposeAsync()
{
await hubConnection.DisposeAsync();
}
private void NotificationHideShow()
{
if (BoxCss == "none") BoxCss = "block";
else BoxCss = "none";
}
//Модель сообщения
[Serializable]
public class MessagesDB
{
[Key]
public string? Id { get; set; }
public string? WhoIs { get; set; }
public string? Body { get; set; }
public bool Mine { get; set; }
public DateTime Time { get; set; }
public string? ConnectionId { get; set; }
public string CSS => Mine ? "sent" : "received";
}
//Модель чата
[Serializable]
public class ChatDB
{
[Key]
public string? ConnectionId { get; set; }
public string? Username { get; set; }
public MessagesDB? MessagesDBs { get; set; }
}
//База данных
public class ChatContext : DbContext
{
public ChatContext(DbContextOptions<ChatContext> options) : base(options)
{
}
public DbSet<ChatDB>? Chats { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlite("Data Source=C:\\Users\\User\\source\\repos\\GodPlease\\GodPlease\\bin\\Debug\\net6.0\\ChatDB.db");
}
}
}