Some checks failed
CI/CD / detect-changes (pull_request) Successful in 4s
CI/CD / test-frontend (pull_request) Successful in 6s
CI/CD / test-go-pg (pull_request) Failing after 2m41s
CI/CD / test-sqlite (pull_request) Failing after 2m48s
CI/CD / build-and-deploy (pull_request) Has been skipped
Final pass before public release — security, correctness, developer experience. - ValidateManifest() gate: centralized manifest validation (12 unit tests) - Extension dependency auto-activation from bundled packages - OIDC nonce validation: ID token nonce checked against stored state - Schema migration stub replaced with log-only additive policy - OptionalAuth middleware for anonymous workflow visitor routes - Package signing schema reservation (signature field + env var) - PublishAsync event bus counter fix - Health UI tooltips explaining published vs delivered gap - ICD/SDK runner updated for v0.6.x endpoints (metrics, cluster, backups, OpenAPI) - Version bump, ROADMAP, CHANGELOG Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
104 lines
2.8 KiB
Go
104 lines
2.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
|
|
"go.starlark.net/starlark"
|
|
)
|
|
|
|
// jsonToStarlark converts an arbitrary Go value (typically from JSON unmarshal)
|
|
// to a Starlark value for passing into extension scripts.
|
|
func jsonToStarlark(v any) starlark.Value {
|
|
switch val := v.(type) {
|
|
case nil:
|
|
return starlark.None
|
|
case bool:
|
|
return starlark.Bool(val)
|
|
case float64:
|
|
if val == float64(int64(val)) {
|
|
return starlark.MakeInt64(int64(val))
|
|
}
|
|
return starlark.Float(val)
|
|
case string:
|
|
return starlark.String(val)
|
|
case []any:
|
|
elems := make([]starlark.Value, len(val))
|
|
for i, e := range val {
|
|
elems[i] = jsonToStarlark(e)
|
|
}
|
|
return starlark.NewList(elems)
|
|
case map[string]any:
|
|
d := starlark.NewDict(len(val))
|
|
for k, v := range val {
|
|
_ = d.SetKey(starlark.String(k), jsonToStarlark(v))
|
|
}
|
|
return d
|
|
default:
|
|
return starlark.String(fmt.Sprintf("%v", val))
|
|
}
|
|
}
|
|
|
|
// starlarkValueToGo converts a Starlark value back to a Go value suitable
|
|
// for JSON serialization.
|
|
func starlarkValueToGo(v starlark.Value) any {
|
|
switch val := v.(type) {
|
|
case starlark.NoneType:
|
|
return nil
|
|
case starlark.Bool:
|
|
return bool(val)
|
|
case starlark.Int:
|
|
i, _ := val.Int64()
|
|
return i
|
|
case starlark.Float:
|
|
return float64(val)
|
|
case starlark.String:
|
|
return string(val)
|
|
case *starlark.List:
|
|
out := make([]any, val.Len())
|
|
for i := 0; i < val.Len(); i++ {
|
|
out[i] = starlarkValueToGo(val.Index(i))
|
|
}
|
|
return out
|
|
case *starlark.Dict:
|
|
out := make(map[string]any)
|
|
for _, item := range val.Items() {
|
|
k, _ := item[0].(starlark.String)
|
|
out[string(k)] = starlarkValueToGo(item[1])
|
|
}
|
|
return out
|
|
default:
|
|
return v.String()
|
|
}
|
|
}
|
|
|
|
// ParseSchemaVersion extracts the schema_version from a package manifest.
|
|
func ParseSchemaVersion(manifest any) int {
|
|
switch m := manifest.(type) {
|
|
case map[string]any:
|
|
if v, ok := m["schema_version"].(float64); ok {
|
|
return int(v)
|
|
}
|
|
case json.RawMessage:
|
|
var s struct {
|
|
SchemaVersion int `json:"schema_version"`
|
|
}
|
|
if err := json.Unmarshal(m, &s); err == nil {
|
|
return s.SchemaVersion
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// RunSchemaMigrations logs a schema version change during package update.
|
|
//
|
|
// Only additive schema changes are supported: extensions can ADD columns and
|
|
// tables via db_tables in the manifest, but cannot modify or delete existing
|
|
// schema. If a migration between versions requires destructive changes,
|
|
// uninstall and reinstall the package manually.
|
|
func RunSchemaMigrations(ctx any, sandbox any, stores any, db any, isPostgres bool, packageID string, manifest any, fromVersion, toVersion int) error {
|
|
log.Printf("[pkg-migrate] %s: schema version %d → %d (only additive changes are applied automatically; destructive migrations require manual uninstall/reinstall)", packageID, fromVersion, toVersion)
|
|
return nil
|
|
}
|