using Microsoft.AspNetCore.Mvc; using Nop.Plugin.Misc.FruitBankPlugin.Services; using Nop.Services.Configuration; using Nop.Web.Framework.Controllers; namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers; /// /// Külső rendszerek (Viber bot, email feldolgozó, diktáló app) hívják ezt az endpointot. /// Authentikáció: X-FruitBank-ApiKey header, értéke megegyezik a FruitBankSettings.OrderDraftApiKey-jel. /// public class OrderDraftApiController : BasePluginController { private readonly IOrderDraftService _orderDraftService; private readonly FruitBankSettings _settings; public OrderDraftApiController( IOrderDraftService orderDraftService, ISettingService settingService) { _orderDraftService = orderDraftService; _settings = settingService.LoadSetting(); } /// /// POST /api/order-draft /// Body: { "externalUsername": "...", "messageText": "..." } /// Header: X-FruitBank-ApiKey: {key} /// [HttpPost] public async Task Create([FromBody] OrderDraftApiRequest request) { // API key validáció if (!ValidateApiKey()) return Unauthorized(new { error = "Érvénytelen vagy hiányzó API kulcs." }); if (request == null || string.IsNullOrWhiteSpace(request.ExternalUsername) || string.IsNullOrWhiteSpace(request.MessageText)) { return BadRequest(new { error = "ExternalUsername és MessageText megadása kötelező." }); } try { var drafts = await _orderDraftService.CreateDraftsFromMessageAsync( request.ExternalUsername.Trim(), request.MessageText.Trim()); if (!drafts.Any()) return Ok(new OrderDraftApiResponse { Success = false, Message = "Az üzenetből nem sikerült rendelési szándékot azonosítani.", Drafts = [] }); return Ok(new OrderDraftApiResponse { Success = true, Message = $"{drafts.Count} rendelés tervezet létrehozva.", Drafts = drafts.Select(d => new OrderDraftApiResponseItem { DraftId = d.Id, ParsedDeliveryDate = d.ParsedDeliveryDate, IsPartnerKnown = d.CustomerId.HasValue, ItemCount = d.Items?.Count ?? 0 }).ToList() }); } catch (Exception ex) { Console.Error.WriteLine($"[OrderDraftApiController] Error: {ex}"); return StatusCode(500, new { error = "Belső hiba. Próbáld újra később." }); } } private bool ValidateApiKey() { if (string.IsNullOrWhiteSpace(_settings.OrderDraftApiKey)) return false; Request.Headers.TryGetValue("X-FruitBank-ApiKey", out var providedKey); return string.Equals( _settings.OrderDraftApiKey, providedKey.ToString(), StringComparison.Ordinal); } } // ── Request / Response modellek ─────────────────────────────────────────── public class OrderDraftApiRequest { public string ExternalUsername { get; set; } = string.Empty; public string MessageText { get; set; } = string.Empty; } public class OrderDraftApiResponse { public bool Success { get; set; } public string Message { get; set; } = string.Empty; public List Drafts { get; set; } = []; } public class OrderDraftApiResponseItem { public int DraftId { get; set; } public DateTime ParsedDeliveryDate { get; set; } public bool IsPartnerKnown { get; set; } public int ItemCount { get; set; } }