113 lines
3.9 KiB
C#
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; }
|
|
}
|