From: Tom Clegg Date: Fri, 23 Sep 2022 19:26:55 +0000 (-0400) Subject: 19388: Trigger activity logs on group contents API, too. X-Git-Tag: 2.5.0~65^2 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/edc70abe9c05ff9a4ce90ce4c6c271223142c5e5 19388: Trigger activity logs on group contents API, too. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- diff --git a/lib/controller/localdb/conn.go b/lib/controller/localdb/conn.go index 0420cf6f2f..5a3faa7279 100644 --- a/lib/controller/localdb/conn.go +++ b/lib/controller/localdb/conn.go @@ -10,7 +10,6 @@ import ( "fmt" "net/http" "os" - "strings" "sync" "time" @@ -166,54 +165,6 @@ func (conn *Conn) UserAuthenticate(ctx context.Context, opts arvados.UserAuthent return conn.loginController.UserAuthenticate(ctx, opts) } -func (conn *Conn) GroupContents(ctx context.Context, options arvados.GroupContentsOptions) (arvados.ObjectList, error) { - // The requested UUID can be a user (virtual home project), which we just pass on to - // the API server. - if strings.Index(options.UUID, "-j7d0g-") != 5 { - return conn.railsProxy.GroupContents(ctx, options) - } - - var resp arvados.ObjectList - - // Get the group object - respGroup, err := conn.GroupGet(ctx, arvados.GetOptions{UUID: options.UUID}) - if err != nil { - return resp, err - } - - // If the group has groupClass 'filter', apply the filters before getting the contents. - if respGroup.GroupClass == "filter" { - if filters, ok := respGroup.Properties["filters"].([]interface{}); ok { - for _, f := range filters { - // f is supposed to be a []string - tmp, ok2 := f.([]interface{}) - if !ok2 || len(tmp) < 3 { - return resp, fmt.Errorf("filter unparsable: %T, %+v, original field: %T, %+v\n", tmp, tmp, f, f) - } - var filter arvados.Filter - if attr, ok2 := tmp[0].(string); ok2 { - filter.Attr = attr - } else { - return resp, fmt.Errorf("filter unparsable: attribute must be string: %T, %+v, filter: %T, %+v\n", tmp[0], tmp[0], f, f) - } - if operator, ok2 := tmp[1].(string); ok2 { - filter.Operator = operator - } else { - return resp, fmt.Errorf("filter unparsable: operator must be string: %T, %+v, filter: %T, %+v\n", tmp[1], tmp[1], f, f) - } - filter.Operand = tmp[2] - options.Filters = append(options.Filters, filter) - } - } else { - return resp, fmt.Errorf("filter unparsable: not an array\n") - } - // Use the generic /groups/contents endpoint for filter groups - options.UUID = "" - } - - return conn.railsProxy.GroupContents(ctx, options) -} - func httpErrorf(code int, format string, args ...interface{}) error { return httpserver.ErrorWithStatus(fmt.Errorf(format, args...), code) } diff --git a/lib/controller/localdb/group.go b/lib/controller/localdb/group.go index 86924c5215..418fd6b8b7 100644 --- a/lib/controller/localdb/group.go +++ b/lib/controller/localdb/group.go @@ -6,6 +6,8 @@ package localdb import ( "context" + "fmt" + "strings" "git.arvados.org/arvados.git/sdk/go/arvados" ) @@ -54,3 +56,53 @@ func (conn *Conn) GroupDelete(ctx context.Context, opts arvados.DeleteOptions) ( conn.logActivity(ctx) return conn.railsProxy.GroupDelete(ctx, opts) } + +func (conn *Conn) GroupContents(ctx context.Context, options arvados.GroupContentsOptions) (arvados.ObjectList, error) { + conn.logActivity(ctx) + + // The requested UUID can be a user (virtual home project), which we just pass on to + // the API server. + if strings.Index(options.UUID, "-j7d0g-") != 5 { + return conn.railsProxy.GroupContents(ctx, options) + } + + var resp arvados.ObjectList + + // Get the group object + respGroup, err := conn.GroupGet(ctx, arvados.GetOptions{UUID: options.UUID}) + if err != nil { + return resp, err + } + + // If the group has groupClass 'filter', apply the filters before getting the contents. + if respGroup.GroupClass == "filter" { + if filters, ok := respGroup.Properties["filters"].([]interface{}); ok { + for _, f := range filters { + // f is supposed to be a []string + tmp, ok2 := f.([]interface{}) + if !ok2 || len(tmp) < 3 { + return resp, fmt.Errorf("filter unparsable: %T, %+v, original field: %T, %+v\n", tmp, tmp, f, f) + } + var filter arvados.Filter + if attr, ok2 := tmp[0].(string); ok2 { + filter.Attr = attr + } else { + return resp, fmt.Errorf("filter unparsable: attribute must be string: %T, %+v, filter: %T, %+v\n", tmp[0], tmp[0], f, f) + } + if operator, ok2 := tmp[1].(string); ok2 { + filter.Operator = operator + } else { + return resp, fmt.Errorf("filter unparsable: operator must be string: %T, %+v, filter: %T, %+v\n", tmp[1], tmp[1], f, f) + } + filter.Operand = tmp[2] + options.Filters = append(options.Filters, filter) + } + } else { + return resp, fmt.Errorf("filter unparsable: not an array\n") + } + // Use the generic /groups/contents endpoint for filter groups + options.UUID = "" + } + + return conn.railsProxy.GroupContents(ctx, options) +}