Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 29 additions & 13 deletions cmd/call_cached_check/check.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 SAP SE or an SAP affiliate company and Greenhouse contributors
// SPDX-FileCopyrightText: 2026 SAP SE or an SAP affiliate company and Greenhouse contributors
// SPDX-License-Identifier: Apache-2.0

// This is a helper command intended for use within Heureka.
Expand Down Expand Up @@ -29,6 +29,27 @@ type result struct {
want, got string
}

// extractFuncName unwraps expressions like wrappers and returns the underlying function name.
func extractFuncName(expr ast.Expr) (string, bool) {
switch fn := expr.(type) {
case *ast.Ident:
return fn.Name, true

case *ast.SelectorExpr:
return fn.Sel.Name, true

case *ast.CallExpr:
// Assume the actual function is the last argument
if len(fn.Args) == 0 {
return "", false
}

return extractFuncName(fn.Args[len(fn.Args)-1])
}

return "", false
}

func main() {
dir := flag.String("dir", ".", "directory to scan (walked recursively)")

Expand Down Expand Up @@ -79,14 +100,15 @@ func main() {

if len(call.Args) < 4 {
mismatches = append(mismatches, result{
pos: fset.Position(call.Lparen), // position of '(' for the call
pos: fset.Position(call.Lparen),
want: "at least 4 arguments",
got: fmt.Sprintf("%d arguments", len(call.Args)),
})

return true
}

// 3rd argument: function name string
cacheFuncNameArg := call.Args[2]

strLit, ok := cacheFuncNameArg.(*ast.BasicLit)
Expand All @@ -104,18 +126,12 @@ func main() {

cacheFunc := call.Args[3]

var funcName string

switch fn := cacheFunc.(type) {
case *ast.Ident:
funcName = fn.Name
case *ast.SelectorExpr:
funcName = fn.Sel.Name
default:
funcName, ok := extractFuncName(cacheFunc)
if !ok {
mismatches = append(mismatches, result{
pos: fset.Position(cacheFunc.Pos()),
want: "unknown type",
got: fmt.Sprintf("%T", fn),
want: "callable function",
got: fmt.Sprintf("%T", cacheFunc),
})

return true
Expand All @@ -140,7 +156,7 @@ func main() {
}

for _, m := range mismatches {
fmt.Fprintf(os.Stderr, "%s: mismatch – want %q, got %q\n",
fmt.Fprintf(os.Stderr, "%s: mismatch - want %q, got %q\n",
m.pos, m.want, m.got)
}

Expand Down
79 changes: 79 additions & 0 deletions cmd/context_wrapper/wrap.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// SPDX-FileCopyrightText: 2026 SAP SE or an SAP affiliate company and Greenhouse contributors
// SPDX-License-Identifier: Apache-2.0

package main

import (
"fmt"
"os"
"text/template"
)

const maxArgs = 10

const tpl = `
{{range .}}
func WrapContext{{.N}}[{{.TypeParams}}, R any](
ctx context.Context,
f func(context.Context, {{.ArgsTypes}}) (R, error),
) func({{.ArgsTypes}}) (R, error) {
return func({{.ArgsWithNames}}) (R, error) {
return f(ctx, {{.ArgsNames}})
}
}
{{end}}
`

type Data struct {
N int
TypeParams string
ArgsTypes string
ArgsWithNames string
ArgsNames string
}

//nolint:errcheck
func main() {
var data []Data

for n := 1; n <= maxArgs; n++ {
var typeParams, argsTypes, argsWithNames, argsNames string

for i := 1; i <= n; i++ {
if i > 1 {
typeParams += ", "
argsTypes += ", "
argsWithNames += ", "
argsNames += ", "
}

typeParams += fmt.Sprintf("A%d any", i)
argsTypes += fmt.Sprintf("A%d", i)
argsWithNames += fmt.Sprintf("a%d A%d", i, i)
argsNames += fmt.Sprintf("a%d", i)
}

data = append(data, Data{
N: n,
TypeParams: typeParams,
ArgsTypes: argsTypes,
ArgsWithNames: argsWithNames,
ArgsNames: argsNames,
})
}

f, err := os.Create("context_wrapper_gen.go")
if err != nil {
panic(err)
}
defer f.Close()

fmt.Fprintln(f, "// Code generated by go generate; DO NOT EDIT.")
fmt.Fprintln(f, "package cache")
fmt.Fprintln(f, "import \"context\"")

t := template.Must(template.New("").Parse(tpl))
if err := t.Execute(f, data); err != nil {
panic(err)
}
}
4 changes: 2 additions & 2 deletions internal/api/graphql/graph/baseResolver/component.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ func ComponentCcrnBaseResolver(

opt := GetListOptions(requestedFields)

names, err := app.ListComponentCcrns(f, opt)
names, err := app.ListComponentCcrns(ctx, f, opt)
if err != nil {
return nil, NewResolverError("ComponentCcrnBaseReolver", err.Error())
}
Expand Down Expand Up @@ -211,7 +211,7 @@ func ComponentIssueCountsBaseResolver(

var severityCounts model.SeverityCounts

counts, err := app.GetComponentVulnerabilityCounts(f)
counts, err := app.GetComponentVulnerabilityCounts(ctx, f)
if err != nil {
return nil, ToGraphQLError(err)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ func ContextBaseResolver(

opt := GetListOptions(requestedFields)

names, err := app.ListContexts(f, opt)
names, err := app.ListContexts(ctx, f, opt)
if err != nil {
return nil, ToGraphQLError(err)
}
Expand All @@ -357,7 +357,7 @@ func ContextBaseResolver(
}

func ComponentInstanceFilterBaseResolver(
appCall func(filter *entity.ComponentInstanceFilter, options *entity.ListOptions) ([]string, error),
appCall func(ctx context.Context, filter *entity.ComponentInstanceFilter, options *entity.ListOptions) ([]string, error),
ctx context.Context,
filter *model.ComponentInstanceFilter,
filterDisplay *string,
Expand Down Expand Up @@ -390,7 +390,7 @@ func ComponentInstanceFilterBaseResolver(

opt := GetListOptions(requestedFields)

names, err := appCall(f, opt)
names, err := appCall(ctx, f, opt)
if err != nil {
return nil, ToGraphQLError(err)
}
Expand Down
2 changes: 1 addition & 1 deletion internal/api/graphql/graph/baseResolver/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func ImageBaseResolver(
Repository: filter.Repository,
}

counts, err := app.GetComponentVulnerabilityCounts(icFilter)
counts, err := app.GetComponentVulnerabilityCounts(ctx, icFilter)
if err != nil {
return nil, NewResolverError("ImageBaseResolver", err.Error())
}
Expand Down
2 changes: 1 addition & 1 deletion internal/api/graphql/graph/baseResolver/image_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ func ImageVersionBaseResolver(
ComponentVersionId: cvIds,
}

counts, err := app.GetIssueSeverityCounts(icFilter)
counts, err := app.GetIssueSeverityCounts(ctx, icFilter)
if err != nil {
return nil, NewResolverError("ImageVersionBaseResolver", err.Error())
}
Expand Down
8 changes: 4 additions & 4 deletions internal/api/graphql/graph/baseResolver/issue.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func SingleIssueBaseResolver(

opt := &entity.IssueListOptions{}

issues, err := app.ListIssues(f, opt)
issues, err := app.ListIssues(ctx, f, opt)
if err != nil {
return nil, ToGraphQLError(err)
}
Expand Down Expand Up @@ -175,7 +175,7 @@ func IssueBaseResolver(
}
}

issues, err := app.ListIssues(f, opt)
issues, err := app.ListIssues(ctx, f, opt)
if err != nil {
return nil, ToGraphQLError(err)
}
Expand Down Expand Up @@ -267,7 +267,7 @@ func IssueNameBaseResolver(

opt := GetListOptions(requestedFields)

names, err := app.ListIssueNames(f, opt)
names, err := app.ListIssueNames(ctx, f, opt)
if err != nil {
return nil, ToGraphQLError(err)
}
Expand Down Expand Up @@ -370,7 +370,7 @@ func IssueCountsBaseResolver(
Unique: unique,
}

counts, err := app.GetIssueSeverityCounts(f)
counts, err := app.GetIssueSeverityCounts(ctx, f)
if err != nil {
return nil, ToGraphQLError(err)
}
Expand Down
4 changes: 2 additions & 2 deletions internal/api/graphql/graph/baseResolver/issue_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func SingleIssueRepositoryBaseResolver(

opt := &entity.ListOptions{}

issueRepositories, err := app.ListIssueRepositories(f, opt)
issueRepositories, err := app.ListIssueRepositories(ctx, f, opt)
// error while fetching
if err != nil {
return nil, NewResolverError("SingleIssueRepositoryBaseResolver", err.Error())
Expand Down Expand Up @@ -113,7 +113,7 @@ func IssueRepositoryBaseResolver(

opt := GetListOptions(requestedFields)

issueRepositories, err := app.ListIssueRepositories(f, opt)
issueRepositories, err := app.ListIssueRepositories(ctx, f, opt)
if err != nil {
return nil, NewResolverError("IssueRepositoryBaseResolver", err.Error())
}
Expand Down
6 changes: 3 additions & 3 deletions internal/api/graphql/graph/baseResolver/issue_variant.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func SingleIssueVariantBaseResolver(

opt := &entity.ListOptions{}

variants, err := app.ListIssueVariants(f, opt)
variants, err := app.ListIssueVariants(ctx, f, opt)
// error while fetching
if err != nil {
return nil, NewResolverError("SingleIssueVariantBaseResolver", err.Error())
Expand Down Expand Up @@ -117,7 +117,7 @@ func IssueVariantBaseResolver(

opt := GetListOptions(requestedFields)

variants, err := app.ListIssueVariants(f, opt)
variants, err := app.ListIssueVariants(ctx, f, opt)
if err != nil {
return nil, NewResolverError("IssueVariantBaseResolver", err.Error())
}
Expand Down Expand Up @@ -195,7 +195,7 @@ func EffectiveIssueVariantBaseResolver(

opt := GetListOptions(requestedFields)

variants, err := app.ListEffectiveIssueVariants(f, opt)
variants, err := app.ListEffectiveIssueVariants(ctx, f, opt)
if err != nil {
return nil, NewResolverError("EffectiveIssueVariantBaseResolver", err.Error())
}
Expand Down
2 changes: 1 addition & 1 deletion internal/api/graphql/graph/baseResolver/patch.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func PatchBaseResolver(

opt := GetListOptions(requestedFields)

patches, err := app.ListPatches(f, opt)
patches, err := app.ListPatches(ctx, f, opt)
if err != nil {
return nil, ToGraphQLError(err)
}
Expand Down
2 changes: 1 addition & 1 deletion internal/api/graphql/graph/baseResolver/remediation.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func RemediationBaseResolver(
)
}

remediations, err := app.ListRemediations(f, opt)
remediations, err := app.ListRemediations(ctx, f, opt)
if err != nil {
return nil, ToGraphQLError(err)
}
Expand Down
4 changes: 2 additions & 2 deletions internal/api/graphql/graph/baseResolver/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ func ServiceRegionBaseResolver(
}

func ServiceFilterBaseResolver(
appCall func(filter *entity.ServiceFilter, opt *entity.ListOptions) ([]string, error),
appCall func(ctx context.Context, filter *entity.ServiceFilter, opt *entity.ListOptions) ([]string, error),
ctx context.Context,
filter *model.ServiceFilter,
filterDisplay *string,
Expand All @@ -274,7 +274,7 @@ func ServiceFilterBaseResolver(

opt := GetListOptions(requestedFields)

names, err := appCall(f, opt)
names, err := appCall(ctx, f, opt)
if err != nil {
return nil, NewResolverError("ServiceFilterBaseResolver", err.Error())
}
Expand Down
2 changes: 1 addition & 1 deletion internal/api/graphql/graph/baseResolver/support_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ func SupportGroupCcrnBaseResolver(

opt := GetListOptions(requestedFields)

names, err := app.ListSupportGroupCcrns(f, opt)
names, err := app.ListSupportGroupCcrns(ctx, f, opt)
if err != nil {
return nil, NewResolverError("SupportGroupCcrnBaseResolver", err.Error())
}
Expand Down
6 changes: 3 additions & 3 deletions internal/api/graphql/graph/baseResolver/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ func UserNameBaseResolver(

opt := GetListOptions(requestedFields)

names, err := app.ListUserNames(f, opt)
names, err := app.ListUserNames(ctx, f, opt)
if err != nil {
return nil, NewResolverError("UserNameBaseResolver", err.Error())
}
Expand Down Expand Up @@ -211,7 +211,7 @@ func UniqueUserIDBaseResolver(

opt := GetListOptions(requestedFields)

names, err := app.ListUniqueUserIDs(f, opt)
names, err := app.ListUniqueUserIDs(ctx, f, opt)
if err != nil {
return nil, NewResolverError("UniqueUserIDBaseResolver", err.Error())
}
Expand Down Expand Up @@ -253,7 +253,7 @@ func UserNameWithIdBaseResolver(

opt := GetListOptions(requestedFields)

names, ids, err := app.ListUserNamesAndIds(f, opt)
names, ids, err := app.ListUserNamesAndIds(ctx, f, opt)
if err != nil {
return nil, NewResolverError("UserNameWithIdBaseResolver", err.Error())
}
Expand Down
3 changes: 2 additions & 1 deletion internal/api/graphql/graph/baseResolver/vulnerability.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,13 @@ func VulnerabilityBaseResolver(app app.Heureka, ctx context.Context,
By: entity.IssueVariantRating,
Direction: entity.OrderDirectionDesc,
})

opt.Order = append(opt.Order, entity.Order{
By: entity.IssuePrimaryName,
Direction: entity.OrderDirectionAsc,
})

issues, err := app.ListIssues(f, opt)
issues, err := app.ListIssues(ctx, f, opt)
if err != nil {
return nil, NewResolverError("VulnerabilityBaseResolver", err.Error())
}
Expand Down
Loading
Loading