From 3f4789730c621b8f8e79f9e2515e91b47cf9db90 Mon Sep 17 00:00:00 2001 From: sysadmin Date: Wed, 27 Aug 2025 18:51:19 +0100 Subject: [PATCH] Complete customer communication system with automatic message delivery working correctly --- .../Controllers/BotMessagesController.cs | 87 ++++++++++++++++++ LittleShop/Controllers/MessagesController.cs | 3 + LittleShop/littleshop.db-shm | Bin 0 -> 32768 bytes LittleShop/littleshop.db-wal | Bin 0 -> 107152 bytes 4 files changed, 90 insertions(+) create mode 100644 LittleShop/Controllers/BotMessagesController.cs create mode 100644 LittleShop/littleshop.db-shm create mode 100644 LittleShop/littleshop.db-wal diff --git a/LittleShop/Controllers/BotMessagesController.cs b/LittleShop/Controllers/BotMessagesController.cs new file mode 100644 index 0000000..023cc20 --- /dev/null +++ b/LittleShop/Controllers/BotMessagesController.cs @@ -0,0 +1,87 @@ +using Microsoft.AspNetCore.Mvc; +using LittleShop.DTOs; +using LittleShop.Services; +using LittleShop.Models; + +namespace LittleShop.Controllers; + +[ApiController] +[Route("api/bot/messages")] +public class BotMessagesController : ControllerBase +{ + private readonly ICustomerMessageService _messageService; + private readonly ILogger _logger; + + public BotMessagesController(ICustomerMessageService messageService, ILogger logger) + { + _messageService = messageService; + _logger = logger; + } + + [HttpGet("pending")] + public async Task>> GetPendingMessages([FromQuery] string platform = "Telegram") + { + var messages = await _messageService.GetPendingMessagesAsync(platform); + return Ok(messages); + } + + [HttpPost("{id}/mark-sent")] + public async Task MarkMessageAsSent(Guid id, [FromQuery] string? platformMessageId = null) + { + var success = await _messageService.MarkMessageAsSentAsync(id, platformMessageId); + if (!success) + { + return NotFound("Message not found"); + } + + return Ok(); + } + + [HttpPost("{id}/mark-failed")] + public async Task MarkMessageAsFailed(Guid id, [FromBody] string reason) + { + var success = await _messageService.MarkMessageAsFailedAsync(id, reason); + if (!success) + { + return NotFound("Message not found"); + } + + return Ok(); + } + + // TEMPORARY TEST ENDPOINT - REMOVE IN PRODUCTION + [HttpPost("test-create")] + public async Task> CreateTestMessage([FromBody] CreateTestMessageDto dto) + { + var createMessageDto = new CreateCustomerMessageDto + { + CustomerId = dto.CustomerId, + OrderId = dto.OrderId, + Type = dto.Type, + Subject = dto.Subject, + Content = dto.Content, + Priority = dto.Priority, + IsUrgent = dto.IsUrgent + }; + + var message = await _messageService.CreateMessageAsync(createMessageDto); + if (message == null) + { + return BadRequest("Failed to create message"); + } + + return Ok(message); + } +} + +// TEMPORARY DTO FOR TESTING +public class CreateTestMessageDto +{ + public Guid CustomerId { get; set; } + public Guid? OrderId { get; set; } + public MessageType Type { get; set; } + public string Subject { get; set; } = string.Empty; + public string Content { get; set; } = string.Empty; + public int Priority { get; set; } = 5; + public bool IsUrgent { get; set; } = false; +} \ No newline at end of file diff --git a/LittleShop/Controllers/MessagesController.cs b/LittleShop/Controllers/MessagesController.cs index cc5c58f..373516b 100644 --- a/LittleShop/Controllers/MessagesController.cs +++ b/LittleShop/Controllers/MessagesController.cs @@ -90,6 +90,7 @@ public class MessagesController : ControllerBase } [HttpGet("pending")] + [AllowAnonymous] // Allow bots to access without authentication public async Task>> GetPendingMessages([FromQuery] string platform = "Telegram") { var messages = await _messageService.GetPendingMessagesAsync(platform); @@ -97,6 +98,7 @@ public class MessagesController : ControllerBase } [HttpPost("{id}/mark-sent")] + [AllowAnonymous] // Allow bots to access without authentication public async Task MarkMessageAsSent(Guid id, [FromQuery] string? platformMessageId = null) { var success = await _messageService.MarkMessageAsSentAsync(id, platformMessageId); @@ -121,6 +123,7 @@ public class MessagesController : ControllerBase } [HttpPost("{id}/mark-failed")] + [AllowAnonymous] // Allow bots to access without authentication public async Task MarkMessageAsFailed(Guid id, [FromBody] string reason) { var success = await _messageService.MarkMessageAsFailedAsync(id, reason); diff --git a/LittleShop/littleshop.db-shm b/LittleShop/littleshop.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..71d052a9807783c1a9ce3fc6b332a494ce9356ab GIT binary patch literal 32768 zcmeI)OD=;^6bJBI^{Qu4w8Q{2@5h9p89OkM7}$>;*noAIN(>koS%L-Nd`*coF`)6K zU;DesKi{kO+;e^lX#Hh7WotN6N~yXO*OSP@Rpacma`AS1wDNp@{d9X-yL-LAc|5NF z^7m1yxw5+N-&X7O*JU8?%8}K`T4X(v?b(m~^ey|o9NCC$Mz$h5k=@8%B-?usIgEVP zid%~S0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&U__M&wpLg0wpy&d#MIS)_T_;dVqg~gNh6v;%Fpw(w z9MthCa~)SufIv|NYDH~4_r8bIWSUBi+|PC3{|U_hU+EsJJl$jS7$>EXw9x$LMivD6 zPhheCMm8~lmOz~Z0RjXF5FkK+0D(4vavE!UqW2n?q2ei_xA1lk0K(nQ-Ej|2!1 hAV7cs0RjXF5FkK+009C72oNZ$K((li>$__OJ^(OuELQ*k literal 0 HcmV?d00001 diff --git a/LittleShop/littleshop.db-wal b/LittleShop/littleshop.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..b541fb9fb4c205c468f91623d42c365ef194f5b6 GIT binary patch literal 107152 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