developer_samples

This document provides practical examples using skail.

Each example illustrates key patterns such as human approvals, automatic workflows, retry policies, compensating sagas, fan-out/fan-in orchestration, and event-driven logic.


1. Parallel Human Approval (Function + Command)

[SkailFunction]
public async SkailTask AwaitAllHumanApprovals(Guid approvalTaskId)
{
    await SendApprovalRequestEmail("Finance", approvalTaskId);
    await SendApprovalRequestEmail("Legal", approvalTaskId);
    await SendApprovalRequestEmail("Executive", approvalTaskId);
    var approvals = new[]
    {
        SkailEvent.WaitForEvent<ApprovalResponse>("EVT_APPROVAL_FINANCE", approvalTaskId),
        SkailEvent.WaitForEvent<ApprovalResponse>("EVT_APPROVAL_LEGAL", approvalTaskId),
        SkailEvent.WaitForEvent<ApprovalResponse>("EVT_APPROVAL_EXECUTIVE", approvalTaskId)
    };
    var results = await SkailTask.WhenAll(approvals);
    if (results.All(r => r.Approved))
        await NotifyApproved(approvalTaskId);
    else
        await NotifyDenied(approvalTaskId, results.First(r => !r.Approved).Reason);
}

[SkailCommand]
public async SkailTask SendApprovalRequestEmail(string department, Guid taskId)
{
    var link = $"https://portal.company.com/approvals/{department.ToLower()}/{taskId}";
    await EmailService.SendAsync($"{department} - Pending Approval",
        $"Please review the request at: {link}");
}

2. Human Approval with Timeout


3. CT-e Issuance Pipeline (Function + Commands)


4. Compensating Workflow (Saga Pattern)


5. Durable Retry with Backoff


6. Race Between Providers (WhenAny)


7. Fan-out / Fan-in Data Aggregation


8. Human Approval Followed by Automation (Hybrid)


circle-info

Note: Adapt these examples to your environment’s orchestration model, domain constraints, and versioning strategy.