Add access-control flags to workflow REST payloads

This commit is contained in:
Denis Arh
2021-04-01 21:10:51 +02:00
parent fdf916b7f9
commit b5e6683c44
+57 -8
View File
@@ -31,11 +31,36 @@ type (
svcModule interface {
FindByID(ctx context.Context, namespaceID, moduleID uint64) (*cmpTypes.Module, error)
}
ac workflowAccessControl
}
workflowAccessControl interface {
CanGrant(context.Context) bool
CanUpdateWorkflow(context.Context, *types.Workflow) bool
CanDeleteWorkflow(context.Context, *types.Workflow) bool
CanUndeleteWorkflow(context.Context, *types.Workflow) bool
CanExecuteWorkflow(context.Context, *types.Workflow) bool
CanManageWorkflowTriggers(context.Context, *types.Workflow) bool
CanManageWorkflowSessions(context.Context, *types.Workflow) bool
}
workflowPayload struct {
*types.Workflow
CanGrant bool `json:"canGrant"`
CanUpdateWorkflow bool `json:"canUpdateWorkflow"`
CanDeleteWorkflow bool `json:"canDeleteWorkflow"`
CanUndeleteWorkflow bool `json:"canUndeleteWorkflow"`
CanExecuteWorkflow bool `json:"canExecuteWorkflow"`
CanManageWorkflowTriggers bool `json:"canManageWorkflowTriggers"`
CanManageWorkflowSessions bool `json:"canManageWorkflowSessions"`
}
workflowSetPayload struct {
Filter types.WorkflowFilter `json:"filter"`
Set types.WorkflowSet `json:"set"`
Set []*workflowPayload `json:"set"`
}
workflowExecPayload struct {
@@ -49,6 +74,7 @@ func (Workflow) New() *Workflow {
ctrl := &Workflow{}
ctrl.svc = service.DefaultWorkflow
ctrl.svcModule = cmpService.DefaultModule
ctrl.ac = service.DefaultAccessControl
return ctrl
}
@@ -91,7 +117,8 @@ func (ctrl Workflow) Create(ctx context.Context, r *request.WorkflowCreate) (int
OwnedBy: r.OwnedBy,
}
return ctrl.svc.Create(ctx, workflow)
wf, err := ctrl.svc.Create(ctx, workflow)
return ctrl.makePayload(ctx, wf, err)
}
func (ctrl Workflow) Update(ctx context.Context, r *request.WorkflowUpdate) (interface{}, error) {
@@ -110,11 +137,13 @@ func (ctrl Workflow) Update(ctx context.Context, r *request.WorkflowUpdate) (int
OwnedBy: r.OwnedBy,
}
return ctrl.svc.Update(ctx, workflow)
wf, err := ctrl.svc.Update(ctx, workflow)
return ctrl.makePayload(ctx, wf, err)
}
func (ctrl Workflow) Read(ctx context.Context, r *request.WorkflowRead) (interface{}, error) {
return ctrl.svc.LookupByID(ctx, r.WorkflowID)
wf, err := ctrl.svc.LookupByID(ctx, r.WorkflowID)
return ctrl.makePayload(ctx, wf, err)
}
func (ctrl Workflow) Test(ctx context.Context, r *request.WorkflowTest) (interface{}, error) {
@@ -182,14 +211,34 @@ func (ctrl Workflow) Exec(ctx context.Context, r *request.WorkflowExec) (interfa
return wep, err
}
func (ctrl Workflow) makeFilterPayload(ctx context.Context, uu types.WorkflowSet, f types.WorkflowFilter, err error) (*workflowSetPayload, error) {
func (ctrl Workflow) makeFilterPayload(ctx context.Context, set types.WorkflowSet, f types.WorkflowFilter, err error) (*workflowSetPayload, error) {
if err != nil {
return nil, err
}
if len(uu) == 0 {
uu = make([]*types.Workflow, 0)
wfsp := &workflowSetPayload{Filter: f, Set: make([]*workflowPayload, len(set))}
for i, wf := range set {
wfsp.Set[i], _ = ctrl.makePayload(ctx, wf, nil)
}
return &workflowSetPayload{Filter: f, Set: uu}, nil
return wfsp, nil
}
func (ctrl Workflow) makePayload(ctx context.Context, wf *types.Workflow, err error) (*workflowPayload, error) {
if err != nil {
return nil, err
}
return &workflowPayload{
Workflow: wf,
CanGrant: ctrl.ac.CanGrant(ctx),
CanUpdateWorkflow: ctrl.ac.CanUpdateWorkflow(ctx, wf),
CanDeleteWorkflow: ctrl.ac.CanDeleteWorkflow(ctx, wf),
CanUndeleteWorkflow: ctrl.ac.CanUndeleteWorkflow(ctx, wf),
CanExecuteWorkflow: ctrl.ac.CanExecuteWorkflow(ctx, wf),
CanManageWorkflowTriggers: ctrl.ac.CanManageWorkflowTriggers(ctx, wf),
CanManageWorkflowSessions: ctrl.ac.CanManageWorkflowSessions(ctx, wf),
}, nil
}