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 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 AssistantService _assistantService; private readonly MyInfoMateDbContext _context; private readonly ILogger _logger; public AiController( AssistantService assistantService, MyInfoMateDbContext context, ILogger logger) { _assistantService = assistantService; _context = context; _logger = logger; } /// /// 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 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 }; } } } }