using foodmarket.Infrastructure.Integrations.MoySklad; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace foodmarket.Api.Controllers.Admin; [ApiController] [Authorize(Policy = "AdminAccess")] [Route("api/admin/moysklad")] public class MoySkladImportController : ControllerBase { private readonly MoySkladImportService _svc; public MoySkladImportController(MoySkladImportService svc) => _svc = svc; public record TestRequest(string Token); public record ImportRequest(string Token, bool OverwriteExisting = false); [HttpPost("test")] public async Task TestConnection([FromBody] TestRequest req, CancellationToken ct) { if (string.IsNullOrWhiteSpace(req.Token)) return BadRequest(new { error = "Token is required." }); var result = await _svc.TestConnectionAsync(req.Token, ct); if (!result.Success) { var msg = result.StatusCode switch { 401 or 403 => "Токен недействителен или не имеет доступа к API.", 503 or 502 => "МойСклад временно недоступен. Повтори через минуту.", _ => $"МойСклад вернул {result.StatusCode}: {Truncate(result.Error, 400)}", }; return StatusCode(result.StatusCode ?? 502, new { error = msg }); } return Ok(new { organization = result.Value!.Name, inn = result.Value.Inn }); } private static string? Truncate(string? s, int max) => string.IsNullOrEmpty(s) ? s : (s.Length <= max ? s : s[..max] + "…"); [HttpPost("import-products")] public async Task> ImportProducts([FromBody] ImportRequest req, CancellationToken ct) { if (string.IsNullOrWhiteSpace(req.Token)) return BadRequest(new { error = "Token is required." }); var result = await _svc.ImportProductsAsync(req.Token, req.OverwriteExisting, ct); return result; } [HttpPost("import-counterparties")] public async Task> ImportCounterparties([FromBody] ImportRequest req, CancellationToken ct) { if (string.IsNullOrWhiteSpace(req.Token)) return BadRequest(new { error = "Token is required." }); var result = await _svc.ImportCounterpartiesAsync(req.Token, req.OverwriteExisting, ct); return result; } }