Skip to content

Commit 55b21eb

Browse files
committed
refactor: implement mutation backends and migrate handlers off sdk/mpr
Implement PageMutator, WorkflowMutator, and WidgetBuilderBackend in mdl/backend/mpr/. Rewrite ALTER PAGE (1721→256 lines) and ALTER WORKFLOW (887→178 lines) as thin orchestrators using mutator sessions. Implement PluggableWidgetEngine with WidgetObjectBuilder interface, eliminating all BSON from widget_engine.go. - Create mdl/backend/mpr/page_mutator.go (1554 lines) - Create mdl/backend/mpr/workflow_mutator.go (771 lines) - Create mdl/backend/mpr/widget_builder.go (1007 lines) - Migrate SerializeWidget/ClientAction/DataSource to backend interface - Add ParseMicroflowFromRaw to MicroflowBackend interface - Delete widget_operations.go, widget_templates.go, widget_defaults.go - Move ALTER PAGE/WORKFLOW tests to backend/mpr/ package
1 parent f07d6fb commit 55b21eb

28 files changed

+4511
-3523
lines changed

mdl/backend/backend.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,5 @@ type FullBackend interface {
3434
PageMutationBackend
3535
WorkflowMutationBackend
3636
WidgetSerializationBackend
37+
WidgetBuilderBackend
3738
}

mdl/backend/microflow.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ type MicroflowBackend interface {
1616
DeleteMicroflow(id model.ID) error
1717
MoveMicroflow(mf *microflows.Microflow) error
1818

19+
// ParseMicroflowFromRaw builds a Microflow from an already-unmarshalled
20+
// BSON map. Used by diff-local and other callers that have raw map data.
21+
ParseMicroflowFromRaw(raw map[string]any, unitID, containerID model.ID) *microflows.Microflow
22+
1923
ListNanoflows() ([]*microflows.Nanoflow, error)
2024
GetNanoflow(id model.ID) (*microflows.Nanoflow, error)
2125
CreateNanoflow(nf *microflows.Nanoflow) error

mdl/backend/mock/backend.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ type MockBackend struct {
8080
CreateMicroflowFunc func(mf *microflows.Microflow) error
8181
UpdateMicroflowFunc func(mf *microflows.Microflow) error
8282
DeleteMicroflowFunc func(id model.ID) error
83-
MoveMicroflowFunc func(mf *microflows.Microflow) error
83+
MoveMicroflowFunc func(mf *microflows.Microflow) error
84+
ParseMicroflowFromRawFunc func(raw map[string]any, unitID, containerID model.ID) *microflows.Microflow
8485
ListNanoflowsFunc func() ([]*microflows.Nanoflow, error)
8586
GetNanoflowFunc func(id model.ID) (*microflows.Nanoflow, error)
8687
CreateNanoflowFunc func(nf *microflows.Nanoflow) error
@@ -270,6 +271,12 @@ type MockBackend struct {
270271
SerializeDataSourceFunc func(ds pages.DataSource) (any, error)
271272
SerializeWorkflowActivityFunc func(a workflows.WorkflowActivity) (any, error)
272273

274+
// WidgetBuilderBackend
275+
LoadWidgetTemplateFunc func(widgetID string, projectPath string) (backend.WidgetObjectBuilder, error)
276+
SerializeWidgetToOpaqueFunc func(w pages.Widget) any
277+
SerializeDataSourceToOpaqueFunc func(ds pages.DataSource) any
278+
BuildCreateAttributeObjectFunc func(attributePath string, objectTypeID, propertyTypeID, valueTypeID string) (any, error)
279+
273280
// AgentEditorBackend
274281
ListAgentEditorModelsFunc func() ([]*agenteditor.Model, error)
275282
ListAgentEditorKnowledgeBasesFunc func() ([]*agenteditor.KnowledgeBase, error)

mdl/backend/mock/mock_microflow.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ func (m *MockBackend) MoveMicroflow(mf *microflows.Microflow) error {
4949
return nil
5050
}
5151

52+
func (m *MockBackend) ParseMicroflowFromRaw(raw map[string]any, unitID, containerID model.ID) *microflows.Microflow {
53+
if m.ParseMicroflowFromRawFunc != nil {
54+
return m.ParseMicroflowFromRawFunc(raw, unitID, containerID)
55+
}
56+
return nil
57+
}
58+
5259
func (m *MockBackend) ListNanoflows() ([]*microflows.Nanoflow, error) {
5360
if m.ListNanoflowsFunc != nil {
5461
return m.ListNanoflowsFunc()

mdl/backend/mock/mock_mutation.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,35 @@ func (m *MockBackend) SerializeWorkflowActivity(a workflows.WorkflowActivity) (a
6262
}
6363
return nil, nil
6464
}
65+
66+
// ---------------------------------------------------------------------------
67+
// WidgetBuilderBackend
68+
// ---------------------------------------------------------------------------
69+
70+
func (m *MockBackend) LoadWidgetTemplate(widgetID string, projectPath string) (backend.WidgetObjectBuilder, error) {
71+
if m.LoadWidgetTemplateFunc != nil {
72+
return m.LoadWidgetTemplateFunc(widgetID, projectPath)
73+
}
74+
return nil, nil
75+
}
76+
77+
func (m *MockBackend) SerializeWidgetToOpaque(w pages.Widget) any {
78+
if m.SerializeWidgetToOpaqueFunc != nil {
79+
return m.SerializeWidgetToOpaqueFunc(w)
80+
}
81+
return nil
82+
}
83+
84+
func (m *MockBackend) SerializeDataSourceToOpaque(ds pages.DataSource) any {
85+
if m.SerializeDataSourceToOpaqueFunc != nil {
86+
return m.SerializeDataSourceToOpaqueFunc(ds)
87+
}
88+
return nil
89+
}
90+
91+
func (m *MockBackend) BuildCreateAttributeObject(attributePath string, objectTypeID, propertyTypeID, valueTypeID string) (any, error) {
92+
if m.BuildCreateAttributeObjectFunc != nil {
93+
return m.BuildCreateAttributeObjectFunc(attributePath, objectTypeID, propertyTypeID, valueTypeID)
94+
}
95+
return nil, nil
96+
}

mdl/backend/mpr/backend.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ func (b *MprBackend) MoveMicroflow(mf *microflows.Microflow) error {
211211
func (b *MprBackend) ListNanoflows() ([]*microflows.Nanoflow, error) {
212212
return b.reader.ListNanoflows()
213213
}
214+
func (b *MprBackend) ParseMicroflowFromRaw(raw map[string]any, unitID, containerID model.ID) *microflows.Microflow {
215+
return mpr.ParseMicroflowFromRaw(raw, unitID, containerID)
216+
}
214217
func (b *MprBackend) GetNanoflow(id model.ID) (*microflows.Nanoflow, error) {
215218
return b.reader.GetNanoflow(id)
216219
}
@@ -726,17 +729,17 @@ func (b *MprBackend) DeleteAgentEditorAgent(id string) error {
726729
}
727730

728731
// ---------------------------------------------------------------------------
729-
// PageMutationBackend
732+
// PageMutationBackend — implemented in page_mutator.go
733+
// ---------------------------------------------------------------------------
730734

731-
func (b *MprBackend) OpenPageForMutation(unitID model.ID) (backend.PageMutator, error) {
732-
panic("MprBackend.OpenPageForMutation not yet implemented") // TODO: implement in PR #237
733-
}
735+
// OpenPageForMutation is implemented in page_mutator.go.
734736

735737
// ---------------------------------------------------------------------------
736738
// WorkflowMutationBackend
737739

740+
// OpenWorkflowForMutation is implemented in workflow_mutator.go.
738741
func (b *MprBackend) OpenWorkflowForMutation(unitID model.ID) (backend.WorkflowMutator, error) {
739-
panic("MprBackend.OpenWorkflowForMutation not yet implemented") // TODO: implement in PR #237
742+
return b.openWorkflowForMutation(unitID)
740743
}
741744

742745
// ---------------------------------------------------------------------------
@@ -751,7 +754,7 @@ func (b *MprBackend) SerializeClientAction(a pages.ClientAction) (any, error) {
751754
}
752755

753756
func (b *MprBackend) SerializeDataSource(ds pages.DataSource) (any, error) {
754-
panic("MprBackend.SerializeDataSource not yet implemented") // TODO: implement in PR #237
757+
return mpr.SerializeCustomWidgetDataSource(ds), nil
755758
}
756759

757760
func (b *MprBackend) SerializeWorkflowActivity(a workflows.WorkflowActivity) (any, error) {

0 commit comments

Comments
 (0)