Add support for asynchronous workflow resumption in Resume endpoint
- Introduced `async` parameter to enable asynchronous workflow resumption. - Refactored `ResumeBookmarkedWorkflowAsync` to handle both synchronous and asynchronous resumption via `IWorkflowResumer` and `IBookmarkQueue`. - Updated dependency injection to include `IWorkflowResumer`.
This commit is contained in:
parent
07986de7a8
commit
f2d3c540ee
|
|
@ -11,7 +11,7 @@ namespace Elsa.Workflows.Api.Endpoints.Bookmarks.Resume;
|
|||
/// Resumes a bookmarked workflow instance with the bookmark ID specified in the provided SAS token.
|
||||
/// </summary>
|
||||
[PublicAPI]
|
||||
internal class Resume(ITokenService tokenService, IBookmarkQueue bookmarkQueue, IPayloadSerializer serializer) : ElsaEndpoint<Request>
|
||||
internal class Resume(ITokenService tokenService, IWorkflowResumer workflowResumer, IBookmarkQueue bookmarkQueue, IPayloadSerializer serializer) : ElsaEndpoint<Request>
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public override void Configure()
|
||||
|
|
@ -25,6 +25,7 @@ internal class Resume(ITokenService tokenService, IBookmarkQueue bookmarkQueue,
|
|||
public override async Task HandleAsync(Request request, CancellationToken cancellationToken)
|
||||
{
|
||||
var token = Query<string>("t")!;
|
||||
var asynchronous = Query<bool>("async", false);
|
||||
|
||||
if (!tokenService.TryDecryptToken<BookmarkTokenPayload>(token, out var payload))
|
||||
AddError("Invalid token.");
|
||||
|
|
@ -37,7 +38,7 @@ internal class Resume(ITokenService tokenService, IBookmarkQueue bookmarkQueue,
|
|||
return;
|
||||
}
|
||||
|
||||
await ResumeBookmarkedWorkflowAsync(payload, input, cancellationToken);
|
||||
await ResumeBookmarkedWorkflowAsync(payload, input, asynchronous, cancellationToken);
|
||||
|
||||
if (!HttpContext.Response.HasStarted)
|
||||
await SendOkAsync(cancellationToken);
|
||||
|
|
@ -60,20 +61,35 @@ internal class Resume(ITokenService tokenService, IBookmarkQueue bookmarkQueue,
|
|||
}
|
||||
}
|
||||
|
||||
private async Task ResumeBookmarkedWorkflowAsync(BookmarkTokenPayload tokenPayload, IDictionary<string, object>? input, CancellationToken cancellationToken)
|
||||
private async Task ResumeBookmarkedWorkflowAsync(BookmarkTokenPayload tokenPayload, IDictionary<string, object>? input, bool asynchronous, CancellationToken cancellationToken)
|
||||
{
|
||||
var bookmarkId = tokenPayload.BookmarkId;
|
||||
var workflowInstanceId = tokenPayload.WorkflowInstanceId;
|
||||
var item = new NewBookmarkQueueItem
|
||||
|
||||
if (asynchronous)
|
||||
{
|
||||
var item = new NewBookmarkQueueItem
|
||||
{
|
||||
BookmarkId = bookmarkId,
|
||||
WorkflowInstanceId = workflowInstanceId,
|
||||
Options = new()
|
||||
{
|
||||
Input = input
|
||||
}
|
||||
};
|
||||
|
||||
await bookmarkQueue.EnqueueAsync(item, cancellationToken);
|
||||
return;
|
||||
}
|
||||
|
||||
var resumeRequest = new ResumeBookmarkRequest
|
||||
{
|
||||
BookmarkId = bookmarkId,
|
||||
WorkflowInstanceId = workflowInstanceId,
|
||||
Options = new()
|
||||
{
|
||||
Input = input
|
||||
}
|
||||
Input = input
|
||||
};
|
||||
await bookmarkQueue.EnqueueAsync(item, cancellationToken);
|
||||
|
||||
await workflowResumer.ResumeAsync(resumeRequest, cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue