Add resilient Azure offline transcription backlog
PR and Push Build/Test / build-and-test (push) Successful in 18m41s

This commit is contained in:
2026-06-15 17:26:34 +02:00
parent b22754ce5d
commit b774ccc375
35 changed files with 2456 additions and 198 deletions
@@ -117,26 +117,53 @@ public sealed class MeetingWorkflowEngine : IMeetingWorkflowEngine
foreach (var rule in rules)
{
if (!MatchesTrigger(rule, workflowEvent) ||
!EvaluateConditions(rule.If, meeting, context))
try
{
continue;
}
if (!MatchesTrigger(rule, workflowEvent) ||
!EvaluateConditions(rule.If, meeting, context))
{
continue;
}
logger.LogInformation(
"Applying meeting workflow rule {RuleName} for event {EventType}",
rule.Name,
workflowEvent.Type);
var model = CreateTemplateModel(meeting, context);
foreach (var step in rule.Steps)
logger.LogInformation(
"Triggered meeting workflow rule {RuleName} for event {EventType}",
rule.Name,
workflowEvent.Type);
var ruleNoteChanged = false;
var originalTranscriptLine = context.TranscriptLine;
var model = CreateTemplateModel(meeting, context);
foreach (var step in rule.Steps)
{
var stepChanged = await ApplyStepAsync(
step,
meeting,
context,
model,
cancellationToken);
ruleNoteChanged |= stepChanged;
noteChanged |= stepChanged;
model = CreateTemplateModel(meeting, context);
}
logger.LogInformation(
"Completed meeting workflow rule {RuleName} for event {EventType}; noteChanged={NoteChanged}, transcriptLineChanged={TranscriptLineChanged}",
rule.Name,
workflowEvent.Type,
ruleNoteChanged,
!string.Equals(originalTranscriptLine, context.TranscriptLine, StringComparison.Ordinal));
}
catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested)
{
noteChanged |= await ApplyStepAsync(
step,
meeting,
context,
model,
cancellationToken);
model = CreateTemplateModel(meeting, context);
throw;
}
catch (Exception exception)
{
logger.LogError(
exception,
"Meeting workflow rule {RuleName} failed for event {EventType}",
rule.Name,
workflowEvent.Type);
throw;
}
}
@@ -1,4 +1,5 @@
using System.Text.RegularExpressions;
using System.Net;
using RazorLight;
namespace MeetingAssistant.Workflow;
@@ -20,10 +21,11 @@ internal sealed class MeetingWorkflowTemplateRenderer
return template;
}
return await razorEngine.CompileRenderStringAsync(
var rendered = await razorEngine.CompileRenderStringAsync(
Guid.NewGuid().ToString("N"),
EscapeEmailAddressAtSigns(template),
model);
return WebUtility.HtmlDecode(rendered);
}
public static bool ContainsRazorTemplateSyntax(string value)