Implement CEL filter in list folder command

This commit is contained in:
PiMaDaum 2023-02-05 21:27:40 +01:00
parent 5ee20771a8
commit 7db321f130
2 changed files with 73 additions and 0 deletions

64
folder/filter.go Normal file
View file

@ -0,0 +1,64 @@
package folder
import (
"context"
"fmt"
"github.com/google/cel-go/cel"
"github.com/passbolt/go-passbolt/api"
)
// Environments for CEl
var celEnvOptions = []cel.EnvOption{
cel.Variable("ID", cel.StringType),
cel.Variable("FolderParentID", cel.StringType),
cel.Variable("Name", cel.StringType),
cel.Variable("CreatedTimestamp", cel.TimestampType),
cel.Variable("ModifiedTimestamp", cel.TimestampType),
}
func filterFolders(folders *[]api.Folder, celCmd string, ctx context.Context) ([]api.Folder, error) {
if celCmd == "" {
return *folders, nil
}
env, err := cel.NewEnv(celEnvOptions...)
if err != nil {
return nil, err
}
ast, issue := env.Compile(celCmd)
if issue.Err() != nil {
return nil, issue.Err()
}
program, err := env.Program(ast)
if err != nil {
return nil, err
}
filteredFolders := []api.Folder{}
for _, folder := range *folders {
val, _, err := program.ContextEval(ctx, map[string]any{
"ID": folder.ID,
"FolderParentID": folder.FolderParentID,
"Name": folder.Name,
"CreatedTimestamp": folder.Created.Time,
"ModifiedTimestamp": folder.Modified.Time,
})
if err != nil {
return nil, err
}
if val.Value() == true {
filteredFolders = append(filteredFolders, folder)
}
}
if len(filteredFolders) == 0 {
return nil, fmt.Errorf("No such folders found with filter %v!", celCmd)
}
return filteredFolders, nil
}

View file

@ -51,6 +51,10 @@ func FolderList(cmd *cobra.Command, args []string) error {
if err != nil {
return err
}
celFilter, err := cmd.Flags().GetString("filter")
if err != nil {
return err
}
ctx := util.GetContext()
cmd.SilenceUsage = true
@ -69,6 +73,11 @@ func FolderList(cmd *cobra.Command, args []string) error {
return fmt.Errorf("Listing Folder: %w", err)
}
folders, err = filterFolders(&folders, celFilter, ctx)
if err != nil {
return err
}
if jsonOutput {
outputFolders := []FolderJsonOutput{}
for i := range folders {