using FastEndpoints; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Framework.ResponseStandard; using GB5Shared.FastEndPoint; using ECPBLL.Meeting.Interfaces; using ECPSL.Meeting.Parameters; using static GB5Shared.GB5Constant.Constant; namespace ECPSL.Meeting.Endpoints.MeetingRecording; /// Triggers transcription + summarization via GB5Shared.RecordingIntelligence. /// IAICapabilityService. The default DI registration (NotConfiguredAICapabilityService) always /// throws — RecordingTranscriptBLL.TranscribeAndSummarizeAsync already catches that specific /// failure path internally, marks PROCESSINGSTATUS=4/failed with the reason, and returns a normal /// (non-throwing) result describing the failure. This endpoint's own try/catch only guards /// against genuinely unexpected failures (e.g. the record not existing), so a not-yet-configured /// AI capability never surfaces as an unhandled 500. public class TranscribeRecording : BaseEndpoint> { private readonly IRecordingTranscriptBLL _bll; public TranscribeRecording(IRecordingTranscriptBLL bll) => _bll = bll; public override void Configure() { Post("/MeetingRecording/TranscribeRecording"); AllowAnonymous(); } // Mutation endpoint — GetCacheKey returns null (base default) per CLAUDE.md's cache rule. protected override async Task> ExecuteAsync( TranscribeRecordingParameters req, LoginDTO login, CancellationToken ct) { try { var result = await _bll.TranscribeAndSummarizeAsync(req.RecordingTranscriptId, login, ct); return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse( result, CacheKeyLevel.NOT_REQUIRED, login); } catch (Exception ex) { return await GB5Shared.ResponseStandard.Response.CreateExceptionError( ex, CacheKeyLevel.NOT_REQUIRED, login, ex.Message, 500); } } }