c8e71a0c34
Three packages (api, reconciler, webhook) each carried a private 30-line toPluginWorkload() copy that had drifted — only the api version logged malformed public_faces JSON; the others swallowed it. Hoist the single implementation to plugin.WorkloadFromStore() (convert.go); store is already a plugin dependency so no new import edge or cycle forms. Likewise the dockerfile and static sources each had a private removeContainerByName() that disagreed (remove-all vs stop-at-first). Docker enforces unique container names, so the two were equivalent for every reachable state; converge on plugin.RemoveContainerByName() (container.go, stop-at-first) with a note on why remove-all was moot. Callers migrated; old copies removed. Adds convert_test.go pinning the field-by-field contract and JSON edge cases.
59 lines
1.9 KiB
Go
59 lines
1.9 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/alexei/tinyforge/internal/store"
|
|
"github.com/alexei/tinyforge/internal/workload/plugin"
|
|
)
|
|
|
|
// toPluginWorkload is a local alias for the shared plugin.WorkloadFromStore
|
|
// converter, kept so the api package's many call sites read tersely and pair
|
|
// visually with fromPluginWorkload below. The conversion logic lives in the
|
|
// plugin package (the single home shared with reconciler / webhook).
|
|
func toPluginWorkload(w store.Workload) plugin.Workload {
|
|
return plugin.WorkloadFromStore(w)
|
|
}
|
|
|
|
// fromPluginWorkload is the symmetric direction — used by /api/workloads
|
|
// create + update handlers. Returns a store.Workload ready to pass to
|
|
// store.CreateWorkload / store.UpdateWorkload. The caller is responsible
|
|
// for re-encoding PublicFaces; we do it here to keep the JSON shape in
|
|
// one place.
|
|
func fromPluginWorkload(p plugin.Workload) (store.Workload, error) {
|
|
facesJSON := "[]"
|
|
if len(p.PublicFaces) > 0 {
|
|
b, err := json.Marshal(p.PublicFaces)
|
|
if err != nil {
|
|
return store.Workload{}, err
|
|
}
|
|
facesJSON = string(b)
|
|
}
|
|
srcCfg := string(p.SourceConfig)
|
|
if srcCfg == "" {
|
|
srcCfg = "{}"
|
|
}
|
|
trgCfg := string(p.TriggerConfig)
|
|
if trgCfg == "" {
|
|
trgCfg = "{}"
|
|
}
|
|
return store.Workload{
|
|
ID: p.ID,
|
|
Name: p.Name,
|
|
AppID: p.GroupID,
|
|
ParentWorkloadID: p.ParentWorkloadID,
|
|
SourceKind: p.SourceKind,
|
|
SourceConfig: srcCfg,
|
|
TriggerKind: p.TriggerKind,
|
|
TriggerConfig: trgCfg,
|
|
PublicFaces: facesJSON,
|
|
NotificationURL: p.NotificationURL,
|
|
NotificationSecret: p.NotificationSecret,
|
|
WebhookSecret: p.WebhookSecret,
|
|
WebhookSigningSecret: p.WebhookSigningSecret,
|
|
WebhookRequireSignature: p.WebhookRequireSignature,
|
|
CreatedAt: p.CreatedAt,
|
|
UpdatedAt: p.UpdatedAt,
|
|
}, nil
|
|
}
|