workflows

package
v0.0.0-...-d1b6a4e Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 17, 2026 License: AGPL-3.0 Imports: 17 Imported by: 0

README

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:
// 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.

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
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"},
)

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewClient

func NewClient(ctx context.Context, cfg ClientConfig) (client.Client, error)

NewClient creates a new Temporal client.

Types

type ClientConfig

type ClientConfig struct {
	HostPort           string
	Namespace          string
	Logger             *slog.Logger
	OAuthTokenProvider *OAuthTokenProviderConfig
}

ClientConfig holds configuration for the Temporal client.

func DefaultClientConfig

func DefaultClientConfig() ClientConfig

DefaultClientConfig returns a ClientConfig with sensible defaults.

type OAuthTokenProvider

type OAuthTokenProvider struct {
	TokenURL     string
	ClientID     string
	ClientSecret string
	Scopes       []string
	// contains filtered or unexported fields
}

OAuthTokenProvider implements Temporal's HeadersProvider using OAuth2 client credentials.

func NewOAuthTokenProvider

func NewOAuthTokenProvider(cfg OAuthTokenProviderConfig) (*OAuthTokenProvider, error)

NewOAuthTokenProvider validates configuration and returns a ready provider.

func (*OAuthTokenProvider) GetHeaders

func (p *OAuthTokenProvider) GetHeaders(ctx context.Context) (map[string]string, error)

GetHeaders returns Authorization headers for each outgoing Temporal request.

type OAuthTokenProviderConfig

type OAuthTokenProviderConfig struct {
	TokenURL     string
	ClientID     string
	ClientSecret string
	Scopes       []string
}

OAuthTokenProviderConfig configures OAuth2 client credentials token fetching.

type Worker

type Worker struct {
	// contains filtered or unexported fields
}

Worker wraps a Temporal worker with application-specific setup.

func NewWorker

func NewWorker(c client.Client, cfg WorkerConfig) (*Worker, error)

NewWorker creates and configures a new embedded Temporal worker.

func (*Worker) GracefulStop

func (w *Worker) GracefulStop(ctx context.Context)

func (*Worker) Start

func (w *Worker) Start() error

func (*Worker) Stop

func (w *Worker) Stop()

type WorkerConfig

type WorkerConfig struct {
	TaskQueue               string
	DB                      db.Querier
	Logger                  *slog.Logger
	MaxConcurrentActivities int
	MaxConcurrentWorkflows  int
	// FedWiki configuration
	FedWikiFarmAPIURL     string   // URL for FarmManager API calls
	FedWikiAllowedDomains []string // Domains where users can create sites
	FedWikiAdminToken     string
	SupportURL            string
}

WorkerConfig holds configuration for the embedded Temporal worker.

func DefaultWorkerConfig

func DefaultWorkerConfig(database db.Querier, logger *slog.Logger) WorkerConfig

DefaultWorkerConfig returns a WorkerConfig with sensible defaults.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL