diff --git a/Chatbot.Api/Controllers/ChatController.cs b/Chatbot.Api/Controllers/ChatController.cs index d515015..e4dd15f 100644 --- a/Chatbot.Api/Controllers/ChatController.cs +++ b/Chatbot.Api/Controllers/ChatController.cs @@ -32,5 +32,12 @@ namespace Chatbot.Api.Controllers var result = await _mediator.Send(saveChatMessage); return Ok(result); } + + [HttpPost("close")] + public async Task CloseChat([FromBody] CloseChat closeChat) + { + var result = await _mediator.Send(closeChat); + return Ok(result); + } } } diff --git a/Chatbot.Application/CommandHandlers/CloseChatHandler.cs b/Chatbot.Application/CommandHandlers/CloseChatHandler.cs new file mode 100644 index 0000000..2ad963d --- /dev/null +++ b/Chatbot.Application/CommandHandlers/CloseChatHandler.cs @@ -0,0 +1,25 @@ +using Chatbot.Api.Application.Commands; +using Chatbot.Api.Application.Events; +using Chatbot.Api.Domain.Repositories; +using MediatR; +using System.Threading; +using System.Threading.Tasks; + +namespace Chatbot.Api.Application.CommandHandlers +{ + public class CloseChatHandler : IRequestHandler + { + private readonly IChatRepository _chatRepository; + + public CloseChatHandler(IChatRepository chatRepository) + { + _chatRepository = chatRepository; + } + + public async Task Handle(CloseChat request, CancellationToken cancellationToken) + { + await _chatRepository.CloseChat(request.ChatId); + return new ChatClosed(request.ChatId); + } + } +} diff --git a/Chatbot.Application/Commands/CloseChat.cs b/Chatbot.Application/Commands/CloseChat.cs new file mode 100644 index 0000000..a112554 --- /dev/null +++ b/Chatbot.Application/Commands/CloseChat.cs @@ -0,0 +1,16 @@ +using Chatbot.Api.Application.Events; +using System; + +namespace Chatbot.Api.Application.Commands +{ + public class CloseChat : Command + { + public Guid ChatId { get; } + + public CloseChat(Guid chatId) + : base(new Metadata() { CorrelationId = Guid.NewGuid() }) + { + ChatId = chatId; + } + } +} diff --git a/Chatbot.Application/Events/ChatClosed.cs b/Chatbot.Application/Events/ChatClosed.cs new file mode 100644 index 0000000..58314bd --- /dev/null +++ b/Chatbot.Application/Events/ChatClosed.cs @@ -0,0 +1,14 @@ +using System; + +namespace Chatbot.Api.Application.Events +{ + public class ChatClosed + { + public Guid ChatId { get; } + + public ChatClosed(Guid chatId) + { + ChatId = chatId; + } + } +} diff --git a/Chatbot.Domain.Data/Repositories/ChatRepository.cs b/Chatbot.Domain.Data/Repositories/ChatRepository.cs index e9432ba..0d91df0 100644 --- a/Chatbot.Domain.Data/Repositories/ChatRepository.cs +++ b/Chatbot.Domain.Data/Repositories/ChatRepository.cs @@ -1,6 +1,7 @@ using Chatbot.Api.Domain.Data.DbContexts; using Chatbot.Api.Domain.Entities; using Chatbot.Api.Domain.Repositories; +using Microsoft.EntityFrameworkCore; using System; using System.Threading.Tasks; @@ -35,5 +36,16 @@ namespace Chatbot.Api.Domain.Data.Repositories _dbContext.Add(entity); await _dbContext.SaveChangesAsync(); } + + public async Task CloseChat(Guid chatId) + { + var chat = await _dbContext.Chats.FirstOrDefaultAsync(z => z.ChatId == chatId); + if (chat == null) + return; + + chat.StopDate = DateTime.Now; + _dbContext.Update(chat); + await _dbContext.SaveChangesAsync(); + } } } diff --git a/Chatbot.Domain.Data/Scripts/01.Chatbot tables.sql b/Chatbot.Domain.Data/Scripts/01.Chatbot tables.sql index 0c994fb..755987a 100644 --- a/Chatbot.Domain.Data/Scripts/01.Chatbot tables.sql +++ b/Chatbot.Domain.Data/Scripts/01.Chatbot tables.sql @@ -36,7 +36,7 @@ begin StartDate datetime constraint DF_Chat_StartDate default getdate(), StopDate datetime, constraint PK_Chat primary key (ChatId), - constraint FK_Chat_BotSession foreign key (ChatId) references BotSession(SessionId) + constraint FK_Chat_BotSession foreign key (SessionId) references BotSession(SessionId) ) end go diff --git a/Chatbot.Domain/Repositories/IChatRepository.cs b/Chatbot.Domain/Repositories/IChatRepository.cs index 8628855..ccd7752 100644 --- a/Chatbot.Domain/Repositories/IChatRepository.cs +++ b/Chatbot.Domain/Repositories/IChatRepository.cs @@ -8,5 +8,6 @@ namespace Chatbot.Api.Domain.Repositories { Task CreateChat(Guid sessionId); Task Add(T entity) where T : class; + Task CloseChat(Guid chatId); } }