88 lines
3.0 KiB
Markdown
88 lines
3.0 KiB
Markdown
# Temporal Workflows
|
|
|
|
This directory contains the Temporal workflow definitions, activity implementations, and worker configuration for the member-console application.
|
|
|
|
## Structure: Domain-Based
|
|
|
|
We use a **Domain-Based** (or Feature-Based) structure. Instead of grouping all workflows in one folder and all activities in another, we group them by business domain.
|
|
|
|
```
|
|
internal/workflows/
|
|
├── client.go # Temporal client factory
|
|
├── worker.go # Central worker setup & registration
|
|
├── queues/
|
|
│ └── queues.go # Task Queue constants
|
|
├── common/ # Shared utilities & generic activities
|
|
│ └── options.go # Standard ActivityOptions (retries, timeouts)
|
|
├── example/ # "Example" Domain
|
|
│ ├── workflow.go # Workflow definition
|
|
│ └── activities.go # Domain-specific activities
|
|
├── fedwiki/ # "FedWiki" Domain - Site provisioning
|
|
│ ├── README.md # Domain documentation
|
|
│ ├── FARMMANAGER.md # FarmManager API documentation
|
|
│ ├── workflow.go # Create/Delete site workflows
|
|
│ ├── activities.go # Site management activities
|
|
│ └── farmmanager_client.go # HTTP client for FarmManager API
|
|
└── onboarding/ # (Future) "Onboarding" Domain
|
|
├── workflow.go
|
|
└── activities.go
|
|
```
|
|
|
|
## Adding a New Domain
|
|
|
|
1. **Create a directory**: `internal/workflows/<domain_name>/`
|
|
2. **Define the Workflow**: Create `workflow.go` in that directory.
|
|
3. **Define Activities**: Create `activities.go` in that directory.
|
|
* Define a struct (e.g., `Activities`) to hold dependencies (DB, Logger).
|
|
* Implement a `NewActivities` constructor.
|
|
4. **Register**: Go to `internal/workflows/worker.go` and add your new domain to the `NewWorker` function:
|
|
|
|
```go
|
|
// internal/workflows/worker.go
|
|
|
|
// ... inside NewWorker ...
|
|
w.RegisterWorkflow(yourdomain.Workflow)
|
|
w.RegisterActivity(yourdomain.NewActivities(cfg.DB, cfg.Logger))
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Starting the Worker
|
|
|
|
The worker is embedded in the main application but can be extracted later.
|
|
|
|
```go
|
|
import "git.coopcloud.tech/wiki-cafe/member-console/internal/workflows"
|
|
|
|
// ... in your main setup ...
|
|
workerCfg := workflows.DefaultWorkerConfig(database, logger)
|
|
worker, err := workflows.NewWorker(temporalClient, workerCfg)
|
|
if err := worker.Start(); err != nil {
|
|
// handle error
|
|
}
|
|
defer worker.Stop()
|
|
```
|
|
|
|
### Starting a Workflow
|
|
|
|
```go
|
|
import (
|
|
"git.coopcloud.tech/wiki-cafe/member-console/internal/workflows"
|
|
"git.coopcloud.tech/wiki-cafe/member-console/internal/workflows/queues"
|
|
"git.coopcloud.tech/wiki-cafe/member-console/internal/workflows/example"
|
|
)
|
|
|
|
// ... inside an HTTP handler ...
|
|
workflowOpts := client.StartWorkflowOptions{
|
|
ID: "example-" + uuid.New().String(),
|
|
TaskQueue: queues.Main,
|
|
}
|
|
|
|
we, err := temporalClient.ExecuteWorkflow(
|
|
ctx,
|
|
workflowOpts,
|
|
example.Workflow, // Pass the function reference
|
|
example.Input{Message: "hello"},
|
|
)
|
|
```
|