using ManagerService.Data; using ManagerService.DTOs; using ManagerService.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using NSwag.Annotations; using Microsoft.EntityFrameworkCore; using System; using System.Linq; using System.Threading.Tasks; namespace ManagerService.Controllers { [Authorize(Policy = ManagerService.Service.Security.Policies.Viewer)] [ApiController, Route("api/[controller]")] [OpenApiTag("AI", Description = "Assistant IA")] public class AiController : ControllerBase { private readonly IAssistantService _assistantService; private readonly MyInfoMateDbContext _context; private readonly ILogger _logger; public AiController( IAssistantService assistantService, MyInfoMateDbContext context, ILogger logger) { _assistantService = assistantService; _context = context; _logger = logger; } /// /// Traduit un texte HTML vers plusieurs langues via IA /// [HttpPost("translate")] [ProducesResponseType(typeof(AiTranslateResponse), 200)] [ProducesResponseType(403)] [ProducesResponseType(typeof(string), 500)] public async Task Translate([FromBody] AiTranslateRequest request, [FromQuery] string instanceId) { try { var instance = _context.Instances.FirstOrDefault(i => i.Id == instanceId); if (instance == null || !instance.IsAssistant) return Forbid(); var result = await _assistantService.TranslateAsync(request); return Ok(result); } catch (Exception ex) { _logger.LogError(ex, "Erreur lors de la traduction IA"); return new ObjectResult("Une erreur est survenue") { StatusCode = 500 }; } } /// /// Envoie un message à l'assistant IA, scopé à l'instance et optionnellement à une configuration /// [HttpPost("chat")] [ProducesResponseType(typeof(AiChatResponse), 200)] [ProducesResponseType(403)] [ProducesResponseType(typeof(string), 500)] public async Task Chat([FromBody] AiChatRequest request) { try { // Vérifie que l'instance a activé la fonctionnalité assistant var instance = _context.Instances .FirstOrDefault(i => i.Id == request.InstanceId); if (instance == null || !instance.IsAssistant) return Forbid(); // Vérifie que l'app concernée a activé l'assistant var appInstance = _context.ApplicationInstances .FirstOrDefault(ai => ai.InstanceId == request.InstanceId && ai.AppType == request.AppType); if (appInstance == null || !appInstance.IsAssistant) return Forbid(); var monthKey = DateTime.UtcNow.ToString("yyyy-MM"); if (instance.AiUsageMonthKey != monthKey) { instance.AiRequestsThisMonth = 0; instance.AiUsageMonthKey = monthKey; } var quota = instance.AiRequestsPerMonth; if (quota > 0 && instance.AiRequestsThisMonth >= quota) return StatusCode(429, "Quota IA mensuel dépassé"); instance.AiRequestsThisMonth++; _context.SaveChanges(); var result = await _assistantService.ChatAsync(request); return Ok(result); } catch (Exception ex) { _logger.LogError(ex, "Erreur lors de l'appel à l'assistant IA"); return new ObjectResult("Une erreur est survenue") { StatusCode = 500 }; } } } }