Files
felhom-controller/controller/internal/integrations/integrations.go
T
admin 2487681396 style: gofmt normalization — no logic changes
gofmt -w across the controller tree (46 files) so gofmt -l is empty — disarms the
formatting landmine where a targeted edit + accidental gofmt -w swept ~46 unrelated
files. Pure formatting: whitespace + gofmt's optional-semicolon removal in reflowed
inline closures. One doc comment reworded ('' -> 'the empty string') to avoid gofmt's
Go-1.19 doc-comment typographic substitition ('' -> curly quote) muddying its meaning.
No build/vet/test behavior change.
2026-07-25 07:37:02 +02:00

58 lines
2.0 KiB
Go

package integrations
import (
"log"
"strings"
"gitea.dooplex.hu/admin/felhom-controller/internal/stacks"
)
// IntegrationKey builds the settings key: "provider:target".
func IntegrationKey(provider, target string) string {
return provider + ":" + target
}
// ParseIntegrationKey splits "provider:target" into its components.
func ParseIntegrationKey(key string) (provider, target string, ok bool) {
parts := strings.SplitN(key, ":", 2)
if len(parts) != 2 || parts[0] == "" || parts[1] == "" {
return "", "", false
}
return parts[0], parts[1], true
}
// ApplyContext holds all context needed by an integration handler.
type ApplyContext struct {
ProviderName string // e.g., "onlyoffice"
TargetName string // e.g., "filebrowser"
Domain string // e.g., "demo-felhom.eu"
ProviderEnv map[string]string // decrypted app.yaml env of provider
ProviderMeta *stacks.Metadata
StacksDir string
Logger *log.Logger
RestartStack func(name string) error // restart via stacks.Manager
}
// Handler defines the interface for a concrete integration handler.
// Each provider:target pair has one Handler implementation.
type Handler interface {
// Apply enables the integration (writes configs, runs commands, restarts containers).
Apply(ac *ApplyContext) error
// Revoke disables the integration (removes configs, runs commands, restarts containers).
Revoke(ac *ApplyContext) error
}
// StatusInfo is returned by the API for UI display.
type StatusInfo struct {
Key string `json:"key"` // "onlyoffice:filebrowser"
Provider string `json:"provider"`
Target string `json:"target"`
Label string `json:"label"`
Description string `json:"description"`
Enabled bool `json:"enabled"`
Status string `json:"status"` // "active", "error", "disabled", "provider_stopped", "target_unavailable"
LastError string `json:"last_error,omitempty"`
TargetDeployed bool `json:"target_deployed"`
TargetRunning bool `json:"target_running"`
}