Mango.Nop.Plugins/Nop.Plugin.Misc.AIPlugin/Controllers/OrderDraftApiController.cs

113 lines
3.9 KiB
C#

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;
/// <summary>
/// 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.
/// </summary>
public class OrderDraftApiController : BasePluginController
{
private readonly IOrderDraftService _orderDraftService;
private readonly FruitBankSettings _settings;
public OrderDraftApiController(
IOrderDraftService orderDraftService,
ISettingService settingService)
{
_orderDraftService = orderDraftService;
_settings = settingService.LoadSetting<FruitBankSettings>();
}
/// <summary>
/// POST /api/order-draft
/// Body: { "externalUsername": "...", "messageText": "..." }
/// Header: X-FruitBank-ApiKey: {key}
/// </summary>
[HttpPost]
public async Task<IActionResult> 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<OrderDraftApiResponseItem> 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; }
}