Feat v0.3.4 team roles + multi-party validation (#18)
Custom team roles: removed CHECK constraint on team_members.role, roles stored in teams.settings, roles API, stage_config.required_role enforced on claim. Multi-party signoff: workflow_signoffs table, validation gate in advanceInternal, SubmitSignoff engine method, signoff HTTP API. Frontend: dynamic role management, stage config validation UI, signoff panel. Design docs for extension lifecycle and trigger composition. 20 store tests passing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -433,6 +433,11 @@ func main() {
|
||||
protected.POST("/assignments/:id/cancel", middleware.RequirePermission(auth.PermWorkflowCreate, stores), wfAssignH.Cancel)
|
||||
protected.GET("/assignments/mine", wfAssignH.ListMine)
|
||||
|
||||
// Workflow signoffs (v0.3.4)
|
||||
wfSignoffH := handlers.NewWorkflowSignoffHandler(wfEngine, stores)
|
||||
protected.POST("/instances/:iid/signoffs", wfSignoffH.Submit)
|
||||
protected.GET("/instances/:iid/signoffs", wfSignoffH.List)
|
||||
|
||||
// Surface discovery (v0.25.0, v0.28.7: unified packages)
|
||||
pkgH := handlers.NewPackageHandler(stores)
|
||||
protected.GET("/surfaces", pkgH.ListEnabledSurfaces)
|
||||
@@ -515,6 +520,8 @@ func main() {
|
||||
teamScoped.POST("/members", teams.AddMember)
|
||||
teamScoped.PUT("/members/:memberId", teams.UpdateMember)
|
||||
teamScoped.DELETE("/members/:memberId", teams.RemoveMember)
|
||||
teamScoped.GET("/roles", teams.ListRoles)
|
||||
teamScoped.PUT("/roles", teams.UpdateRoles)
|
||||
|
||||
// Team groups (team admins manage team-scoped groups)
|
||||
teamScoped.GET("/groups", groupH.ListTeamGroups)
|
||||
@@ -566,6 +573,11 @@ func main() {
|
||||
teamWfAssignH := handlers.NewWorkflowAssignmentHandler(wfEngine, stores)
|
||||
teamScoped.GET("/assignments", teamWfAssignH.ListByTeam)
|
||||
|
||||
// Team workflow signoffs (v0.3.4)
|
||||
teamWfSignoffH := handlers.NewWorkflowSignoffHandler(wfEngine, stores)
|
||||
teamScoped.POST("/instances/:iid/signoffs", teamWfSignoffH.Submit)
|
||||
teamScoped.GET("/instances/:iid/signoffs", teamWfSignoffH.List)
|
||||
|
||||
}
|
||||
|
||||
// Public global settings (non-admin users can read safe subset)
|
||||
|
||||
Reference in New Issue
Block a user