Skip to content

Commit

Permalink
Merge pull request #6 from wmeints/improve-workflow-behavior
Browse files Browse the repository at this point in the history
Improve workflow structure
  • Loading branch information
wmeints authored Jul 30, 2024
2 parents 8100a1b + 52fa6ed commit 8d181ae
Show file tree
Hide file tree
Showing 13 changed files with 81 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ namespace PaperBoy.Orchestrator.Activities;
/// <param name="contentStoreClient">Content store client to use for communicating with the content store.</param>
public class ImportPaperActivity(IContentStoreClient contentStoreClient): WorkflowActivity<ImportPaperActivityInput, ImportPaperActivityOutput>
{
/// <summary>
/// Executes the import paper activity asynchronously.
/// </summary>
/// <param name="context">The workflow activity context.</param>
/// <param name="input">The input for the import paper activity.</param>
/// <returns>The output of the import paper activity.</returns>
public override async Task<ImportPaperActivityOutput> RunAsync(WorkflowActivityContext context, ImportPaperActivityInput input)
{
var result = await contentStoreClient.ImportPaperAsync(new ImportPaperRequest(input.Title, input.Url, input.Submitter));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ public class ScorePaperActivity(IContentProcessorClient contentProcessorClient,
{
public override async Task<ScorePaperActivityOutput> RunAsync(WorkflowActivityContext context, ScorePaperActivityInput input)
{
var paper = await contentStoreClient.GetPaperAsync(input.PaperId);
var request = new GeneratePaperScoreRequest(paper.Title, paper.Summary!);
var request = new GeneratePaperScoreRequest(input.Title, input.Summary);
var response = await contentProcessorClient.GeneratePaperScoreAsync(request);

return new ScorePaperActivityOutput(response.Score, response.Explanation);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
namespace PaperBoy.Orchestrator.Activities;

public record ScorePaperActivityInput(Guid PaperId);
/// <summary>
/// Input information for the <see cref="ScorePaperActivityInput"/>
/// </summary>
/// <param name="Title">Title of the paper.</param>
/// <param name="Summary">Summary for the paper.</param>
public record ScorePaperActivityInput(string Title, string Summary);
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
namespace PaperBoy.Orchestrator.Activities;

/// <summary>
/// Output of the <see cref="ScorePaperActivity"/>
/// </summary>
/// <param name="Score">Score received for the paper.</param>
/// <param name="Explanation">Explanation of the score.</param>
public record ScorePaperActivityOutput(int Score, string Explanation);
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@

namespace PaperBoy.Orchestrator.Activities;

public record SubmitPaperDescriptionActivityInput(Guid PaperId, string PaperDescription);

/// <summary>
/// Submits the generated newsletter description for the paper to the content store.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace PaperBoy.Orchestrator.Activities;

public record SubmitPaperDescriptionActivityInput(Guid PaperId, string PaperDescription);
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ namespace PaperBoy.Orchestrator.Activities;
/// <param name="contentStoreClient">Content store client to use.</param>
public class SubmitPaperScoreActivity(IContentStoreClient contentStoreClient): WorkflowActivity<SubmitPaperScoreActivityInput, object>
{
/// <summary>
/// Executes the workflow activity.
/// </summary>
/// <param name="context">Context of the activity.</param>
/// <param name="input">Input for the activity.</param>
/// <returns>Returns the output of the activity.</returns>
public override async Task<object> RunAsync(WorkflowActivityContext context, SubmitPaperScoreActivityInput input)
{
await contentStoreClient.SubmitPaperScoreAsync(input.PaperId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,21 @@

namespace PaperBoy.Orchestrator.Activities;

/// <summary>
/// Submits the summary for the paper to the content store.
/// </summary>
/// <param name="contentStoreClient">Content store client instance to use.</param>
public class SubmitPaperSummaryActivity(IContentStoreClient contentStoreClient): WorkflowActivity<SubmitPaperSummaryActivityInput, object>
{
/// <summary>
/// Executes the workflow activity.
/// </summary>
/// <param name="context">Context of the activity.</param>
/// <param name="input">Input for the activity.</param>
/// <returns>Returns the output of the activity.</returns>
public override async Task<object> RunAsync(WorkflowActivityContext context, SubmitPaperSummaryActivityInput input)
{
await contentStoreClient.SubmitPaperSummary(input.PaperId, new SubmitPaperSummaryRequest(input.Summary, input.PageSummaries));
await contentStoreClient.SubmitPaperSummary(input.PaperId, new SubmitPaperSummaryRequest(input.Summary));
return new object();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,9 @@

namespace PaperBoy.Orchestrator.Activities;

public record SubmitPaperSummaryActivityInput(Guid PaperId, string Summary, List<PageSummary> PageSummaries);
/// <summary>
/// Input for the <see cref="SubmitPaperSummaryActivity"/>
/// </summary>
/// <param name="PaperId">Identifier for the paper.</param>
/// <param name="Summary">Summary for the paper.</param>
public record SubmitPaperSummaryActivityInput(Guid PaperId, string Summary);
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,7 @@ public class SummarizePaperActivity(IContentStoreClient contentStoreClient, ICon
/// <returns>A task that represents the asynchronous operation. The task result contains the output with the paper summary and page summaries.</returns>
public override async Task<SummarizePaperActivityOutput> RunAsync(WorkflowActivityContext context, SummarizePaperActivityInput input)
{
var paper = await contentStoreClient.GetPaperAsync(input.PaperId);

var request = new SummarizePaperRequest(paper.Title,
paper.Pages.Select(x => new PageSummary(x.PageNumber, x.Summary!)).ToList());

var request = new SummarizePaperRequest(input.PaperTitle, input.PageSummaries);
var response = await contentProcessorClient.SummarizePaperAsync(request);

return new SummarizePaperActivityOutput(response.Summary, response.PageSummaries);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
namespace PaperBoy.Orchestrator.Activities;
using PaperBoy.Orchestrator.Models;

public record SummarizePaperActivityInput(Guid PaperId);
namespace PaperBoy.Orchestrator.Activities;

/// <summary>
/// Input for the <see cref="SummarizePaperActivity"/>.
/// </summary>
/// <param name="PaperTitle">Title of the paper.</param>
/// <param name="PageSummaries">Summaries of all pages in the paper.</param>
public record SummarizePaperActivityInput(string PaperTitle, List<PageSummary> PageSummaries);
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

namespace PaperBoy.Orchestrator.Clients.ContentStore;

public record SubmitPaperSummaryRequest(string Summary, List<PageSummary> PageSummaries);
public record SubmitPaperSummaryRequest(string Summary);
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Net.Sockets;
using Dapr.Workflow;
using Dapr.Workflow;
using PaperBoy.Orchestrator.Activities;
using PaperBoy.Orchestrator.Events;
using PaperBoy.Orchestrator.Models;
Expand All @@ -22,22 +21,23 @@ public override async Task<object> RunAsync(WorkflowContext context, ProcessPape
await ImportPaperAsync(context, input);

var paperSummary = await SummarizePaperAsync(context, input.PaperId);
await ScorePaperAsync(context, input.PaperId);
await ScorePaperAsync(context, input.PaperId, input.Title, paperSummary);

var paperApprovalStateChanged =
var paperApprovalStateChanged =
await context.WaitForExternalEventAsync<PaperApprovalStateChangedWorkflowEvent>(
nameof(PaperApprovalStateChangedWorkflowEvent));

// When a paper is approved, we want to generate a nice description for it to use
// in the weekly newsletter, on slack, and on LinkedIn.
if (paperApprovalStateChanged.State == ApprovalState.Approved)
{
var generatePaperDescriptionResult = await context.CallActivityAsync<GeneratePaperDescriptionActivityOutput>(
nameof(GeneratePaperDescriptionActivity),
new GeneratePaperDescriptionActivityInput(input.Title, paperSummary));
var generatePaperDescriptionResult =
await context.CallActivityAsync<GeneratePaperDescriptionActivityOutput>(
nameof(GeneratePaperDescriptionActivity),
new GeneratePaperDescriptionActivityInput(input.Title, paperSummary));

await context.CallActivityAsync(nameof(SubmitPaperDescriptionActivity),
new SubmitPaperDescriptionActivityInput(input.PaperId,
new SubmitPaperDescriptionActivityInput(input.PaperId,
generatePaperDescriptionResult.Description));
}
else
Expand All @@ -49,11 +49,12 @@ await context.CallActivityAsync(nameof(DeclinePaperActivity),
return new object();
}

private static async Task ScorePaperAsync(WorkflowContext context, Guid paperId)
private static async Task ScorePaperAsync(WorkflowContext context, Guid paperId, string paperTitle,
string paperSummary)
{
var scorePaperResult = await context.CallActivityAsync<ScorePaperActivityOutput>(
nameof(ScorePaperActivity),
new ScorePaperActivityInput(paperId));
new ScorePaperActivityInput(paperTitle, paperSummary));

await context.CallActivityAsync(nameof(SubmitPaperScoreActivity),
new SubmitPaperScoreActivityInput(paperId, scorePaperResult.Score,
Expand All @@ -62,9 +63,12 @@ await context.CallActivityAsync(nameof(SubmitPaperScoreActivity),

private static async Task<string> SummarizePaperAsync(WorkflowContext context, Guid paperId)
{
var paperDetails = await context.CallActivityAsync<GetPaperDetailsActivityOutput>(nameof(GetPaperDetailsActivity),
var paperDetails = await context.CallActivityAsync<GetPaperDetailsActivityOutput>(
nameof(GetPaperDetailsActivity),
new GetPaperDetailsActivityInput(paperId));

var pageSummaries = new List<PageSummary>();

foreach (var page in paperDetails.Pages)
{
var summaryResult = await context.CallActivityAsync<SummarizePageActivityOutput>(
Expand All @@ -73,29 +77,30 @@ private static async Task<string> SummarizePaperAsync(WorkflowContext context, G

await context.CallActivityAsync(nameof(SubmitPageSummaryActivity),
new SubmitPageSummaryActivityInput(paperId, page.PageNumber, summaryResult.Summary));

pageSummaries.Add(new PageSummary(page.PageNumber, summaryResult.Summary));
}

var summarizePaperResult = await context.CallActivityAsync<SummarizePaperActivityOutput>(
nameof(SummarizePaperActivity),
new SummarizePaperActivityInput(paperId));
new SummarizePaperActivityInput(paperDetails.Title, pageSummaries));

await context.CallActivityAsync(nameof(SubmitPaperSummaryActivity),
new SubmitPaperSummaryActivityInput(
paperId,
summarizePaperResult.Summary,
summarizePaperResult.PageSummaries));
paperId, summarizePaperResult.Summary));

return summarizePaperResult.Summary;
}

private static async Task<ImportPaperActivityOutput> ImportPaperAsync(WorkflowContext context, ProcessPaperWorkflowInput input)
private static async Task<ImportPaperActivityOutput> ImportPaperAsync(WorkflowContext context,
ProcessPaperWorkflowInput input)
{
var activityInput = new ImportPaperActivityInput(input.PaperId, input.Title, input.Url, input.Submitter);

var activityOutput = await context.CallActivityAsync<ImportPaperActivityOutput>(
nameof(ImportPaperActivity),
activityInput);

return activityOutput;
}
}
}

0 comments on commit 8d181ae

Please sign in to comment.