@@ -10,18 +10,34 @@ import (
1010 "go.temporal.io/sdk/temporal"
1111 "go.temporal.io/sdk/workflow"
1212
13+ "github.com/google/uuid"
1314 "github.com/speakeasy-api/gram/server/internal/background/activities"
1415)
1516
1617type FunctionsReaperWorkflowParams struct {
17- // No parameters needed - reaper runs globally across all projects
18+ Scope activities.FunctionsReaperScope
19+
20+ ProjectID uuid.NullUUID
1821}
1922
2023type FunctionsReaperWorkflowResult struct {
2124 AppsReaped int
2225 Errors int
2326}
2427
28+ func ExecuteProjectFunctionsReaperChildWorkflow (ctx workflow.Context , projectID uuid.UUID ) (workflow.ChildWorkflowFuture , error ) {
29+ return workflow .ExecuteChildWorkflow (ctx , client.StartWorkflowOptions {
30+ ID : "v1:functions-reaper:" + projectID .String (),
31+ TaskQueue : string (TaskQueueMain ),
32+ WorkflowIDConflictPolicy : enums .WORKFLOW_ID_CONFLICT_POLICY_USE_EXISTING ,
33+ WorkflowIDReusePolicy : enums .WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE ,
34+ WorkflowRunTimeout : time .Minute * 5 ,
35+ }, FunctionsReaperWorkflow , FunctionsReaperWorkflowParams {
36+ Scope : activities .FunctionsReaperScopeProject ,
37+ ProjectID : uuid.NullUUID {UUID : projectID , Valid : projectID != uuid .Nil },
38+ }), nil
39+ }
40+
2541func ExecuteFunctionsReaperWorkflow (ctx context.Context , temporalClient client.Client , params FunctionsReaperWorkflowParams ) (client.WorkflowRun , error ) {
2642 // Use a fixed workflow ID so that only one reaper workflow can run at a time
2743 return temporalClient .ExecuteWorkflow (ctx , client.StartWorkflowOptions {
@@ -54,6 +70,10 @@ func FunctionsReaperWorkflow(ctx workflow.Context, params FunctionsReaperWorkflo
5470 err := workflow .ExecuteActivity (
5571 ctx ,
5672 a .ReapFlyApps ,
73+ activities.ReapFlyAppsRequest {
74+ Scope : params .Scope ,
75+ ProjectID : params .ProjectID ,
76+ },
5777 ).Get (ctx , & result )
5878 if err != nil {
5979 return nil , fmt .Errorf ("failed to reap functions: %w" , err )
0 commit comments