From 816b41bcc825563adb99c6f634c7d0f02236f7a8 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 14 May 2020 10:07:08 -0400 Subject: [PATCH] api: flesh out query complexity configuration --- api/graph/complexity.go | 45 +++++++++++++++++++++++++++++++++++++++++ api/server.go | 4 +++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 api/graph/complexity.go diff --git a/api/graph/complexity.go b/api/graph/complexity.go new file mode 100644 index 0000000..5b3c1e9 --- /dev/null +++ b/api/graph/complexity.go @@ -0,0 +1,45 @@ +package graph + +import ( + "git.sr.ht/~sircmpwn/git.sr.ht/api/graph/api" + "git.sr.ht/~sircmpwn/git.sr.ht/api/graph/model" +) + +func cursorComplexity(c int, cursor *model.Cursor) int { + if cursor != nil { + return c * cursor.Count + } + return c +} + +func ApplyComplexity(conf *api.Config) { + conf.Complexity.Query.Repositories = func(c int, cursor *model.Cursor, filter *model.Filter) int { + c = cursorComplexity(c, cursor) + if filter != nil && filter.Count != nil { + c *= *filter.Count + } + return c + } + conf.Complexity.Repository.AccessControlList = func(c int, cursor *model.Cursor) int { + return cursorComplexity(c, cursor) + } + conf.Complexity.Repository.Log = func(c int, cursor *model.Cursor, from *string) int { + return cursorComplexity(c, cursor) + } + conf.Complexity.Repository.Objects = func(c int, ids []string) int { + return c * len(ids) + } + conf.Complexity.Repository.References = func(c int, cursor *model.Cursor) int { + return cursorComplexity(c, cursor) + } + conf.Complexity.Tree.Entries = func(c int, cursor *model.Cursor) int { + return cursorComplexity(c, cursor) + } + conf.Complexity.User.Repositories = func(c int, cursor *model.Cursor, filter *model.Filter) int { + c = cursorComplexity(c, cursor) + if filter != nil && filter.Count != nil { + c *= *filter.Count + } + return c + } +} diff --git a/api/server.go b/api/server.go index 7c2936b..cd8ef07 100644 --- a/api/server.go +++ b/api/server.go @@ -73,9 +73,11 @@ func main() { gqlConfig := api.Config{ Resolvers: &graph.Resolver{DB: db}, } + graph.ApplyComplexity(&gqlConfig) + srv := handler.GraphQL( api.NewExecutableSchema(gqlConfig), - handler.ComplexityLimit(50)) + handler.ComplexityLimit(100)) router.Handle("/query", srv) -- 2.38.4