From 61f4427eeaf604c8a38f54bf7ec8b1302cb87dc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Flor=C3=AAncio?= Date: Tue, 7 Jul 2026 18:54:46 +0100 Subject: [PATCH] fix: encode workflow hidden flag for postgres (#1614) --- .../repository/sqlite/postgres_schema_test.go | 50 +++++++++++++++++++ .../task/repository/sqlite/workflow.go | 9 ++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/apps/backend/internal/task/repository/sqlite/postgres_schema_test.go b/apps/backend/internal/task/repository/sqlite/postgres_schema_test.go index d7a53eb382..5f431d10dc 100644 --- a/apps/backend/internal/task/repository/sqlite/postgres_schema_test.go +++ b/apps/backend/internal/task/repository/sqlite/postgres_schema_test.go @@ -1,9 +1,11 @@ package sqlite import ( + "context" "testing" "time" + "github.com/kandev/kandev/internal/task/models" "github.com/kandev/kandev/internal/testutil" ) @@ -54,6 +56,54 @@ func TestPostgresSkipsLegacyTaskEnvironmentBackfill(t *testing.T) { } } +func TestPostgresWorkflowHiddenRoundTrip(t *testing.T) { + ctx := context.Background() + db := testutil.OpenIsolatedPostgres(t, testutil.PostgresDSNFromEnv(t)) + repo, err := NewWithDB(db, db, nil) + if err != nil { + t.Fatalf("init fresh postgres schema: %v", err) + } + if err := repo.CreateWorkspace(ctx, &models.Workspace{ID: "ws-postgres", Name: "Postgres"}); err != nil { + t.Fatalf("create workspace: %v", err) + } + + visible := &models.Workflow{ID: "wf-visible", WorkspaceID: "ws-postgres", Name: "Visible"} + if err := repo.CreateWorkflow(ctx, visible); err != nil { + t.Fatalf("create visible workflow: %v", err) + } + retrieved, err := repo.GetWorkflow(ctx, visible.ID) + if err != nil { + t.Fatalf("get visible workflow: %v", err) + } + if retrieved.Hidden { + t.Fatalf("visible workflow Hidden = true, want false") + } + + hidden := &models.Workflow{ID: "wf-hidden", WorkspaceID: "ws-postgres", Name: "Hidden", Hidden: true} + if err := repo.CreateWorkflow(ctx, hidden); err != nil { + t.Fatalf("create hidden workflow: %v", err) + } + retrieved, err = repo.GetWorkflow(ctx, hidden.ID) + if err != nil { + t.Fatalf("get hidden workflow: %v", err) + } + if !retrieved.Hidden { + t.Fatalf("hidden workflow Hidden = false, want true") + } + + hidden.Hidden = false + if err := repo.UpdateWorkflow(ctx, hidden); err != nil { + t.Fatalf("update hidden workflow to visible: %v", err) + } + retrieved, err = repo.GetWorkflow(ctx, hidden.ID) + if err != nil { + t.Fatalf("get updated workflow: %v", err) + } + if retrieved.Hidden { + t.Fatalf("updated workflow Hidden = true, want false") + } +} + func TestPostgresTaskEnvironmentReposMultiBranchMigration(t *testing.T) { db := testutil.OpenIsolatedPostgres(t, testutil.PostgresDSNFromEnv(t)) if _, err := db.Exec(` diff --git a/apps/backend/internal/task/repository/sqlite/workflow.go b/apps/backend/internal/task/repository/sqlite/workflow.go index 2cc279b4ec..1be376c31b 100644 --- a/apps/backend/internal/task/repository/sqlite/workflow.go +++ b/apps/backend/internal/task/repository/sqlite/workflow.go @@ -9,6 +9,7 @@ import ( "github.com/google/uuid" "github.com/jmoiron/sqlx" + "github.com/kandev/kandev/internal/db/dialect" "github.com/kandev/kandev/internal/task/models" ) @@ -53,7 +54,7 @@ func (r *Repository) CreateWorkflow(ctx context.Context, workflow *models.Workfl _, err = r.db.ExecContext(ctx, r.db.Rebind(` INSERT INTO workflows (id, workspace_id, name, description, agent_profile_id, workflow_template_id, sort_order, hidden, style, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - `), workflow.ID, workflow.WorkspaceID, workflow.Name, workflow.Description, workflow.AgentProfileID, workflow.WorkflowTemplateID, workflow.SortOrder, workflow.Hidden, normalizeWorkflowStyle(workflow.Style), workflow.CreatedAt, workflow.UpdatedAt) + `), workflow.ID, workflow.WorkspaceID, workflow.Name, workflow.Description, workflow.AgentProfileID, workflow.WorkflowTemplateID, workflow.SortOrder, dialect.BoolToInt(workflow.Hidden), normalizeWorkflowStyle(workflow.Style), workflow.CreatedAt, workflow.UpdatedAt) return err } @@ -81,6 +82,7 @@ type workflowScanner interface { func scanWorkflowRow(scanner workflowScanner) (*models.Workflow, error) { workflow := &models.Workflow{} var workflowTemplateID, agentProfileID, style sql.NullString + var hidden int if err := scanner.Scan( &workflow.ID, &workflow.WorkspaceID, @@ -89,13 +91,14 @@ func scanWorkflowRow(scanner workflowScanner) (*models.Workflow, error) { &agentProfileID, &workflowTemplateID, &workflow.SortOrder, - &workflow.Hidden, + &hidden, &style, &workflow.CreatedAt, &workflow.UpdatedAt, ); err != nil { return nil, err } + workflow.Hidden = hidden != 0 if agentProfileID.Valid { workflow.AgentProfileID = agentProfileID.String } @@ -143,7 +146,7 @@ func (r *Repository) UpdateWorkflow(ctx context.Context, workflow *models.Workfl result, err := r.db.ExecContext(ctx, r.db.Rebind(` UPDATE workflows SET name = ?, description = ?, agent_profile_id = ?, workflow_template_id = ?, hidden = ?, style = ?, updated_at = ? WHERE id = ? - `), workflow.Name, workflow.Description, workflow.AgentProfileID, workflow.WorkflowTemplateID, workflow.Hidden, normalizeWorkflowStyle(workflow.Style), workflow.UpdatedAt, workflow.ID) + `), workflow.Name, workflow.Description, workflow.AgentProfileID, workflow.WorkflowTemplateID, dialect.BoolToInt(workflow.Hidden), normalizeWorkflowStyle(workflow.Style), workflow.UpdatedAt, workflow.ID) if err != nil { return err }