mirror of https://github.com/dapr/quickstarts.git
119 lines
3.0 KiB
Go
119 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/dapr/go-sdk/client"
|
|
"github.com/dapr/go-sdk/workflow"
|
|
)
|
|
|
|
var (
|
|
stateStoreName = "statestore"
|
|
workflowComponent = "dapr"
|
|
workflowName = "OrderProcessingWorkflow"
|
|
defaultItemName = "cars"
|
|
)
|
|
|
|
func main() {
|
|
fmt.Println("*** Welcome to the Dapr Workflow console app sample!")
|
|
fmt.Println("*** Using this app, you can place orders that start workflows.")
|
|
|
|
w, err := workflow.NewWorker()
|
|
if err != nil {
|
|
log.Fatalf("failed to start worker: %v", err)
|
|
}
|
|
|
|
if err := w.RegisterWorkflow(OrderProcessingWorkflow); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
if err := w.RegisterActivity(NotifyActivity); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
if err := w.RegisterActivity(RequestApprovalActivity); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
if err := w.RegisterActivity(VerifyInventoryActivity); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
if err := w.RegisterActivity(ProcessPaymentActivity); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
if err := w.RegisterActivity(UpdateInventoryActivity); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
if err := w.Start(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
daprClient, err := client.NewClient()
|
|
if err != nil {
|
|
log.Fatalf("failed to initialise dapr client: %v", err)
|
|
}
|
|
wfClient, err := workflow.NewClient(workflow.WithDaprClient(daprClient))
|
|
if err != nil {
|
|
log.Fatalf("failed to initialise workflow client: %v", err)
|
|
}
|
|
|
|
inventory := []InventoryItem{
|
|
{ItemName: "paperclip", PerItemCost: 5, Quantity: 100},
|
|
{ItemName: "cars", PerItemCost: 5000, Quantity: 10},
|
|
{ItemName: "computers", PerItemCost: 500, Quantity: 100},
|
|
}
|
|
if err := restockInventory(daprClient, inventory); err != nil {
|
|
log.Fatalf("failed to restock: %v", err)
|
|
}
|
|
|
|
fmt.Println("==========Begin the purchase of item:==========")
|
|
|
|
itemName := defaultItemName
|
|
orderQuantity := 1
|
|
|
|
totalCost := inventory[1].PerItemCost * orderQuantity
|
|
|
|
orderPayload := OrderPayload{
|
|
ItemName: itemName,
|
|
Quantity: orderQuantity,
|
|
TotalCost: totalCost,
|
|
}
|
|
|
|
id, err := wfClient.ScheduleNewWorkflow(context.Background(), workflowName, workflow.WithInput(orderPayload))
|
|
if err != nil {
|
|
log.Fatalf("failed to start workflow: %v", err)
|
|
}
|
|
|
|
waitCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
_, err = wfClient.WaitForWorkflowCompletion(waitCtx, id)
|
|
cancel()
|
|
if err != nil {
|
|
log.Fatalf("failed to wait for workflow: %v", err)
|
|
}
|
|
|
|
respFetch, err := wfClient.FetchWorkflowMetadata(context.Background(), id, workflow.WithFetchPayloads(true))
|
|
if err != nil {
|
|
log.Fatalf("failed to get workflow: %v", err)
|
|
}
|
|
|
|
fmt.Printf("workflow status: %v\n", respFetch.RuntimeStatus)
|
|
|
|
fmt.Println("Purchase of item is complete")
|
|
}
|
|
|
|
func restockInventory(daprClient client.Client, inventory []InventoryItem) error {
|
|
for _, item := range inventory {
|
|
itemSerialized, err := json.Marshal(item)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Printf("adding base stock item: %s\n", item.ItemName)
|
|
if err := daprClient.SaveState(context.Background(), stateStoreName, item.ItemName, itemSerialized, nil); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|