Skip to content

Commit c9ca781

Browse files
committed
bubble pipeline exceptions up to hangfire orchestrator
1 parent f64802e commit c9ca781

15 files changed

+92
-88
lines changed

rubberduckvba.Server/Api/Auth/AuthController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class AuthController(IOptions<GitHubSettings> configuration, IOptions<Api
2424
{
2525
[HttpGet("auth")]
2626
[AllowAnonymous]
27-
public async Task<ActionResult<UserViewModel>> Index()
27+
public ActionResult<UserViewModel> Index()
2828
{
2929
var claims = HttpContext.User.Claims.ToDictionary(claim => claim.Type, claim => claim.Value);
3030
var hasName = claims.TryGetValue(ClaimTypes.Name, out var name);

rubberduckvba.Server/ContentSynchronization/Pipeline/Abstract/IPipeline.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public interface IPipeline<TContext, TResult>
66
{
77
TContext Context { get; }
88
IPipelineResult<TResult> Result { get; }
9+
IEnumerable<Exception> Exceptions { get; }
910

1011
void Start<TInput>(ITargetBlock<TInput> entryBlock, TInput input);
1112
}
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
namespace rubberduckvba.com.Server.ContentSynchronization.Pipeline.Abstract;
22

3-
public interface ISynchronizationPipeline<TContext>
3+
public interface ISynchronizationPipeline<TContext, TResult> : IPipeline<TContext, TResult>
44
where TContext : class
55
{
6-
TContext Context { get; }
7-
Task<TContext> ExecuteAsync(SyncRequestParameters parameters, CancellationTokenSource tokenSource);
6+
Task<IPipelineResult<TResult>> ExecuteAsync(SyncRequestParameters parameters, CancellationTokenSource tokenSource);
87
}

rubberduckvba.Server/ContentSynchronization/Pipeline/Abstract/ISynchronizationPipelineFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
public interface ISynchronizationPipelineFactory<TContext>
44
where TContext : class
55
{
6-
ISynchronizationPipeline<TContext> Create<TParameters>(TParameters parameters, CancellationTokenSource tokenSource) where TParameters : IRequestParameters;
6+
ISynchronizationPipeline<TContext, bool> Create<TParameters>(TParameters parameters, CancellationTokenSource tokenSource) where TParameters : IRequestParameters;
77
}

rubberduckvba.Server/ContentSynchronization/Pipeline/Abstract/PipelineBase.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ protected PipelineBase(TContext context, CancellationTokenSource tokenSource, IL
1313
Context = context;
1414
TokenSource = tokenSource;
1515
Token = TokenSource.Token;
16+
17+
Result = Parent?.Result ?? new PipelineResult<TResult>();
1618
}
1719

1820
protected PipelineBase(IPipeline<TContext, TResult> parent, CancellationTokenSource tokenSource, ILogger logger)
1921
: this(parent.Context, tokenSource, logger)
2022
{
21-
Logger = logger;
2223
Parent = parent;
23-
Result = new PipelineResult<TResult>();
2424
}
2525

2626
protected ILogger Logger { get; }
@@ -30,6 +30,7 @@ protected PipelineBase(IPipeline<TContext, TResult> parent, CancellationTokenSou
3030
public TContext Context { get; }
3131

3232
public IPipelineResult<TResult> Result { get; }
33+
public IEnumerable<Exception> Exceptions => _sections.SelectMany(section => section.Result.Exceptions).ToList();
3334

3435
public virtual void Start<TInput>(ITargetBlock<TInput> entryBlock, TInput input)
3536
{
@@ -38,12 +39,12 @@ public virtual void Start<TInput>(ITargetBlock<TInput> entryBlock, TInput input)
3839
entryBlock.Complete();
3940
}
4041

41-
protected IPipeline<TContext, TResult> Parent { get; }
42+
protected IPipeline<TContext, TResult>? Parent { get; }
4243

4344
private readonly IList<PipelineSection<TContext>> _sections = new List<PipelineSection<TContext>>();
4445
protected IEnumerable<PipelineSection<TContext>> Sections => _sections;
4546

46-
public void AddSections(SyncRequestParameters parameters, params PipelineSection<TContext>[] sections)
47+
protected void AddSections(SyncRequestParameters parameters, params PipelineSection<TContext>[] sections)
4748
{
4849
foreach (var section in sections)
4950
{
@@ -57,12 +58,12 @@ protected void LinkSections<TTarget>(ISourceBlock<TTarget> exitBlock, ITargetBlo
5758
_links.Add(exitBlock.LinkTo(entryBlock, new DataflowLinkOptions { PropagateCompletion = true }));
5859
}
5960

60-
protected void LinkSections(Task exitTask, ITargetBlock<TContext> successEntryBlock, ITargetBlock<TContext> faultedEntryBlock = null)
61+
protected void LinkSections(Task exitTask, ITargetBlock<TContext> successEntryBlock, ITargetBlock<TContext>? faultedEntryBlock = null)
6162
{
6263
LinkSections(exitTask, Context, successEntryBlock, faultedEntryBlock);
6364
}
6465

65-
protected void LinkSections<TTarget>(Task exitTask, TTarget input, ITargetBlock<TTarget> entryBlock, ITargetBlock<TTarget> faultedEntryBlock = null)
66+
protected void LinkSections<TTarget>(Task exitTask, TTarget input, ITargetBlock<TTarget> entryBlock, ITargetBlock<TTarget>? faultedEntryBlock = null)
6667
{
6768
Task.WhenAll(exitTask).ContinueWith(t =>
6869
{

rubberduckvba.Server/ContentSynchronization/Pipeline/Abstract/PipelineResult.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public class PipelineResult<TResult> : IPipelineResult<TResult>
77
private readonly ConcurrentBag<Exception> _exceptions = new ConcurrentBag<Exception>();
88

99
public TResult Result { get; set; }
10-
public IEnumerable<Exception> Exceptions { get; }
10+
public IEnumerable<Exception> Exceptions => _exceptions;
1111

1212
public void AddException(Exception exception)
1313
{

rubberduckvba.Server/ContentSynchronization/Pipeline/Abstract/SynchronizationPipelineFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public SynchronizationPipelineFactory(ILogger<PipelineLogger> logger, IRubberduc
2323
_markdown = markdown;
2424
}
2525

26-
public ISynchronizationPipeline<SyncContext> Create<TParameters>(TParameters parameters, CancellationTokenSource tokenSource) where TParameters : IRequestParameters
26+
public ISynchronizationPipeline<SyncContext, bool> Create<TParameters>(TParameters parameters, CancellationTokenSource tokenSource) where TParameters : IRequestParameters
2727
{
2828
return parameters switch
2929
{

rubberduckvba.Server/ContentSynchronization/Pipeline/Sections/SyncXmldoc/SyncMergeBlock.cs

Lines changed: 0 additions & 24 deletions
This file was deleted.

rubberduckvba.Server/ContentSynchronization/Pipeline/SynchronizeTagsPipeline.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
using System.Threading.Tasks.Dataflow;
2-
3-
using rubberduckvba.com.Server.ContentSynchronization.Pipeline.Abstract;
4-
using rubberduckvba.com.Server.ContentSynchronization.XmlDoc.Abstract;
1+
using rubberduckvba.com.Server.ContentSynchronization.Pipeline.Abstract;
52
using rubberduckvba.com.Server.ContentSynchronization.Pipeline.Sections.SyncTags;
3+
using rubberduckvba.com.Server.ContentSynchronization.XmlDoc.Abstract;
64
using rubberduckvba.com.Server.Services;
75

86
namespace rubberduckvba.com.Server.ContentSynchronization.Pipeline;
97

10-
public class SynchronizeTagsPipeline : PipelineBase<SyncContext, bool>, ISynchronizationPipeline<SyncContext>
8+
public class SynchronizeTagsPipeline : PipelineBase<SyncContext, bool>, ISynchronizationPipeline<SyncContext, bool>
119
{
1210
private readonly IRubberduckDbService _content;
1311
private readonly IGitHubClientService _github;
@@ -23,7 +21,7 @@ public SynchronizeTagsPipeline(IRequestParameters parameters, ILogger logger, IR
2321
_staging = staging;
2422
}
2523

26-
public async Task<SyncContext> ExecuteAsync(SyncRequestParameters parameters, CancellationTokenSource tokenSource)
24+
public async Task<IPipelineResult<bool>> ExecuteAsync(SyncRequestParameters parameters, CancellationTokenSource tokenSource)
2725
{
2826
if (_isDisposed)
2927
{
@@ -42,6 +40,8 @@ public async Task<SyncContext> ExecuteAsync(SyncRequestParameters parameters, Ca
4240
Start(synchronizeTags.InputBlock, parameters);
4341

4442
// 04. await completion
45-
return await synchronizeTags.OutputTask.ContinueWith(t => Context, tokenSource.Token);
43+
await synchronizeTags.OutputTask;
44+
45+
return Result;
4646
}
4747
}

rubberduckvba.Server/ContentSynchronization/Pipeline/SynchronizeXmlPipeline.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
using System.Threading.Tasks.Dataflow;
2-
3-
using rubberduckvba.com.Server.ContentSynchronization.Pipeline.Abstract;
4-
using rubberduckvba.com.Server.ContentSynchronization.XmlDoc.Abstract;
1+
using rubberduckvba.com.Server.ContentSynchronization.Pipeline.Abstract;
52
using rubberduckvba.com.Server.ContentSynchronization.Pipeline.Sections.SyncXmldoc;
3+
using rubberduckvba.com.Server.ContentSynchronization.XmlDoc.Abstract;
64
using rubberduckvba.com.Server.Services;
75

86
namespace rubberduckvba.com.Server.ContentSynchronization.Pipeline;
97

10-
public class SynchronizeXmlPipeline : PipelineBase<SyncContext, bool>, ISynchronizationPipeline<SyncContext>
8+
public class SynchronizeXmlPipeline : PipelineBase<SyncContext, bool>, ISynchronizationPipeline<SyncContext, bool>
119
{
1210
private readonly IRubberduckDbService _content;
1311
private readonly IGitHubClientService _github;
@@ -25,7 +23,7 @@ public SynchronizeXmlPipeline(IRequestParameters parameters, ILogger logger, IRu
2523
_markdown = markdown;
2624
}
2725

28-
public async Task<SyncContext> ExecuteAsync(SyncRequestParameters parameters, CancellationTokenSource tokenSource)
26+
public async Task<IPipelineResult<bool>> ExecuteAsync(SyncRequestParameters parameters, CancellationTokenSource tokenSource)
2927
{
3028
if (_isDisposed)
3129
{
@@ -45,6 +43,8 @@ public async Task<SyncContext> ExecuteAsync(SyncRequestParameters parameters, Ca
4543
Start(synchronizeFeatureItems.InputBlock!, xmldocRequest);
4644

4745
// 04. await completion
48-
return await synchronizeFeatureItems.OutputBlock.Completion.ContinueWith(t => Context);
46+
await synchronizeFeatureItems.OutputBlock.Completion;
47+
48+
return Result;
4949
}
5050
}

0 commit comments

Comments
 (0)