From 235b6b52cc4465d5101a877cab52da03e73eee44 Mon Sep 17 00:00:00 2001 From: Tudor Stanciu Date: Sat, 6 Jun 2020 23:44:49 +0300 Subject: [PATCH] SaveChatMessageHandler --- .../CommandHandlers/SaveChatMessageHandler.cs | 44 +++++++++++++++++++ .../Commands/SaveChatMessage.cs | 22 ++++++++++ .../Events/ChatMessageSaved.cs | 14 ++++++ .../DbContexts/ChatDbContext.cs | 1 + .../ChatMessageConfiguration.cs | 15 +++++++ .../Repositories/ChatRepository.cs | 6 +++ Chatbot.Domain/Entities/ChatMessage.cs | 13 ++++++ .../Repositories/IChatRepository.cs | 1 + 8 files changed, 116 insertions(+) create mode 100644 Chatbot.Application/CommandHandlers/SaveChatMessageHandler.cs create mode 100644 Chatbot.Application/Commands/SaveChatMessage.cs create mode 100644 Chatbot.Application/Events/ChatMessageSaved.cs create mode 100644 Chatbot.Domain.Data/EntityTypeConfiguration/ChatMessageConfiguration.cs create mode 100644 Chatbot.Domain/Entities/ChatMessage.cs diff --git a/Chatbot.Application/CommandHandlers/SaveChatMessageHandler.cs b/Chatbot.Application/CommandHandlers/SaveChatMessageHandler.cs new file mode 100644 index 0000000..f6146f1 --- /dev/null +++ b/Chatbot.Application/CommandHandlers/SaveChatMessageHandler.cs @@ -0,0 +1,44 @@ +using AutoMapper; +using Chatbot.Api.Application.Commands; +using Chatbot.Api.Application.Events; +using Chatbot.Api.Domain.Entities; +using Chatbot.Api.Domain.Repositories; +using MediatR; +using Microsoft.Extensions.Logging; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Chatbot.Api.Application.CommandHandlers +{ + public class SaveChatMessageHandler : IRequestHandler + { + private readonly ILogger _logger; + private readonly IMapper _mapper; + private readonly IChatRepository _chatRepository; + + public SaveChatMessageHandler(ILogger logger, IMapper mapper, IChatRepository chatRepository) + { + _logger = logger; + _mapper = mapper; + _chatRepository = chatRepository; + } + + public async Task Handle(SaveChatMessage request, CancellationToken cancellationToken) + { + try + { + var message = _mapper.Map(request); + await _chatRepository.Add(message); + + return new ChatMessageSaved(true, null); + } + catch (Exception ex) + { + var correlationIdMsg = $"CorrelationId: {request.Metadata.CorrelationId}"; + _logger.LogError(ex, $"An unexpected error has occurred. {correlationIdMsg}"); + return new ChatMessageSaved(false, $"{ex.Message} {correlationIdMsg}"); + } + } + } +} diff --git a/Chatbot.Application/Commands/SaveChatMessage.cs b/Chatbot.Application/Commands/SaveChatMessage.cs new file mode 100644 index 0000000..42abd1a --- /dev/null +++ b/Chatbot.Application/Commands/SaveChatMessage.cs @@ -0,0 +1,22 @@ +using Chatbot.Api.Application.Events; +using System; + +namespace Chatbot.Api.Application.Commands +{ + public class SaveChatMessage : Command + { + public Guid ChatId { get; } + public int MessageSourceId { get; } + public DateTime MessageDate { get; } + public string MessageContent { get; } + + public SaveChatMessage(Guid chatId, int messageSourceId, DateTime messageDate, string messageContent) + : base(new Metadata() { CorrelationId = Guid.NewGuid() }) + { + ChatId = chatId; + MessageSourceId = messageSourceId; + MessageDate = messageDate; + MessageContent = messageContent; + } + } +} diff --git a/Chatbot.Application/Events/ChatMessageSaved.cs b/Chatbot.Application/Events/ChatMessageSaved.cs new file mode 100644 index 0000000..99afead --- /dev/null +++ b/Chatbot.Application/Events/ChatMessageSaved.cs @@ -0,0 +1,14 @@ +namespace Chatbot.Api.Application.Events +{ + public class ChatMessageSaved + { + public bool Success { get; } + public string Message { get; } + + public ChatMessageSaved(bool success, string message) + { + Success = success; + Message = message; + } + } +} diff --git a/Chatbot.Domain.Data/DbContexts/ChatDbContext.cs b/Chatbot.Domain.Data/DbContexts/ChatDbContext.cs index d0d6288..0069c54 100644 --- a/Chatbot.Domain.Data/DbContexts/ChatDbContext.cs +++ b/Chatbot.Domain.Data/DbContexts/ChatDbContext.cs @@ -20,6 +20,7 @@ namespace Chatbot.Api.Domain.Data.DbContexts base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfiguration(new ChatConfiguration()); + modelBuilder.ApplyConfiguration(new ChatMessageConfiguration()); } } } diff --git a/Chatbot.Domain.Data/EntityTypeConfiguration/ChatMessageConfiguration.cs b/Chatbot.Domain.Data/EntityTypeConfiguration/ChatMessageConfiguration.cs new file mode 100644 index 0000000..d7a2374 --- /dev/null +++ b/Chatbot.Domain.Data/EntityTypeConfiguration/ChatMessageConfiguration.cs @@ -0,0 +1,15 @@ +using Chatbot.Api.Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Chatbot.Api.Domain.Data.EntityTypeConfiguration +{ + class ChatMessageConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("ChatMessage").HasKey(key => key.MessageId); + builder.Property(e => e.MessageId).ValueGeneratedOnAdd(); + } + } +} diff --git a/Chatbot.Domain.Data/Repositories/ChatRepository.cs b/Chatbot.Domain.Data/Repositories/ChatRepository.cs index f2c98c4..e9432ba 100644 --- a/Chatbot.Domain.Data/Repositories/ChatRepository.cs +++ b/Chatbot.Domain.Data/Repositories/ChatRepository.cs @@ -29,5 +29,11 @@ namespace Chatbot.Api.Domain.Data.Repositories return chat; } + + public async Task Add(T entity) where T : class + { + _dbContext.Add(entity); + await _dbContext.SaveChangesAsync(); + } } } diff --git a/Chatbot.Domain/Entities/ChatMessage.cs b/Chatbot.Domain/Entities/ChatMessage.cs new file mode 100644 index 0000000..53c93b1 --- /dev/null +++ b/Chatbot.Domain/Entities/ChatMessage.cs @@ -0,0 +1,13 @@ +using System; + +namespace Chatbot.Api.Domain.Entities +{ + public class ChatMessage + { + public int MessageId { get; set; } + public Guid ChatId { get; set; } + public int MessageSourceId { get; set; } + public DateTime MessageDate { get; set; } + public string MessageContent { get; set; } + } +} \ No newline at end of file diff --git a/Chatbot.Domain/Repositories/IChatRepository.cs b/Chatbot.Domain/Repositories/IChatRepository.cs index 82262d5..8628855 100644 --- a/Chatbot.Domain/Repositories/IChatRepository.cs +++ b/Chatbot.Domain/Repositories/IChatRepository.cs @@ -7,5 +7,6 @@ namespace Chatbot.Api.Domain.Repositories public interface IChatRepository { Task CreateChat(Guid sessionId); + Task Add(T entity) where T : class; } }