Files
member-console/cmd/seed_demo.go
Christian Galo 9d11ee0328 Add member-console demo seeder with person seeding
Add a `seed-demo` subcommand (cmd/seed_demo.go + internal/demoseed/)
that inserts a fixed reference catalog into the member-console DB so
the operator panel has rows to walk through for UX research. Catalog:
6 demo-* products (4 by product_type + 2 extra plans), 1 plan ladder
with 3 tiers, 1 entitlement set with 2 rules (limit + boolean), and 1
grant on Alice's personal org (once she's logged in).

Person rows for bob/carlos/diana are seeded via provisioning.AutoProvision
keyed on the pinned Keycloak UUIDs — no longer fragile now that
seed-keycloak.sh's partialImport switch preserves the pinned id. Alice
is intentionally NOT pre-seeded so the lazy-creation OIDC flow stays
exercised on every fresh stack.

Idempotency: list+filter by `name` for catalog rows, by `oidc_subject`
for persons. Re-running is a no-op for created rows; warns + skips
the grant if alice hasn't logged in yet.

Host-side invocation only — run `./test/seed-demo.sh` after
bootstrap-stack.sh. Mirrors how member-console itself runs on the
host (config + secrets live under test/).

Two OpenSpec changes folded in: 2026-05-10-member-console-demo-seeder
(the seeder) and 2026-05-11-demo-seeder-persons (the persons follow-up
unlocked by the Keycloak fix).
2026-05-11 10:55:14 -05:00

56 lines
1.6 KiB
Go

package cmd
import (
"context"
"log/slog"
"git.coopcloud.tech/wiki-cafe/member-console/internal/db"
"git.coopcloud.tech/wiki-cafe/member-console/internal/demoseed"
"git.coopcloud.tech/wiki-cafe/member-console/internal/logging"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var seedDemoCmd = &cobra.Command{
Use: "seed-demo",
Short: "Seed a fixed reference catalog of demo data for the operator panel",
Long: `Insert an idempotent reference catalog (products, entitlement sets, plan ladder,
one grant) so the operator panel has data to walk through. Re-running is a no-op.
Person rows are NOT seeded — log in as bob/carlos/diana once to populate them via
the existing OIDC lazy-creation path. See OpenSpec change
2026-05-10-member-console-demo-seeder for the rationale.`,
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
ctx := context.Background()
env := viper.GetString("env")
logger := logging.SetupLogger(env)
ctx = logging.WithContext(ctx, logger)
dbDSN := viper.GetString("db-dsn")
dbConfig := db.DefaultDBConfig(dbDSN)
database, err := db.ConnectAndMigrate(ctx, logger, dbConfig, migrationSources())
if err != nil {
logger.Error("failed to initialize database", slog.Any("error", err))
return err
}
defer database.Close()
summary, err := demoseed.Seed(ctx, database, logger)
if err != nil {
logger.Error("seed-demo failed", slog.Any("error", err))
return err
}
logger.Info("seed-demo complete",
slog.Int("created", summary.Created),
slog.Int("skipped", summary.Skipped),
)
return nil
},
}
func init() {
rootCmd.AddCommand(seedDemoCmd)
}