Skip to content

Commit a5217e1

Browse files
authored
WIP
1 parent 6126040 commit a5217e1

File tree

19 files changed

+28914
-8
lines changed

19 files changed

+28914
-8
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
*.sqlite
22
*.sqlite-journal
33
vendor
4-
plugin.so
4+
plugin.so
5+
6+
web/app/node_modules

.vscode/launch.json

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,45 +24,52 @@
2424
"type": "go",
2525
"request": "launch",
2626
"mode": "debug",
27-
"program": "${workspaceFolder}/samples/concurrent/concurrent.go"
27+
"program": "${workspaceFolder}/samples/concurrent"
2828
},
2929
{
3030
"name": "Launch timer sample",
3131
"type": "go",
3232
"request": "launch",
3333
"mode": "debug",
34-
"program": "${workspaceFolder}/samples/timer/timer.go"
34+
"program": "${workspaceFolder}/samples/timer"
3535
},
3636
{
3737
"name": "Launch signal sample",
3838
"type": "go",
3939
"request": "launch",
4040
"mode": "debug",
41-
"program": "${workspaceFolder}/samples/signal/signal.go"
41+
"program": "${workspaceFolder}/samples/signal"
4242
},
4343
{
4444
"name": "Launch cancellation sample",
4545
"type": "go",
4646
"request": "launch",
4747
"mode": "debug",
48-
"program": "${workspaceFolder}/samples/cancellation/cancellation.go"
48+
"program": "${workspaceFolder}/samples/cancellation"
4949
},
5050
{
5151
"name": "Launch subworkflow sample",
5252
"type": "go",
5353
"request": "launch",
5454
"mode": "debug",
55-
"program": "${workspaceFolder}/samples/subworkflow/subworkflow.go"
55+
"program": "${workspaceFolder}/samples/subworkflow"
5656
},
5757
{
5858
"name": "Launch scale/worker sample",
5959
"type": "go",
6060
"request": "launch",
6161
"mode": "debug",
62-
"program": "${workspaceFolder}/samples/scale/worker/main.go",
62+
"program": "${workspaceFolder}/samples/scale/worker",
6363
"args": [
6464
"-backend", "mysql",
6565
]
6666
},
67+
{
68+
"name": "Launch web sample",
69+
"type": "go",
70+
"request": "launch",
71+
"mode": "debug",
72+
"program": "${workspaceFolder}/samples/web"
73+
},
6774
]
6875
}

backend/sqlite/sqlite.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
//go:embed schema.sql
2424
var schema string
2525

26-
func NewInMemoryBackend(opts ...backend.BackendOption) backend.Backend {
26+
func NewInMemoryBackend(opts ...backend.BackendOption) *sqliteBackend {
2727
b := newSqliteBackend("file::memory:", opts...)
2828

2929
b.db.SetMaxOpenConns(1)

backend/sqlite/web.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package sqlite
2+
3+
import (
4+
"context"
5+
6+
"github.com/cschleiden/go-workflows/internal/core"
7+
)
8+
9+
func (sb *sqliteBackend) GetWorkflowInstances(ctx context.Context) ([]*core.WorkflowInstance, error) {
10+
tx, err := sb.db.BeginTx(ctx, nil)
11+
if err != nil {
12+
return nil, err
13+
}
14+
defer tx.Rollback()
15+
16+
rows, err := tx.QueryContext(ctx, "SELECT id, execution_id FROM instances")
17+
if err != nil {
18+
return nil, err
19+
}
20+
21+
var instances []*core.WorkflowInstance
22+
23+
for rows.Next() {
24+
var id, executionID string
25+
err = rows.Scan(&id, &executionID)
26+
if err != nil {
27+
return nil, err
28+
}
29+
30+
instances = append(instances, core.NewWorkflowInstance(id, executionID))
31+
}
32+
33+
return instances, nil
34+
}

samples/web/web.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log"
6+
"net/http"
7+
"os"
8+
"os/signal"
9+
"time"
10+
11+
"github.com/cschleiden/go-workflows/backend"
12+
"github.com/cschleiden/go-workflows/backend/sqlite"
13+
"github.com/cschleiden/go-workflows/client"
14+
"github.com/cschleiden/go-workflows/web"
15+
16+
// "github.com/cschleiden/go-workflows/web"
17+
"github.com/cschleiden/go-workflows/worker"
18+
19+
"github.com/google/uuid"
20+
)
21+
22+
func main() {
23+
ctx, cancel := context.WithCancel(context.Background())
24+
25+
// b := sqlite.NewSqliteBackend("simple.sqlite")
26+
b := sqlite.NewInMemoryBackend()
27+
28+
//b := mysql.NewMysqlBackend("localhost", 3306, "root", "test", "simple")
29+
30+
// b, err := redis.NewRedisBackend("localhost:6379", "", "RedisPassw0rd", 0)
31+
// if err != nil {
32+
// panic(err)
33+
// }
34+
35+
// Start diagnostic server
36+
go http.ListenAndServe(":8080", web.NewMux(b))
37+
38+
// Run worker
39+
w := RunWorker(ctx, b)
40+
41+
// Start workflow via client
42+
c := client.New(b)
43+
44+
runWorkflow(ctx, c)
45+
46+
sigint := make(chan os.Signal, 1)
47+
signal.Notify(sigint, os.Interrupt)
48+
<-sigint
49+
50+
cancel()
51+
52+
if err := w.WaitForCompletion(); err != nil {
53+
panic("could not stop worker" + err.Error())
54+
}
55+
}
56+
57+
func runWorkflow(ctx context.Context, c client.Client) {
58+
wf, err := c.CreateWorkflowInstance(ctx, client.WorkflowInstanceOptions{
59+
InstanceID: uuid.NewString(),
60+
}, Workflow1, "Hello world"+uuid.NewString(), 42, Inputs{
61+
Msg: "",
62+
Times: 0,
63+
})
64+
if err != nil {
65+
log.Fatal(err)
66+
panic("could not start workflow")
67+
}
68+
69+
result, err := client.GetWorkflowResult[int](ctx, c, wf, time.Second*10)
70+
if err != nil {
71+
log.Fatal(err)
72+
}
73+
74+
log.Println("Workflow finished. Result:", result)
75+
}
76+
77+
func RunWorker(ctx context.Context, mb backend.Backend) worker.Worker {
78+
w := worker.New(mb, nil)
79+
80+
w.RegisterWorkflow(Workflow1)
81+
82+
w.RegisterActivity(Activity1)
83+
84+
if err := w.Start(ctx); err != nil {
85+
panic("could not start worker")
86+
}
87+
88+
return w
89+
}

samples/web/workflow.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package main
2+
3+
import (
4+
"context"
5+
6+
"github.com/cschleiden/go-workflows/activity"
7+
"github.com/cschleiden/go-workflows/workflow"
8+
)
9+
10+
type Inputs struct {
11+
Msg string
12+
Times int
13+
}
14+
15+
func Workflow1(ctx workflow.Context, msg string, times int, inputs Inputs) (int, error) {
16+
logger := workflow.Logger(ctx)
17+
logger.Debug("Entering Workflow1", "msg", msg, "times", times, "inputs", inputs)
18+
defer logger.Debug("Leaving Workflow1")
19+
20+
r1, err := workflow.ExecuteActivity[int](ctx, workflow.DefaultActivityOptions, Activity1, 35, 12).Get(ctx)
21+
if err != nil {
22+
panic("error getting activity 1 result")
23+
}
24+
logger.Debug("R1 result", "r1", r1)
25+
26+
return r1, nil
27+
}
28+
29+
func Activity1(ctx context.Context, a, b int) (int, error) {
30+
logger := activity.Logger(ctx)
31+
logger.Debug("Entering Activity1")
32+
defer logger.Debug("Leaving Activity1")
33+
34+
// time.Sleep(5 * time.Second)
35+
36+
return a + b, nil
37+
}

web/app/.gitignore

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
/.pnp
6+
.pnp.js
7+
8+
# testing
9+
/coverage
10+
11+
# production
12+
/build
13+
14+
# misc
15+
.DS_Store
16+
.env.local
17+
.env.development.local
18+
.env.test.local
19+
.env.production.local
20+
21+
npm-debug.log*
22+
yarn-debug.log*
23+
yarn-error.log*

web/app/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Diagnostic web ui

0 commit comments

Comments
 (0)