From 6858ec2a5793f8982daab349986c71b80666e11e Mon Sep 17 00:00:00 2001 From: Lakhan Samani Date: Mon, 8 Jun 2026 11:10:27 +0530 Subject: [PATCH 01/39] feat(authz): replace bespoke FGA with embedded OpenFGA ReBAC engine Remove the not-yet-rolled-out Resource/Scope/Policy/Permission engine (#607/#610/#611) and replace it with an OpenFGA-backed ReBAC engine. - AuthorizationEngine SPI (internal/authorization/engine) with an embedded OpenFGA implementation (memory/sqlite/postgres/mysql datastores) plus external-mode flag scaffolding. - GraphQL: admin _fga_write_model/_fga_get_model/_fga_write_tuples/ _fga_delete_tuples/_fga_read_tuples and runtime fga_check/fga_batch_check/ fga_list_objects (runtime principal pinned to the token subject). - required_relations on session/validate_session/validate_jwt_token; coarse roles/scope gating unchanged. - Dashboard FGA admin UI: authorization model editor, relationship tuples, access tester. - Standardize the SQLite driver on modernc.org/sqlite via a local GORM dialect so the embedded OpenFGA SQL datastore links without a duplicate database/sql "sqlite" registration. Flags: --authorization-engine, --fga-mode, --fga-store, --fga-store-url, --fga-external-url. --- cmd/root.go | 91 +- go.mod | 101 +- go.sum | 371 +- internal/authorization/cache.go | 91 - internal/authorization/cache_test.go | 77 - internal/authorization/engine/engine.go | 143 + .../engine/openfga/datastore_sql.go | 71 + .../engine/openfga/datastore_sqlite_test.go | 95 + .../authorization/engine/openfga/openfga.go | 223 + .../engine/openfga/openfga_test.go | 165 + .../engine/openfga/operations.go | 263 + internal/authorization/evaluator.go | 581 - internal/authorization/provider.go | 102 - internal/authorization/validators.go | 22 - internal/config/config.go | 23 + internal/constants/audit_event.go | 43 +- internal/constants/authorization.go | 38 - internal/graph/generated/generated.go | 16767 ++++++---------- internal/graph/model/models_gen.go | 237 +- internal/graph/schema.graphqls | 256 +- internal/graph/schema.resolvers.go | 93 +- internal/graphql/authz_add_permission.go | 176 - internal/graphql/authz_add_policy.go | 122 - internal/graphql/authz_add_resource.go | 69 - internal/graphql/authz_add_scope.go | 69 - internal/graphql/authz_delete_permission.go | 65 - internal/graphql/authz_delete_policy.go | 54 - internal/graphql/authz_delete_resource.go | 52 - internal/graphql/authz_delete_scope.go | 52 - internal/graphql/authz_permissions.go | 97 - internal/graphql/authz_policies.go | 46 - internal/graphql/authz_resources.go | 41 - internal/graphql/authz_scopes.go | 41 - internal/graphql/authz_update_permission.go | 239 - internal/graphql/authz_update_policy.go | 126 - internal/graphql/authz_update_resource.go | 76 - internal/graphql/authz_update_scope.go | 76 - internal/graphql/fga_admin.go | 226 + internal/graphql/fga_relation_check.go | 49 + internal/graphql/fga_runtime.go | 164 + internal/graphql/permission_check.go | 67 - internal/graphql/permissions.go | 62 - internal/graphql/policy_targets.go | 47 - internal/graphql/policy_targets_test.go | 61 - internal/graphql/provider.go | 82 +- internal/graphql/session.go | 7 +- internal/graphql/validate_jwt_token.go | 9 +- internal/graphql/validate_session.go | 7 +- internal/http_handlers/graphql.go | 2 +- internal/http_handlers/provider.go | 10 +- .../integration_tests/authorization_test.go | 1114 - .../authz_cache_invalidation_test.go | 162 - .../authz_pagination_test.go | 220 - internal/integration_tests/fga_test.go | 350 + internal/integration_tests/metrics_test.go | 29 - .../integration_tests/permissions_test.go | 119 - .../required_permissions_test.go | 276 - internal/integration_tests/test_helper.go | 19 - internal/metrics/metrics.go | 86 - internal/storage/db/arangodb/permission.go | 363 - internal/storage/db/arangodb/policy.go | 191 - internal/storage/db/arangodb/provider.go | 155 - internal/storage/db/arangodb/resource.go | 155 - internal/storage/db/arangodb/scope.go | 155 - internal/storage/db/cassandradb/permission.go | 423 - internal/storage/db/cassandradb/policy.go | 221 - internal/storage/db/cassandradb/provider.go | 104 - internal/storage/db/cassandradb/resource.go | 144 - internal/storage/db/cassandradb/scope.go | 144 - internal/storage/db/couchbase/permission.go | 429 - internal/storage/db/couchbase/policy.go | 223 - internal/storage/db/couchbase/provider.go | 32 - internal/storage/db/couchbase/resource.go | 177 - internal/storage/db/couchbase/scope.go | 177 - internal/storage/db/dynamodb/permission.go | 318 - internal/storage/db/dynamodb/policy.go | 156 - internal/storage/db/dynamodb/resource.go | 122 - internal/storage/db/dynamodb/scope.go | 121 - internal/storage/db/dynamodb/tables.go | 68 - internal/storage/db/mongodb/permission.go | 325 - internal/storage/db/mongodb/policy.go | 153 - internal/storage/db/mongodb/provider.go | 90 - internal/storage/db/mongodb/resource.go | 112 - internal/storage/db/mongodb/scope.go | 112 - internal/storage/db/sql/permission.go | 250 - internal/storage/db/sql/policy.go | 122 - internal/storage/db/sql/provider.go | 4 +- internal/storage/db/sql/resource.go | 93 - internal/storage/db/sql/scope.go | 93 - .../storage/db/sql/sqlitedialect/ddlmod.go | 296 + .../storage/db/sql/sqlitedialect/errors.go | 7 + .../storage/db/sql/sqlitedialect/migrator.go | 406 + .../storage/db/sql/sqlitedialect/sqlite.go | 298 + internal/storage/provider.go | 95 - internal/storage/provider_test.go | 841 - internal/storage/schemas/model.go | 16 - internal/storage/schemas/permission.go | 112 - internal/storage/schemas/policy.go | 73 - internal/storage/schemas/resource.go | 33 - internal/storage/schemas/scope.go | 33 - .../src/components/FgaNotEnabled.tsx | 26 + web/dashboard/src/components/Sidebar.tsx | 115 +- web/dashboard/src/graphql/mutation/index.ts | 143 +- web/dashboard/src/graphql/queries/index.ts | 142 +- web/dashboard/src/lib/utils.ts | 12 + web/dashboard/src/pages/Authorization.tsx | 68 - .../src/pages/authorization/Model.tsx | 157 + .../src/pages/authorization/Permissions.tsx | 580 - .../src/pages/authorization/Policies.tsx | 506 - .../src/pages/authorization/Resources.tsx | 314 - .../src/pages/authorization/Scopes.tsx | 308 - .../src/pages/authorization/Tester.tsx | 243 + .../src/pages/authorization/Tuples.tsx | 317 + web/dashboard/src/routes/index.tsx | 17 +- web/dashboard/src/types.ts | 78 +- 115 files changed, 11028 insertions(+), 23862 deletions(-) delete mode 100644 internal/authorization/cache.go delete mode 100644 internal/authorization/cache_test.go create mode 100644 internal/authorization/engine/engine.go create mode 100644 internal/authorization/engine/openfga/datastore_sql.go create mode 100644 internal/authorization/engine/openfga/datastore_sqlite_test.go create mode 100644 internal/authorization/engine/openfga/openfga.go create mode 100644 internal/authorization/engine/openfga/openfga_test.go create mode 100644 internal/authorization/engine/openfga/operations.go delete mode 100644 internal/authorization/evaluator.go delete mode 100644 internal/authorization/provider.go delete mode 100644 internal/authorization/validators.go delete mode 100644 internal/constants/authorization.go delete mode 100644 internal/graphql/authz_add_permission.go delete mode 100644 internal/graphql/authz_add_policy.go delete mode 100644 internal/graphql/authz_add_resource.go delete mode 100644 internal/graphql/authz_add_scope.go delete mode 100644 internal/graphql/authz_delete_permission.go delete mode 100644 internal/graphql/authz_delete_policy.go delete mode 100644 internal/graphql/authz_delete_resource.go delete mode 100644 internal/graphql/authz_delete_scope.go delete mode 100644 internal/graphql/authz_permissions.go delete mode 100644 internal/graphql/authz_policies.go delete mode 100644 internal/graphql/authz_resources.go delete mode 100644 internal/graphql/authz_scopes.go delete mode 100644 internal/graphql/authz_update_permission.go delete mode 100644 internal/graphql/authz_update_policy.go delete mode 100644 internal/graphql/authz_update_resource.go delete mode 100644 internal/graphql/authz_update_scope.go create mode 100644 internal/graphql/fga_admin.go create mode 100644 internal/graphql/fga_relation_check.go create mode 100644 internal/graphql/fga_runtime.go delete mode 100644 internal/graphql/permission_check.go delete mode 100644 internal/graphql/permissions.go delete mode 100644 internal/graphql/policy_targets.go delete mode 100644 internal/graphql/policy_targets_test.go delete mode 100644 internal/integration_tests/authorization_test.go delete mode 100644 internal/integration_tests/authz_cache_invalidation_test.go delete mode 100644 internal/integration_tests/authz_pagination_test.go create mode 100644 internal/integration_tests/fga_test.go delete mode 100644 internal/integration_tests/permissions_test.go delete mode 100644 internal/integration_tests/required_permissions_test.go delete mode 100644 internal/storage/db/arangodb/permission.go delete mode 100644 internal/storage/db/arangodb/policy.go delete mode 100644 internal/storage/db/arangodb/resource.go delete mode 100644 internal/storage/db/arangodb/scope.go delete mode 100644 internal/storage/db/cassandradb/permission.go delete mode 100644 internal/storage/db/cassandradb/policy.go delete mode 100644 internal/storage/db/cassandradb/resource.go delete mode 100644 internal/storage/db/cassandradb/scope.go delete mode 100644 internal/storage/db/couchbase/permission.go delete mode 100644 internal/storage/db/couchbase/policy.go delete mode 100644 internal/storage/db/couchbase/resource.go delete mode 100644 internal/storage/db/couchbase/scope.go delete mode 100644 internal/storage/db/dynamodb/permission.go delete mode 100644 internal/storage/db/dynamodb/policy.go delete mode 100644 internal/storage/db/dynamodb/resource.go delete mode 100644 internal/storage/db/dynamodb/scope.go delete mode 100644 internal/storage/db/mongodb/permission.go delete mode 100644 internal/storage/db/mongodb/policy.go delete mode 100644 internal/storage/db/mongodb/resource.go delete mode 100644 internal/storage/db/mongodb/scope.go delete mode 100644 internal/storage/db/sql/permission.go delete mode 100644 internal/storage/db/sql/policy.go delete mode 100644 internal/storage/db/sql/resource.go delete mode 100644 internal/storage/db/sql/scope.go create mode 100644 internal/storage/db/sql/sqlitedialect/ddlmod.go create mode 100644 internal/storage/db/sql/sqlitedialect/errors.go create mode 100644 internal/storage/db/sql/sqlitedialect/migrator.go create mode 100644 internal/storage/db/sql/sqlitedialect/sqlite.go delete mode 100644 internal/storage/schemas/permission.go delete mode 100644 internal/storage/schemas/policy.go delete mode 100644 internal/storage/schemas/resource.go delete mode 100644 internal/storage/schemas/scope.go create mode 100644 web/dashboard/src/components/FgaNotEnabled.tsx delete mode 100644 web/dashboard/src/pages/Authorization.tsx create mode 100644 web/dashboard/src/pages/authorization/Model.tsx delete mode 100644 web/dashboard/src/pages/authorization/Permissions.tsx delete mode 100644 web/dashboard/src/pages/authorization/Policies.tsx delete mode 100644 web/dashboard/src/pages/authorization/Resources.tsx delete mode 100644 web/dashboard/src/pages/authorization/Scopes.tsx create mode 100644 web/dashboard/src/pages/authorization/Tester.tsx create mode 100644 web/dashboard/src/pages/authorization/Tuples.tsx diff --git a/cmd/root.go b/cmd/root.go index c331e09b..3a917167 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -15,12 +15,12 @@ import ( "github.com/authorizerdev/authorizer/internal/audit" "github.com/authorizerdev/authorizer/internal/authenticators" - "github.com/authorizerdev/authorizer/internal/authorization" + "github.com/authorizerdev/authorizer/internal/authorization/engine" + fgaengine "github.com/authorizerdev/authorizer/internal/authorization/engine/openfga" "github.com/authorizerdev/authorizer/internal/config" "github.com/authorizerdev/authorizer/internal/constants" "github.com/authorizerdev/authorizer/internal/email" "github.com/authorizerdev/authorizer/internal/events" - "github.com/authorizerdev/authorizer/internal/graph/model" "github.com/authorizerdev/authorizer/internal/http_handlers" "github.com/authorizerdev/authorizer/internal/memory_store" "github.com/authorizerdev/authorizer/internal/metrics" @@ -242,6 +242,14 @@ func init() { f.BoolVar(&rootArgs.config.IncludePermissionsInToken, "include-permissions-in-token", false, "Include permissions in JWT access tokens") f.BoolVar(&rootArgs.config.AuthorizationLogAllChecks, "authorization-log-all-checks", false, "Audit log all permission checks, not just denials") + // OpenFGA / FGA engine flags (Phase 1 — additive; the FGA engine is + // selectable but not yet the default) + f.StringVar(&rootArgs.config.AuthorizationEngine, "authorization-engine", "policy", "Authorization backend: 'policy' (existing resource/scope/policy engine, default) or 'fga' (OpenFGA ReBAC engine)") + f.StringVar(&rootArgs.config.FGAMode, "fga-mode", "embedded", "OpenFGA run mode: 'embedded' (in-process, default) or 'external' (standalone OpenFGA service)") + f.StringVar(&rootArgs.config.FGAStore, "fga-store", "memory", "OpenFGA datastore: 'memory' (dev/tests, default), 'sqlite' (single-node), 'postgres' or 'mysql' (HA)") + f.StringVar(&rootArgs.config.FGAStoreURL, "fga-store-url", "", "OpenFGA datastore connection URI (file: URI for sqlite, DSN for postgres/mysql)") + f.StringVar(&rootArgs.config.FGAExternalURL, "fga-external-url", "", "gRPC URL of an external OpenFGA service (used when --fga-mode=external)") + // Deprecated flags f.MarkDeprecated("database_url", "use --database-url instead") f.MarkDeprecated("database_type", "use --database-type instead") @@ -462,34 +470,55 @@ func runRoot(c *cobra.Command, args []string) { } defer rateLimitProvider.Close() - // Authorization provider - authorizationProvider, err := authorization.New( - &authorization.Config{ - CacheTTL: rootArgs.config.AuthorizationCacheTTL, - }, - &authorization.Dependencies{ - Log: &log, - StorageProvider: storageProvider, - MemoryStoreProvider: memoryStoreProvider, - }, - ) - if err != nil { - log.Fatal().Err(err).Msg("failed to create authorization provider") - } - - // Check once at startup whether any permissions exist. If zero, emit a - // loud warn so operators don't lock themselves out in prod. Bounded - // context prevents a hung DB at boot from blocking startup indefinitely. - probeCtx, probeCancel := context.WithTimeout(context.Background(), 5*time.Second) - _, pr, lerr := storageProvider.ListPermissions(probeCtx, &model.Pagination{Limit: 1, Page: 1}) - probeCancel() - switch { - case lerr != nil: - log.Warn().Err(lerr).Msg("authz: failed to probe permission count at startup; authorization is enforcing") - case pr != nil && pr.Total == 0: - log.Warn().Msg("authz: 0 permissions configured — all authorization checks will DENY. Seed permissions via the dashboard or admin GraphQL mutations.") - default: - log.Info().Msg("authz: enforcing; unmatched CheckPermission calls will be DENIED.") + // OpenFGA authorization engine (Phase 1 — additive). + // + // This is constructed only when --authorization-engine=fga. The FGA engine + // is selectable but is not yet routed into the request path — later phases + // wire it into GraphQL and session/validate. + // + // Embedded mode runs the OpenFGA server in-process. For single-node/dev + // (memory or sqlite) migrations may run on boot; HA/serverless must run + // migrations as a separate init job (see FGA_OPENFGA_MIGRATION_PLAN.md §2.1) + // and must use an external SQL store. + // authzEngine is threaded into the HTTP/GraphQL providers below. It stays nil + // unless --authorization-engine=fga (and embedded mode initializes cleanly). + // Resolvers fail closed when it is nil. + var authzEngine engine.AuthorizationEngine + if strings.EqualFold(rootArgs.config.AuthorizationEngine, "fga") { + switch strings.ToLower(strings.TrimSpace(rootArgs.config.FGAMode)) { + case "", "embedded": + // Run migrations on boot only for single-node embedded SQL stores. + // memory needs none; postgres/mysql (HA) must migrate out-of-band. + runMigrations := strings.EqualFold(rootArgs.config.FGAStore, fgaengine.StoreSQLite) + fgaEngine, ferr := fgaengine.New( + &fgaengine.Config{ + Store: rootArgs.config.FGAStore, + StoreURL: rootArgs.config.FGAStoreURL, + StoreName: rootArgs.config.OrganizationName, + RunMigrations: runMigrations, + }, + &fgaengine.Dependencies{Log: &log}, + ) + if ferr != nil { + log.Fatal().Err(ferr).Msg("failed to create OpenFGA authorization engine") + } + if closer, ok := fgaEngine.(interface{ Close() }); ok { + defer closer.Close() + } + authzEngine = fgaEngine + log.Info(). + Str("fga_mode", "embedded"). + Str("fga_store", rootArgs.config.FGAStore). + Msg("OpenFGA authorization engine initialized (embedded); routed into GraphQL + session/validate") + case "external": + // External-mode wiring (gRPC client to a standalone OpenFGA + // service) lands in a later phase; the seam and flags exist now. + log.Warn(). + Str("fga_external_url", rootArgs.config.FGAExternalURL). + Msg("OpenFGA external mode selected but the external client is not yet wired (Phase 1 implements the embedded engine); no FGA engine started") + default: + log.Fatal().Str("fga_mode", rootArgs.config.FGAMode).Msg("invalid --fga-mode (want 'embedded' or 'external')") + } } // SMS provider @@ -542,7 +571,7 @@ func runRoot(c *cobra.Command, args []string) { TokenProvider: tokenProvider, OAuthProvider: oauthProvider, RateLimitProvider: rateLimitProvider, - AuthorizationProvider: authorizationProvider, + AuthzEngine: authzEngine, }) if err != nil { log.Fatal().Err(err).Msg("failed to create http provider") diff --git a/go.mod b/go.mod index 820533ce..91990ce8 100644 --- a/go.mod +++ b/go.mod @@ -16,35 +16,45 @@ require ( github.com/couchbase/gocb/v2 v2.6.4 github.com/ekristen/gorm-libsql v0.0.0-20231101204708-6e113112bcc2 github.com/gin-gonic/gin v1.9.1 - github.com/glebarez/sqlite v1.10.0 github.com/go-jose/go-jose/v4 v4.1.4 github.com/gocql/gocql v1.6.0 github.com/golang-jwt/jwt/v4 v4.5.2 github.com/google/uuid v1.6.0 + github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20 + github.com/openfga/language/pkg/go v0.2.1 + github.com/openfga/openfga v1.17.1 github.com/pquerna/otp v1.4.0 github.com/prometheus/client_golang v1.23.2 github.com/redis/go-redis/v9 v9.6.3 github.com/robertkrimen/otto v0.2.1 github.com/rs/zerolog v1.33.0 - github.com/spf13/cobra v1.8.1 + github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.11.1 github.com/twilio/twilio-go v1.14.1 github.com/vektah/gqlparser/v2 v2.5.26 go.mongodb.org/mongo-driver v1.17.9 golang.org/x/crypto v0.52.0 - golang.org/x/oauth2 v0.30.0 + golang.org/x/oauth2 v0.36.0 golang.org/x/sync v0.20.0 golang.org/x/time v0.15.0 + google.golang.org/protobuf v1.36.11 gopkg.in/mail.v2 v2.3.1 gorm.io/driver/mysql v1.5.2 gorm.io/driver/postgres v1.6.0 gorm.io/driver/sqlserver v1.5.2 gorm.io/gorm v1.25.10 + modernc.org/sqlite v1.51.0 ) require ( + cel.dev/expr v0.25.1 // indirect + filippo.io/edwards25519 v1.2.0 // indirect + github.com/IBM/pgxpoolprometheus v1.1.3 // indirect + github.com/Masterminds/squirrel v1.5.4 // indirect + github.com/Yiling-J/theine-go v0.6.2 // indirect github.com/agnivade/levenshtein v1.2.1 // indirect github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect + github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect @@ -61,62 +71,86 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect github.com/bytedance/sonic v1.9.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/couchbase/gocbcore/v10 v10.2.8 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/glebarez/go-sqlite v1.21.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.14.0 // indirect - github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/go-sql-driver/mysql v1.10.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/cel-go v0.28.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.9.2 // indirect + github.com/jackc/pgx/v5 v5.10.0 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/compress v1.18.5 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect + github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect + github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/libsql/libsql-client-go v0.0.0-20231026052543-fce76c0f39a7 // indirect github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 // indirect github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/microsoft/go-mssqldb v1.6.0 // indirect + github.com/mattn/go-isatty v0.0.21 // indirect + github.com/mfridman/interpolate v0.0.2 // indirect + github.com/microsoft/go-mssqldb v1.9.8 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/montanaflynn/stats v0.7.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/natefinch/wrap v0.2.0 // indirect + github.com/ncruces/go-strftime v1.0.0 // indirect + github.com/oklog/ulid/v2 v2.1.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/pressly/goose/v3 v3.27.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.66.1 // indirect - github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/procfs v0.20.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sagikazarmark/locafero v0.9.0 // indirect + github.com/sethvargo/go-retry v0.3.0 // indirect + github.com/shopspring/decimal v1.4.0 // indirect github.com/sosodev/duration v1.3.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/spf13/viper v1.20.1 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect github.com/urfave/cli/v2 v2.27.6 // indirect @@ -125,22 +159,37 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/otel v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect + go.opentelemetry.io/otel/sdk v1.44.0 // indirect + go.opentelemetry.io/otel/trace v1.44.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect + go.uber.org/mock v0.6.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.28.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f // indirect golang.org/x/mod v0.35.0 // indirect golang.org/x/net v0.55.0 // indirect golang.org/x/sys v0.45.0 // indirect golang.org/x/text v0.37.0 // indirect golang.org/x/tools v0.44.0 // indirect - google.golang.org/protobuf v1.36.8 // indirect + gonum.org/v1/gonum v0.17.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/grpc v1.81.1 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - modernc.org/libc v1.22.5 // indirect - modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.5.0 // indirect - modernc.org/sqlite v1.23.1 // indirect + modernc.org/libc v1.72.3 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect nhooyr.io/websocket v1.8.7 // indirect ) diff --git a/go.sum b/go.sum index 0c3a44c6..090a4440 100644 --- a/go.sum +++ b/go.sum @@ -1,25 +1,45 @@ +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= +filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= github.com/99designs/gqlgen v0.17.73 h1:A3Ki+rHWqKbAOlg5fxiZBnz6OjW3nwupDHEG15gEsrg= github.com/99designs/gqlgen v0.17.73/go.mod h1:2RyGWjy2k7W9jxrs8MOQthXGkD3L3oGr0jXW3Pu8lGg= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 h1:/iHxaJhsFr0+xVFfbMr5vxz848jyiWuIEDhYq3y5odY= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.2.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0 h1:yfJe15aSwEQ6Oo6J+gdfdulPNoZ3TEhmbhLIoxZcA+U= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0/go.mod h1:Q28U+75mpCaSCDowNEmhIo/rmgdkqmkmzI7N6TGR4UY= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 h1:T028gtTPiYt/RMUfs8nVsAL7FDQrfLlrm/NnRG/zcC4= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0 h1:E4MgwLBGeVB5f2MdcIVD3ELVAWpr+WD6MUe1i+tM/PA= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0/go.mod h1:Y2b/1clN4zsAoUd/pgNAQHjLDnTis/6ROkUfyob6psM= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 h1:nCYfgcSyHZXJI8J0IWE5MsCGlb2xp9fJiXyxWgmOFg4= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0/go.mod h1:ucUjca2JtSZboY8IoUqyQyuuXvwbMBVwFOm0vdQPNhA= github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0 h1:HCc0+LpPfpCKs6LGGLAhwBARt9632unrVcI6i8s/8os= github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs= +github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/IBM/pgxpoolprometheus v1.1.3 h1:LYDekhCpo0I6qBrnfZlCSDqdr8UX/ZJ2C3GwhrTSVcw= +github.com/IBM/pgxpoolprometheus v1.1.3/go.mod h1:Q/NZpDapcg7VJQSfUfhH+KaGV7wZQk0/bFRoyinkjr8= +github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= +github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo= github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y= +github.com/Yiling-J/theine-go v0.6.2 h1:1GeoXeQ0O0AUkiwj2S9Jc0Mzx+hpqzmqsJ4kIC4M9AY= +github.com/Yiling-J/theine-go v0.6.2/go.mod h1:08QpMa5JZ2pKN+UJCRrCasWYO1IKCdl54Xa836rpmDU= github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= @@ -28,6 +48,8 @@ github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kk github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= +github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= +github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/arangodb/go-driver v1.6.0 h1:NFWj/idqXZxhFVueihMSI2R9NotNIsgvNfM/xmpekb4= github.com/arangodb/go-driver v1.6.0/go.mod h1:HQmdGkvNMVBTE3SIPSQ8T/ZddC6iwNsfMR+dDJQxIsI= github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e h1:Xg+hGrY2LcQBbxd0ZFdbGSyRKTYMZCfBbw/pMJFOk1g= @@ -73,6 +95,7 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.41.10/go.mod h1:60dv0eZJfeVXfbT1tFJi github.com/aws/smithy-go v1.24.3 h1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg= github.com/aws/smithy-go v1.24.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= @@ -88,11 +111,22 @@ github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0 github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= +github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc= github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -103,23 +137,43 @@ github.com/couchbase/gocbcore/v10 v10.2.8/go.mod h1:lYQIIk+tzoMcwtwU5GzPbDdqEkwk github.com/couchbaselabs/gocaves/client v0.0.0-20230307083111-cc3960c624b1/go.mod h1:AVekAZwIY2stsJOMWLAS/0uA/+qdp7pjO8EHnl61QkY= github.com/couchbaselabs/gocaves/client v0.0.0-20230404095311-05e3ba4f0259 h1:2TXy68EGEzIMHOx9UvczR5ApVecwCfQZ0LjkmwMI6g4= github.com/couchbaselabs/gocaves/client v0.0.0-20230404095311-05e3ba4f0259/go.mod h1:AVekAZwIY2stsJOMWLAS/0uA/+qdp7pjO8EHnl61QkY= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= -github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo= github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/go-connections v0.7.0 h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c= +github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/ekristen/gorm-libsql v0.0.0-20231101204708-6e113112bcc2 h1:3f6DAUkYKbZSJ1bBM0/RiX5NHVt7YgmB0BWzKWUd45g= github.com/ekristen/gorm-libsql v0.0.0-20231101204708-6e113112bcc2/go.mod h1:5g9wSYpR/MvkR6W7SumX9zdha7Yt1iM4nxOAWfRfcPA= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= +github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -127,12 +181,15 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= -github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= -github.com/glebarez/sqlite v1.10.0 h1:u4gt8y7OND/cCei/NMHmfbLxF6xP2wgKcT/BJf2pYkc= -github.com/glebarez/sqlite v1.10.0/go.mod h1:IJ+lfSOmiekhQsFTJRx/lHtGYmCdtAiTaf5wI9u5uHA= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -145,8 +202,10 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.10.0 h1:Q+1LV8DkHJvSYAdR83XzuhDaTykuDx0l6fkXxoWCWfw= +github.com/go-sql-driver/mysql v1.10.0/go.mod h1:M+cqaI7+xxXGG9swrdeUIoPG3Y3KCkF0pZej+SK+nWk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= @@ -160,35 +219,43 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= +github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/cel-go v0.28.1 h1:YWIwi77J4xIsYUwAF/iIuS6haffzIHS8yWI8glSbLWM= +github.com/google/cel-go v0.28.1/go.mod h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -198,8 +265,23 @@ github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/z github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3/go.mod h1:NbCUVmiS4foBGBHOYlCT25+YmGpJ32dZPi75pGEUpj4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= +github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -210,8 +292,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= -github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/pgx/v5 v5.10.0 h1:VhSvgU2jSli8o3AqIEOTJr7rZwAEUVo4E4XhR94Zfr0= +github.com/jackc/pgx/v5 v5.10.0/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= @@ -227,12 +309,15 @@ github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -242,6 +327,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= @@ -257,70 +346,121 @@ github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stg github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs= +github.com/mattn/go-isatty v0.0.21/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc= +github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= +github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= +github.com/microsoft/go-mssqldb v1.9.8 h1:d4IFMvF/o+HdpXUqbBfzHvn/NlFA75YGcfHUUvDFJEM= +github.com/microsoft/go-mssqldb v1.9.8/go.mod h1:eGSRSGAW4hKMy5YcAenhCDjIRm2rhqIdmmwgciMzLus= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/moby/api v1.54.2 h1:wiat9QAhnDQjA7wk1kh/TqHz2I1uUA7M7t9SAl/JNXg= +github.com/moby/moby/api v1.54.2/go.mod h1:+RQ6wluLwtYaTd1WnPLykIDPekkuyD/ROWQClE83pzs= +github.com/moby/moby/client v0.4.1 h1:DMQgisVoMkmMs7fp3ROSdiBnoAu8+vo3GggFl06M/wY= +github.com/moby/moby/client v0.4.1/go.mod h1:z52C9O2POPOsnxZAy//WtKcQ32P+jT/NGeXu/7nfjGQ= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/natefinch/wrap v0.2.0 h1:IXzc/pw5KqxJv55gV0lSOcKHYuEZPGbQrOOXr/bamRk= +github.com/natefinch/wrap v0.2.0/go.mod h1:6gMHlAl12DwYEfKP3TkuykYUfLSEAvHw67itm4/KAS8= +github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= +github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/oklog/ulid/v2 v2.1.1 h1:suPZ4ARWLOJLegGFiZZ1dFAkqzhMjL3J1TzI+5wHz8s= +github.com/oklog/ulid/v2 v2.1.1/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20 h1:xdVG0EDz9Z9Uhd7YZ5OMN1F8tkAz/Dpgdjxd0cuTBJo= +github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20/go.mod h1:XDX4qYNBUM2Rsa2AbKPh+oocZc2zgme+EF2fFC6amVU= +github.com/openfga/language/pkg/go v0.2.1 h1:nmVJTPfjvaJC2EWGcy8HrUyL15KkIfjjnmB3VFVeCts= +github.com/openfga/language/pkg/go v0.2.1/go.mod h1:wg+EuPmYIaM855F2uPygT1hJoWcoUxAoecgYC5akXsw= +github.com/openfga/openfga v1.17.1 h1:80sT4P5EYAKaRnbFqr4Wr6Cz5MI1WyT+Ss6kAAh1xD4= +github.com/openfga/openfga v1.17.1/go.mod h1:ZKAbAaqcijZuOT0AfCVjqtK3FiOFwZZh0pE8nlLuElA= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/otp v1.4.0 h1:wZvl1TIVxKRThZIBiwOOHOGP/1+nZyWBil9Y2XNEDzg= github.com/pquerna/otp v1.4.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= +github.com/pressly/goose/v3 v3.27.1 h1:6uEvcprBybDmW4hcz3gYujhARhye+GoWKhEWyzD5sh4= +github.com/pressly/goose/v3 v3.27.1/go.mod h1:maruOxsPnIG2yHHyo8UqKWXYKFcH7Q76csUV7+7KYoM= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/redis/go-redis/v9 v9.6.3 h1:8Dr5ygF1QFXRxIH/m3Xg9MMG1rS8YCtAgosrsewT6i0= github.com/redis/go-redis/v9 v9.6.3/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/robertkrimen/otto v0.2.1 h1:FVP0PJ0AHIjC+N4pKCG9yCDz6LHNPCwi/GKID5pGGF0= github.com/robertkrimen/otto v0.2.1/go.mod h1:UPwtJ1Xu7JrLcZjNWN8orJaM5n5YEtqL//farB5FlRY= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.9.0 h1:GbgQGNtTrEmddYDSAH9QLRyfAHY12md+8YFTqyMTC9k= +github.com/sagikazarmark/locafero v0.9.0/go.mod h1:UBUyz37V+EdMS3hDF3QWIiVr/2dPrx49OMO0Bn0hJqk= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= +github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= +github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -329,10 +469,11 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/twilio/twilio-go v1.14.1 h1:uyMwNe2naFKwxLpVflAHbKEPiW9iHNI8VF6NWLJJ1Kk= github.com/twilio/twilio-go v1.14.1/go.mod h1:tdnfQ5TjbewoAu4lf9bMsGvfuJ/QU9gYuv9yx3TSIXU= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -355,14 +496,52 @@ github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGC github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.mongodb.org/mongo-driver v1.17.9 h1:IexDdCuuNJ3BHrELgBlyaH9p60JXAvdzWR128q+U5tU= go.mongodb.org/mongo-driver v1.17.9/go.mod h1:LlOhpH5NUEfhxcAwG0UEkMqwYcc4JU18gtCdGudk/tQ= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= +go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= +go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= @@ -376,17 +555,30 @@ golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0 golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -397,16 +589,23 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -414,6 +613,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -446,7 +646,14 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= @@ -456,13 +663,30 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -477,6 +701,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs= @@ -489,14 +714,36 @@ gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqw gorm.io/gorm v1.25.2-0.20230610234218-206613868439/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= -modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= -modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +modernc.org/cc/v4 v4.28.2 h1:3tQ0lf2ADtoby2EtSP+J7IE2SHwEJdP8ioR59wx7XpY= +modernc.org/cc/v4 v4.28.2/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI= +modernc.org/ccgo/v4 v4.34.0 h1:yRLPFZieg532OT4rp4JFNIVcquwalMX26G95WQDqwCQ= +modernc.org/ccgo/v4 v4.34.0/go.mod h1:AS5WYMyBakQ+fhsHhtP8mWB82KTGPkNNJDGfGQCe0/A= +modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= +modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= +modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= +modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo= +modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.72.3 h1:ZnDF4tXn4NBXFutMMQC4vtbTFSXhhKzR73fv0beZEAU= +modernc.org/libc v1.72.3/go.mod h1:dn0dZNnnn1clLyvRxLxYExxiKRZIRENOfqQ8XEeg4Qs= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/opt v0.2.0 h1:tGyef5ApycA7FSEOMraay9SaTk5zmbx7Tu+cJs4QKZg= +modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.51.0 h1:aH/MMSoayAIhozZ7uJbVTT9QO/VhzBf0J9tymmmuC/U= +modernc.org/sqlite v1.51.0/go.mod h1:tcNzv5p84E0skkmJn038y+hWJbLQXQqEnQfeh5r2JLM= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/authorization/cache.go b/internal/authorization/cache.go deleted file mode 100644 index d10d98f6..00000000 --- a/internal/authorization/cache.go +++ /dev/null @@ -1,91 +0,0 @@ -package authorization - -import ( - "sync" - "time" -) - -// cache holds in-process membership caches that don't fit the string-only -// memory_store.Provider API. Decision results (allowed / denied for a -// (principal, resource, scope)) live in memory_store instead — see -// evaluator.go. -// -// validSets caches the bounded set of known resource and scope names so -// validateResourceExists / validateScopeExists avoid a storage round-trip -// on every CheckPermission call. A zero-length set is a valid cached value -// meaning "DB was reachable and empty". -type cache struct { - ttl time.Duration - validSets sync.Map // cache key -> map[string]struct{} - expiryMap sync.Map // cache key -> time.Time -} - -// newCache creates a new local membership cache. If ttlSeconds is 0, -// caching is disabled and getValidSet always reports miss. -func newCache(ttlSeconds int64) *cache { - return &cache{ - ttl: time.Duration(ttlSeconds) * time.Second, - } -} - -// enabled reports whether caching is active (TTL > 0). -func (c *cache) enabled() bool { - return c.ttl > 0 -} - -// getValidSet returns the cached membership set for the given key. -// The second return value reports whether the cache had an entry at all. -// Callers must not mutate the returned map. -func (c *cache) getValidSet(key string) (map[string]struct{}, bool) { - if !c.enabled() { - return nil, false - } - expiry, ok := c.expiryMap.Load(key) - if !ok { - return nil, false - } - if time.Now().After(expiry.(time.Time)) { - c.validSets.Delete(key) - c.expiryMap.Delete(key) - return nil, false - } - v, ok := c.validSets.Load(key) - if !ok { - return nil, false - } - return v.(map[string]struct{}), true -} - -// setValidSet stores a membership set under the given key with the -// configured TTL. -func (c *cache) setValidSet(key string, set map[string]struct{}) { - if !c.enabled() { - return - } - c.validSets.Store(key, set) - c.expiryMap.Store(key, time.Now().Add(c.ttl)) -} - -// invalidateValidSets evicts all cached validSets entries. Called when an -// admin mutation may have changed the resource or scope catalog. No-op when -// caching is disabled — symmetric with setValidSet/getValidSet. -func (c *cache) invalidateValidSets() { - if !c.enabled() { - return - } - c.validSets.Range(func(key, _ any) bool { - c.validSets.Delete(key) - c.expiryMap.Delete(key) - return true - }) -} - -// validResourcesKey returns the cache key for the set of known resource names. -func validResourcesKey() string { - return "authz:valid_resources" -} - -// validScopesKey returns the cache key for the set of known scope names. -func validScopesKey() string { - return "authz:valid_scopes" -} diff --git a/internal/authorization/cache_test.go b/internal/authorization/cache_test.go deleted file mode 100644 index bb619d38..00000000 --- a/internal/authorization/cache_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package authorization - -import ( - "testing" -) - -func TestCache_ValidSets(t *testing.T) { - t.Run("miss when caching disabled (TTL=0)", func(t *testing.T) { - c := newCache(0) - _, ok := c.getValidSet("authz:valid_resources") - if ok { - t.Fatal("expected cache miss when TTL is 0") - } - }) - - t.Run("miss before any set", func(t *testing.T) { - c := newCache(60) - _, ok := c.getValidSet("authz:valid_resources") - if ok { - t.Fatal("expected cache miss for unset key") - } - }) - - t.Run("hit after set", func(t *testing.T) { - c := newCache(60) - set := map[string]struct{}{"orders": {}, "users": {}} - c.setValidSet("authz:valid_resources", set) - - got, ok := c.getValidSet("authz:valid_resources") - if !ok { - t.Fatal("expected cache hit after setValidSet") - } - if len(got) != 2 { - t.Fatalf("expected 2 entries, got %d", len(got)) - } - if _, found := got["orders"]; !found { - t.Error("expected 'orders' in cached set") - } - }) - - t.Run("empty set is a valid cache hit", func(t *testing.T) { - c := newCache(60) - c.setValidSet("authz:valid_resources", map[string]struct{}{}) - - got, ok := c.getValidSet("authz:valid_resources") - if !ok { - t.Fatal("expected cache hit for empty set (DB reachable but empty)") - } - if len(got) != 0 { - t.Fatalf("expected 0 entries, got %d", len(got)) - } - }) - - t.Run("invalidateValidSets clears all entries", func(t *testing.T) { - c := newCache(60) - c.setValidSet(validResourcesKey(), map[string]struct{}{"orders": {}}) - c.setValidSet(validScopesKey(), map[string]struct{}{"read": {}}) - - c.invalidateValidSets() - - if _, ok := c.getValidSet(validResourcesKey()); ok { - t.Error("expected resources set to be evicted after invalidateValidSets") - } - if _, ok := c.getValidSet(validScopesKey()); ok { - t.Error("expected scopes set to be evicted after invalidateValidSets") - } - }) - - t.Run("setValidSet is no-op when TTL=0", func(t *testing.T) { - c := newCache(0) - c.setValidSet(validResourcesKey(), map[string]struct{}{"orders": {}}) - _, ok := c.getValidSet(validResourcesKey()) - if ok { - t.Fatal("expected no cache storage when TTL is 0") - } - }) -} diff --git a/internal/authorization/engine/engine.go b/internal/authorization/engine/engine.go new file mode 100644 index 00000000..b4bedb74 --- /dev/null +++ b/internal/authorization/engine/engine.go @@ -0,0 +1,143 @@ +// Package engine defines the AuthorizationEngine SPI — the abstraction over a +// relationship-based access control (ReBAC) backend used by Authorizer's +// fine-grained authorization (FGA) subsystem. +// +// The interface is deliberately backend-agnostic. The Phase 1 implementation +// (internal/authorization/engine/openfga) embeds OpenFGA in-process, but the +// same contract is intended to also front an external OpenFGA service. The +// engine speaks the OpenFGA tuple vocabulary: a tuple relates a user (subject) +// to an object via a relation, e.g. (user:alice, viewer, document:1). +// +// This package is additive (Phase 1 of the OpenFGA migration). It does not +// replace the existing authorization.Provider (resource/scope/policy engine); +// both coexist behind the --authorization-engine flag. +package engine + +import "context" + +// TupleKey identifies a single relationship: the subject (User) is related to +// the Object via the Relation. Identifiers are expected to be fully qualified +// in OpenFGA form, e.g. User="user:alice", Relation="viewer", +// Object="document:1". The User field may also be a userset reference such as +// "role:admin#assignee". +type TupleKey struct { + // User is the subject of the relationship (e.g. "user:alice" or a userset + // like "role:admin#assignee"). + User string + // Relation is the relation name connecting the user to the object (e.g. + // "viewer"). + Relation string + // Object is the fully qualified object (e.g. "document:1"). + Object string +} + +// ContextualTuple is a tuple supplied only for the duration of a single Check +// or BatchCheck call. It is not persisted; it lets callers evaluate +// hypothetical or request-scoped relationships (the OpenFGA contextual-tuples +// feature) without writing to the store. +type ContextualTuple struct { + // User is the subject of the relationship. + User string + // Relation is the relation name. + Relation string + // Object is the fully qualified object. + Object string +} + +// CheckRequest is a single relationship-check question: "is User related to +// Object via Relation?". ContextualTuples, if any, are evaluated alongside the +// persisted tuples for this check only. +type CheckRequest struct { + // User is the subject being checked (e.g. "user:alice"). + User string + // Relation is the relation to evaluate (e.g. "can_view"). + Relation string + // Object is the fully qualified object (e.g. "document:1"). + Object string + // ContextualTuples are request-scoped tuples not persisted to the store. + ContextualTuples []ContextualTuple +} + +// CheckResult is the answer to a single CheckRequest. +type CheckResult struct { + // Allowed reports whether the relationship holds. + Allowed bool +} + +// ReadTuplesFilter narrows a ReadTuples query. Any field left empty acts as a +// wildcard for that position. An entirely empty filter reads all tuples (use +// with pagination; this is an enumeration surface). +type ReadTuplesFilter struct { + // User filters by subject (optional). + User string + // Relation filters by relation (optional). + Relation string + // Object filters by object (optional); may be a type prefix like + // "document:" depending on backend support. + Object string + // PageSize caps the number of tuples returned in one page. Zero lets the + // backend choose a default. + PageSize int32 + // ContinuationToken resumes a previous ReadTuples call; empty starts from + // the beginning. + ContinuationToken string +} + +// ReadTuplesResult is one page of tuples plus a continuation token for the +// next page (empty when exhausted). +type ReadTuplesResult struct { + // Tuples is the page of matching relationships. + Tuples []TupleKey + // ContinuationToken, when non-empty, can be passed back via + // ReadTuplesFilter.ContinuationToken to fetch the next page. + ContinuationToken string +} + +// AuthorizationEngine is the SPI for a ReBAC authorization backend. +// +// All decision methods (Check, BatchCheck, ListObjects) are fail-closed at the +// call site: callers must treat a non-nil error as a deny and never as an +// allow. Identifiers follow OpenFGA conventions ("type:id", relation names, +// usersets "type:id#relation"). +// +// Implementations are expected to be safe for concurrent use. +type AuthorizationEngine interface { + // Check reports whether user is related to object via relation. Optional + // contextual tuples are evaluated for this call only and are not persisted. + // Returns (false, err) on engine error; callers must fail closed. + Check(ctx context.Context, user, relation, object string, ctxTuples ...ContextualTuple) (bool, error) + + // BatchCheck evaluates multiple CheckRequests. The returned slice is + // positionally aligned with the input: result[i] answers requests[i]. An + // error indicates a whole-batch failure; callers must fail closed for every + // request in the batch. + BatchCheck(ctx context.Context, requests []CheckRequest) ([]CheckResult, error) + + // ListObjects returns the IDs of objects of type objType to which user is + // related via relation. This is the RAG/pre-filter primitive and is an + // expensive enumeration surface — callers must paginate, cap, and + // rate-limit. Returned IDs are fully qualified ("document:1"). + ListObjects(ctx context.Context, user, relation, objType string) ([]string, error) + + // WriteTuples persists the given relationship tuples. It is additive; + // duplicate writes may error depending on the backend. + WriteTuples(ctx context.Context, tuples []TupleKey) error + + // DeleteTuples removes the given relationship tuples. Deleting a + // non-existent tuple may error depending on the backend. + DeleteTuples(ctx context.Context, tuples []TupleKey) error + + // ReadTuples returns a page of persisted tuples matching the filter, plus a + // continuation token. It is an enumeration surface — always paginate. + ReadTuples(ctx context.Context, filter ReadTuplesFilter) (*ReadTuplesResult, error) + + // WriteModel installs a new authorization model from its DSL form and + // returns the backend-assigned model ID. Writing a model is powerful (a + // single edit can re-grant broadly) and must be admin-gated, audited, and + // staged by callers. + WriteModel(ctx context.Context, dsl string) (string, error) + + // ReadModel returns the currently active authorization model rendered as + // DSL. + ReadModel(ctx context.Context) (string, error) +} diff --git a/internal/authorization/engine/openfga/datastore_sql.go b/internal/authorization/engine/openfga/datastore_sql.go new file mode 100644 index 00000000..17fd6219 --- /dev/null +++ b/internal/authorization/engine/openfga/datastore_sql.go @@ -0,0 +1,71 @@ +package openfga + +import ( + "fmt" + "time" + + "github.com/openfga/openfga/pkg/storage" + "github.com/openfga/openfga/pkg/storage/migrate" + "github.com/openfga/openfga/pkg/storage/mysql" + "github.com/openfga/openfga/pkg/storage/postgres" + "github.com/openfga/openfga/pkg/storage/sqlcommon" + "github.com/openfga/openfga/pkg/storage/sqlite" + "github.com/rs/zerolog" +) + +// Default timeouts for the migration bootstrap step. +const ( + defaultMigrateTimeout = 30 * time.Second + defaultMigratePingTimeout = 5 * time.Second +) + +// newSQLDatastore opens a SQL-backed OpenFGA datastore against an (optionally +// just-migrated) schema. The SQLite datastore uses modernc.org/sqlite (pure-Go), +// which is the single registrant of the "sqlite" database/sql driver shared with +// Authorizer's GORM SQLite path (see internal/storage/db/sql/sqlitedialect). +func newSQLDatastore(cfg *Config, log *zerolog.Logger) (storage.OpenFGADatastore, error) { + if cfg.RunMigrations { + if err := runMigrations(cfg, log); err != nil { + return nil, err + } + } + sc := sqlcommon.NewConfig() + switch cfg.Store { + case StoreSQLite: + ds, err := sqlite.New(cfg.StoreURL, sc) + if err != nil { + return nil, fmt.Errorf("openfga.New: sqlite.New: %w", err) + } + return ds, nil + case StorePostgres: + ds, err := postgres.New(cfg.StoreURL, sc) + if err != nil { + return nil, fmt.Errorf("openfga.New: postgres.New: %w", err) + } + return ds, nil + case StoreMySQL: + ds, err := mysql.New(cfg.StoreURL, sc) + if err != nil { + return nil, fmt.Errorf("openfga.New: mysql.New: %w", err) + } + return ds, nil + default: + return nil, fmt.Errorf("openfga.New: unsupported sql store %q", cfg.Store) + } +} + +// runMigrations runs the OpenFGA datastore migrations (idempotent, embedded). +// For HA/serverless this must NOT be called on boot — run it as a separate init +// job (§2.1). +func runMigrations(cfg *Config, log *zerolog.Logger) error { + log.Info().Str("engine", cfg.Store).Msg("running OpenFGA datastore migrations") + if err := migrate.RunMigrations(migrate.MigrationConfig{ + Engine: cfg.Store, + URI: cfg.StoreURL, + Timeout: defaultMigrateTimeout, + PingTimeout: defaultMigratePingTimeout, + }); err != nil { + return fmt.Errorf("openfga.New: RunMigrations(%s): %w", cfg.Store, err) + } + return nil +} diff --git a/internal/authorization/engine/openfga/datastore_sqlite_test.go b/internal/authorization/engine/openfga/datastore_sqlite_test.go new file mode 100644 index 00000000..6740e411 --- /dev/null +++ b/internal/authorization/engine/openfga/datastore_sqlite_test.go @@ -0,0 +1,95 @@ +package openfga + +import ( + "context" + "fmt" + "os" + "path/filepath" + "testing" + + "github.com/rs/zerolog" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gorm.io/gorm" + + "github.com/authorizerdev/authorizer/internal/authorization/engine" + sqlitedialect "github.com/authorizerdev/authorizer/internal/storage/db/sql/sqlitedialect" +) + +// TestOpenFGAEngine_SQLiteStore_EndToEnd proves that the embedded SQL-backed +// OpenFGA engine runs in-process against a real on-disk SQLite database — built +// into the DEFAULT binary (no fga_sql build tag) — alongside Authorizer's GORM +// SQLite path, without the historical "sql: Register called twice for driver +// sqlite" panic. +// +// Both code paths use modernc.org/sqlite as the single registrant of the +// "sqlite" database/sql driver: OpenFGA's sqlite datastore opens it directly, +// and Authorizer's GORM dialect (internal/storage/db/sql/sqlitedialect) targets +// the same driver. This test exercises both in one process. +func TestOpenFGAEngine_SQLiteStore_EndToEnd(t *testing.T) { + ctx := context.Background() + log := zerolog.New(os.Stderr) + + dir := t.TempDir() + + // 1) Open a GORM SQLite DB via Authorizer's local dialect to assert the two + // SQLite consumers coexist in one process (no double-registration panic). + gormDBPath := filepath.Join(dir, "authorizer-main.db") + gormDB, err := gorm.Open( + sqlitedialect.Open(gormDBPath+"?_pragma=busy_timeout(5000)&_pragma=journal_mode(WAL)"), + &gorm.Config{}, + ) + require.NoError(t, err, "GORM SQLite (modernc) must open without driver conflict") + require.NoError(t, gormDB.Exec("CREATE TABLE IF NOT EXISTS probe (id INTEGER PRIMARY KEY)").Error) + require.NoError(t, gormDB.Exec("INSERT INTO probe (id) VALUES (1)").Error) + var probeCount int64 + require.NoError(t, gormDB.Raw("SELECT COUNT(*) FROM probe").Scan(&probeCount).Error) + assert.Equal(t, int64(1), probeCount, "GORM SQLite path works") + + // 2) Construct the embedded OpenFGA engine against a SQLite file store, with + // migrations run on boot (single-node mode). + fgaDBPath := filepath.Join(dir, "openfga.db") + fgaURI := fmt.Sprintf("file:%s", fgaDBPath) + + eng, err := New(&Config{ + Store: StoreSQLite, + StoreURL: fgaURI, + RunMigrations: true, + }, &Dependencies{Log: &log}) + require.NoError(t, err, "embedded OpenFGA SQLite engine must construct (migrations + open)") + require.NotNil(t, eng) + + impl, ok := eng.(*engineImpl) + require.True(t, ok) + t.Cleanup(impl.Close) + + assert.NotEmpty(t, impl.StoreID(), "store ID bootstrapped on the SQLite store") + + // 3) Write a model + tuples and Check — proving the persistent store works. + modelID, err := eng.WriteModel(ctx, testModel) + require.NoError(t, err) + assert.NotEmpty(t, modelID) + + require.NoError(t, eng.WriteTuples(ctx, []engine.TupleKey{ + {User: "user:alice", Relation: "viewer", Object: "document:1"}, + {User: "user:erin", Relation: "viewer", Object: "document:1"}, + {User: "user:erin", Relation: "blocked", Object: "document:1"}, + })) + + allowed, err := eng.Check(ctx, "user:alice", "can_view", "document:1") + require.NoError(t, err) + assert.True(t, allowed, "alice is a viewer and not blocked") + + allowed, err = eng.Check(ctx, "user:erin", "can_view", "document:1") + require.NoError(t, err) + assert.False(t, allowed, "erin is blocked despite being a viewer") + + allowed, err = eng.Check(ctx, "user:bob", "can_view", "document:1") + require.NoError(t, err) + assert.False(t, allowed, "bob has no grant") + + // 4) Confirm data was actually persisted to the SQLite file on disk. + info, statErr := os.Stat(fgaDBPath) + require.NoError(t, statErr, "OpenFGA SQLite db file must exist on disk") + assert.Positive(t, info.Size(), "OpenFGA SQLite db file must be non-empty") +} diff --git a/internal/authorization/engine/openfga/openfga.go b/internal/authorization/engine/openfga/openfga.go new file mode 100644 index 00000000..be3b836c --- /dev/null +++ b/internal/authorization/engine/openfga/openfga.go @@ -0,0 +1,223 @@ +// Package openfga implements the engine.AuthorizationEngine SPI by embedding +// the OpenFGA server in-process (openfga v1.17.1). It supports an in-memory +// datastore (dev/tests) and persistent SQL datastores (SQLite single-node, +// Postgres/MySQL for HA) per the migration plan's deployment modes (§2.1). +// +// This package is additive (Phase 1). It does not replace the existing +// resource/scope/policy engine; both are selectable behind +// --authorization-engine. The principal-pinning, admin-gating, audit, and +// caching policy described in the plan live in the callers of this engine — +// this package is the thin, fail-closed adapter over OpenFGA. +package openfga + +import ( + "context" + "fmt" + "strconv" + "sync" + + openfgav1 "github.com/openfga/api/proto/openfga/v1" + "github.com/openfga/openfga/pkg/server" + "github.com/openfga/openfga/pkg/storage" + "github.com/openfga/openfga/pkg/storage/memory" + "github.com/rs/zerolog" + + "github.com/authorizerdev/authorizer/internal/authorization/engine" +) + +// Store kinds for the embedded datastore. +const ( + // StoreMemory selects the in-memory datastore (dev/tests only; non-durable). + StoreMemory = "memory" + // StoreSQLite selects the embedded SQLite datastore (single-node/dev). + StoreSQLite = "sqlite" + // StorePostgres selects an external Postgres datastore (HA). + StorePostgres = "postgres" + // StoreMySQL selects an external MySQL datastore (HA). + StoreMySQL = "mysql" +) + +// Config holds the parameters needed to construct the embedded OpenFGA engine. +// +// StoreID and ModelID are the OpenFGA-assigned ULIDs that Authorizer MUST +// persist itself (config or main DB) and pass back on every call — OpenFGA does +// not look stores/models up by name across restarts. When they are empty (e.g. +// memory store on first boot), the caller is expected to bootstrap via +// CreateStore + WriteModel and then persist the returned IDs. +type Config struct { + // Store selects the datastore kind: memory|sqlite|postgres|mysql. + Store string + // StoreURL is the datastore connection URI (file: URI for sqlite, DSN for + // postgres/mysql). Ignored for the memory store. + StoreURL string + // StoreName is the OpenFGA store name used when bootstrapping a new store. + StoreName string + // StoreID, when set, targets an existing OpenFGA store (skips CreateStore). + StoreID string + // ModelID, when set, targets an existing authorization model (skips the + // need to write one before checks). + ModelID string + // RunMigrations, when true, runs the datastore migrations during Init for + // SQL stores. For HA/serverless this MUST be false — migrations run as a + // separate init job (§2.1) to avoid races and cold-start latency. + RunMigrations bool +} + +// Dependencies carries shared resources for constructing the engine. +type Dependencies struct { + Log *zerolog.Logger +} + +// engineImpl implements engine.AuthorizationEngine over an embedded OpenFGA +// server. storeID and modelID are mutated under mu when a store/model is +// bootstrapped at runtime (memory store / first boot). +type engineImpl struct { + log *zerolog.Logger + srv *server.Server + ds storage.OpenFGADatastore + mu sync.RWMutex + storeID string + modelID string +} + +// Compile-time interface verification. +var _ engine.AuthorizationEngine = &engineImpl{} + +// New constructs the embedded OpenFGA engine. +// +// Migrations are deliberately NOT run unconditionally: they run only when +// cfg.RunMigrations is true (single-node/dev). HA and serverless deployments +// must run migrate.RunMigrations as a separate init job and leave +// RunMigrations=false so engine boot assumes the schema already exists (§2.1). +// +// If cfg.StoreID is empty a new store is created and its ID exposed via +// StoreID(); callers should persist it. If cfg.ModelID is empty, callers must +// call WriteModel before issuing checks. +func New(cfg *Config, deps *Dependencies) (engine.AuthorizationEngine, error) { + if cfg == nil { + return nil, fmt.Errorf("openfga.New: config is required") + } + if deps == nil || deps.Log == nil { + return nil, fmt.Errorf("openfga.New: logger is required") + } + log := deps.Log.With().Str("component", "fga-engine").Logger() + + ds, err := newDatastore(cfg, &log) + if err != nil { + return nil, err + } + + srv, err := server.NewServerWithOpts(server.WithDatastore(ds)) + if err != nil { + ds.Close() + return nil, fmt.Errorf("openfga.New: NewServerWithOpts: %w", err) + } + + e := &engineImpl{ + log: &log, + srv: srv, + ds: ds, + storeID: cfg.StoreID, + modelID: cfg.ModelID, + } + + // Bootstrap a store if none was provided. The store ID is exposed via + // StoreID() so the caller can persist it for subsequent boots. + if e.storeID == "" { + store, cErr := srv.CreateStore(context.Background(), &openfgav1.CreateStoreRequest{ + Name: storeNameOrDefault(cfg.StoreName), + }) + if cErr != nil { + srv.Close() + ds.Close() + return nil, fmt.Errorf("openfga.New: CreateStore: %w", cErr) + } + e.storeID = store.GetId() + log.Info().Str("store_id", e.storeID).Msg("created new OpenFGA store; persist this ID") + } + + return e, nil +} + +// newDatastore opens the configured datastore. +// +// The memory store and all SQL stores (sqlite/postgres/mysql) are compiled into +// the default binary. OpenFGA's SQLite datastore uses modernc.org/sqlite, the +// same pure-Go driver that Authorizer's GORM SQLite dialect now targets (see +// internal/storage/db/sql/sqlitedialect). Because modernc.org/sqlite is the +// single registrant of the "sqlite" database/sql driver, embedding SQL-backed +// FGA alongside the GORM SQLite main DB no longer panics at startup with +// "sql: Register called twice for driver sqlite". +func newDatastore(cfg *Config, log *zerolog.Logger) (storage.OpenFGADatastore, error) { + switch cfg.Store { + case "", StoreMemory: + return memory.New(), nil + case StoreSQLite, StorePostgres, StoreMySQL: + if cfg.StoreURL == "" { + return nil, fmt.Errorf("openfga.New: --fga-store-url is required for store %q", cfg.Store) + } + return newSQLDatastore(cfg, log) + default: + return nil, fmt.Errorf("openfga.New: unsupported fga store %q (want memory|sqlite|postgres|mysql)", cfg.Store) + } +} + +func storeNameOrDefault(name string) string { + if name == "" { + return "authorizer" + } + return name +} + +// StoreID returns the OpenFGA store ID this engine is bound to. Callers should +// persist it (config/main DB) so subsequent boots target the same store. +func (e *engineImpl) StoreID() string { + e.mu.RLock() + defer e.mu.RUnlock() + return e.storeID +} + +// ModelID returns the currently active authorization model ID, or empty if no +// model has been written yet. Callers should persist it alongside the store ID. +func (e *engineImpl) ModelID() string { + e.mu.RLock() + defer e.mu.RUnlock() + return e.modelID +} + +// Close releases the embedded server and datastore, flushing any WAL. It should +// be deferred at the construction site. +func (e *engineImpl) Close() { + if e.srv != nil { + e.srv.Close() + } + if e.ds != nil { + e.ds.Close() + } +} + +// ids returns the current store and model IDs under the read lock. +func (e *engineImpl) ids() (storeID, modelID string) { + e.mu.RLock() + defer e.mu.RUnlock() + return e.storeID, e.modelID +} + +// strconvItoa is a tiny helper to build correlation IDs for BatchCheck. +func strconvItoa(i int) string { return strconv.Itoa(i) } + +// toProtoContextual converts engine contextual tuples to the OpenFGA wire type. +func toProtoContextual(ctxTuples []engine.ContextualTuple) *openfgav1.ContextualTupleKeys { + if len(ctxTuples) == 0 { + return nil + } + keys := make([]*openfgav1.TupleKey, 0, len(ctxTuples)) + for _, t := range ctxTuples { + keys = append(keys, &openfgav1.TupleKey{ + User: t.User, + Relation: t.Relation, + Object: t.Object, + }) + } + return &openfgav1.ContextualTupleKeys{TupleKeys: keys} +} diff --git a/internal/authorization/engine/openfga/openfga_test.go b/internal/authorization/engine/openfga/openfga_test.go new file mode 100644 index 00000000..a017a464 --- /dev/null +++ b/internal/authorization/engine/openfga/openfga_test.go @@ -0,0 +1,165 @@ +package openfga + +import ( + "context" + "os" + "testing" + + "github.com/rs/zerolog" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/authorizerdev/authorizer/internal/authorization/engine" +) + +// testModel mirrors the Phase 0 spike: a document with a viewer grant, a +// blocked exception, and an effective can_view = viewer but not blocked. +const testModel = `model + schema 1.1 +type user +type document + relations + define viewer: [user] + define blocked: [user] + define can_view: viewer but not blocked` + +// newTestEngine constructs the embedded OpenFGA engine over the in-memory +// datastore and returns it along with its concrete type for Close(). +func newTestEngine(t *testing.T) (engine.AuthorizationEngine, *engineImpl) { + t.Helper() + log := zerolog.New(os.Stderr) + eng, err := New(&Config{Store: StoreMemory}, &Dependencies{Log: &log}) + require.NoError(t, err) + require.NotNil(t, eng) + + impl, ok := eng.(*engineImpl) + require.True(t, ok, "expected *engineImpl") + t.Cleanup(impl.Close) + return eng, impl +} + +func TestOpenFGAEngine_MemoryStore_CheckAndListObjects(t *testing.T) { + ctx := context.Background() + eng, impl := newTestEngine(t) + + // A store must have been bootstrapped automatically. + assert.NotEmpty(t, impl.StoreID(), "store ID should be bootstrapped") + + // Write the model. + modelID, err := eng.WriteModel(ctx, testModel) + require.NoError(t, err) + assert.NotEmpty(t, modelID) + assert.Equal(t, modelID, impl.ModelID()) + + // Write tuples: alice is a viewer; erin is a viewer but also blocked. + err = eng.WriteTuples(ctx, []engine.TupleKey{ + {User: "user:alice", Relation: "viewer", Object: "document:1"}, + {User: "user:erin", Relation: "viewer", Object: "document:1"}, + {User: "user:erin", Relation: "blocked", Object: "document:1"}, + }) + require.NoError(t, err) + + t.Run("can_view alice is allowed", func(t *testing.T) { + allowed, err := eng.Check(ctx, "user:alice", "can_view", "document:1") + require.NoError(t, err) + assert.True(t, allowed, "alice is a viewer and not blocked") + }) + + t.Run("can_view erin is denied by blocked exclusion", func(t *testing.T) { + allowed, err := eng.Check(ctx, "user:erin", "can_view", "document:1") + require.NoError(t, err) + assert.False(t, allowed, "erin is blocked despite being a viewer") + }) + + t.Run("can_view unknown user is denied", func(t *testing.T) { + allowed, err := eng.Check(ctx, "user:bob", "can_view", "document:1") + require.NoError(t, err) + assert.False(t, allowed, "bob has no grant") + }) + + t.Run("ListObjects returns only document:1 for alice", func(t *testing.T) { + objects, err := eng.ListObjects(ctx, "user:alice", "can_view", "document") + require.NoError(t, err) + assert.Equal(t, []string{"document:1"}, objects) + }) + + t.Run("ListObjects returns nothing for blocked erin", func(t *testing.T) { + objects, err := eng.ListObjects(ctx, "user:erin", "can_view", "document") + require.NoError(t, err) + assert.Empty(t, objects) + }) +} + +func TestOpenFGAEngine_BatchCheck(t *testing.T) { + ctx := context.Background() + eng, _ := newTestEngine(t) + + _, err := eng.WriteModel(ctx, testModel) + require.NoError(t, err) + require.NoError(t, eng.WriteTuples(ctx, []engine.TupleKey{ + {User: "user:alice", Relation: "viewer", Object: "document:1"}, + {User: "user:erin", Relation: "viewer", Object: "document:1"}, + {User: "user:erin", Relation: "blocked", Object: "document:1"}, + })) + + results, err := eng.BatchCheck(ctx, []engine.CheckRequest{ + {User: "user:alice", Relation: "can_view", Object: "document:1"}, + {User: "user:erin", Relation: "can_view", Object: "document:1"}, + {User: "user:bob", Relation: "can_view", Object: "document:1"}, + }) + require.NoError(t, err) + require.Len(t, results, 3) + assert.True(t, results[0].Allowed, "alice allowed") + assert.False(t, results[1].Allowed, "erin blocked") + assert.False(t, results[2].Allowed, "bob no grant") +} + +func TestOpenFGAEngine_ReadWriteDeleteTuples(t *testing.T) { + ctx := context.Background() + eng, _ := newTestEngine(t) + + _, err := eng.WriteModel(ctx, testModel) + require.NoError(t, err) + + require.NoError(t, eng.WriteTuples(ctx, []engine.TupleKey{ + {User: "user:alice", Relation: "viewer", Object: "document:1"}, + })) + + // Read back the tuple. + res, err := eng.ReadTuples(ctx, engine.ReadTuplesFilter{Object: "document:1"}) + require.NoError(t, err) + require.Len(t, res.Tuples, 1) + assert.Equal(t, "user:alice", res.Tuples[0].User) + assert.Equal(t, "viewer", res.Tuples[0].Relation) + assert.Equal(t, "document:1", res.Tuples[0].Object) + + // Delete it and confirm it is gone. + require.NoError(t, eng.DeleteTuples(ctx, []engine.TupleKey{ + {User: "user:alice", Relation: "viewer", Object: "document:1"}, + })) + res, err = eng.ReadTuples(ctx, engine.ReadTuplesFilter{Object: "document:1"}) + require.NoError(t, err) + assert.Empty(t, res.Tuples) +} + +func TestOpenFGAEngine_ReadModelRoundtrip(t *testing.T) { + ctx := context.Background() + eng, _ := newTestEngine(t) + + _, err := eng.WriteModel(ctx, testModel) + require.NoError(t, err) + + dsl, err := eng.ReadModel(ctx) + require.NoError(t, err) + assert.Contains(t, dsl, "type document") + assert.Contains(t, dsl, "can_view") +} + +func TestOpenFGAEngine_CheckBeforeModelFailsClosed(t *testing.T) { + ctx := context.Background() + eng, _ := newTestEngine(t) + + allowed, err := eng.Check(ctx, "user:alice", "can_view", "document:1") + assert.Error(t, err, "checking before a model is written must error") + assert.False(t, allowed, "must fail closed") +} diff --git a/internal/authorization/engine/openfga/operations.go b/internal/authorization/engine/openfga/operations.go new file mode 100644 index 00000000..5e903690 --- /dev/null +++ b/internal/authorization/engine/openfga/operations.go @@ -0,0 +1,263 @@ +package openfga + +import ( + "context" + "fmt" + + openfgav1 "github.com/openfga/api/proto/openfga/v1" + language "github.com/openfga/language/pkg/go/transformer" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/types/known/wrapperspb" + + "github.com/authorizerdev/authorizer/internal/authorization/engine" +) + +// Check reports whether user is related to object via relation. It is +// fail-closed: any engine error returns (false, err) and callers must treat the +// error as a deny. +func (e *engineImpl) Check(ctx context.Context, user, relation, object string, ctxTuples ...engine.ContextualTuple) (bool, error) { + storeID, modelID := e.ids() + if modelID == "" { + return false, fmt.Errorf("openfga.Check: no authorization model written yet") + } + res, err := e.srv.Check(ctx, &openfgav1.CheckRequest{ + StoreId: storeID, + AuthorizationModelId: modelID, + TupleKey: &openfgav1.CheckRequestTupleKey{ + User: user, + Relation: relation, + Object: object, + }, + ContextualTuples: toProtoContextual(ctxTuples), + }) + if err != nil { + return false, fmt.Errorf("openfga.Check: %w", err) + } + return res.GetAllowed(), nil +} + +// BatchCheck evaluates multiple checks. The returned slice is positionally +// aligned with the input. OpenFGA returns results keyed by a per-item +// correlation ID, so we assign the item index as the correlation ID and map +// back. A whole-batch error fails closed for every request. +func (e *engineImpl) BatchCheck(ctx context.Context, requests []engine.CheckRequest) ([]engine.CheckResult, error) { + if len(requests) == 0 { + return nil, nil + } + storeID, modelID := e.ids() + if modelID == "" { + return nil, fmt.Errorf("openfga.BatchCheck: no authorization model written yet") + } + + items := make([]*openfgav1.BatchCheckItem, 0, len(requests)) + for i, r := range requests { + items = append(items, &openfgav1.BatchCheckItem{ + TupleKey: &openfgav1.CheckRequestTupleKey{ + User: r.User, + Relation: r.Relation, + Object: r.Object, + }, + ContextualTuples: toProtoContextual(r.ContextualTuples), + CorrelationId: strconvItoa(i), + }) + } + + res, err := e.srv.BatchCheck(ctx, &openfgav1.BatchCheckRequest{ + StoreId: storeID, + AuthorizationModelId: modelID, + Checks: items, + }) + if err != nil { + return nil, fmt.Errorf("openfga.BatchCheck: %w", err) + } + + results := make([]engine.CheckResult, len(requests)) + resultMap := res.GetResult() + for i := range requests { + single, ok := resultMap[strconvItoa(i)] + if !ok { + return nil, fmt.Errorf("openfga.BatchCheck: missing result for check %d", i) + } + if cerr := single.GetError(); cerr != nil { + return nil, fmt.Errorf("openfga.BatchCheck: check %d errored: %s", i, cerr.GetMessage()) + } + results[i] = engine.CheckResult{Allowed: single.GetAllowed()} + } + return results, nil +} + +// ListObjects returns the IDs of objects of type objType to which user is +// related via relation. This is an expensive enumeration surface — callers must +// paginate/cap/rate-limit at the API boundary. +func (e *engineImpl) ListObjects(ctx context.Context, user, relation, objType string) ([]string, error) { + storeID, modelID := e.ids() + if modelID == "" { + return nil, fmt.Errorf("openfga.ListObjects: no authorization model written yet") + } + res, err := e.srv.ListObjects(ctx, &openfgav1.ListObjectsRequest{ + StoreId: storeID, + AuthorizationModelId: modelID, + Type: objType, + Relation: relation, + User: user, + }) + if err != nil { + return nil, fmt.Errorf("openfga.ListObjects: %w", err) + } + return res.GetObjects(), nil +} + +// WriteTuples persists the given relationship tuples. +func (e *engineImpl) WriteTuples(ctx context.Context, tuples []engine.TupleKey) error { + if len(tuples) == 0 { + return nil + } + storeID, modelID := e.ids() + keys := make([]*openfgav1.TupleKey, 0, len(tuples)) + for _, t := range tuples { + keys = append(keys, &openfgav1.TupleKey{ + User: t.User, + Relation: t.Relation, + Object: t.Object, + }) + } + _, err := e.srv.Write(ctx, &openfgav1.WriteRequest{ + StoreId: storeID, + AuthorizationModelId: modelID, + Writes: &openfgav1.WriteRequestWrites{TupleKeys: keys}, + }) + if err != nil { + return fmt.Errorf("openfga.WriteTuples: %w", err) + } + return nil +} + +// DeleteTuples removes the given relationship tuples. +func (e *engineImpl) DeleteTuples(ctx context.Context, tuples []engine.TupleKey) error { + if len(tuples) == 0 { + return nil + } + storeID, modelID := e.ids() + keys := make([]*openfgav1.TupleKeyWithoutCondition, 0, len(tuples)) + for _, t := range tuples { + keys = append(keys, &openfgav1.TupleKeyWithoutCondition{ + User: t.User, + Relation: t.Relation, + Object: t.Object, + }) + } + _, err := e.srv.Write(ctx, &openfgav1.WriteRequest{ + StoreId: storeID, + AuthorizationModelId: modelID, + Deletes: &openfgav1.WriteRequestDeletes{TupleKeys: keys}, + }) + if err != nil { + return fmt.Errorf("openfga.DeleteTuples: %w", err) + } + return nil +} + +// ReadTuples returns a page of persisted tuples matching the filter. An empty +// filter reads all tuples (paginated). The filter's User/Relation/Object map to +// the OpenFGA read tuple-key wildcard semantics. +func (e *engineImpl) ReadTuples(ctx context.Context, filter engine.ReadTuplesFilter) (*engine.ReadTuplesResult, error) { + storeID, _ := e.ids() + + req := &openfgav1.ReadRequest{ + StoreId: storeID, + ContinuationToken: filter.ContinuationToken, + } + // Only attach a tuple-key filter when at least one field is set; OpenFGA + // rejects an empty (all-wildcard) tuple key but allows omitting it to read + // everything. + if filter.User != "" || filter.Relation != "" || filter.Object != "" { + req.TupleKey = &openfgav1.ReadRequestTupleKey{ + User: filter.User, + Relation: filter.Relation, + Object: filter.Object, + } + } + if filter.PageSize > 0 { + req.PageSize = wrapperspb.Int32(filter.PageSize) + } + + res, err := e.srv.Read(ctx, req) + if err != nil { + return nil, fmt.Errorf("openfga.ReadTuples: %w", err) + } + + out := &engine.ReadTuplesResult{ + ContinuationToken: res.GetContinuationToken(), + Tuples: make([]engine.TupleKey, 0, len(res.GetTuples())), + } + for _, t := range res.GetTuples() { + k := t.GetKey() + out.Tuples = append(out.Tuples, engine.TupleKey{ + User: k.GetUser(), + Relation: k.GetRelation(), + Object: k.GetObject(), + }) + } + return out, nil +} + +// WriteModel installs a new authorization model from its DSL form and returns +// the backend-assigned model ID. The new model becomes the active model for +// subsequent checks. Model writes are powerful and must be admin-gated, audited +// and staged by the caller. +func (e *engineImpl) WriteModel(ctx context.Context, dsl string) (string, error) { + parsed, err := language.TransformDSLToProto(dsl) + if err != nil { + return "", fmt.Errorf("openfga.WriteModel: invalid DSL: %w", err) + } + storeID, _ := e.ids() + wm, err := e.srv.WriteAuthorizationModel(ctx, &openfgav1.WriteAuthorizationModelRequest{ + StoreId: storeID, + TypeDefinitions: parsed.GetTypeDefinitions(), + SchemaVersion: parsed.GetSchemaVersion(), + Conditions: parsed.GetConditions(), + }) + if err != nil { + return "", fmt.Errorf("openfga.WriteModel: %w", err) + } + modelID := wm.GetAuthorizationModelId() + + e.mu.Lock() + e.modelID = modelID + e.mu.Unlock() + + e.log.Info().Str("model_id", modelID).Msg("wrote OpenFGA authorization model; persist this ID") + return modelID, nil +} + +// ReadModel returns the active authorization model rendered as DSL. +func (e *engineImpl) ReadModel(ctx context.Context) (string, error) { + storeID, modelID := e.ids() + if modelID == "" { + return "", fmt.Errorf("openfga.ReadModel: no authorization model written yet") + } + res, err := e.srv.ReadAuthorizationModel(ctx, &openfgav1.ReadAuthorizationModelRequest{ + StoreId: storeID, + Id: modelID, + }) + if err != nil { + return "", fmt.Errorf("openfga.ReadModel: %w", err) + } + // Render via the JSON-string transformer rather than the proto-direct + // TransformJSONProtoToDSL: the latter (language v0.2.1) errors on relations + // that participate only in a "but not" exclusion (e.g. "not supported by the + // OpenFGA DSL syntax yet"). The protojson -> JSONString path handles the + // same model correctly. + jsonBytes, err := protojson.Marshal(res.GetAuthorizationModel()) + if err != nil { + return "", fmt.Errorf("openfga.ReadModel: marshal model: %w", err) + } + dsl, err := language.TransformJSONStringToDSL(string(jsonBytes)) + if err != nil { + return "", fmt.Errorf("openfga.ReadModel: render DSL: %w", err) + } + if dsl == nil { + return "", fmt.Errorf("openfga.ReadModel: render DSL returned nil") + } + return *dsl, nil +} diff --git a/internal/authorization/evaluator.go b/internal/authorization/evaluator.go deleted file mode 100644 index 101e9a87..00000000 --- a/internal/authorization/evaluator.go +++ /dev/null @@ -1,581 +0,0 @@ -package authorization - -import ( - "context" - "crypto/sha256" - "encoding/hex" - "fmt" - "sort" - "strings" - "time" - - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/metrics" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// MaxPrincipalPermissionEvaluations caps GetPrincipalPermissions at this many -// resource*scope evaluations per call. Callers hitting the cap receive a sentinel -// error so they can detect incomplete output. -const MaxPrincipalPermissionEvaluations = 10000 - -// Boolean-valued cache entries use these sentinel strings. Any other value -// stored under an evalKey is a bug — the lookup branch below treats it as a -// cache miss (returns to the full evaluation path) rather than silently -// coercing to false. -// -// These values are a stable wire format because the cache is now stored in -// memory_store (Redis or DB-backed), so values written by one process may be -// read by another at any time, including across rolling restarts. Changing -// either literal requires a full cache flush; do not edit without coordination. -const ( - cacheValTrue = "true" - cacheValFalse = "false" -) - -// policyResult holds the outcome of a single policy evaluation. -type policyResult struct { - denied bool - granted bool - policyName string -} - -// CheckPermission evaluates whether a principal can perform a scope on a resource. -// It is fail-closed: any missing permission row or unknown (resource, scope) pair -// results in a deny. It follows this sequence: -// 1. Validate inputs -// 2. Check MaxScopes ceiling -// 3. Check cache -// 4. Query storage for matching permissions -// 5. Evaluate policies using decision strategies -// 6. Cache and return result -// -// Every terminal path records exactly one metrics.RecordAuthzCheck call, and -// AuthzCheckDuration is observed via defer. -func (p *provider) CheckPermission(ctx context.Context, principal *Principal, resource string, scope string) (result *CheckResult, err error) { - start := time.Now() - defer func() { - metrics.AuthzCheckDuration.Observe(time.Since(start).Seconds()) - }() - - // Validate inputs. - if principal == nil { - metrics.RecordAuthzCheck(metrics.AuthzResultError) - return nil, fmt.Errorf("principal is required") - } - if !isValidIdentifier(principal.ID) { - metrics.RecordAuthzCheck(metrics.AuthzResultError) - return nil, fmt.Errorf("invalid principal ID: %q", principal.ID) - } - if !isValidIdentifier(resource) { - metrics.RecordAuthzCheck(metrics.AuthzResultError) - return nil, fmt.Errorf("invalid resource: %q", resource) - } - if !isValidIdentifier(scope) { - metrics.RecordAuthzCheck(metrics.AuthzResultError) - return nil, fmt.Errorf("invalid scope: %q", scope) - } - - // MaxScopes ceiling. - if principal.MaxScopes != nil { - scopeStr := resource + ":" + scope - found := false - for _, ms := range principal.MaxScopes { - if ms == scopeStr { - found = true - break - } - } - if !found { - p.log.Debug(). - Str("principal_id", principal.ID). - Str("resource", resource). - Str("scope", scope). - Msg("denied by MaxScopes ceiling") - metrics.RecordAuthzCheck(metrics.AuthzResultDenied) - return &CheckResult{Allowed: false}, nil - } - } - - // Cache lookup. Skip the memory_store round-trip entirely when caching - // is disabled (--authorization-cache-ttl=0) — no entry can exist and - // the extra IPC is pure latency waste. - // - // Otherwise memory_store.GetCache returns ("", nil) on miss; treat any - // error as a miss so a transient backend issue doesn't fail the request - // — we'll re-evaluate against storage. The same value space - // ("true"/"false") is used so a negative cached deny avoids a stampede - // on repeated probes. - cacheKey := evalKey(principal, resource, scope) - if p.config.CacheTTL > 0 { - cached, cacheErr := p.memoryStore.GetCache(cacheKey) - if cacheErr != nil { - p.log.Debug().Err(cacheErr).Str("cache_key", cacheKey). - Msg("authz: memory_store GetCache failed; treating as miss") - } - if cached != "" { - switch cached { - case cacheValTrue: - p.log.Debug(). - Str("principal_id", principal.ID). - Str("resource", resource). - Str("scope", scope). - Bool("allowed", true). - Msg("authorization cache hit") - metrics.RecordAuthzCheck(metrics.AuthzResultAllowed) - return &CheckResult{Allowed: true}, nil - case cacheValFalse: - p.log.Debug(). - Str("principal_id", principal.ID). - Str("resource", resource). - Str("scope", scope). - Bool("allowed", false). - Msg("authorization cache hit") - metrics.RecordAuthzCheck(metrics.AuthzResultDenied) - return &CheckResult{Allowed: false}, nil - default: - p.log.Warn().Str("cache_key", cacheKey).Str("value", cached). - Msg("authz: unexpected cached eval value, ignoring") - } - } - } - - // Resource/scope existence. Fail-closed: if the probe itself errors, surface the error to - // the caller rather than falling through to handleNoPermission. - knownResource, err := p.validateResourceExists(ctx, resource) - if err != nil { - metrics.RecordAuthzCheck(metrics.AuthzResultError) - return nil, err - } - knownScope := true - if knownResource { - // Only probe scope when resource is valid; avoids a second lookup on - // the unknown-resource path. - knownScope, err = p.validateScopeExists(ctx, scope) - if err != nil { - metrics.RecordAuthzCheck(metrics.AuthzResultError) - return nil, err - } - } - if !knownResource || !knownScope { - // Unknown identifier — skip counter bumps (DoS guard for attacker- - // controlled inputs reaching CheckPermission, e.g. via GraphQL - // permissions / required_permissions on authenticated endpoints). - return p.handleNoPermission(cacheKey, false /* isKnown */), nil - } - - // Permissions. - perms, err := p.storageProvider.GetPermissionsForResourceScope(ctx, resource, scope) - if err != nil { - metrics.RecordAuthzCheck(metrics.AuthzResultError) - return nil, fmt.Errorf("failed to query permissions: %w", err) - } - if len(perms) == 0 { - // Known (resource, scope) but no permission row — this is the signal - // we DO want to track for rollout. - return p.handleNoPermission(cacheKey, true /* isKnown */), nil - } - - // Policy evaluation. Track the first non-empty deny attribution so we - // can surface it on the deny path for audit/debugging — resolveDecision - // returns the denying policy name when an explicit deny fires; empty - // strings mean "no policy contributed a verdict." - var denyMatchedPolicy string - for _, perm := range perms { - allowed, matchedPolicy := p.evaluatePermission(principal, perm) - if allowed { - p.cacheStore(cacheKey, cacheValTrue) - p.log.Debug(). - Str("principal_id", principal.ID). - Str("resource", resource). - Str("scope", scope). - Str("matched_policy", matchedPolicy). - Msg("authorization granted") - metrics.RecordAuthzCheck(metrics.AuthzResultAllowed) - return &CheckResult{Allowed: true, MatchedPolicy: matchedPolicy}, nil - } - if denyMatchedPolicy == "" && matchedPolicy != "" { - denyMatchedPolicy = matchedPolicy - } - } - - // No permission granted access. - p.cacheStore(cacheKey, cacheValFalse) - p.log.Debug(). - Str("principal_id", principal.ID). - Str("resource", resource). - Str("scope", scope). - Str("matched_policy", denyMatchedPolicy). - Msg("authorization denied") - metrics.RecordAuthzCheck(metrics.AuthzResultDenied) - return &CheckResult{Allowed: false, MatchedPolicy: denyMatchedPolicy}, nil -} - -// handleNoPermission returns a deny result for an unmatched (resource, scope) -// pair, caches it under cacheKey, and conditionally records the unmatched -// metric. The isKnown parameter reports whether the pair is registered in the -// DB — the unmatched metric is recorded only for known pairs to prevent -// unbounded counter growth from attacker-controlled identifiers reaching -// CheckPermission via authenticated GraphQL (permissions / -// required_permissions). -func (p *provider) handleNoPermission(cacheKey string, isKnown bool) *CheckResult { - if isKnown { - metrics.RecordAuthzUnmatched() - } - p.cacheStore(cacheKey, cacheValFalse) - metrics.RecordAuthzCheck(metrics.AuthzResultUnmatched) - return &CheckResult{Allowed: false} -} - -// evaluatePermission evaluates all policies attached to a single permission -// and combines their results using the permission's decision strategy. -func (p *provider) evaluatePermission(principal *Principal, perm *schemas.PermissionWithPolicies) (bool, string) { - if len(perm.Policies) == 0 { - return false, "" - } - - results := make([]policyResult, 0, len(perm.Policies)) - for i := range perm.Policies { - policy := &perm.Policies[i] - denied, granted := p.evaluatePolicy(principal, policy) - results = append(results, policyResult{ - denied: denied, - granted: granted, - policyName: policy.PolicyName, - }) - } - - return resolveDecision(results, perm.DecisionStrategy) -} - -// evaluatePolicy evaluates a single policy against the principal. -// It checks whether the principal matches any of the policy's targets, -// then applies the policy's logic (positive = grant, negative = deny). -func (p *provider) evaluatePolicy(principal *Principal, policy *schemas.PolicyWithTargets) (denied bool, granted bool) { - if len(policy.Targets) == 0 { - return false, false - } - - var matched bool - switch policy.Type { - case constants.PolicyTypeRole: - matched = evaluateRoleTargets(policy.Targets, principal.Roles, policy.DecisionStrategy) - case constants.PolicyTypeUser: - matched = evaluateUserTargets(policy.Targets, principal.ID) - default: - // Unknown policy type -- fail closed. - p.log.Warn(). - Str("policy_type", policy.Type). - Str("policy_name", policy.PolicyName). - Msg("unknown policy type, denying") - return true, false - } - - // Apply logic: positive policies grant on match, negative policies deny on match. - if policy.Logic == constants.PolicyLogicNegative { - return matched, false - } - return false, matched -} - -// evaluateRoleTargets checks whether any (affirmative) or all (unanimous) of the -// role targets match the principal's roles. -func evaluateRoleTargets(targets []schemas.PolicyTargetView, roles []string, strategy string) bool { - roleSet := make(map[string]struct{}, len(roles)) - for _, r := range roles { - roleSet[r] = struct{}{} - } - - switch strategy { - case constants.DecisionStrategyUnanimous: - // All role targets must be present in the principal's roles. - evaluated := false - for _, t := range targets { - if t.TargetType != constants.TargetTypeRole { - continue - } - evaluated = true - if _, ok := roleSet[t.TargetValue]; !ok { - return false - } - } - return evaluated // false if no role targets existed - default: - // Affirmative (default): any role target match is sufficient. - for _, t := range targets { - if t.TargetType != constants.TargetTypeRole { - continue - } - if _, ok := roleSet[t.TargetValue]; ok { - return true - } - } - return false - } -} - -// evaluateUserTargets checks whether any of the user targets match the principal's ID. -func evaluateUserTargets(targets []schemas.PolicyTargetView, principalID string) bool { - for _, t := range targets { - if t.TargetType == constants.TargetTypeUser && t.TargetValue == principalID { - return true - } - } - return false -} - -// resolveDecision combines multiple policy results using the given strategy. -// Any explicit deny wins. Otherwise, affirmative grants on any allow, while -// unanimous requires every policy to grant. -func resolveDecision(results []policyResult, strategy string) (bool, string) { - if len(results) == 0 { - return false, "" - } - - for _, r := range results { - if r.denied { - return false, r.policyName - } - } - - switch strategy { - case constants.DecisionStrategyUnanimous: - // All policies must grant. - for _, r := range results { - if !r.granted { - return false, "" - } - } - return true, results[0].policyName - default: - // Affirmative: first grant wins. - for _, r := range results { - if r.granted { - return true, r.policyName - } - } - return false, "" - } -} - -// evalKey constructs a cache key for an authorization evaluation result. The -// effective roles and delegation ceiling are part of the key because the same -// principal ID can legitimately evaluate to different answers across sessions. -func evalKey(principal *Principal, resource, scope string) string { - fp := principalFingerprint(principal) - return fmt.Sprintf("authz:eval:%s:%s:%s:%s", principal.ID, fp, resource, scope) -} - -func principalFingerprint(principal *Principal) string { - roles := append([]string(nil), principal.Roles...) - sort.Strings(roles) - maxScopes := append([]string(nil), principal.MaxScopes...) - sort.Strings(maxScopes) - - h := sha256.New() - _, _ = h.Write([]byte(principal.Type)) - _, _ = h.Write([]byte{0}) - _, _ = h.Write([]byte(strings.Join(roles, "\x00"))) - _, _ = h.Write([]byte{0}) - _, _ = h.Write([]byte(strings.Join(maxScopes, "\x00"))) - return hex.EncodeToString(h.Sum(nil))[:16] -} - -// GetPrincipalPermissions returns all granted resource:scope pairs for a principal. -// It iterates all known resources and scopes, checking each combination. -func (p *provider) GetPrincipalPermissions(ctx context.Context, principal *Principal) ([]ResourceScope, error) { - if principal == nil { - return nil, fmt.Errorf("principal is required") - } - if !isValidIdentifier(principal.ID) { - return nil, fmt.Errorf("invalid principal ID: %q", principal.ID) - } - - // Fetch all resources. - resources, err := p.fetchAllResources(ctx) - if err != nil { - return nil, fmt.Errorf("failed to list resources: %w", err) - } - - // Fetch all scopes. - scopes, err := p.fetchAllScopes(ctx) - if err != nil { - return nil, fmt.Errorf("failed to list scopes: %w", err) - } - - // Hard ceiling: refuse to enumerate O(R*S) permissions beyond the cap. - // A tenant with, e.g., 1000 resources * 100 scopes = 100k CheckPermission - // calls per request would otherwise saturate the authz subsystem. - if int64(len(resources))*int64(len(scopes)) > int64(MaxPrincipalPermissionEvaluations) { - return nil, fmt.Errorf("too many permissions to enumerate: %d resources * %d scopes exceeds cap of %d", - len(resources), len(scopes), MaxPrincipalPermissionEvaluations) - } - - var granted []ResourceScope - for _, res := range resources { - for _, sc := range scopes { - result, err := p.CheckPermission(ctx, principal, res, sc) - if err != nil { - p.log.Warn().Err(err). - Str("resource", res). - Str("scope", sc). - Msg("error checking permission, skipping") - continue - } - if result.Allowed { - granted = append(granted, ResourceScope{ - Resource: res, - Scope: sc, - }) - } - } - } - - return granted, nil -} - -// InvalidateCache invalidates cached authorization data matching the given prefix. -// Both the local membership cache (validSets) and the memory_store decision cache -// are cleared so stale "allowed" results cannot persist after an admin mutation. -// -// When caching is disabled (--authorization-cache-ttl=0), the memory_store -// delete is skipped — nothing was ever written, so the round-trip would be -// pure waste. The local validSets clear is still cheap and stays unconditional. -func (p *provider) InvalidateCache(ctx context.Context, prefix string) { - p.cache.invalidateValidSets() - if p.config.CacheTTL > 0 { - if err := p.memoryStore.DeleteCacheByPrefix(prefix); err != nil { - p.log.Warn().Err(err).Str("prefix", prefix). - Msg("authz: memory_store DeleteCacheByPrefix failed; stale allow results may persist until TTL") - } - } - p.log.Debug().Str("prefix", prefix).Msg("authorization cache invalidated") -} - -// cacheStore writes a decision result to the memory_store cache. No-op when -// caching is disabled (CacheTTL <= 0). Errors are logged and swallowed — a -// failed write means the next read will fall through to a full evaluation, -// which is correct degradation; a write failure must never turn into a hard -// error on the request path. -func (p *provider) cacheStore(cacheKey, value string) { - if p.config.CacheTTL <= 0 { - return - } - if err := p.memoryStore.SetCache(cacheKey, value, p.config.CacheTTL); err != nil { - p.log.Debug().Err(err).Str("cache_key", cacheKey). - Msg("authz: memory_store SetCache failed; cache miss next time") - } -} - -// validateResourceExists reports whether the given resource is registered. -// Returns (true, nil) if known; (false, nil) if definitively unknown; -// (false, err) if the storage probe itself failed. -// -// A probe error must NOT be masked as "unknown" — fail-closed on probe -// error so a transient DB blip surfaces as an error to the caller rather -// than falling through to handleNoPermission's deny path (which would -// look indistinguishable from a legitimate unknown resource). -func (p *provider) validateResourceExists(ctx context.Context, resource string) (bool, error) { - cacheKey := validResourcesKey() - if set, ok := p.cache.getValidSet(cacheKey); ok { - _, found := set[resource] - return found, nil - } - - names, err := p.fetchAllResources(ctx) - if err != nil { - return false, fmt.Errorf("probe resources: %w", err) - } - - set := make(map[string]struct{}, len(names)) - for _, n := range names { - set[n] = struct{}{} - } - p.cache.setValidSet(cacheKey, set) - - _, found := set[resource] - return found, nil -} - -// validateScopeExists reports whether the given scope is registered. -// Returns (true, nil) if known; (false, nil) if definitively unknown; -// (false, err) if the storage probe itself failed. -func (p *provider) validateScopeExists(ctx context.Context, scope string) (bool, error) { - cacheKey := validScopesKey() - if set, ok := p.cache.getValidSet(cacheKey); ok { - _, found := set[scope] - return found, nil - } - - names, err := p.fetchAllScopes(ctx) - if err != nil { - return false, fmt.Errorf("probe scopes: %w", err) - } - - set := make(map[string]struct{}, len(names)) - for _, n := range names { - set[n] = struct{}{} - } - p.cache.setValidSet(cacheKey, set) - - _, found := set[scope] - return found, nil -} - -// fetchAllResources retrieves all resource names from storage using pagination. -func (p *provider) fetchAllResources(ctx context.Context) ([]string, error) { - var names []string - page := int64(1) - limit := int64(100) - - for { - pagination := &model.Pagination{ - Limit: limit, - Offset: (page - 1) * limit, - Page: page, - } - resources, paginationResult, err := p.storageProvider.ListResources(ctx, pagination) - if err != nil { - return nil, err - } - for _, r := range resources { - names = append(names, r.Name) - } - // If we got fewer results than the limit, or reached the total, we're done. - if int64(len(resources)) < limit || (paginationResult != nil && paginationResult.Total <= page*limit) { - break - } - page++ - } - - return names, nil -} - -// fetchAllScopes retrieves all scope names from storage using pagination. -func (p *provider) fetchAllScopes(ctx context.Context) ([]string, error) { - var names []string - page := int64(1) - limit := int64(100) - - for { - pagination := &model.Pagination{ - Limit: limit, - Offset: (page - 1) * limit, - Page: page, - } - scopes, paginationResult, err := p.storageProvider.ListScopes(ctx, pagination) - if err != nil { - return nil, err - } - for _, s := range scopes { - names = append(names, s.Name) - } - if int64(len(scopes)) < limit || (paginationResult != nil && paginationResult.Total <= page*limit) { - break - } - page++ - } - - return names, nil -} diff --git a/internal/authorization/provider.go b/internal/authorization/provider.go deleted file mode 100644 index 911082c3..00000000 --- a/internal/authorization/provider.go +++ /dev/null @@ -1,102 +0,0 @@ -package authorization - -import ( - "context" - "fmt" - - "github.com/rs/zerolog" - - "github.com/authorizerdev/authorizer/internal/memory_store" - "github.com/authorizerdev/authorizer/internal/storage" -) - -// Principal represents the entity requesting access. -// It is deliberately agnostic -- a Principal can be a human user, -// a service account (M2M), or an AI agent. The evaluation engine -// does not care about the origin; it only evaluates policies against -// the principal's identity and roles. -type Principal struct { - // ID is the unique identifier of the principal (user ID, client ID, agent ID). - ID string - // Type is the kind of principal: "user", "client", or "agent". - Type string - // Roles are the roles assigned to this principal. - Roles []string - // MaxScopes is an optional delegation ceiling. If set, the principal - // can never be granted permissions beyond this set, regardless of - // what policies say. Format: []string{"resource:scope", ...}. - // Nil means no ceiling (full access based on policies). - MaxScopes []string -} - -// ResourceScope pairs a resource name with a scope name. -// Used for returning all permissions a principal has. -type ResourceScope struct { - Resource string `json:"resource"` - Scope string `json:"scope"` -} - -// CheckResult contains the result of a permission check with debugging info. -type CheckResult struct { - // Allowed is true if the principal has the requested permission. - Allowed bool - // MatchedPolicy is the name of the policy that granted access (empty if denied). - MatchedPolicy string -} - -// Provider defines the authorization evaluation engine interface. -type Provider interface { - // CheckPermission evaluates whether a principal can perform a scope on a resource. - CheckPermission(ctx context.Context, principal *Principal, resource string, scope string) (*CheckResult, error) - - // GetPrincipalPermissions returns all granted resource:scope pairs for a principal. - // Used for JWT embedding and dashboard display. - GetPrincipalPermissions(ctx context.Context, principal *Principal) ([]ResourceScope, error) - - // InvalidateCache removes cached authorization data matching the given prefix. - // Called by admin mutations when permissions/policies change. - InvalidateCache(ctx context.Context, prefix string) -} - -// Dependencies carries shared resources for constructing an authorization Provider. -type Dependencies struct { - Log *zerolog.Logger - StorageProvider storage.Provider - MemoryStoreProvider memory_store.Provider -} - -// Config holds authorization-specific configuration. -// This is separate from the main config to avoid circular imports. -// The values are passed in from cmd/root.go. -type Config struct { - // CacheTTL is the cache time-to-live in seconds. 0 disables caching. - CacheTTL int64 -} - -// provider implements the Provider interface. -type provider struct { - config *Config - log *zerolog.Logger - storageProvider storage.Provider - memoryStore memory_store.Provider - cache *cache -} - -// New creates a new authorization provider. -// -// MemoryStoreProvider is required: the evaluator's decision cache is -// delegated to it. Missing it would surface as a nil-pointer panic on the -// first CheckPermission call; we'd rather fail loudly at construction. -func New(cfg *Config, deps *Dependencies) (Provider, error) { - if deps == nil || deps.MemoryStoreProvider == nil { - return nil, fmt.Errorf("authorization.New: MemoryStoreProvider is required") - } - p := &provider{ - config: cfg, - log: deps.Log, - storageProvider: deps.StorageProvider, - memoryStore: deps.MemoryStoreProvider, - cache: newCache(cfg.CacheTTL), - } - return p, nil -} diff --git a/internal/authorization/validators.go b/internal/authorization/validators.go deleted file mode 100644 index b91422ce..00000000 --- a/internal/authorization/validators.go +++ /dev/null @@ -1,22 +0,0 @@ -package authorization - -import ( - "unicode" - - "github.com/authorizerdev/authorizer/internal/constants" -) - -// isValidIdentifier checks that a string is safe for use in cache keys -// and database queries. Allows alphanumeric, hyphens, underscores. -// Max constants.MaxAuthzIdentifierLength characters. Empty strings are invalid. -func isValidIdentifier(s string) bool { - if len(s) == 0 || len(s) > constants.MaxAuthzIdentifierLength { - return false - } - for _, r := range s { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '-' && r != '_' { - return false - } - } - return true -} diff --git a/internal/config/config.go b/internal/config/config.go index 213ca073..4f52ef9f 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -327,4 +327,27 @@ type Config struct { // AuthorizationLogAllChecks controls whether all permission checks are audit logged. // When false (default), only denied checks are logged. When true, all checks are logged. AuthorizationLogAllChecks bool + + // OpenFGA / Fine-Grained Authorization engine (Phase 1 — additive) + // These configure the OpenFGA-backed AuthorizationEngine. The engine is + // selectable but NOT yet the default; existing policy-based authorization is + // unchanged when AuthorizationEngine is empty or "policy". + + // AuthorizationEngine selects the authorization backend: "policy" (existing + // resource/scope/policy engine, default) or "fga" (OpenFGA ReBAC engine). + // Empty is treated as "policy" to preserve existing behavior. + AuthorizationEngine string + // FGAMode selects how the OpenFGA engine runs: "embedded" (in-process, + // default) or "external" (a standalone OpenFGA service). Only relevant when + // AuthorizationEngine is "fga". + FGAMode string + // FGAStore selects the OpenFGA datastore kind: "memory" (dev/tests), + // "sqlite" (single-node), "postgres" or "mysql" (HA). Default: "memory". + FGAStore string + // FGAStoreURL is the OpenFGA datastore connection URI: a file: URI for + // sqlite, or a DSN for postgres/mysql. Ignored for the memory store. + FGAStoreURL string + // FGAExternalURL is the gRPC URL of an external OpenFGA service. Only used + // when FGAMode is "external". + FGAExternalURL string } diff --git a/internal/constants/audit_event.go b/internal/constants/audit_event.go index 804b775b..8f636bc3 100644 --- a/internal/constants/audit_event.go +++ b/internal/constants/audit_event.go @@ -22,14 +22,10 @@ const ( AuditResourceTypeEmailTemplate = "email_template" // AuditResourceTypeToken represents an auth token. AuditResourceTypeToken = "token" - // AuditResourceTypeAuthzPermission represents a fine-grained-authorization permission entity. - AuditResourceTypeAuthzPermission = "authz_permission" - // AuditResourceTypeAuthzPolicy represents a fine-grained-authorization policy entity. - AuditResourceTypeAuthzPolicy = "authz_policy" - // AuditResourceTypeAuthzResource represents a fine-grained-authorization resource entity. - AuditResourceTypeAuthzResource = "authz_resource" - // AuditResourceTypeAuthzScope represents a fine-grained-authorization scope entity. - AuditResourceTypeAuthzScope = "authz_scope" + // AuditResourceTypeFgaModel represents a fine-grained authorization model. + AuditResourceTypeFgaModel = "fga_model" + // AuditResourceTypeFgaTuple represents a fine-grained authorization tuple. + AuditResourceTypeFgaTuple = "fga_tuple" ) // Audit event type constants used for structured audit logging. @@ -102,31 +98,12 @@ const ( AuditAdminEmailTemplateUpdatedEvent = "admin.email_template_updated" // AuditAdminEmailTemplateDeletedEvent is logged when an admin deletes an email template. AuditAdminEmailTemplateDeletedEvent = "admin.email_template_deleted" - - // AuditAdminAuthzPermissionCreatedEvent is logged when an admin creates an authz permission. - AuditAdminAuthzPermissionCreatedEvent = "admin.authz_permission_created" - // AuditAdminAuthzPermissionUpdatedEvent is logged when an admin updates an authz permission. - AuditAdminAuthzPermissionUpdatedEvent = "admin.authz_permission_updated" - // AuditAdminAuthzPermissionDeletedEvent is logged when an admin deletes an authz permission. - AuditAdminAuthzPermissionDeletedEvent = "admin.authz_permission_deleted" - // AuditAdminAuthzPolicyCreatedEvent is logged when an admin creates an authz policy. - AuditAdminAuthzPolicyCreatedEvent = "admin.authz_policy_created" - // AuditAdminAuthzPolicyUpdatedEvent is logged when an admin updates an authz policy. - AuditAdminAuthzPolicyUpdatedEvent = "admin.authz_policy_updated" - // AuditAdminAuthzPolicyDeletedEvent is logged when an admin deletes an authz policy. - AuditAdminAuthzPolicyDeletedEvent = "admin.authz_policy_deleted" - // AuditAdminAuthzResourceCreatedEvent is logged when an admin creates an authz resource. - AuditAdminAuthzResourceCreatedEvent = "admin.authz_resource_created" - // AuditAdminAuthzResourceUpdatedEvent is logged when an admin updates an authz resource. - AuditAdminAuthzResourceUpdatedEvent = "admin.authz_resource_updated" - // AuditAdminAuthzResourceDeletedEvent is logged when an admin deletes an authz resource. - AuditAdminAuthzResourceDeletedEvent = "admin.authz_resource_deleted" - // AuditAdminAuthzScopeCreatedEvent is logged when an admin creates an authz scope. - AuditAdminAuthzScopeCreatedEvent = "admin.authz_scope_created" - // AuditAdminAuthzScopeUpdatedEvent is logged when an admin updates an authz scope. - AuditAdminAuthzScopeUpdatedEvent = "admin.authz_scope_updated" - // AuditAdminAuthzScopeDeletedEvent is logged when an admin deletes an authz scope. - AuditAdminAuthzScopeDeletedEvent = "admin.authz_scope_deleted" + // AuditAdminFgaModelWrittenEvent is logged when an admin writes a fine-grained authorization model. + AuditAdminFgaModelWrittenEvent = "admin.fga_model_written" + // AuditAdminFgaTuplesWrittenEvent is logged when an admin writes fine-grained authorization tuples. + AuditAdminFgaTuplesWrittenEvent = "admin.fga_tuples_written" + // AuditAdminFgaTuplesDeletedEvent is logged when an admin deletes fine-grained authorization tuples. + AuditAdminFgaTuplesDeletedEvent = "admin.fga_tuples_deleted" // AuditOAuthLoginInitiatedEvent is logged when an OAuth login flow is started. AuditOAuthLoginInitiatedEvent = "oauth.login_initiated" diff --git a/internal/constants/authorization.go b/internal/constants/authorization.go deleted file mode 100644 index b16ad784..00000000 --- a/internal/constants/authorization.go +++ /dev/null @@ -1,38 +0,0 @@ -package constants - -const ( - // PolicyTypeRole is the policy type for role-based policies. - // A role-based policy grants or denies access based on the principal's roles. - PolicyTypeRole = "role" - // PolicyTypeUser is the policy type for user-based policies. - // A user-based policy grants or denies access to specific user IDs. - PolicyTypeUser = "user" - - // PolicyLogicPositive grants access when the policy condition matches. - PolicyLogicPositive = "positive" - // PolicyLogicNegative denies access when the policy condition matches (blacklist). - PolicyLogicNegative = "negative" - - // DecisionStrategyAffirmative grants if ANY policy/target grants (OR logic). - DecisionStrategyAffirmative = "affirmative" - // DecisionStrategyUnanimous grants only if ALL policies/targets agree (AND logic). - DecisionStrategyUnanimous = "unanimous" - - // PrincipalTypeUser identifies a human user principal (from authorization_code grant). - PrincipalTypeUser = "user" - // PrincipalTypeClient identifies a service/M2M principal (from client_credentials grant). - PrincipalTypeClient = "client" - // PrincipalTypeAgent identifies an AI agent principal (future use). - PrincipalTypeAgent = "agent" - - // TargetTypeRole is a policy target that matches by role name. - TargetTypeRole = "role" - // TargetTypeUser is a policy target that matches by user ID. - TargetTypeUser = "user" - - // MaxAuthzIdentifierLength is the maximum allowed length for - // authorization resource names, scope names, policy names, and other - // FGA identifiers. The limit keeps caches bounded and ensures identifiers - // fit within reasonable index / column sizes across all storage providers. - MaxAuthzIdentifierLength = 100 -) diff --git a/internal/graph/generated/generated.go b/internal/graph/generated/generated.go index e25d9fc6..cdf463d1 100644 --- a/internal/graph/generated/generated.go +++ b/internal/graph/generated/generated.go @@ -80,72 +80,6 @@ type ComplexityRoot struct { User func(childComplexity int) int } - AuthzPermission struct { - CreatedAt func(childComplexity int) int - DecisionStrategy func(childComplexity int) int - Description func(childComplexity int) int - ID func(childComplexity int) int - Name func(childComplexity int) int - Policies func(childComplexity int) int - Resource func(childComplexity int) int - Scopes func(childComplexity int) int - UpdatedAt func(childComplexity int) int - } - - AuthzPermissions struct { - Pagination func(childComplexity int) int - Permissions func(childComplexity int) int - } - - AuthzPolicies struct { - Pagination func(childComplexity int) int - Policies func(childComplexity int) int - } - - AuthzPolicy struct { - CreatedAt func(childComplexity int) int - DecisionStrategy func(childComplexity int) int - Description func(childComplexity int) int - ID func(childComplexity int) int - Logic func(childComplexity int) int - Name func(childComplexity int) int - Targets func(childComplexity int) int - Type func(childComplexity int) int - UpdatedAt func(childComplexity int) int - } - - AuthzPolicyTarget struct { - ID func(childComplexity int) int - TargetType func(childComplexity int) int - TargetValue func(childComplexity int) int - } - - AuthzResource struct { - CreatedAt func(childComplexity int) int - Description func(childComplexity int) int - ID func(childComplexity int) int - Name func(childComplexity int) int - UpdatedAt func(childComplexity int) int - } - - AuthzResources struct { - Pagination func(childComplexity int) int - Resources func(childComplexity int) int - } - - AuthzScope struct { - CreatedAt func(childComplexity int) int - Description func(childComplexity int) int - ID func(childComplexity int) int - Name func(childComplexity int) int - UpdatedAt func(childComplexity int) int - } - - AuthzScopes struct { - Pagination func(childComplexity int) int - Scopes func(childComplexity int) int - } - EmailTemplate struct { CreatedAt func(childComplexity int) int Design func(childComplexity int) int @@ -240,6 +174,34 @@ type ComplexityRoot struct { Reason func(childComplexity int) int } + FgaBatchCheckResponse struct { + Results func(childComplexity int) int + } + + FgaCheckResponse struct { + Allowed func(childComplexity int) int + } + + FgaListObjectsResponse struct { + Objects func(childComplexity int) int + } + + FgaModel struct { + Dsl func(childComplexity int) int + ID func(childComplexity int) int + } + + FgaTuple struct { + Object func(childComplexity int) int + Relation func(childComplexity int) int + User func(childComplexity int) int + } + + FgaTuples struct { + ContinuationToken func(childComplexity int) int + Tuples func(childComplexity int) int + } + ForgotPasswordResponse struct { Message func(childComplexity int) int ShouldShowMobileOtpScreen func(childComplexity int) int @@ -280,50 +242,41 @@ type ComplexityRoot struct { } Mutation struct { - AddEmailTemplate func(childComplexity int, params model.AddEmailTemplateRequest) int - AddWebhook func(childComplexity int, params model.AddWebhookRequest) int - AdminLogin func(childComplexity int, params model.AdminLoginRequest) int - AdminLogout func(childComplexity int) int - AdminSignup func(childComplexity int, params model.AdminSignupRequest) int - AuthzAddPermission func(childComplexity int, params model.AddPermissionInput) int - AuthzAddPolicy func(childComplexity int, params model.AddPolicyInput) int - AuthzAddResource func(childComplexity int, params model.AddResourceInput) int - AuthzAddScope func(childComplexity int, params model.AddScopeInput) int - AuthzDeletePermission func(childComplexity int, id string) int - AuthzDeletePolicy func(childComplexity int, id string) int - AuthzDeleteResource func(childComplexity int, id string) int - AuthzDeleteScope func(childComplexity int, id string) int - AuthzUpdatePermission func(childComplexity int, params model.UpdatePermissionInput) int - AuthzUpdatePolicy func(childComplexity int, params model.UpdatePolicyInput) int - AuthzUpdateResource func(childComplexity int, params model.UpdateResourceInput) int - AuthzUpdateScope func(childComplexity int, params model.UpdateScopeInput) int - DeactivateAccount func(childComplexity int) int - DeleteEmailTemplate func(childComplexity int, params model.DeleteEmailTemplateRequest) int - DeleteUser func(childComplexity int, params model.DeleteUserRequest) int - DeleteWebhook func(childComplexity int, params model.WebhookRequest) int - EnableAccess func(childComplexity int, param model.UpdateAccessRequest) int - ForgotPassword func(childComplexity int, params model.ForgotPasswordRequest) int - GenerateJwtKeys func(childComplexity int, params model.GenerateJWTKeysRequest) int - InviteMembers func(childComplexity int, params model.InviteMemberRequest) int - Login func(childComplexity int, params model.LoginRequest) int - Logout func(childComplexity int) int - MagicLinkLogin func(childComplexity int, params model.MagicLinkLoginRequest) int - MobileLogin func(childComplexity int, params model.MobileLoginRequest) int - MobileSignup func(childComplexity int, params *model.MobileSignUpRequest) int - ResendOtp func(childComplexity int, params model.ResendOTPRequest) int - ResendVerifyEmail func(childComplexity int, params model.ResendVerifyEmailRequest) int - ResetPassword func(childComplexity int, params model.ResetPasswordRequest) int - Revoke func(childComplexity int, params model.OAuthRevokeRequest) int - RevokeAccess func(childComplexity int, param model.UpdateAccessRequest) int - Signup func(childComplexity int, params model.SignUpRequest) int - TestEndpoint func(childComplexity int, params model.TestEndpointRequest) int - UpdateEmailTemplate func(childComplexity int, params model.UpdateEmailTemplateRequest) int - UpdateEnv func(childComplexity int, params model.UpdateEnvRequest) int - UpdateProfile func(childComplexity int, params model.UpdateProfileRequest) int - UpdateUser func(childComplexity int, params model.UpdateUserRequest) int - UpdateWebhook func(childComplexity int, params model.UpdateWebhookRequest) int - VerifyEmail func(childComplexity int, params model.VerifyEmailRequest) int - VerifyOtp func(childComplexity int, params model.VerifyOTPRequest) int + AddEmailTemplate func(childComplexity int, params model.AddEmailTemplateRequest) int + AddWebhook func(childComplexity int, params model.AddWebhookRequest) int + AdminLogin func(childComplexity int, params model.AdminLoginRequest) int + AdminLogout func(childComplexity int) int + AdminSignup func(childComplexity int, params model.AdminSignupRequest) int + DeactivateAccount func(childComplexity int) int + DeleteEmailTemplate func(childComplexity int, params model.DeleteEmailTemplateRequest) int + DeleteUser func(childComplexity int, params model.DeleteUserRequest) int + DeleteWebhook func(childComplexity int, params model.WebhookRequest) int + EnableAccess func(childComplexity int, param model.UpdateAccessRequest) int + FgaDeleteTuples func(childComplexity int, params model.FgaWriteTuplesInput) int + FgaWriteModel func(childComplexity int, params model.FgaWriteModelInput) int + FgaWriteTuples func(childComplexity int, params model.FgaWriteTuplesInput) int + ForgotPassword func(childComplexity int, params model.ForgotPasswordRequest) int + GenerateJwtKeys func(childComplexity int, params model.GenerateJWTKeysRequest) int + InviteMembers func(childComplexity int, params model.InviteMemberRequest) int + Login func(childComplexity int, params model.LoginRequest) int + Logout func(childComplexity int) int + MagicLinkLogin func(childComplexity int, params model.MagicLinkLoginRequest) int + MobileLogin func(childComplexity int, params model.MobileLoginRequest) int + MobileSignup func(childComplexity int, params *model.MobileSignUpRequest) int + ResendOtp func(childComplexity int, params model.ResendOTPRequest) int + ResendVerifyEmail func(childComplexity int, params model.ResendVerifyEmailRequest) int + ResetPassword func(childComplexity int, params model.ResetPasswordRequest) int + Revoke func(childComplexity int, params model.OAuthRevokeRequest) int + RevokeAccess func(childComplexity int, param model.UpdateAccessRequest) int + Signup func(childComplexity int, params model.SignUpRequest) int + TestEndpoint func(childComplexity int, params model.TestEndpointRequest) int + UpdateEmailTemplate func(childComplexity int, params model.UpdateEmailTemplateRequest) int + UpdateEnv func(childComplexity int, params model.UpdateEnvRequest) int + UpdateProfile func(childComplexity int, params model.UpdateProfileRequest) int + UpdateUser func(childComplexity int, params model.UpdateUserRequest) int + UpdateWebhook func(childComplexity int, params model.UpdateWebhookRequest) int + VerifyEmail func(childComplexity int, params model.VerifyEmailRequest) int + VerifyOtp func(childComplexity int, params model.VerifyOTPRequest) int } Pagination struct { @@ -333,22 +286,17 @@ type ComplexityRoot struct { Total func(childComplexity int) int } - Permission struct { - Resource func(childComplexity int) int - Scope func(childComplexity int) int - } - Query struct { AdminSession func(childComplexity int) int AuditLogs func(childComplexity int, params *model.ListAuditLogRequest) int - AuthzPermissions func(childComplexity int, params *model.PaginatedRequest) int - AuthzPolicies func(childComplexity int, params *model.PaginatedRequest) int - AuthzResources func(childComplexity int, params *model.PaginatedRequest) int - AuthzScopes func(childComplexity int, params *model.PaginatedRequest) int EmailTemplates func(childComplexity int, params *model.PaginatedRequest) int Env func(childComplexity int) int + FgaBatchCheck func(childComplexity int, params model.FgaBatchCheckInput) int + FgaCheck func(childComplexity int, params model.FgaCheckInput) int + FgaGetModel func(childComplexity int) int + FgaListObjects func(childComplexity int, params model.FgaListObjectsInput) int + FgaReadTuples func(childComplexity int, params model.FgaReadTuplesInput) int Meta func(childComplexity int) int - Permissions func(childComplexity int) int Profile func(childComplexity int) int Session func(childComplexity int, params *model.SessionQueryRequest) int User func(childComplexity int, params model.GetUserRequest) int @@ -490,18 +438,9 @@ type MutationResolver interface { AddEmailTemplate(ctx context.Context, params model.AddEmailTemplateRequest) (*model.Response, error) UpdateEmailTemplate(ctx context.Context, params model.UpdateEmailTemplateRequest) (*model.Response, error) DeleteEmailTemplate(ctx context.Context, params model.DeleteEmailTemplateRequest) (*model.Response, error) - AuthzAddResource(ctx context.Context, params model.AddResourceInput) (*model.AuthzResource, error) - AuthzUpdateResource(ctx context.Context, params model.UpdateResourceInput) (*model.AuthzResource, error) - AuthzDeleteResource(ctx context.Context, id string) (*model.Response, error) - AuthzAddScope(ctx context.Context, params model.AddScopeInput) (*model.AuthzScope, error) - AuthzUpdateScope(ctx context.Context, params model.UpdateScopeInput) (*model.AuthzScope, error) - AuthzDeleteScope(ctx context.Context, id string) (*model.Response, error) - AuthzAddPolicy(ctx context.Context, params model.AddPolicyInput) (*model.AuthzPolicy, error) - AuthzUpdatePolicy(ctx context.Context, params model.UpdatePolicyInput) (*model.AuthzPolicy, error) - AuthzDeletePolicy(ctx context.Context, id string) (*model.Response, error) - AuthzAddPermission(ctx context.Context, params model.AddPermissionInput) (*model.AuthzPermission, error) - AuthzUpdatePermission(ctx context.Context, params model.UpdatePermissionInput) (*model.AuthzPermission, error) - AuthzDeletePermission(ctx context.Context, id string) (*model.Response, error) + FgaWriteModel(ctx context.Context, params model.FgaWriteModelInput) (*model.FgaModel, error) + FgaWriteTuples(ctx context.Context, params model.FgaWriteTuplesInput) (*model.Response, error) + FgaDeleteTuples(ctx context.Context, params model.FgaWriteTuplesInput) (*model.Response, error) } type QueryResolver interface { Meta(ctx context.Context) (*model.Meta, error) @@ -519,11 +458,11 @@ type QueryResolver interface { WebhookLogs(ctx context.Context, params *model.ListWebhookLogRequest) (*model.WebhookLogs, error) EmailTemplates(ctx context.Context, params *model.PaginatedRequest) (*model.EmailTemplates, error) AuditLogs(ctx context.Context, params *model.ListAuditLogRequest) (*model.AuditLogs, error) - AuthzResources(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzResources, error) - AuthzScopes(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzScopes, error) - AuthzPolicies(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzPolicies, error) - AuthzPermissions(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzPermissions, error) - Permissions(ctx context.Context) ([]*model.Permission, error) + FgaGetModel(ctx context.Context) (*model.FgaModel, error) + FgaReadTuples(ctx context.Context, params model.FgaReadTuplesInput) (*model.FgaTuples, error) + FgaCheck(ctx context.Context, params model.FgaCheckInput) (*model.FgaCheckResponse, error) + FgaBatchCheck(ctx context.Context, params model.FgaBatchCheckInput) (*model.FgaBatchCheckResponse, error) + FgaListObjects(ctx context.Context, params model.FgaListObjectsInput) (*model.FgaListObjectsResponse, error) } type executableSchema struct { @@ -720,279 +659,6 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.AuthResponse.User(childComplexity), true - case "AuthzPermission.created_at": - if e.complexity.AuthzPermission.CreatedAt == nil { - break - } - - return e.complexity.AuthzPermission.CreatedAt(childComplexity), true - - case "AuthzPermission.decision_strategy": - if e.complexity.AuthzPermission.DecisionStrategy == nil { - break - } - - return e.complexity.AuthzPermission.DecisionStrategy(childComplexity), true - - case "AuthzPermission.description": - if e.complexity.AuthzPermission.Description == nil { - break - } - - return e.complexity.AuthzPermission.Description(childComplexity), true - - case "AuthzPermission.id": - if e.complexity.AuthzPermission.ID == nil { - break - } - - return e.complexity.AuthzPermission.ID(childComplexity), true - - case "AuthzPermission.name": - if e.complexity.AuthzPermission.Name == nil { - break - } - - return e.complexity.AuthzPermission.Name(childComplexity), true - - case "AuthzPermission.policies": - if e.complexity.AuthzPermission.Policies == nil { - break - } - - return e.complexity.AuthzPermission.Policies(childComplexity), true - - case "AuthzPermission.resource": - if e.complexity.AuthzPermission.Resource == nil { - break - } - - return e.complexity.AuthzPermission.Resource(childComplexity), true - - case "AuthzPermission.scopes": - if e.complexity.AuthzPermission.Scopes == nil { - break - } - - return e.complexity.AuthzPermission.Scopes(childComplexity), true - - case "AuthzPermission.updated_at": - if e.complexity.AuthzPermission.UpdatedAt == nil { - break - } - - return e.complexity.AuthzPermission.UpdatedAt(childComplexity), true - - case "AuthzPermissions.pagination": - if e.complexity.AuthzPermissions.Pagination == nil { - break - } - - return e.complexity.AuthzPermissions.Pagination(childComplexity), true - - case "AuthzPermissions.permissions": - if e.complexity.AuthzPermissions.Permissions == nil { - break - } - - return e.complexity.AuthzPermissions.Permissions(childComplexity), true - - case "AuthzPolicies.pagination": - if e.complexity.AuthzPolicies.Pagination == nil { - break - } - - return e.complexity.AuthzPolicies.Pagination(childComplexity), true - - case "AuthzPolicies.policies": - if e.complexity.AuthzPolicies.Policies == nil { - break - } - - return e.complexity.AuthzPolicies.Policies(childComplexity), true - - case "AuthzPolicy.created_at": - if e.complexity.AuthzPolicy.CreatedAt == nil { - break - } - - return e.complexity.AuthzPolicy.CreatedAt(childComplexity), true - - case "AuthzPolicy.decision_strategy": - if e.complexity.AuthzPolicy.DecisionStrategy == nil { - break - } - - return e.complexity.AuthzPolicy.DecisionStrategy(childComplexity), true - - case "AuthzPolicy.description": - if e.complexity.AuthzPolicy.Description == nil { - break - } - - return e.complexity.AuthzPolicy.Description(childComplexity), true - - case "AuthzPolicy.id": - if e.complexity.AuthzPolicy.ID == nil { - break - } - - return e.complexity.AuthzPolicy.ID(childComplexity), true - - case "AuthzPolicy.logic": - if e.complexity.AuthzPolicy.Logic == nil { - break - } - - return e.complexity.AuthzPolicy.Logic(childComplexity), true - - case "AuthzPolicy.name": - if e.complexity.AuthzPolicy.Name == nil { - break - } - - return e.complexity.AuthzPolicy.Name(childComplexity), true - - case "AuthzPolicy.targets": - if e.complexity.AuthzPolicy.Targets == nil { - break - } - - return e.complexity.AuthzPolicy.Targets(childComplexity), true - - case "AuthzPolicy.type": - if e.complexity.AuthzPolicy.Type == nil { - break - } - - return e.complexity.AuthzPolicy.Type(childComplexity), true - - case "AuthzPolicy.updated_at": - if e.complexity.AuthzPolicy.UpdatedAt == nil { - break - } - - return e.complexity.AuthzPolicy.UpdatedAt(childComplexity), true - - case "AuthzPolicyTarget.id": - if e.complexity.AuthzPolicyTarget.ID == nil { - break - } - - return e.complexity.AuthzPolicyTarget.ID(childComplexity), true - - case "AuthzPolicyTarget.target_type": - if e.complexity.AuthzPolicyTarget.TargetType == nil { - break - } - - return e.complexity.AuthzPolicyTarget.TargetType(childComplexity), true - - case "AuthzPolicyTarget.target_value": - if e.complexity.AuthzPolicyTarget.TargetValue == nil { - break - } - - return e.complexity.AuthzPolicyTarget.TargetValue(childComplexity), true - - case "AuthzResource.created_at": - if e.complexity.AuthzResource.CreatedAt == nil { - break - } - - return e.complexity.AuthzResource.CreatedAt(childComplexity), true - - case "AuthzResource.description": - if e.complexity.AuthzResource.Description == nil { - break - } - - return e.complexity.AuthzResource.Description(childComplexity), true - - case "AuthzResource.id": - if e.complexity.AuthzResource.ID == nil { - break - } - - return e.complexity.AuthzResource.ID(childComplexity), true - - case "AuthzResource.name": - if e.complexity.AuthzResource.Name == nil { - break - } - - return e.complexity.AuthzResource.Name(childComplexity), true - - case "AuthzResource.updated_at": - if e.complexity.AuthzResource.UpdatedAt == nil { - break - } - - return e.complexity.AuthzResource.UpdatedAt(childComplexity), true - - case "AuthzResources.pagination": - if e.complexity.AuthzResources.Pagination == nil { - break - } - - return e.complexity.AuthzResources.Pagination(childComplexity), true - - case "AuthzResources.resources": - if e.complexity.AuthzResources.Resources == nil { - break - } - - return e.complexity.AuthzResources.Resources(childComplexity), true - - case "AuthzScope.created_at": - if e.complexity.AuthzScope.CreatedAt == nil { - break - } - - return e.complexity.AuthzScope.CreatedAt(childComplexity), true - - case "AuthzScope.description": - if e.complexity.AuthzScope.Description == nil { - break - } - - return e.complexity.AuthzScope.Description(childComplexity), true - - case "AuthzScope.id": - if e.complexity.AuthzScope.ID == nil { - break - } - - return e.complexity.AuthzScope.ID(childComplexity), true - - case "AuthzScope.name": - if e.complexity.AuthzScope.Name == nil { - break - } - - return e.complexity.AuthzScope.Name(childComplexity), true - - case "AuthzScope.updated_at": - if e.complexity.AuthzScope.UpdatedAt == nil { - break - } - - return e.complexity.AuthzScope.UpdatedAt(childComplexity), true - - case "AuthzScopes.pagination": - if e.complexity.AuthzScopes.Pagination == nil { - break - } - - return e.complexity.AuthzScopes.Pagination(childComplexity), true - - case "AuthzScopes.scopes": - if e.complexity.AuthzScopes.Scopes == nil { - break - } - - return e.complexity.AuthzScopes.Scopes(childComplexity), true - case "EmailTemplate.created_at": if e.complexity.EmailTemplate.CreatedAt == nil { break @@ -1567,6 +1233,76 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Error.Reason(childComplexity), true + case "FgaBatchCheckResponse.results": + if e.complexity.FgaBatchCheckResponse.Results == nil { + break + } + + return e.complexity.FgaBatchCheckResponse.Results(childComplexity), true + + case "FgaCheckResponse.allowed": + if e.complexity.FgaCheckResponse.Allowed == nil { + break + } + + return e.complexity.FgaCheckResponse.Allowed(childComplexity), true + + case "FgaListObjectsResponse.objects": + if e.complexity.FgaListObjectsResponse.Objects == nil { + break + } + + return e.complexity.FgaListObjectsResponse.Objects(childComplexity), true + + case "FgaModel.dsl": + if e.complexity.FgaModel.Dsl == nil { + break + } + + return e.complexity.FgaModel.Dsl(childComplexity), true + + case "FgaModel.id": + if e.complexity.FgaModel.ID == nil { + break + } + + return e.complexity.FgaModel.ID(childComplexity), true + + case "FgaTuple.object": + if e.complexity.FgaTuple.Object == nil { + break + } + + return e.complexity.FgaTuple.Object(childComplexity), true + + case "FgaTuple.relation": + if e.complexity.FgaTuple.Relation == nil { + break + } + + return e.complexity.FgaTuple.Relation(childComplexity), true + + case "FgaTuple.user": + if e.complexity.FgaTuple.User == nil { + break + } + + return e.complexity.FgaTuple.User(childComplexity), true + + case "FgaTuples.continuation_token": + if e.complexity.FgaTuples.ContinuationToken == nil { + break + } + + return e.complexity.FgaTuples.ContinuationToken(childComplexity), true + + case "FgaTuples.tuples": + if e.complexity.FgaTuples.Tuples == nil { + break + } + + return e.complexity.FgaTuples.Tuples(childComplexity), true + case "ForgotPasswordResponse.message": if e.complexity.ForgotPasswordResponse.Message == nil { break @@ -1811,204 +1547,96 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Mutation.AdminSignup(childComplexity, args["params"].(model.AdminSignupRequest)), true - case "Mutation._authz_add_permission": - if e.complexity.Mutation.AuthzAddPermission == nil { + case "Mutation.deactivate_account": + if e.complexity.Mutation.DeactivateAccount == nil { break } - args, err := ec.field_Mutation__authz_add_permission_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.AuthzAddPermission(childComplexity, args["params"].(model.AddPermissionInput)), true + return e.complexity.Mutation.DeactivateAccount(childComplexity), true - case "Mutation._authz_add_policy": - if e.complexity.Mutation.AuthzAddPolicy == nil { + case "Mutation._delete_email_template": + if e.complexity.Mutation.DeleteEmailTemplate == nil { break } - args, err := ec.field_Mutation__authz_add_policy_args(ctx, rawArgs) + args, err := ec.field_Mutation__delete_email_template_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Mutation.AuthzAddPolicy(childComplexity, args["params"].(model.AddPolicyInput)), true + return e.complexity.Mutation.DeleteEmailTemplate(childComplexity, args["params"].(model.DeleteEmailTemplateRequest)), true - case "Mutation._authz_add_resource": - if e.complexity.Mutation.AuthzAddResource == nil { - break - } - - args, err := ec.field_Mutation__authz_add_resource_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.AuthzAddResource(childComplexity, args["params"].(model.AddResourceInput)), true - - case "Mutation._authz_add_scope": - if e.complexity.Mutation.AuthzAddScope == nil { - break - } - - args, err := ec.field_Mutation__authz_add_scope_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.AuthzAddScope(childComplexity, args["params"].(model.AddScopeInput)), true - - case "Mutation._authz_delete_permission": - if e.complexity.Mutation.AuthzDeletePermission == nil { - break - } - - args, err := ec.field_Mutation__authz_delete_permission_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.AuthzDeletePermission(childComplexity, args["id"].(string)), true - - case "Mutation._authz_delete_policy": - if e.complexity.Mutation.AuthzDeletePolicy == nil { - break - } - - args, err := ec.field_Mutation__authz_delete_policy_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.AuthzDeletePolicy(childComplexity, args["id"].(string)), true - - case "Mutation._authz_delete_resource": - if e.complexity.Mutation.AuthzDeleteResource == nil { - break - } - - args, err := ec.field_Mutation__authz_delete_resource_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.AuthzDeleteResource(childComplexity, args["id"].(string)), true - - case "Mutation._authz_delete_scope": - if e.complexity.Mutation.AuthzDeleteScope == nil { - break - } - - args, err := ec.field_Mutation__authz_delete_scope_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.AuthzDeleteScope(childComplexity, args["id"].(string)), true - - case "Mutation._authz_update_permission": - if e.complexity.Mutation.AuthzUpdatePermission == nil { - break - } - - args, err := ec.field_Mutation__authz_update_permission_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.AuthzUpdatePermission(childComplexity, args["params"].(model.UpdatePermissionInput)), true - - case "Mutation._authz_update_policy": - if e.complexity.Mutation.AuthzUpdatePolicy == nil { - break - } - - args, err := ec.field_Mutation__authz_update_policy_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.AuthzUpdatePolicy(childComplexity, args["params"].(model.UpdatePolicyInput)), true - - case "Mutation._authz_update_resource": - if e.complexity.Mutation.AuthzUpdateResource == nil { + case "Mutation._delete_user": + if e.complexity.Mutation.DeleteUser == nil { break } - args, err := ec.field_Mutation__authz_update_resource_args(ctx, rawArgs) + args, err := ec.field_Mutation__delete_user_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Mutation.AuthzUpdateResource(childComplexity, args["params"].(model.UpdateResourceInput)), true + return e.complexity.Mutation.DeleteUser(childComplexity, args["params"].(model.DeleteUserRequest)), true - case "Mutation._authz_update_scope": - if e.complexity.Mutation.AuthzUpdateScope == nil { + case "Mutation._delete_webhook": + if e.complexity.Mutation.DeleteWebhook == nil { break } - args, err := ec.field_Mutation__authz_update_scope_args(ctx, rawArgs) + args, err := ec.field_Mutation__delete_webhook_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Mutation.AuthzUpdateScope(childComplexity, args["params"].(model.UpdateScopeInput)), true - - case "Mutation.deactivate_account": - if e.complexity.Mutation.DeactivateAccount == nil { - break - } - - return e.complexity.Mutation.DeactivateAccount(childComplexity), true + return e.complexity.Mutation.DeleteWebhook(childComplexity, args["params"].(model.WebhookRequest)), true - case "Mutation._delete_email_template": - if e.complexity.Mutation.DeleteEmailTemplate == nil { + case "Mutation._enable_access": + if e.complexity.Mutation.EnableAccess == nil { break } - args, err := ec.field_Mutation__delete_email_template_args(ctx, rawArgs) + args, err := ec.field_Mutation__enable_access_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Mutation.DeleteEmailTemplate(childComplexity, args["params"].(model.DeleteEmailTemplateRequest)), true + return e.complexity.Mutation.EnableAccess(childComplexity, args["param"].(model.UpdateAccessRequest)), true - case "Mutation._delete_user": - if e.complexity.Mutation.DeleteUser == nil { + case "Mutation._fga_delete_tuples": + if e.complexity.Mutation.FgaDeleteTuples == nil { break } - args, err := ec.field_Mutation__delete_user_args(ctx, rawArgs) + args, err := ec.field_Mutation__fga_delete_tuples_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Mutation.DeleteUser(childComplexity, args["params"].(model.DeleteUserRequest)), true + return e.complexity.Mutation.FgaDeleteTuples(childComplexity, args["params"].(model.FgaWriteTuplesInput)), true - case "Mutation._delete_webhook": - if e.complexity.Mutation.DeleteWebhook == nil { + case "Mutation._fga_write_model": + if e.complexity.Mutation.FgaWriteModel == nil { break } - args, err := ec.field_Mutation__delete_webhook_args(ctx, rawArgs) + args, err := ec.field_Mutation__fga_write_model_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Mutation.DeleteWebhook(childComplexity, args["params"].(model.WebhookRequest)), true + return e.complexity.Mutation.FgaWriteModel(childComplexity, args["params"].(model.FgaWriteModelInput)), true - case "Mutation._enable_access": - if e.complexity.Mutation.EnableAccess == nil { + case "Mutation._fga_write_tuples": + if e.complexity.Mutation.FgaWriteTuples == nil { break } - args, err := ec.field_Mutation__enable_access_args(ctx, rawArgs) + args, err := ec.field_Mutation__fga_write_tuples_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Mutation.EnableAccess(childComplexity, args["param"].(model.UpdateAccessRequest)), true + return e.complexity.Mutation.FgaWriteTuples(childComplexity, args["params"].(model.FgaWriteTuplesInput)), true case "Mutation.forgot_password": if e.complexity.Mutation.ForgotPassword == nil { @@ -2297,20 +1925,6 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Pagination.Total(childComplexity), true - case "Permission.resource": - if e.complexity.Permission.Resource == nil { - break - } - - return e.complexity.Permission.Resource(childComplexity), true - - case "Permission.scope": - if e.complexity.Permission.Scope == nil { - break - } - - return e.complexity.Permission.Scope(childComplexity), true - case "Query._admin_session": if e.complexity.Query.AdminSession == nil { break @@ -2330,72 +1944,79 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Query.AuditLogs(childComplexity, args["params"].(*model.ListAuditLogRequest)), true - case "Query._authz_permissions": - if e.complexity.Query.AuthzPermissions == nil { + case "Query._email_templates": + if e.complexity.Query.EmailTemplates == nil { break } - args, err := ec.field_Query__authz_permissions_args(ctx, rawArgs) + args, err := ec.field_Query__email_templates_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Query.AuthzPermissions(childComplexity, args["params"].(*model.PaginatedRequest)), true + return e.complexity.Query.EmailTemplates(childComplexity, args["params"].(*model.PaginatedRequest)), true + + case "Query._env": + if e.complexity.Query.Env == nil { + break + } + + return e.complexity.Query.Env(childComplexity), true - case "Query._authz_policies": - if e.complexity.Query.AuthzPolicies == nil { + case "Query.fga_batch_check": + if e.complexity.Query.FgaBatchCheck == nil { break } - args, err := ec.field_Query__authz_policies_args(ctx, rawArgs) + args, err := ec.field_Query_fga_batch_check_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Query.AuthzPolicies(childComplexity, args["params"].(*model.PaginatedRequest)), true + return e.complexity.Query.FgaBatchCheck(childComplexity, args["params"].(model.FgaBatchCheckInput)), true - case "Query._authz_resources": - if e.complexity.Query.AuthzResources == nil { + case "Query.fga_check": + if e.complexity.Query.FgaCheck == nil { break } - args, err := ec.field_Query__authz_resources_args(ctx, rawArgs) + args, err := ec.field_Query_fga_check_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Query.AuthzResources(childComplexity, args["params"].(*model.PaginatedRequest)), true + return e.complexity.Query.FgaCheck(childComplexity, args["params"].(model.FgaCheckInput)), true - case "Query._authz_scopes": - if e.complexity.Query.AuthzScopes == nil { + case "Query._fga_get_model": + if e.complexity.Query.FgaGetModel == nil { break } - args, err := ec.field_Query__authz_scopes_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Query.AuthzScopes(childComplexity, args["params"].(*model.PaginatedRequest)), true + return e.complexity.Query.FgaGetModel(childComplexity), true - case "Query._email_templates": - if e.complexity.Query.EmailTemplates == nil { + case "Query.fga_list_objects": + if e.complexity.Query.FgaListObjects == nil { break } - args, err := ec.field_Query__email_templates_args(ctx, rawArgs) + args, err := ec.field_Query_fga_list_objects_args(ctx, rawArgs) if err != nil { return 0, false } - return e.complexity.Query.EmailTemplates(childComplexity, args["params"].(*model.PaginatedRequest)), true + return e.complexity.Query.FgaListObjects(childComplexity, args["params"].(model.FgaListObjectsInput)), true - case "Query._env": - if e.complexity.Query.Env == nil { + case "Query._fga_read_tuples": + if e.complexity.Query.FgaReadTuples == nil { break } - return e.complexity.Query.Env(childComplexity), true + args, err := ec.field_Query__fga_read_tuples_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.FgaReadTuples(childComplexity, args["params"].(model.FgaReadTuplesInput)), true case "Query.meta": if e.complexity.Query.Meta == nil { @@ -2404,13 +2025,6 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Query.Meta(childComplexity), true - case "Query.permissions": - if e.complexity.Query.Permissions == nil { - break - } - - return e.complexity.Query.Permissions(childComplexity), true - case "Query.profile": if e.complexity.Query.Profile == nil { break @@ -2948,15 +2562,20 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { ec := executionContext{opCtx, e, 0, 0, make(chan graphql.DeferredResult)} inputUnmarshalMap := graphql.BuildUnmarshalerMap( ec.unmarshalInputAddEmailTemplateRequest, - ec.unmarshalInputAddPermissionInput, - ec.unmarshalInputAddPolicyInput, - ec.unmarshalInputAddResourceInput, - ec.unmarshalInputAddScopeInput, ec.unmarshalInputAddWebhookRequest, ec.unmarshalInputAdminLoginRequest, ec.unmarshalInputAdminSignupRequest, ec.unmarshalInputDeleteEmailTemplateRequest, ec.unmarshalInputDeleteUserRequest, + ec.unmarshalInputFgaBatchCheckInput, + ec.unmarshalInputFgaCheckInput, + ec.unmarshalInputFgaCheckPairInput, + ec.unmarshalInputFgaListObjectsInput, + ec.unmarshalInputFgaReadTuplesInput, + ec.unmarshalInputFgaRelationInput, + ec.unmarshalInputFgaTupleInput, + ec.unmarshalInputFgaWriteModelInput, + ec.unmarshalInputFgaWriteTuplesInput, ec.unmarshalInputForgotPasswordRequest, ec.unmarshalInputGenerateJWTKeysRequest, ec.unmarshalInputGetUserRequest, @@ -2970,8 +2589,6 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { ec.unmarshalInputOAuthRevokeRequest, ec.unmarshalInputPaginatedRequest, ec.unmarshalInputPaginationRequest, - ec.unmarshalInputPermissionInput, - ec.unmarshalInputPolicyTargetInput, ec.unmarshalInputResendOTPRequest, ec.unmarshalInputResendVerifyEmailRequest, ec.unmarshalInputResetPasswordRequest, @@ -2981,11 +2598,7 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { ec.unmarshalInputUpdateAccessRequest, ec.unmarshalInputUpdateEmailTemplateRequest, ec.unmarshalInputUpdateEnvRequest, - ec.unmarshalInputUpdatePermissionInput, - ec.unmarshalInputUpdatePolicyInput, ec.unmarshalInputUpdateProfileRequest, - ec.unmarshalInputUpdateResourceInput, - ec.unmarshalInputUpdateScopeInput, ec.unmarshalInputUpdateUserRequest, ec.unmarshalInputUpdateWebhookRequest, ec.unmarshalInputValidateJWTTokenRequest, @@ -3202,6 +2815,44 @@ type Response { message: String! } +# ---- Fine-grained authorization (FGA) types ---- + +# FgaTuple is a single relationship: user is related to object via relation. +# Identifiers follow OpenFGA conventions: user "user:alice" (or userset +# "role:admin#assignee"), object "document:1". +type FgaTuple { + user: String! + relation: String! + object: String! +} + +# FgaModel describes an authorization model (id + DSL form). +type FgaModel { + id: String! + dsl: String! +} + +# FgaTuples is a page of tuples plus a continuation token (empty when exhausted). +type FgaTuples { + tuples: [FgaTuple!]! + continuation_token: String +} + +# FgaCheckResponse is the result of a single relationship check. +type FgaCheckResponse { + allowed: Boolean! +} + +# FgaBatchCheckResponse is the positionally-aligned result of a batch check. +type FgaBatchCheckResponse { + results: [FgaCheckResponse!]! +} + +# FgaListObjectsResponse lists fully-qualified object ids the caller relates to. +type FgaListObjectsResponse { + objects: [String!]! +} + type ForgotPasswordResponse { message: String! should_show_mobile_otp_screen: Boolean @@ -3602,10 +3253,10 @@ input SessionQueryRequest { # when a session already exists and the login UI auto-detects it, # passing state ensures the authorization code state is properly stored state: String - # required_permissions is an optional list of resource:scope pairs that - # must all be granted to the principal. If any is denied the query returns - # unauthorized (AND semantics, matching the roles filter). - required_permissions: [PermissionInput!] + # required_relations gates the session on fine-grained authorization. + # Each (relation, object) is checked against the authenticated caller with + # AND semantics, fail-closed. Requires --authorization-engine=fga. + required_relations: [FgaRelationInput!] } input PaginationRequest { @@ -3634,13 +3285,17 @@ input ValidateJWTTokenRequest { token_type: String! token: String! roles: [String!] - required_permissions: [PermissionInput!] + # required_relations gates validation on fine-grained authorization. + # AND semantics, fail-closed. Requires --authorization-engine=fga. + required_relations: [FgaRelationInput!] } input ValidateSessionRequest { cookie: String! roles: [String!] - required_permissions: [PermissionInput!] + # required_relations gates validation on fine-grained authorization. + # AND semantics, fail-closed. Requires --authorization-engine=fga. + required_relations: [FgaRelationInput!] } input GenerateJWTKeysRequest { @@ -3739,143 +3394,71 @@ input GetUserRequest { email: String } -type AuthzResource { - id: ID! - name: String! - description: String - created_at: Int64! - updated_at: Int64! -} - -type AuthzResources { - pagination: Pagination! - resources: [AuthzResource!]! -} - -type AuthzScope { - id: ID! - name: String! - description: String - created_at: Int64! - updated_at: Int64! -} - -type AuthzScopes { - pagination: Pagination! - scopes: [AuthzScope!]! -} - -type AuthzPolicyTarget { - id: ID! - target_type: String! - target_value: String! -} - -type AuthzPolicy { - id: ID! - name: String! - description: String - type: String! - logic: String! - decision_strategy: String! - targets: [AuthzPolicyTarget!]! - created_at: Int64! - updated_at: Int64! -} - -type AuthzPolicies { - pagination: Pagination! - policies: [AuthzPolicy!]! -} - -type AuthzPermission { - id: ID! - name: String! - description: String - resource: AuthzResource! - scopes: [AuthzScope!]! - policies: [AuthzPolicy!]! - decision_strategy: String! - created_at: Int64! - updated_at: Int64! -} - -type AuthzPermissions { - pagination: Pagination! - permissions: [AuthzPermission!]! -} - -type Permission { - resource: String! - scope: String! -} - -input AddResourceInput { - name: String! - description: String -} +# ---- Fine-grained authorization (FGA) inputs ---- -input UpdateResourceInput { - id: ID! - name: String - description: String +# FgaTupleInput is a single relationship tuple supplied by an admin for write / +# delete / read operations. +input FgaTupleInput { + user: String! + relation: String! + object: String! } -input AddScopeInput { - name: String! - description: String +# FgaWriteModelInput installs a new authorization model from its DSL form. +input FgaWriteModelInput { + dsl: String! } -input UpdateScopeInput { - id: ID! - name: String - description: String +# FgaWriteTuplesInput is used for both writing and deleting tuples. +input FgaWriteTuplesInput { + tuples: [FgaTupleInput!]! } -input PolicyTargetInput { - target_type: String! - target_value: String! +# FgaReadTuplesInput is a paginated, optionally-filtered tuple read. Any empty +# field acts as a wildcard for that position. +input FgaReadTuplesInput { + user: String + relation: String + object: String + page_size: Int64 + continuation_token: String } -input AddPolicyInput { - name: String! - description: String - type: String! - logic: String - decision_strategy: String - targets: [PolicyTargetInput!]! +# FgaCheckInput asks "is the authenticated caller related to object via +# relation?". The caller (user) is pinned server-side from the auth token and is +# NEVER taken from client input. Only relation, object and optional contextual +# tuples are accepted from the client. +input FgaCheckInput { + relation: String! + object: String! + contextual_tuples: [FgaTupleInput!] } -input UpdatePolicyInput { - id: ID! - name: String - description: String - logic: String - decision_strategy: String - targets: [PolicyTargetInput!] +# FgaBatchCheckInput evaluates multiple relation/object pairs for the +# authenticated caller (principal pinned server-side). +input FgaBatchCheckInput { + checks: [FgaCheckPairInput!]! } -input AddPermissionInput { - name: String! - description: String - resource_id: ID! - scope_ids: [ID!]! - policy_ids: [ID!]! - decision_strategy: String +# FgaCheckPairInput is one relation/object pair within a batch check. +input FgaCheckPairInput { + relation: String! + object: String! + contextual_tuples: [FgaTupleInput!] } -input UpdatePermissionInput { - id: ID! - name: String - description: String - scope_ids: [ID!] - policy_ids: [ID!] - decision_strategy: String +# FgaListObjectsInput enumerates objects of type object_type the authenticated +# caller relates to via relation (principal pinned server-side). +input FgaListObjectsInput { + relation: String! + object_type: String! } -input PermissionInput { - resource: String! - scope: String! +# FgaRelationInput is a (relation, object) requirement evaluated against the +# authenticated caller during session/validate. AND semantics, fail-closed. +input FgaRelationInput { + relation: String! + object: String! } type Mutation { @@ -3917,22 +3500,10 @@ type Mutation { _add_email_template(params: AddEmailTemplateRequest!): Response! _update_email_template(params: UpdateEmailTemplateRequest!): Response! _delete_email_template(params: DeleteEmailTemplateRequest!): Response! - # Authorization: Resources - _authz_add_resource(params: AddResourceInput!): AuthzResource! - _authz_update_resource(params: UpdateResourceInput!): AuthzResource! - _authz_delete_resource(id: ID!): Response! - # Authorization: Scopes - _authz_add_scope(params: AddScopeInput!): AuthzScope! - _authz_update_scope(params: UpdateScopeInput!): AuthzScope! - _authz_delete_scope(id: ID!): Response! - # Authorization: Policies - _authz_add_policy(params: AddPolicyInput!): AuthzPolicy! - _authz_update_policy(params: UpdatePolicyInput!): AuthzPolicy! - _authz_delete_policy(id: ID!): Response! - # Authorization: Permissions - _authz_add_permission(params: AddPermissionInput!): AuthzPermission! - _authz_update_permission(params: UpdatePermissionInput!): AuthzPermission! - _authz_delete_permission(id: ID!): Response! + # FGA admin mutations (super-admin only) + _fga_write_model(params: FgaWriteModelInput!): FgaModel! + _fga_write_tuples(params: FgaWriteTuplesInput!): Response! + _fga_delete_tuples(params: FgaWriteTuplesInput!): Response! } type Query { @@ -3953,13 +3524,13 @@ type Query { _webhook_logs(params: ListWebhookLogRequest): WebhookLogs! _email_templates(params: PaginatedRequest): EmailTemplates! _audit_logs(params: ListAuditLogRequest): AuditLogs! - # Authorization: Admin queries - _authz_resources(params: PaginatedRequest): AuthzResources! - _authz_scopes(params: PaginatedRequest): AuthzScopes! - _authz_policies(params: PaginatedRequest): AuthzPolicies! - _authz_permissions(params: PaginatedRequest): AuthzPermissions! - # Authorization: User-facing queries - permissions: [Permission!]! + # FGA admin queries (super-admin only) + _fga_get_model: FgaModel! + _fga_read_tuples(params: FgaReadTuplesInput!): FgaTuples! + # FGA runtime queries (authenticated caller; principal pinned server-side) + fga_check(params: FgaCheckInput!): FgaCheckResponse! + fga_batch_check(params: FgaBatchCheckInput!): FgaBatchCheckResponse! + fga_list_objects(params: FgaListObjectsInput!): FgaListObjectsResponse! } `, BuiltIn: false}, } @@ -4081,476 +3652,224 @@ func (ec *executionContext) field_Mutation__admin_signup_argsParams( return zeroVal, nil } -func (ec *executionContext) field_Mutation__authz_add_permission_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Mutation__delete_email_template_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Mutation__authz_add_permission_argsParams(ctx, rawArgs) + arg0, err := ec.field_Mutation__delete_email_template_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Mutation__authz_add_permission_argsParams( +func (ec *executionContext) field_Mutation__delete_email_template_argsParams( ctx context.Context, rawArgs map[string]any, -) (model.AddPermissionInput, error) { +) (model.DeleteEmailTemplateRequest, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal model.AddPermissionInput + var zeroVal model.DeleteEmailTemplateRequest return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNAddPermissionInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAddPermissionInput(ctx, tmp) + return ec.unmarshalNDeleteEmailTemplateRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐDeleteEmailTemplateRequest(ctx, tmp) } - var zeroVal model.AddPermissionInput + var zeroVal model.DeleteEmailTemplateRequest return zeroVal, nil } -func (ec *executionContext) field_Mutation__authz_add_policy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Mutation__delete_user_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Mutation__authz_add_policy_argsParams(ctx, rawArgs) + arg0, err := ec.field_Mutation__delete_user_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Mutation__authz_add_policy_argsParams( +func (ec *executionContext) field_Mutation__delete_user_argsParams( ctx context.Context, rawArgs map[string]any, -) (model.AddPolicyInput, error) { +) (model.DeleteUserRequest, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal model.AddPolicyInput + var zeroVal model.DeleteUserRequest return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNAddPolicyInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAddPolicyInput(ctx, tmp) + return ec.unmarshalNDeleteUserRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐDeleteUserRequest(ctx, tmp) } - var zeroVal model.AddPolicyInput + var zeroVal model.DeleteUserRequest return zeroVal, nil } -func (ec *executionContext) field_Mutation__authz_add_resource_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Mutation__delete_webhook_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Mutation__authz_add_resource_argsParams(ctx, rawArgs) + arg0, err := ec.field_Mutation__delete_webhook_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Mutation__authz_add_resource_argsParams( +func (ec *executionContext) field_Mutation__delete_webhook_argsParams( ctx context.Context, rawArgs map[string]any, -) (model.AddResourceInput, error) { +) (model.WebhookRequest, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal model.AddResourceInput + var zeroVal model.WebhookRequest return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNAddResourceInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAddResourceInput(ctx, tmp) + return ec.unmarshalNWebhookRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookRequest(ctx, tmp) } - var zeroVal model.AddResourceInput + var zeroVal model.WebhookRequest return zeroVal, nil } -func (ec *executionContext) field_Mutation__authz_add_scope_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Mutation__enable_access_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Mutation__authz_add_scope_argsParams(ctx, rawArgs) + arg0, err := ec.field_Mutation__enable_access_argsParam(ctx, rawArgs) if err != nil { return nil, err } - args["params"] = arg0 + args["param"] = arg0 return args, nil } -func (ec *executionContext) field_Mutation__authz_add_scope_argsParams( +func (ec *executionContext) field_Mutation__enable_access_argsParam( ctx context.Context, rawArgs map[string]any, -) (model.AddScopeInput, error) { - if _, ok := rawArgs["params"]; !ok { - var zeroVal model.AddScopeInput +) (model.UpdateAccessRequest, error) { + if _, ok := rawArgs["param"]; !ok { + var zeroVal model.UpdateAccessRequest return zeroVal, nil } - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) - if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNAddScopeInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAddScopeInput(ctx, tmp) + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("param")) + if tmp, ok := rawArgs["param"]; ok { + return ec.unmarshalNUpdateAccessRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdateAccessRequest(ctx, tmp) } - var zeroVal model.AddScopeInput + var zeroVal model.UpdateAccessRequest return zeroVal, nil } -func (ec *executionContext) field_Mutation__authz_delete_permission_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Mutation__fga_delete_tuples_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Mutation__authz_delete_permission_argsID(ctx, rawArgs) + arg0, err := ec.field_Mutation__fga_delete_tuples_argsParams(ctx, rawArgs) if err != nil { return nil, err } - args["id"] = arg0 + args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Mutation__authz_delete_permission_argsID( +func (ec *executionContext) field_Mutation__fga_delete_tuples_argsParams( ctx context.Context, rawArgs map[string]any, -) (string, error) { - if _, ok := rawArgs["id"]; !ok { - var zeroVal string +) (model.FgaWriteTuplesInput, error) { + if _, ok := rawArgs["params"]; !ok { + var zeroVal model.FgaWriteTuplesInput return zeroVal, nil } - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - if tmp, ok := rawArgs["id"]; ok { - return ec.unmarshalNID2string(ctx, tmp) + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) + if tmp, ok := rawArgs["params"]; ok { + return ec.unmarshalNFgaWriteTuplesInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaWriteTuplesInput(ctx, tmp) } - var zeroVal string + var zeroVal model.FgaWriteTuplesInput return zeroVal, nil } -func (ec *executionContext) field_Mutation__authz_delete_policy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Mutation__fga_write_model_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Mutation__authz_delete_policy_argsID(ctx, rawArgs) + arg0, err := ec.field_Mutation__fga_write_model_argsParams(ctx, rawArgs) if err != nil { return nil, err } - args["id"] = arg0 + args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Mutation__authz_delete_policy_argsID( +func (ec *executionContext) field_Mutation__fga_write_model_argsParams( ctx context.Context, rawArgs map[string]any, -) (string, error) { - if _, ok := rawArgs["id"]; !ok { - var zeroVal string +) (model.FgaWriteModelInput, error) { + if _, ok := rawArgs["params"]; !ok { + var zeroVal model.FgaWriteModelInput return zeroVal, nil } - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - if tmp, ok := rawArgs["id"]; ok { - return ec.unmarshalNID2string(ctx, tmp) + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) + if tmp, ok := rawArgs["params"]; ok { + return ec.unmarshalNFgaWriteModelInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaWriteModelInput(ctx, tmp) } - var zeroVal string + var zeroVal model.FgaWriteModelInput return zeroVal, nil } -func (ec *executionContext) field_Mutation__authz_delete_resource_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Mutation__fga_write_tuples_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Mutation__authz_delete_resource_argsID(ctx, rawArgs) + arg0, err := ec.field_Mutation__fga_write_tuples_argsParams(ctx, rawArgs) if err != nil { return nil, err } - args["id"] = arg0 + args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Mutation__authz_delete_resource_argsID( +func (ec *executionContext) field_Mutation__fga_write_tuples_argsParams( ctx context.Context, rawArgs map[string]any, -) (string, error) { - if _, ok := rawArgs["id"]; !ok { - var zeroVal string +) (model.FgaWriteTuplesInput, error) { + if _, ok := rawArgs["params"]; !ok { + var zeroVal model.FgaWriteTuplesInput return zeroVal, nil } - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - if tmp, ok := rawArgs["id"]; ok { - return ec.unmarshalNID2string(ctx, tmp) + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) + if tmp, ok := rawArgs["params"]; ok { + return ec.unmarshalNFgaWriteTuplesInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaWriteTuplesInput(ctx, tmp) } - var zeroVal string + var zeroVal model.FgaWriteTuplesInput return zeroVal, nil } -func (ec *executionContext) field_Mutation__authz_delete_scope_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Mutation__generate_jwt_keys_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Mutation__authz_delete_scope_argsID(ctx, rawArgs) + arg0, err := ec.field_Mutation__generate_jwt_keys_argsParams(ctx, rawArgs) if err != nil { return nil, err } - args["id"] = arg0 + args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Mutation__authz_delete_scope_argsID( +func (ec *executionContext) field_Mutation__generate_jwt_keys_argsParams( ctx context.Context, rawArgs map[string]any, -) (string, error) { - if _, ok := rawArgs["id"]; !ok { - var zeroVal string +) (model.GenerateJWTKeysRequest, error) { + if _, ok := rawArgs["params"]; !ok { + var zeroVal model.GenerateJWTKeysRequest return zeroVal, nil } - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - if tmp, ok := rawArgs["id"]; ok { - return ec.unmarshalNID2string(ctx, tmp) - } - - var zeroVal string - return zeroVal, nil -} - -func (ec *executionContext) field_Mutation__authz_update_permission_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation__authz_update_permission_argsParams(ctx, rawArgs) - if err != nil { - return nil, err - } - args["params"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation__authz_update_permission_argsParams( - ctx context.Context, - rawArgs map[string]any, -) (model.UpdatePermissionInput, error) { - if _, ok := rawArgs["params"]; !ok { - var zeroVal model.UpdatePermissionInput - return zeroVal, nil - } - - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) - if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNUpdatePermissionInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdatePermissionInput(ctx, tmp) - } - - var zeroVal model.UpdatePermissionInput - return zeroVal, nil -} - -func (ec *executionContext) field_Mutation__authz_update_policy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation__authz_update_policy_argsParams(ctx, rawArgs) - if err != nil { - return nil, err - } - args["params"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation__authz_update_policy_argsParams( - ctx context.Context, - rawArgs map[string]any, -) (model.UpdatePolicyInput, error) { - if _, ok := rawArgs["params"]; !ok { - var zeroVal model.UpdatePolicyInput - return zeroVal, nil - } - - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) - if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNUpdatePolicyInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdatePolicyInput(ctx, tmp) - } - - var zeroVal model.UpdatePolicyInput - return zeroVal, nil -} - -func (ec *executionContext) field_Mutation__authz_update_resource_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation__authz_update_resource_argsParams(ctx, rawArgs) - if err != nil { - return nil, err - } - args["params"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation__authz_update_resource_argsParams( - ctx context.Context, - rawArgs map[string]any, -) (model.UpdateResourceInput, error) { - if _, ok := rawArgs["params"]; !ok { - var zeroVal model.UpdateResourceInput - return zeroVal, nil - } - - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) - if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNUpdateResourceInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdateResourceInput(ctx, tmp) - } - - var zeroVal model.UpdateResourceInput - return zeroVal, nil -} - -func (ec *executionContext) field_Mutation__authz_update_scope_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation__authz_update_scope_argsParams(ctx, rawArgs) - if err != nil { - return nil, err - } - args["params"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation__authz_update_scope_argsParams( - ctx context.Context, - rawArgs map[string]any, -) (model.UpdateScopeInput, error) { - if _, ok := rawArgs["params"]; !ok { - var zeroVal model.UpdateScopeInput - return zeroVal, nil - } - - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) - if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNUpdateScopeInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdateScopeInput(ctx, tmp) - } - - var zeroVal model.UpdateScopeInput - return zeroVal, nil -} - -func (ec *executionContext) field_Mutation__delete_email_template_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation__delete_email_template_argsParams(ctx, rawArgs) - if err != nil { - return nil, err - } - args["params"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation__delete_email_template_argsParams( - ctx context.Context, - rawArgs map[string]any, -) (model.DeleteEmailTemplateRequest, error) { - if _, ok := rawArgs["params"]; !ok { - var zeroVal model.DeleteEmailTemplateRequest - return zeroVal, nil - } - - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) - if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNDeleteEmailTemplateRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐDeleteEmailTemplateRequest(ctx, tmp) - } - - var zeroVal model.DeleteEmailTemplateRequest - return zeroVal, nil -} - -func (ec *executionContext) field_Mutation__delete_user_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation__delete_user_argsParams(ctx, rawArgs) - if err != nil { - return nil, err - } - args["params"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation__delete_user_argsParams( - ctx context.Context, - rawArgs map[string]any, -) (model.DeleteUserRequest, error) { - if _, ok := rawArgs["params"]; !ok { - var zeroVal model.DeleteUserRequest - return zeroVal, nil - } - - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) - if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNDeleteUserRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐDeleteUserRequest(ctx, tmp) - } - - var zeroVal model.DeleteUserRequest - return zeroVal, nil -} - -func (ec *executionContext) field_Mutation__delete_webhook_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation__delete_webhook_argsParams(ctx, rawArgs) - if err != nil { - return nil, err - } - args["params"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation__delete_webhook_argsParams( - ctx context.Context, - rawArgs map[string]any, -) (model.WebhookRequest, error) { - if _, ok := rawArgs["params"]; !ok { - var zeroVal model.WebhookRequest - return zeroVal, nil - } - - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) - if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNWebhookRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookRequest(ctx, tmp) - } - - var zeroVal model.WebhookRequest - return zeroVal, nil -} - -func (ec *executionContext) field_Mutation__enable_access_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation__enable_access_argsParam(ctx, rawArgs) - if err != nil { - return nil, err - } - args["param"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation__enable_access_argsParam( - ctx context.Context, - rawArgs map[string]any, -) (model.UpdateAccessRequest, error) { - if _, ok := rawArgs["param"]; !ok { - var zeroVal model.UpdateAccessRequest - return zeroVal, nil - } - - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("param")) - if tmp, ok := rawArgs["param"]; ok { - return ec.unmarshalNUpdateAccessRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdateAccessRequest(ctx, tmp) - } - - var zeroVal model.UpdateAccessRequest - return zeroVal, nil -} - -func (ec *executionContext) field_Mutation__generate_jwt_keys_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation__generate_jwt_keys_argsParams(ctx, rawArgs) - if err != nil { - return nil, err - } - args["params"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation__generate_jwt_keys_argsParams( - ctx context.Context, - rawArgs map[string]any, -) (model.GenerateJWTKeysRequest, error) { - if _, ok := rawArgs["params"]; !ok { - var zeroVal model.GenerateJWTKeysRequest - return zeroVal, nil - } - - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) - if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNGenerateJWTKeysRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐGenerateJWTKeysRequest(ctx, tmp) + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) + if tmp, ok := rawArgs["params"]; ok { + return ec.unmarshalNGenerateJWTKeysRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐGenerateJWTKeysRequest(ctx, tmp) } var zeroVal model.GenerateJWTKeysRequest @@ -5173,17 +4492,17 @@ func (ec *executionContext) field_Query__audit_logs_argsParams( return zeroVal, nil } -func (ec *executionContext) field_Query__authz_permissions_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query__email_templates_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__authz_permissions_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query__email_templates_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__authz_permissions_argsParams( +func (ec *executionContext) field_Query__email_templates_argsParams( ctx context.Context, rawArgs map[string]any, ) (*model.PaginatedRequest, error) { @@ -5201,73 +4520,73 @@ func (ec *executionContext) field_Query__authz_permissions_argsParams( return zeroVal, nil } -func (ec *executionContext) field_Query__authz_policies_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query__fga_read_tuples_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__authz_policies_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query__fga_read_tuples_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__authz_policies_argsParams( +func (ec *executionContext) field_Query__fga_read_tuples_argsParams( ctx context.Context, rawArgs map[string]any, -) (*model.PaginatedRequest, error) { +) (model.FgaReadTuplesInput, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal *model.PaginatedRequest + var zeroVal model.FgaReadTuplesInput return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalOPaginatedRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginatedRequest(ctx, tmp) + return ec.unmarshalNFgaReadTuplesInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaReadTuplesInput(ctx, tmp) } - var zeroVal *model.PaginatedRequest + var zeroVal model.FgaReadTuplesInput return zeroVal, nil } -func (ec *executionContext) field_Query__authz_resources_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query__user_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__authz_resources_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query__user_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__authz_resources_argsParams( +func (ec *executionContext) field_Query__user_argsParams( ctx context.Context, rawArgs map[string]any, -) (*model.PaginatedRequest, error) { +) (model.GetUserRequest, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal *model.PaginatedRequest + var zeroVal model.GetUserRequest return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalOPaginatedRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginatedRequest(ctx, tmp) + return ec.unmarshalNGetUserRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐGetUserRequest(ctx, tmp) } - var zeroVal *model.PaginatedRequest + var zeroVal model.GetUserRequest return zeroVal, nil } -func (ec *executionContext) field_Query__authz_scopes_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query__users_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__authz_scopes_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query__users_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__authz_scopes_argsParams( +func (ec *executionContext) field_Query__users_argsParams( ctx context.Context, rawArgs map[string]any, ) (*model.PaginatedRequest, error) { @@ -5285,17 +4604,17 @@ func (ec *executionContext) field_Query__authz_scopes_argsParams( return zeroVal, nil } -func (ec *executionContext) field_Query__email_templates_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query__verification_requests_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__email_templates_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query__verification_requests_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__email_templates_argsParams( +func (ec *executionContext) field_Query__verification_requests_argsParams( ctx context.Context, rawArgs map[string]any, ) (*model.PaginatedRequest, error) { @@ -5313,73 +4632,73 @@ func (ec *executionContext) field_Query__email_templates_argsParams( return zeroVal, nil } -func (ec *executionContext) field_Query__user_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query__webhook_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__user_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query__webhook_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__user_argsParams( +func (ec *executionContext) field_Query__webhook_argsParams( ctx context.Context, rawArgs map[string]any, -) (model.GetUserRequest, error) { +) (model.WebhookRequest, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal model.GetUserRequest + var zeroVal model.WebhookRequest return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNGetUserRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐGetUserRequest(ctx, tmp) + return ec.unmarshalNWebhookRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookRequest(ctx, tmp) } - var zeroVal model.GetUserRequest + var zeroVal model.WebhookRequest return zeroVal, nil } -func (ec *executionContext) field_Query__users_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query__webhook_logs_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__users_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query__webhook_logs_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__users_argsParams( +func (ec *executionContext) field_Query__webhook_logs_argsParams( ctx context.Context, rawArgs map[string]any, -) (*model.PaginatedRequest, error) { +) (*model.ListWebhookLogRequest, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal *model.PaginatedRequest + var zeroVal *model.ListWebhookLogRequest return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalOPaginatedRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginatedRequest(ctx, tmp) + return ec.unmarshalOListWebhookLogRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐListWebhookLogRequest(ctx, tmp) } - var zeroVal *model.PaginatedRequest + var zeroVal *model.ListWebhookLogRequest return zeroVal, nil } -func (ec *executionContext) field_Query__verification_requests_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query__webhooks_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__verification_requests_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query__webhooks_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__verification_requests_argsParams( +func (ec *executionContext) field_Query__webhooks_argsParams( ctx context.Context, rawArgs map[string]any, ) (*model.PaginatedRequest, error) { @@ -5397,87 +4716,87 @@ func (ec *executionContext) field_Query__verification_requests_argsParams( return zeroVal, nil } -func (ec *executionContext) field_Query__webhook_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query_fga_batch_check_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__webhook_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query_fga_batch_check_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__webhook_argsParams( +func (ec *executionContext) field_Query_fga_batch_check_argsParams( ctx context.Context, rawArgs map[string]any, -) (model.WebhookRequest, error) { +) (model.FgaBatchCheckInput, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal model.WebhookRequest + var zeroVal model.FgaBatchCheckInput return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalNWebhookRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookRequest(ctx, tmp) + return ec.unmarshalNFgaBatchCheckInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaBatchCheckInput(ctx, tmp) } - var zeroVal model.WebhookRequest + var zeroVal model.FgaBatchCheckInput return zeroVal, nil } -func (ec *executionContext) field_Query__webhook_logs_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query_fga_check_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__webhook_logs_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query_fga_check_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__webhook_logs_argsParams( +func (ec *executionContext) field_Query_fga_check_argsParams( ctx context.Context, rawArgs map[string]any, -) (*model.ListWebhookLogRequest, error) { +) (model.FgaCheckInput, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal *model.ListWebhookLogRequest + var zeroVal model.FgaCheckInput return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalOListWebhookLogRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐListWebhookLogRequest(ctx, tmp) + return ec.unmarshalNFgaCheckInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckInput(ctx, tmp) } - var zeroVal *model.ListWebhookLogRequest + var zeroVal model.FgaCheckInput return zeroVal, nil } -func (ec *executionContext) field_Query__webhooks_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { +func (ec *executionContext) field_Query_fga_list_objects_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := ec.field_Query__webhooks_argsParams(ctx, rawArgs) + arg0, err := ec.field_Query_fga_list_objects_argsParams(ctx, rawArgs) if err != nil { return nil, err } args["params"] = arg0 return args, nil } -func (ec *executionContext) field_Query__webhooks_argsParams( +func (ec *executionContext) field_Query_fga_list_objects_argsParams( ctx context.Context, rawArgs map[string]any, -) (*model.PaginatedRequest, error) { +) (model.FgaListObjectsInput, error) { if _, ok := rawArgs["params"]; !ok { - var zeroVal *model.PaginatedRequest + var zeroVal model.FgaListObjectsInput return zeroVal, nil } ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("params")) if tmp, ok := rawArgs["params"]; ok { - return ec.unmarshalOPaginatedRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginatedRequest(ctx, tmp) + return ec.unmarshalNFgaListObjectsInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaListObjectsInput(ctx, tmp) } - var zeroVal *model.PaginatedRequest + var zeroVal model.FgaListObjectsInput return zeroVal, nil } @@ -6798,8 +6117,8 @@ func (ec *executionContext) fieldContext_AuthResponse_authenticator_recovery_cod return fc, nil } -func (ec *executionContext) _AuthzPermission_id(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermission_id(ctx, field) +func (ec *executionContext) _EmailTemplate_id(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailTemplate_id(ctx, field) if err != nil { return graphql.Null } @@ -6829,9 +6148,9 @@ func (ec *executionContext) _AuthzPermission_id(ctx context.Context, field graph return ec.marshalNID2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermission_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_EmailTemplate_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermission", + Object: "EmailTemplate", Field: field, IsMethod: false, IsResolver: false, @@ -6842,8 +6161,8 @@ func (ec *executionContext) fieldContext_AuthzPermission_id(_ context.Context, f return fc, nil } -func (ec *executionContext) _AuthzPermission_name(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermission_name(ctx, field) +func (ec *executionContext) _EmailTemplate_event_name(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailTemplate_event_name(ctx, field) if err != nil { return graphql.Null } @@ -6856,7 +6175,7 @@ func (ec *executionContext) _AuthzPermission_name(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Name, nil + return obj.EventName, nil }) if err != nil { ec.Error(ctx, err) @@ -6873,9 +6192,9 @@ func (ec *executionContext) _AuthzPermission_name(ctx context.Context, field gra return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermission_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_EmailTemplate_event_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermission", + Object: "EmailTemplate", Field: field, IsMethod: false, IsResolver: false, @@ -6886,8 +6205,8 @@ func (ec *executionContext) fieldContext_AuthzPermission_name(_ context.Context, return fc, nil } -func (ec *executionContext) _AuthzPermission_description(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermission_description(ctx, field) +func (ec *executionContext) _EmailTemplate_template(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailTemplate_template(ctx, field) if err != nil { return graphql.Null } @@ -6900,23 +6219,26 @@ func (ec *executionContext) _AuthzPermission_description(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Description, nil + return obj.Template, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermission_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_EmailTemplate_template(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermission", + Object: "EmailTemplate", Field: field, IsMethod: false, IsResolver: false, @@ -6927,8 +6249,8 @@ func (ec *executionContext) fieldContext_AuthzPermission_description(_ context.C return fc, nil } -func (ec *executionContext) _AuthzPermission_resource(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermission_resource(ctx, field) +func (ec *executionContext) _EmailTemplate_design(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailTemplate_design(ctx, field) if err != nil { return graphql.Null } @@ -6941,7 +6263,7 @@ func (ec *executionContext) _AuthzPermission_resource(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Resource, nil + return obj.Design, nil }) if err != nil { ec.Error(ctx, err) @@ -6953,38 +6275,26 @@ func (ec *executionContext) _AuthzPermission_resource(ctx context.Context, field } return graphql.Null } - res := resTmp.(*model.AuthzResource) + res := resTmp.(string) fc.Result = res - return ec.marshalNAuthzResource2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResource(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermission_resource(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_EmailTemplate_design(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermission", + Object: "EmailTemplate", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzResource_id(ctx, field) - case "name": - return ec.fieldContext_AuthzResource_name(ctx, field) - case "description": - return ec.fieldContext_AuthzResource_description(ctx, field) - case "created_at": - return ec.fieldContext_AuthzResource_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzResource_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzResource", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPermission_scopes(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermission_scopes(ctx, field) +func (ec *executionContext) _EmailTemplate_subject(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailTemplate_subject(ctx, field) if err != nil { return graphql.Null } @@ -6997,7 +6307,7 @@ func (ec *executionContext) _AuthzPermission_scopes(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Scopes, nil + return obj.Subject, nil }) if err != nil { ec.Error(ctx, err) @@ -7009,38 +6319,26 @@ func (ec *executionContext) _AuthzPermission_scopes(ctx context.Context, field g } return graphql.Null } - res := resTmp.([]*model.AuthzScope) + res := resTmp.(string) fc.Result = res - return ec.marshalNAuthzScope2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScopeᚄ(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermission_scopes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_EmailTemplate_subject(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermission", + Object: "EmailTemplate", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzScope_id(ctx, field) - case "name": - return ec.fieldContext_AuthzScope_name(ctx, field) - case "description": - return ec.fieldContext_AuthzScope_description(ctx, field) - case "created_at": - return ec.fieldContext_AuthzScope_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzScope_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzScope", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPermission_policies(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermission_policies(ctx, field) +func (ec *executionContext) _EmailTemplate_created_at(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailTemplate_created_at(ctx, field) if err != nil { return graphql.Null } @@ -7053,58 +6351,35 @@ func (ec *executionContext) _AuthzPermission_policies(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Policies, nil + return obj.CreatedAt, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.([]*model.AuthzPolicy) + res := resTmp.(*int64) fc.Result = res - return ec.marshalNAuthzPolicy2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicyᚄ(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermission_policies(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_EmailTemplate_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermission", + Object: "EmailTemplate", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzPolicy_id(ctx, field) - case "name": - return ec.fieldContext_AuthzPolicy_name(ctx, field) - case "description": - return ec.fieldContext_AuthzPolicy_description(ctx, field) - case "type": - return ec.fieldContext_AuthzPolicy_type(ctx, field) - case "logic": - return ec.fieldContext_AuthzPolicy_logic(ctx, field) - case "decision_strategy": - return ec.fieldContext_AuthzPolicy_decision_strategy(ctx, field) - case "targets": - return ec.fieldContext_AuthzPolicy_targets(ctx, field) - case "created_at": - return ec.fieldContext_AuthzPolicy_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzPolicy_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPolicy", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPermission_decision_strategy(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermission_decision_strategy(ctx, field) +func (ec *executionContext) _EmailTemplate_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailTemplate_updated_at(ctx, field) if err != nil { return graphql.Null } @@ -7117,38 +6392,35 @@ func (ec *executionContext) _AuthzPermission_decision_strategy(ctx context.Conte }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DecisionStrategy, nil + return obj.UpdatedAt, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*int64) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermission_decision_strategy(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_EmailTemplate_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermission", + Object: "EmailTemplate", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Int64 does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPermission_created_at(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermission_created_at(ctx, field) +func (ec *executionContext) _EmailTemplates_pagination(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplates) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailTemplates_pagination(ctx, field) if err != nil { return graphql.Null } @@ -7161,7 +6433,7 @@ func (ec *executionContext) _AuthzPermission_created_at(ctx context.Context, fie }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CreatedAt, nil + return obj.Pagination, nil }) if err != nil { ec.Error(ctx, err) @@ -7173,26 +6445,36 @@ func (ec *executionContext) _AuthzPermission_created_at(ctx context.Context, fie } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*model.Pagination) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermission_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_EmailTemplates_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermission", + Object: "EmailTemplates", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + switch field.Name { + case "limit": + return ec.fieldContext_Pagination_limit(ctx, field) + case "page": + return ec.fieldContext_Pagination_page(ctx, field) + case "offset": + return ec.fieldContext_Pagination_offset(ctx, field) + case "total": + return ec.fieldContext_Pagination_total(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) }, } return fc, nil } -func (ec *executionContext) _AuthzPermission_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermission_updated_at(ctx, field) +func (ec *executionContext) _EmailTemplates_email_templates(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplates) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailTemplates_email_templates(ctx, field) if err != nil { return graphql.Null } @@ -7205,7 +6487,7 @@ func (ec *executionContext) _AuthzPermission_updated_at(ctx context.Context, fie }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.UpdatedAt, nil + return obj.EmailTemplates, nil }) if err != nil { ec.Error(ctx, err) @@ -7217,26 +6499,42 @@ func (ec *executionContext) _AuthzPermission_updated_at(ctx context.Context, fie } return graphql.Null } - res := resTmp.(int64) + res := resTmp.([]*model.EmailTemplate) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalNEmailTemplate2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplateᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermission_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_EmailTemplates_email_templates(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermission", + Object: "EmailTemplates", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + switch field.Name { + case "id": + return ec.fieldContext_EmailTemplate_id(ctx, field) + case "event_name": + return ec.fieldContext_EmailTemplate_event_name(ctx, field) + case "template": + return ec.fieldContext_EmailTemplate_template(ctx, field) + case "design": + return ec.fieldContext_EmailTemplate_design(ctx, field) + case "subject": + return ec.fieldContext_EmailTemplate_subject(ctx, field) + case "created_at": + return ec.fieldContext_EmailTemplate_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_EmailTemplate_updated_at(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type EmailTemplate", field.Name) }, } return fc, nil } -func (ec *executionContext) _AuthzPermissions_pagination(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermissions) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermissions_pagination(ctx, field) +func (ec *executionContext) _Env_ACCESS_TOKEN_EXPIRY_TIME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ACCESS_TOKEN_EXPIRY_TIME(ctx, field) if err != nil { return graphql.Null } @@ -7249,48 +6547,35 @@ func (ec *executionContext) _AuthzPermissions_pagination(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Pagination, nil + return obj.AccessTokenExpiryTime, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Pagination) + res := resTmp.(*string) fc.Result = res - return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermissions_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ACCESS_TOKEN_EXPIRY_TIME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermissions", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "limit": - return ec.fieldContext_Pagination_limit(ctx, field) - case "page": - return ec.fieldContext_Pagination_page(ctx, field) - case "offset": - return ec.fieldContext_Pagination_offset(ctx, field) - case "total": - return ec.fieldContext_Pagination_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPermissions_permissions(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPermissions) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPermissions_permissions(ctx, field) +func (ec *executionContext) _Env_ADMIN_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ADMIN_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -7303,58 +6588,35 @@ func (ec *executionContext) _AuthzPermissions_permissions(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Permissions, nil + return obj.AdminSecret, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.([]*model.AuthzPermission) + res := resTmp.(*string) fc.Result = res - return ec.marshalNAuthzPermission2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermissionᚄ(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPermissions_permissions(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ADMIN_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPermissions", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzPermission_id(ctx, field) - case "name": - return ec.fieldContext_AuthzPermission_name(ctx, field) - case "description": - return ec.fieldContext_AuthzPermission_description(ctx, field) - case "resource": - return ec.fieldContext_AuthzPermission_resource(ctx, field) - case "scopes": - return ec.fieldContext_AuthzPermission_scopes(ctx, field) - case "policies": - return ec.fieldContext_AuthzPermission_policies(ctx, field) - case "decision_strategy": - return ec.fieldContext_AuthzPermission_decision_strategy(ctx, field) - case "created_at": - return ec.fieldContext_AuthzPermission_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzPermission_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPermission", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPolicies_pagination(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicies) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicies_pagination(ctx, field) +func (ec *executionContext) _Env_DATABASE_NAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DATABASE_NAME(ctx, field) if err != nil { return graphql.Null } @@ -7367,48 +6629,35 @@ func (ec *executionContext) _AuthzPolicies_pagination(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Pagination, nil + return obj.DatabaseName, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Pagination) + res := resTmp.(*string) fc.Result = res - return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicies_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DATABASE_NAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicies", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "limit": - return ec.fieldContext_Pagination_limit(ctx, field) - case "page": - return ec.fieldContext_Pagination_page(ctx, field) - case "offset": - return ec.fieldContext_Pagination_offset(ctx, field) - case "total": - return ec.fieldContext_Pagination_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPolicies_policies(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicies) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicies_policies(ctx, field) +func (ec *executionContext) _Env_DATABASE_URL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DATABASE_URL(ctx, field) if err != nil { return graphql.Null } @@ -7421,58 +6670,35 @@ func (ec *executionContext) _AuthzPolicies_policies(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Policies, nil + return obj.DatabaseURL, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.([]*model.AuthzPolicy) + res := resTmp.(*string) fc.Result = res - return ec.marshalNAuthzPolicy2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicyᚄ(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicies_policies(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DATABASE_URL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicies", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzPolicy_id(ctx, field) - case "name": - return ec.fieldContext_AuthzPolicy_name(ctx, field) - case "description": - return ec.fieldContext_AuthzPolicy_description(ctx, field) - case "type": - return ec.fieldContext_AuthzPolicy_type(ctx, field) - case "logic": - return ec.fieldContext_AuthzPolicy_logic(ctx, field) - case "decision_strategy": - return ec.fieldContext_AuthzPolicy_decision_strategy(ctx, field) - case "targets": - return ec.fieldContext_AuthzPolicy_targets(ctx, field) - case "created_at": - return ec.fieldContext_AuthzPolicy_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzPolicy_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPolicy", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPolicy_id(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicy) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicy_id(ctx, field) +func (ec *executionContext) _Env_DATABASE_TYPE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DATABASE_TYPE(ctx, field) if err != nil { return graphql.Null } @@ -7485,38 +6711,35 @@ func (ec *executionContext) _AuthzPolicy_id(ctx context.Context, field graphql.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ID, nil + return obj.DatabaseType, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicy_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DATABASE_TYPE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicy", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPolicy_name(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicy) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicy_name(ctx, field) +func (ec *executionContext) _Env_DATABASE_USERNAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DATABASE_USERNAME(ctx, field) if err != nil { return graphql.Null } @@ -7529,26 +6752,23 @@ func (ec *executionContext) _AuthzPolicy_name(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Name, nil + return obj.DatabaseUsername, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicy_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DATABASE_USERNAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicy", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -7559,8 +6779,8 @@ func (ec *executionContext) fieldContext_AuthzPolicy_name(_ context.Context, fie return fc, nil } -func (ec *executionContext) _AuthzPolicy_description(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicy) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicy_description(ctx, field) +func (ec *executionContext) _Env_DATABASE_PASSWORD(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DATABASE_PASSWORD(ctx, field) if err != nil { return graphql.Null } @@ -7573,7 +6793,7 @@ func (ec *executionContext) _AuthzPolicy_description(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Description, nil + return obj.DatabasePassword, nil }) if err != nil { ec.Error(ctx, err) @@ -7587,9 +6807,9 @@ func (ec *executionContext) _AuthzPolicy_description(ctx context.Context, field return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicy_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DATABASE_PASSWORD(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicy", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -7600,8 +6820,8 @@ func (ec *executionContext) fieldContext_AuthzPolicy_description(_ context.Conte return fc, nil } -func (ec *executionContext) _AuthzPolicy_type(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicy) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicy_type(ctx, field) +func (ec *executionContext) _Env_DATABASE_HOST(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DATABASE_HOST(ctx, field) if err != nil { return graphql.Null } @@ -7614,26 +6834,23 @@ func (ec *executionContext) _AuthzPolicy_type(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Type, nil + return obj.DatabaseHost, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicy_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DATABASE_HOST(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicy", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -7644,8 +6861,8 @@ func (ec *executionContext) fieldContext_AuthzPolicy_type(_ context.Context, fie return fc, nil } -func (ec *executionContext) _AuthzPolicy_logic(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicy) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicy_logic(ctx, field) +func (ec *executionContext) _Env_DATABASE_PORT(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DATABASE_PORT(ctx, field) if err != nil { return graphql.Null } @@ -7658,26 +6875,23 @@ func (ec *executionContext) _AuthzPolicy_logic(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Logic, nil + return obj.DatabasePort, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicy_logic(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DATABASE_PORT(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicy", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -7688,8 +6902,8 @@ func (ec *executionContext) fieldContext_AuthzPolicy_logic(_ context.Context, fi return fc, nil } -func (ec *executionContext) _AuthzPolicy_decision_strategy(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicy) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicy_decision_strategy(ctx, field) +func (ec *executionContext) _Env_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -7702,7 +6916,7 @@ func (ec *executionContext) _AuthzPolicy_decision_strategy(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DecisionStrategy, nil + return obj.ClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -7719,9 +6933,9 @@ func (ec *executionContext) _AuthzPolicy_decision_strategy(ctx context.Context, return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicy_decision_strategy(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicy", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -7732,8 +6946,8 @@ func (ec *executionContext) fieldContext_AuthzPolicy_decision_strategy(_ context return fc, nil } -func (ec *executionContext) _AuthzPolicy_targets(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicy) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicy_targets(ctx, field) +func (ec *executionContext) _Env_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -7746,7 +6960,7 @@ func (ec *executionContext) _AuthzPolicy_targets(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Targets, nil + return obj.ClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -7758,34 +6972,26 @@ func (ec *executionContext) _AuthzPolicy_targets(ctx context.Context, field grap } return graphql.Null } - res := resTmp.([]*model.AuthzPolicyTarget) + res := resTmp.(string) fc.Result = res - return ec.marshalNAuthzPolicyTarget2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicyTargetᚄ(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicy_targets(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicy", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzPolicyTarget_id(ctx, field) - case "target_type": - return ec.fieldContext_AuthzPolicyTarget_target_type(ctx, field) - case "target_value": - return ec.fieldContext_AuthzPolicyTarget_target_value(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPolicyTarget", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPolicy_created_at(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicy) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicy_created_at(ctx, field) +func (ec *executionContext) _Env_CUSTOM_ACCESS_TOKEN_SCRIPT(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_CUSTOM_ACCESS_TOKEN_SCRIPT(ctx, field) if err != nil { return graphql.Null } @@ -7798,38 +7004,35 @@ func (ec *executionContext) _AuthzPolicy_created_at(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CreatedAt, nil + return obj.CustomAccessTokenScript, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicy_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_CUSTOM_ACCESS_TOKEN_SCRIPT(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicy", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPolicy_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicy) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicy_updated_at(ctx, field) +func (ec *executionContext) _Env_SMTP_HOST(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_SMTP_HOST(ctx, field) if err != nil { return graphql.Null } @@ -7842,38 +7045,35 @@ func (ec *executionContext) _AuthzPolicy_updated_at(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.UpdatedAt, nil + return obj.SMTPHost, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicy_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_SMTP_HOST(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicy", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPolicyTarget_id(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicyTarget) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicyTarget_id(ctx, field) +func (ec *executionContext) _Env_SMTP_PORT(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_SMTP_PORT(ctx, field) if err != nil { return graphql.Null } @@ -7886,38 +7086,35 @@ func (ec *executionContext) _AuthzPolicyTarget_id(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ID, nil + return obj.SMTPPort, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicyTarget_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_SMTP_PORT(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicyTarget", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzPolicyTarget_target_type(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicyTarget) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicyTarget_target_type(ctx, field) +func (ec *executionContext) _Env_SMTP_USERNAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_SMTP_USERNAME(ctx, field) if err != nil { return graphql.Null } @@ -7930,26 +7127,23 @@ func (ec *executionContext) _AuthzPolicyTarget_target_type(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.TargetType, nil + return obj.SMTPUsername, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicyTarget_target_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_SMTP_USERNAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicyTarget", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -7960,8 +7154,8 @@ func (ec *executionContext) fieldContext_AuthzPolicyTarget_target_type(_ context return fc, nil } -func (ec *executionContext) _AuthzPolicyTarget_target_value(ctx context.Context, field graphql.CollectedField, obj *model.AuthzPolicyTarget) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzPolicyTarget_target_value(ctx, field) +func (ec *executionContext) _Env_SMTP_PASSWORD(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_SMTP_PASSWORD(ctx, field) if err != nil { return graphql.Null } @@ -7974,26 +7168,23 @@ func (ec *executionContext) _AuthzPolicyTarget_target_value(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.TargetValue, nil + return obj.SMTPPassword, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzPolicyTarget_target_value(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_SMTP_PASSWORD(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzPolicyTarget", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -8004,8 +7195,8 @@ func (ec *executionContext) fieldContext_AuthzPolicyTarget_target_value(_ contex return fc, nil } -func (ec *executionContext) _AuthzResource_id(ctx context.Context, field graphql.CollectedField, obj *model.AuthzResource) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzResource_id(ctx, field) +func (ec *executionContext) _Env_SMTP_LOCAL_NAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_SMTP_LOCAL_NAME(ctx, field) if err != nil { return graphql.Null } @@ -8018,38 +7209,35 @@ func (ec *executionContext) _AuthzResource_id(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ID, nil + return obj.SMTPLocalName, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzResource_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_SMTP_LOCAL_NAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzResource", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzResource_name(ctx context.Context, field graphql.CollectedField, obj *model.AuthzResource) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzResource_name(ctx, field) +func (ec *executionContext) _Env_SENDER_EMAIL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_SENDER_EMAIL(ctx, field) if err != nil { return graphql.Null } @@ -8062,26 +7250,23 @@ func (ec *executionContext) _AuthzResource_name(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Name, nil + return obj.SenderEmail, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzResource_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_SENDER_EMAIL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzResource", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -8092,8 +7277,8 @@ func (ec *executionContext) fieldContext_AuthzResource_name(_ context.Context, f return fc, nil } -func (ec *executionContext) _AuthzResource_description(ctx context.Context, field graphql.CollectedField, obj *model.AuthzResource) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzResource_description(ctx, field) +func (ec *executionContext) _Env_SENDER_NAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_SENDER_NAME(ctx, field) if err != nil { return graphql.Null } @@ -8106,7 +7291,7 @@ func (ec *executionContext) _AuthzResource_description(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Description, nil + return obj.SenderName, nil }) if err != nil { ec.Error(ctx, err) @@ -8120,9 +7305,9 @@ func (ec *executionContext) _AuthzResource_description(ctx context.Context, fiel return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzResource_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_SENDER_NAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzResource", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -8133,8 +7318,8 @@ func (ec *executionContext) fieldContext_AuthzResource_description(_ context.Con return fc, nil } -func (ec *executionContext) _AuthzResource_created_at(ctx context.Context, field graphql.CollectedField, obj *model.AuthzResource) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzResource_created_at(ctx, field) +func (ec *executionContext) _Env_JWT_TYPE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_JWT_TYPE(ctx, field) if err != nil { return graphql.Null } @@ -8147,38 +7332,35 @@ func (ec *executionContext) _AuthzResource_created_at(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CreatedAt, nil + return obj.JwtType, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzResource_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_JWT_TYPE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzResource", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzResource_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.AuthzResource) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzResource_updated_at(ctx, field) +func (ec *executionContext) _Env_JWT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_JWT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -8191,38 +7373,35 @@ func (ec *executionContext) _AuthzResource_updated_at(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.UpdatedAt, nil + return obj.JwtSecret, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzResource_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_JWT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzResource", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzResources_pagination(ctx context.Context, field graphql.CollectedField, obj *model.AuthzResources) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzResources_pagination(ctx, field) +func (ec *executionContext) _Env_JWT_PRIVATE_KEY(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_JWT_PRIVATE_KEY(ctx, field) if err != nil { return graphql.Null } @@ -8235,48 +7414,35 @@ func (ec *executionContext) _AuthzResources_pagination(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Pagination, nil + return obj.JwtPrivateKey, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Pagination) + res := resTmp.(*string) fc.Result = res - return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzResources_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_JWT_PRIVATE_KEY(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzResources", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "limit": - return ec.fieldContext_Pagination_limit(ctx, field) - case "page": - return ec.fieldContext_Pagination_page(ctx, field) - case "offset": - return ec.fieldContext_Pagination_offset(ctx, field) - case "total": - return ec.fieldContext_Pagination_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzResources_resources(ctx context.Context, field graphql.CollectedField, obj *model.AuthzResources) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzResources_resources(ctx, field) +func (ec *executionContext) _Env_JWT_PUBLIC_KEY(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_JWT_PUBLIC_KEY(ctx, field) if err != nil { return graphql.Null } @@ -8289,50 +7455,35 @@ func (ec *executionContext) _AuthzResources_resources(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Resources, nil + return obj.JwtPublicKey, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.([]*model.AuthzResource) + res := resTmp.(*string) fc.Result = res - return ec.marshalNAuthzResource2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResourceᚄ(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzResources_resources(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_JWT_PUBLIC_KEY(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzResources", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzResource_id(ctx, field) - case "name": - return ec.fieldContext_AuthzResource_name(ctx, field) - case "description": - return ec.fieldContext_AuthzResource_description(ctx, field) - case "created_at": - return ec.fieldContext_AuthzResource_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzResource_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzResource", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzScope_id(ctx context.Context, field graphql.CollectedField, obj *model.AuthzScope) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzScope_id(ctx, field) +func (ec *executionContext) _Env_ALLOWED_ORIGINS(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ALLOWED_ORIGINS(ctx, field) if err != nil { return graphql.Null } @@ -8345,38 +7496,35 @@ func (ec *executionContext) _AuthzScope_id(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ID, nil + return obj.AllowedOrigins, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.([]string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzScope_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ALLOWED_ORIGINS(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzScope", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzScope_name(ctx context.Context, field graphql.CollectedField, obj *model.AuthzScope) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzScope_name(ctx, field) +func (ec *executionContext) _Env_APP_URL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_APP_URL(ctx, field) if err != nil { return graphql.Null } @@ -8389,26 +7537,23 @@ func (ec *executionContext) _AuthzScope_name(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Name, nil + return obj.AppURL, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzScope_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_APP_URL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzScope", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -8419,8 +7564,8 @@ func (ec *executionContext) fieldContext_AuthzScope_name(_ context.Context, fiel return fc, nil } -func (ec *executionContext) _AuthzScope_description(ctx context.Context, field graphql.CollectedField, obj *model.AuthzScope) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzScope_description(ctx, field) +func (ec *executionContext) _Env_REDIS_URL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_REDIS_URL(ctx, field) if err != nil { return graphql.Null } @@ -8433,7 +7578,7 @@ func (ec *executionContext) _AuthzScope_description(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Description, nil + return obj.RedisURL, nil }) if err != nil { ec.Error(ctx, err) @@ -8447,9 +7592,9 @@ func (ec *executionContext) _AuthzScope_description(ctx context.Context, field g return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzScope_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_REDIS_URL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzScope", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, @@ -8460,8 +7605,8 @@ func (ec *executionContext) fieldContext_AuthzScope_description(_ context.Contex return fc, nil } -func (ec *executionContext) _AuthzScope_created_at(ctx context.Context, field graphql.CollectedField, obj *model.AuthzScope) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzScope_created_at(ctx, field) +func (ec *executionContext) _Env_RESET_PASSWORD_URL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_RESET_PASSWORD_URL(ctx, field) if err != nil { return graphql.Null } @@ -8474,38 +7619,35 @@ func (ec *executionContext) _AuthzScope_created_at(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CreatedAt, nil + return obj.ResetPasswordURL, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzScope_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_RESET_PASSWORD_URL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzScope", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzScope_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.AuthzScope) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzScope_updated_at(ctx, field) +func (ec *executionContext) _Env_DISABLE_EMAIL_VERIFICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_EMAIL_VERIFICATION(ctx, field) if err != nil { return graphql.Null } @@ -8518,7 +7660,7 @@ func (ec *executionContext) _AuthzScope_updated_at(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.UpdatedAt, nil + return obj.DisableEmailVerification, nil }) if err != nil { ec.Error(ctx, err) @@ -8530,26 +7672,26 @@ func (ec *executionContext) _AuthzScope_updated_at(ctx context.Context, field gr } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(bool) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzScope_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_EMAIL_VERIFICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzScope", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzScopes_pagination(ctx context.Context, field graphql.CollectedField, obj *model.AuthzScopes) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzScopes_pagination(ctx, field) +func (ec *executionContext) _Env_DISABLE_BASIC_AUTHENTICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_BASIC_AUTHENTICATION(ctx, field) if err != nil { return graphql.Null } @@ -8562,7 +7704,7 @@ func (ec *executionContext) _AuthzScopes_pagination(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Pagination, nil + return obj.DisableBasicAuthentication, nil }) if err != nil { ec.Error(ctx, err) @@ -8574,36 +7716,26 @@ func (ec *executionContext) _AuthzScopes_pagination(ctx context.Context, field g } return graphql.Null } - res := resTmp.(*model.Pagination) + res := resTmp.(bool) fc.Result = res - return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzScopes_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_BASIC_AUTHENTICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzScopes", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "limit": - return ec.fieldContext_Pagination_limit(ctx, field) - case "page": - return ec.fieldContext_Pagination_page(ctx, field) - case "offset": - return ec.fieldContext_Pagination_offset(ctx, field) - case "total": - return ec.fieldContext_Pagination_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AuthzScopes_scopes(ctx context.Context, field graphql.CollectedField, obj *model.AuthzScopes) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AuthzScopes_scopes(ctx, field) +func (ec *executionContext) _Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx, field) if err != nil { return graphql.Null } @@ -8616,7 +7748,7 @@ func (ec *executionContext) _AuthzScopes_scopes(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Scopes, nil + return obj.DisableMobileBasicAuthentication, nil }) if err != nil { ec.Error(ctx, err) @@ -8628,38 +7760,26 @@ func (ec *executionContext) _AuthzScopes_scopes(ctx context.Context, field graph } return graphql.Null } - res := resTmp.([]*model.AuthzScope) + res := resTmp.(bool) fc.Result = res - return ec.marshalNAuthzScope2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScopeᚄ(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AuthzScopes_scopes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AuthzScopes", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzScope_id(ctx, field) - case "name": - return ec.fieldContext_AuthzScope_name(ctx, field) - case "description": - return ec.fieldContext_AuthzScope_description(ctx, field) - case "created_at": - return ec.fieldContext_AuthzScope_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzScope_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzScope", field.Name) + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _EmailTemplate_id(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_EmailTemplate_id(ctx, field) +func (ec *executionContext) _Env_DISABLE_MAGIC_LINK_LOGIN(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_MAGIC_LINK_LOGIN(ctx, field) if err != nil { return graphql.Null } @@ -8672,7 +7792,7 @@ func (ec *executionContext) _EmailTemplate_id(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ID, nil + return obj.DisableMagicLinkLogin, nil }) if err != nil { ec.Error(ctx, err) @@ -8684,26 +7804,26 @@ func (ec *executionContext) _EmailTemplate_id(ctx context.Context, field graphql } return graphql.Null } - res := resTmp.(string) + res := resTmp.(bool) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_EmailTemplate_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_MAGIC_LINK_LOGIN(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "EmailTemplate", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _EmailTemplate_event_name(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_EmailTemplate_event_name(ctx, field) +func (ec *executionContext) _Env_DISABLE_LOGIN_PAGE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_LOGIN_PAGE(ctx, field) if err != nil { return graphql.Null } @@ -8716,7 +7836,7 @@ func (ec *executionContext) _EmailTemplate_event_name(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.EventName, nil + return obj.DisableLoginPage, nil }) if err != nil { ec.Error(ctx, err) @@ -8728,26 +7848,26 @@ func (ec *executionContext) _EmailTemplate_event_name(ctx context.Context, field } return graphql.Null } - res := resTmp.(string) + res := resTmp.(bool) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_EmailTemplate_event_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_LOGIN_PAGE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "EmailTemplate", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _EmailTemplate_template(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_EmailTemplate_template(ctx, field) +func (ec *executionContext) _Env_DISABLE_SIGN_UP(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_SIGN_UP(ctx, field) if err != nil { return graphql.Null } @@ -8760,7 +7880,7 @@ func (ec *executionContext) _EmailTemplate_template(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Template, nil + return obj.DisableSignUp, nil }) if err != nil { ec.Error(ctx, err) @@ -8772,26 +7892,26 @@ func (ec *executionContext) _EmailTemplate_template(ctx context.Context, field g } return graphql.Null } - res := resTmp.(string) + res := resTmp.(bool) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_EmailTemplate_template(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_SIGN_UP(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "EmailTemplate", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _EmailTemplate_design(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_EmailTemplate_design(ctx, field) +func (ec *executionContext) _Env_DISABLE_REDIS_FOR_ENV(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_REDIS_FOR_ENV(ctx, field) if err != nil { return graphql.Null } @@ -8804,7 +7924,7 @@ func (ec *executionContext) _EmailTemplate_design(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Design, nil + return obj.DisableRedisForEnv, nil }) if err != nil { ec.Error(ctx, err) @@ -8816,26 +7936,26 @@ func (ec *executionContext) _EmailTemplate_design(ctx context.Context, field gra } return graphql.Null } - res := resTmp.(string) + res := resTmp.(bool) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_EmailTemplate_design(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_REDIS_FOR_ENV(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "EmailTemplate", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _EmailTemplate_subject(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_EmailTemplate_subject(ctx, field) +func (ec *executionContext) _Env_DISABLE_STRONG_PASSWORD(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_STRONG_PASSWORD(ctx, field) if err != nil { return graphql.Null } @@ -8848,7 +7968,7 @@ func (ec *executionContext) _EmailTemplate_subject(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Subject, nil + return obj.DisableStrongPassword, nil }) if err != nil { ec.Error(ctx, err) @@ -8860,26 +7980,26 @@ func (ec *executionContext) _EmailTemplate_subject(ctx context.Context, field gr } return graphql.Null } - res := resTmp.(string) + res := resTmp.(bool) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_EmailTemplate_subject(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_STRONG_PASSWORD(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "EmailTemplate", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _EmailTemplate_created_at(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_EmailTemplate_created_at(ctx, field) +func (ec *executionContext) _Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(ctx, field) if err != nil { return graphql.Null } @@ -8892,35 +8012,38 @@ func (ec *executionContext) _EmailTemplate_created_at(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CreatedAt, nil + return obj.DisableMultiFactorAuthentication, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(bool) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_EmailTemplate_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "EmailTemplate", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _EmailTemplate_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplate) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_EmailTemplate_updated_at(ctx, field) +func (ec *executionContext) _Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx, field) if err != nil { return graphql.Null } @@ -8933,35 +8056,38 @@ func (ec *executionContext) _EmailTemplate_updated_at(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.UpdatedAt, nil + return obj.EnforceMultiFactorAuthentication, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(bool) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_EmailTemplate_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "EmailTemplate", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _EmailTemplates_pagination(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplates) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_EmailTemplates_pagination(ctx, field) +func (ec *executionContext) _Env_ROLES(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ROLES(ctx, field) if err != nil { return graphql.Null } @@ -8974,48 +8100,35 @@ func (ec *executionContext) _EmailTemplates_pagination(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Pagination, nil + return obj.Roles, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Pagination) + res := resTmp.([]string) fc.Result = res - return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) + return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_EmailTemplates_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ROLES(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "EmailTemplates", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "limit": - return ec.fieldContext_Pagination_limit(ctx, field) - case "page": - return ec.fieldContext_Pagination_page(ctx, field) - case "offset": - return ec.fieldContext_Pagination_offset(ctx, field) - case "total": - return ec.fieldContext_Pagination_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _EmailTemplates_email_templates(ctx context.Context, field graphql.CollectedField, obj *model.EmailTemplates) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_EmailTemplates_email_templates(ctx, field) +func (ec *executionContext) _Env_PROTECTED_ROLES(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_PROTECTED_ROLES(ctx, field) if err != nil { return graphql.Null } @@ -9028,54 +8141,35 @@ func (ec *executionContext) _EmailTemplates_email_templates(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.EmailTemplates, nil + return obj.ProtectedRoles, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.([]*model.EmailTemplate) + res := resTmp.([]string) fc.Result = res - return ec.marshalNEmailTemplate2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplateᚄ(ctx, field.Selections, res) + return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_EmailTemplates_email_templates(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_PROTECTED_ROLES(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "EmailTemplates", + Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_EmailTemplate_id(ctx, field) - case "event_name": - return ec.fieldContext_EmailTemplate_event_name(ctx, field) - case "template": - return ec.fieldContext_EmailTemplate_template(ctx, field) - case "design": - return ec.fieldContext_EmailTemplate_design(ctx, field) - case "subject": - return ec.fieldContext_EmailTemplate_subject(ctx, field) - case "created_at": - return ec.fieldContext_EmailTemplate_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_EmailTemplate_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type EmailTemplate", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_ACCESS_TOKEN_EXPIRY_TIME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ACCESS_TOKEN_EXPIRY_TIME(ctx, field) +func (ec *executionContext) _Env_DEFAULT_ROLES(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DEFAULT_ROLES(ctx, field) if err != nil { return graphql.Null } @@ -9088,7 +8182,7 @@ func (ec *executionContext) _Env_ACCESS_TOKEN_EXPIRY_TIME(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.AccessTokenExpiryTime, nil + return obj.DefaultRoles, nil }) if err != nil { ec.Error(ctx, err) @@ -9097,12 +8191,12 @@ func (ec *executionContext) _Env_ACCESS_TOKEN_EXPIRY_TIME(ctx context.Context, f if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.([]string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ACCESS_TOKEN_EXPIRY_TIME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DEFAULT_ROLES(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9115,8 +8209,8 @@ func (ec *executionContext) fieldContext_Env_ACCESS_TOKEN_EXPIRY_TIME(_ context. return fc, nil } -func (ec *executionContext) _Env_ADMIN_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ADMIN_SECRET(ctx, field) +func (ec *executionContext) _Env_JWT_ROLE_CLAIM(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_JWT_ROLE_CLAIM(ctx, field) if err != nil { return graphql.Null } @@ -9129,7 +8223,7 @@ func (ec *executionContext) _Env_ADMIN_SECRET(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.AdminSecret, nil + return obj.JwtRoleClaim, nil }) if err != nil { ec.Error(ctx, err) @@ -9143,7 +8237,7 @@ func (ec *executionContext) _Env_ADMIN_SECRET(ctx context.Context, field graphql return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ADMIN_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_JWT_ROLE_CLAIM(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9156,8 +8250,8 @@ func (ec *executionContext) fieldContext_Env_ADMIN_SECRET(_ context.Context, fie return fc, nil } -func (ec *executionContext) _Env_DATABASE_NAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DATABASE_NAME(ctx, field) +func (ec *executionContext) _Env_GOOGLE_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_GOOGLE_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9170,7 +8264,7 @@ func (ec *executionContext) _Env_DATABASE_NAME(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DatabaseName, nil + return obj.GoogleClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -9184,7 +8278,7 @@ func (ec *executionContext) _Env_DATABASE_NAME(ctx context.Context, field graphq return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DATABASE_NAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_GOOGLE_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9197,8 +8291,8 @@ func (ec *executionContext) fieldContext_Env_DATABASE_NAME(_ context.Context, fi return fc, nil } -func (ec *executionContext) _Env_DATABASE_URL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DATABASE_URL(ctx, field) +func (ec *executionContext) _Env_GOOGLE_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_GOOGLE_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9211,7 +8305,7 @@ func (ec *executionContext) _Env_DATABASE_URL(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DatabaseURL, nil + return obj.GoogleClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -9225,7 +8319,7 @@ func (ec *executionContext) _Env_DATABASE_URL(ctx context.Context, field graphql return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DATABASE_URL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_GOOGLE_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9238,8 +8332,8 @@ func (ec *executionContext) fieldContext_Env_DATABASE_URL(_ context.Context, fie return fc, nil } -func (ec *executionContext) _Env_DATABASE_TYPE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DATABASE_TYPE(ctx, field) +func (ec *executionContext) _Env_GITHUB_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_GITHUB_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9252,7 +8346,7 @@ func (ec *executionContext) _Env_DATABASE_TYPE(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DatabaseType, nil + return obj.GithubClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -9266,7 +8360,7 @@ func (ec *executionContext) _Env_DATABASE_TYPE(ctx context.Context, field graphq return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DATABASE_TYPE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_GITHUB_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9279,8 +8373,8 @@ func (ec *executionContext) fieldContext_Env_DATABASE_TYPE(_ context.Context, fi return fc, nil } -func (ec *executionContext) _Env_DATABASE_USERNAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DATABASE_USERNAME(ctx, field) +func (ec *executionContext) _Env_GITHUB_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_GITHUB_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9293,7 +8387,7 @@ func (ec *executionContext) _Env_DATABASE_USERNAME(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DatabaseUsername, nil + return obj.GithubClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -9307,7 +8401,7 @@ func (ec *executionContext) _Env_DATABASE_USERNAME(ctx context.Context, field gr return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DATABASE_USERNAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_GITHUB_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9320,8 +8414,8 @@ func (ec *executionContext) fieldContext_Env_DATABASE_USERNAME(_ context.Context return fc, nil } -func (ec *executionContext) _Env_DATABASE_PASSWORD(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DATABASE_PASSWORD(ctx, field) +func (ec *executionContext) _Env_FACEBOOK_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_FACEBOOK_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9334,7 +8428,7 @@ func (ec *executionContext) _Env_DATABASE_PASSWORD(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DatabasePassword, nil + return obj.FacebookClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -9348,7 +8442,7 @@ func (ec *executionContext) _Env_DATABASE_PASSWORD(ctx context.Context, field gr return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DATABASE_PASSWORD(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_FACEBOOK_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9361,8 +8455,8 @@ func (ec *executionContext) fieldContext_Env_DATABASE_PASSWORD(_ context.Context return fc, nil } -func (ec *executionContext) _Env_DATABASE_HOST(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DATABASE_HOST(ctx, field) +func (ec *executionContext) _Env_FACEBOOK_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_FACEBOOK_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9375,7 +8469,7 @@ func (ec *executionContext) _Env_DATABASE_HOST(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DatabaseHost, nil + return obj.FacebookClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -9389,7 +8483,7 @@ func (ec *executionContext) _Env_DATABASE_HOST(ctx context.Context, field graphq return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DATABASE_HOST(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_FACEBOOK_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9402,8 +8496,8 @@ func (ec *executionContext) fieldContext_Env_DATABASE_HOST(_ context.Context, fi return fc, nil } -func (ec *executionContext) _Env_DATABASE_PORT(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DATABASE_PORT(ctx, field) +func (ec *executionContext) _Env_LINKEDIN_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_LINKEDIN_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9416,7 +8510,7 @@ func (ec *executionContext) _Env_DATABASE_PORT(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DatabasePort, nil + return obj.LinkedinClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -9430,7 +8524,7 @@ func (ec *executionContext) _Env_DATABASE_PORT(ctx context.Context, field graphq return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DATABASE_PORT(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_LINKEDIN_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9443,8 +8537,8 @@ func (ec *executionContext) fieldContext_Env_DATABASE_PORT(_ context.Context, fi return fc, nil } -func (ec *executionContext) _Env_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_CLIENT_ID(ctx, field) +func (ec *executionContext) _Env_LINKEDIN_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_LINKEDIN_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9457,24 +8551,21 @@ func (ec *executionContext) _Env_CLIENT_ID(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ClientID, nil + return obj.LinkedinClientSecret, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_LINKEDIN_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9487,8 +8578,8 @@ func (ec *executionContext) fieldContext_Env_CLIENT_ID(_ context.Context, field return fc, nil } -func (ec *executionContext) _Env_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _Env_APPLE_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_APPLE_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9501,24 +8592,21 @@ func (ec *executionContext) _Env_CLIENT_SECRET(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ClientSecret, nil + return obj.AppleClientID, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_APPLE_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9531,8 +8619,8 @@ func (ec *executionContext) fieldContext_Env_CLIENT_SECRET(_ context.Context, fi return fc, nil } -func (ec *executionContext) _Env_CUSTOM_ACCESS_TOKEN_SCRIPT(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_CUSTOM_ACCESS_TOKEN_SCRIPT(ctx, field) +func (ec *executionContext) _Env_APPLE_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_APPLE_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9545,7 +8633,7 @@ func (ec *executionContext) _Env_CUSTOM_ACCESS_TOKEN_SCRIPT(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CustomAccessTokenScript, nil + return obj.AppleClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -9559,7 +8647,7 @@ func (ec *executionContext) _Env_CUSTOM_ACCESS_TOKEN_SCRIPT(ctx context.Context, return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_CUSTOM_ACCESS_TOKEN_SCRIPT(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_APPLE_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9572,8 +8660,8 @@ func (ec *executionContext) fieldContext_Env_CUSTOM_ACCESS_TOKEN_SCRIPT(_ contex return fc, nil } -func (ec *executionContext) _Env_SMTP_HOST(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_SMTP_HOST(ctx, field) +func (ec *executionContext) _Env_DISCORD_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISCORD_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9586,7 +8674,7 @@ func (ec *executionContext) _Env_SMTP_HOST(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.SMTPHost, nil + return obj.DiscordClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -9600,7 +8688,7 @@ func (ec *executionContext) _Env_SMTP_HOST(ctx context.Context, field graphql.Co return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_SMTP_HOST(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISCORD_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9613,8 +8701,8 @@ func (ec *executionContext) fieldContext_Env_SMTP_HOST(_ context.Context, field return fc, nil } -func (ec *executionContext) _Env_SMTP_PORT(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_SMTP_PORT(ctx, field) +func (ec *executionContext) _Env_DISCORD_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISCORD_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9627,7 +8715,7 @@ func (ec *executionContext) _Env_SMTP_PORT(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.SMTPPort, nil + return obj.DiscordClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -9641,7 +8729,7 @@ func (ec *executionContext) _Env_SMTP_PORT(ctx context.Context, field graphql.Co return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_SMTP_PORT(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISCORD_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9654,8 +8742,8 @@ func (ec *executionContext) fieldContext_Env_SMTP_PORT(_ context.Context, field return fc, nil } -func (ec *executionContext) _Env_SMTP_USERNAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_SMTP_USERNAME(ctx, field) +func (ec *executionContext) _Env_TWITTER_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_TWITTER_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9668,7 +8756,7 @@ func (ec *executionContext) _Env_SMTP_USERNAME(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.SMTPUsername, nil + return obj.TwitterClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -9682,7 +8770,7 @@ func (ec *executionContext) _Env_SMTP_USERNAME(ctx context.Context, field graphq return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_SMTP_USERNAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_TWITTER_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9695,8 +8783,8 @@ func (ec *executionContext) fieldContext_Env_SMTP_USERNAME(_ context.Context, fi return fc, nil } -func (ec *executionContext) _Env_SMTP_PASSWORD(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_SMTP_PASSWORD(ctx, field) +func (ec *executionContext) _Env_TWITTER_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_TWITTER_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9709,7 +8797,7 @@ func (ec *executionContext) _Env_SMTP_PASSWORD(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.SMTPPassword, nil + return obj.TwitterClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -9723,7 +8811,7 @@ func (ec *executionContext) _Env_SMTP_PASSWORD(ctx context.Context, field graphq return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_SMTP_PASSWORD(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_TWITTER_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9736,8 +8824,8 @@ func (ec *executionContext) fieldContext_Env_SMTP_PASSWORD(_ context.Context, fi return fc, nil } -func (ec *executionContext) _Env_SMTP_LOCAL_NAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_SMTP_LOCAL_NAME(ctx, field) +func (ec *executionContext) _Env_MICROSOFT_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_MICROSOFT_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9750,7 +8838,7 @@ func (ec *executionContext) _Env_SMTP_LOCAL_NAME(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.SMTPLocalName, nil + return obj.MicrosoftClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -9764,7 +8852,7 @@ func (ec *executionContext) _Env_SMTP_LOCAL_NAME(ctx context.Context, field grap return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_SMTP_LOCAL_NAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_MICROSOFT_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9777,8 +8865,8 @@ func (ec *executionContext) fieldContext_Env_SMTP_LOCAL_NAME(_ context.Context, return fc, nil } -func (ec *executionContext) _Env_SENDER_EMAIL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_SENDER_EMAIL(ctx, field) +func (ec *executionContext) _Env_MICROSOFT_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_MICROSOFT_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9791,7 +8879,7 @@ func (ec *executionContext) _Env_SENDER_EMAIL(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.SenderEmail, nil + return obj.MicrosoftClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -9805,7 +8893,7 @@ func (ec *executionContext) _Env_SENDER_EMAIL(ctx context.Context, field graphql return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_SENDER_EMAIL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_MICROSOFT_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9818,8 +8906,8 @@ func (ec *executionContext) fieldContext_Env_SENDER_EMAIL(_ context.Context, fie return fc, nil } -func (ec *executionContext) _Env_SENDER_NAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_SENDER_NAME(ctx, field) +func (ec *executionContext) _Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9832,7 +8920,7 @@ func (ec *executionContext) _Env_SENDER_NAME(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.SenderName, nil + return obj.MicrosoftActiveDirectoryTenantID, nil }) if err != nil { ec.Error(ctx, err) @@ -9846,7 +8934,7 @@ func (ec *executionContext) _Env_SENDER_NAME(ctx context.Context, field graphql. return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_SENDER_NAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9859,8 +8947,8 @@ func (ec *executionContext) fieldContext_Env_SENDER_NAME(_ context.Context, fiel return fc, nil } -func (ec *executionContext) _Env_JWT_TYPE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_JWT_TYPE(ctx, field) +func (ec *executionContext) _Env_TWITCH_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_TWITCH_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9873,7 +8961,7 @@ func (ec *executionContext) _Env_JWT_TYPE(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.JwtType, nil + return obj.TwitchClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -9887,7 +8975,7 @@ func (ec *executionContext) _Env_JWT_TYPE(ctx context.Context, field graphql.Col return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_JWT_TYPE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_TWITCH_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9900,8 +8988,8 @@ func (ec *executionContext) fieldContext_Env_JWT_TYPE(_ context.Context, field g return fc, nil } -func (ec *executionContext) _Env_JWT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_JWT_SECRET(ctx, field) +func (ec *executionContext) _Env_TWITCH_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_TWITCH_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9914,7 +9002,7 @@ func (ec *executionContext) _Env_JWT_SECRET(ctx context.Context, field graphql.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.JwtSecret, nil + return obj.TwitchClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -9928,7 +9016,7 @@ func (ec *executionContext) _Env_JWT_SECRET(ctx context.Context, field graphql.C return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_JWT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_TWITCH_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9941,8 +9029,8 @@ func (ec *executionContext) fieldContext_Env_JWT_SECRET(_ context.Context, field return fc, nil } -func (ec *executionContext) _Env_JWT_PRIVATE_KEY(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_JWT_PRIVATE_KEY(ctx, field) +func (ec *executionContext) _Env_ROBLOX_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ROBLOX_CLIENT_ID(ctx, field) if err != nil { return graphql.Null } @@ -9955,7 +9043,7 @@ func (ec *executionContext) _Env_JWT_PRIVATE_KEY(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.JwtPrivateKey, nil + return obj.RobloxClientID, nil }) if err != nil { ec.Error(ctx, err) @@ -9969,7 +9057,7 @@ func (ec *executionContext) _Env_JWT_PRIVATE_KEY(ctx context.Context, field grap return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_JWT_PRIVATE_KEY(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ROBLOX_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -9982,8 +9070,8 @@ func (ec *executionContext) fieldContext_Env_JWT_PRIVATE_KEY(_ context.Context, return fc, nil } -func (ec *executionContext) _Env_JWT_PUBLIC_KEY(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_JWT_PUBLIC_KEY(ctx, field) +func (ec *executionContext) _Env_ROBLOX_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ROBLOX_CLIENT_SECRET(ctx, field) if err != nil { return graphql.Null } @@ -9996,7 +9084,7 @@ func (ec *executionContext) _Env_JWT_PUBLIC_KEY(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.JwtPublicKey, nil + return obj.RobloxClientSecret, nil }) if err != nil { ec.Error(ctx, err) @@ -10010,7 +9098,7 @@ func (ec *executionContext) _Env_JWT_PUBLIC_KEY(ctx context.Context, field graph return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_JWT_PUBLIC_KEY(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ROBLOX_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -10023,8 +9111,8 @@ func (ec *executionContext) fieldContext_Env_JWT_PUBLIC_KEY(_ context.Context, f return fc, nil } -func (ec *executionContext) _Env_ALLOWED_ORIGINS(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ALLOWED_ORIGINS(ctx, field) +func (ec *executionContext) _Env_ORGANIZATION_NAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ORGANIZATION_NAME(ctx, field) if err != nil { return graphql.Null } @@ -10037,7 +9125,7 @@ func (ec *executionContext) _Env_ALLOWED_ORIGINS(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.AllowedOrigins, nil + return obj.OrganizationName, nil }) if err != nil { ec.Error(ctx, err) @@ -10046,12 +9134,12 @@ func (ec *executionContext) _Env_ALLOWED_ORIGINS(ctx context.Context, field grap if resTmp == nil { return graphql.Null } - res := resTmp.([]string) + res := resTmp.(*string) fc.Result = res - return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ALLOWED_ORIGINS(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ORGANIZATION_NAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -10064,8 +9152,8 @@ func (ec *executionContext) fieldContext_Env_ALLOWED_ORIGINS(_ context.Context, return fc, nil } -func (ec *executionContext) _Env_APP_URL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_APP_URL(ctx, field) +func (ec *executionContext) _Env_ORGANIZATION_LOGO(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ORGANIZATION_LOGO(ctx, field) if err != nil { return graphql.Null } @@ -10078,7 +9166,7 @@ func (ec *executionContext) _Env_APP_URL(ctx context.Context, field graphql.Coll }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.AppURL, nil + return obj.OrganizationLogo, nil }) if err != nil { ec.Error(ctx, err) @@ -10092,7 +9180,7 @@ func (ec *executionContext) _Env_APP_URL(ctx context.Context, field graphql.Coll return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_APP_URL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ORGANIZATION_LOGO(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -10105,9 +9193,9 @@ func (ec *executionContext) fieldContext_Env_APP_URL(_ context.Context, field gr return fc, nil } -func (ec *executionContext) _Env_REDIS_URL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_REDIS_URL(ctx, field) - if err != nil { +func (ec *executionContext) _Env_APP_COOKIE_SECURE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_APP_COOKIE_SECURE(ctx, field) + if err != nil { return graphql.Null } ctx = graphql.WithFieldContext(ctx, fc) @@ -10119,35 +9207,38 @@ func (ec *executionContext) _Env_REDIS_URL(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.RedisURL, nil + return obj.AppCookieSecure, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_REDIS_URL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_APP_COOKIE_SECURE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_RESET_PASSWORD_URL(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_RESET_PASSWORD_URL(ctx, field) +func (ec *executionContext) _Env_ADMIN_COOKIE_SECURE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_ADMIN_COOKIE_SECURE(ctx, field) if err != nil { return graphql.Null } @@ -10160,35 +9251,38 @@ func (ec *executionContext) _Env_RESET_PASSWORD_URL(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ResetPasswordURL, nil + return obj.AdminCookieSecure, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_RESET_PASSWORD_URL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_ADMIN_COOKIE_SECURE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_DISABLE_EMAIL_VERIFICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_EMAIL_VERIFICATION(ctx, field) +func (ec *executionContext) _Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(ctx, field) if err != nil { return graphql.Null } @@ -10201,38 +9295,35 @@ func (ec *executionContext) _Env_DISABLE_EMAIL_VERIFICATION(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableEmailVerification, nil + return obj.DefaultAuthorizeResponseType, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*string) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_EMAIL_VERIFICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_DISABLE_BASIC_AUTHENTICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_BASIC_AUTHENTICATION(ctx, field) +func (ec *executionContext) _Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(ctx, field) if err != nil { return graphql.Null } @@ -10245,38 +9336,35 @@ func (ec *executionContext) _Env_DISABLE_BASIC_AUTHENTICATION(ctx context.Contex }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableBasicAuthentication, nil + return obj.DefaultAuthorizeResponseMode, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*string) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_BASIC_AUTHENTICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx, field) +func (ec *executionContext) _Env_DISABLE_PLAYGROUND(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_PLAYGROUND(ctx, field) if err != nil { return graphql.Null } @@ -10289,7 +9377,7 @@ func (ec *executionContext) _Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableMobileBasicAuthentication, nil + return obj.DisablePlayground, nil }) if err != nil { ec.Error(ctx, err) @@ -10306,7 +9394,7 @@ func (ec *executionContext) _Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx context return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_PLAYGROUND(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -10319,8 +9407,8 @@ func (ec *executionContext) fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION return fc, nil } -func (ec *executionContext) _Env_DISABLE_MAGIC_LINK_LOGIN(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_MAGIC_LINK_LOGIN(ctx, field) +func (ec *executionContext) _Env_DISABLE_MAIL_OTP_LOGIN(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_MAIL_OTP_LOGIN(ctx, field) if err != nil { return graphql.Null } @@ -10333,7 +9421,7 @@ func (ec *executionContext) _Env_DISABLE_MAGIC_LINK_LOGIN(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableMagicLinkLogin, nil + return obj.DisableMailOtpLogin, nil }) if err != nil { ec.Error(ctx, err) @@ -10350,7 +9438,7 @@ func (ec *executionContext) _Env_DISABLE_MAGIC_LINK_LOGIN(ctx context.Context, f return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_MAGIC_LINK_LOGIN(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_MAIL_OTP_LOGIN(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -10363,8 +9451,8 @@ func (ec *executionContext) fieldContext_Env_DISABLE_MAGIC_LINK_LOGIN(_ context. return fc, nil } -func (ec *executionContext) _Env_DISABLE_LOGIN_PAGE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_LOGIN_PAGE(ctx, field) +func (ec *executionContext) _Env_DISABLE_TOTP_LOGIN(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Env_DISABLE_TOTP_LOGIN(ctx, field) if err != nil { return graphql.Null } @@ -10377,7 +9465,7 @@ func (ec *executionContext) _Env_DISABLE_LOGIN_PAGE(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableLoginPage, nil + return obj.DisableTotpLogin, nil }) if err != nil { ec.Error(ctx, err) @@ -10394,7 +9482,7 @@ func (ec *executionContext) _Env_DISABLE_LOGIN_PAGE(ctx context.Context, field g return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_LOGIN_PAGE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Env_DISABLE_TOTP_LOGIN(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Env", Field: field, @@ -10407,8 +9495,8 @@ func (ec *executionContext) fieldContext_Env_DISABLE_LOGIN_PAGE(_ context.Contex return fc, nil } -func (ec *executionContext) _Env_DISABLE_SIGN_UP(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_SIGN_UP(ctx, field) +func (ec *executionContext) _Error_message(ctx context.Context, field graphql.CollectedField, obj *model.Error) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Error_message(ctx, field) if err != nil { return graphql.Null } @@ -10421,7 +9509,7 @@ func (ec *executionContext) _Env_DISABLE_SIGN_UP(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableSignUp, nil + return obj.Message, nil }) if err != nil { ec.Error(ctx, err) @@ -10433,26 +9521,26 @@ func (ec *executionContext) _Env_DISABLE_SIGN_UP(ctx context.Context, field grap } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(string) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_SIGN_UP(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Error_message(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Error", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_DISABLE_REDIS_FOR_ENV(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_REDIS_FOR_ENV(ctx, field) +func (ec *executionContext) _Error_reason(ctx context.Context, field graphql.CollectedField, obj *model.Error) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Error_reason(ctx, field) if err != nil { return graphql.Null } @@ -10465,7 +9553,7 @@ func (ec *executionContext) _Env_DISABLE_REDIS_FOR_ENV(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableRedisForEnv, nil + return obj.Reason, nil }) if err != nil { ec.Error(ctx, err) @@ -10477,26 +9565,26 @@ func (ec *executionContext) _Env_DISABLE_REDIS_FOR_ENV(ctx context.Context, fiel } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(string) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_REDIS_FOR_ENV(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Error_reason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Error", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_DISABLE_STRONG_PASSWORD(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_STRONG_PASSWORD(ctx, field) +func (ec *executionContext) _FgaBatchCheckResponse_results(ctx context.Context, field graphql.CollectedField, obj *model.FgaBatchCheckResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaBatchCheckResponse_results(ctx, field) if err != nil { return graphql.Null } @@ -10509,7 +9597,7 @@ func (ec *executionContext) _Env_DISABLE_STRONG_PASSWORD(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableStrongPassword, nil + return obj.Results, nil }) if err != nil { ec.Error(ctx, err) @@ -10521,26 +9609,30 @@ func (ec *executionContext) _Env_DISABLE_STRONG_PASSWORD(ctx context.Context, fi } return graphql.Null } - res := resTmp.(bool) + res := resTmp.([]*model.FgaCheckResponse) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNFgaCheckResponse2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckResponseᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_STRONG_PASSWORD(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaBatchCheckResponse_results(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaBatchCheckResponse", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "allowed": + return ec.fieldContext_FgaCheckResponse_allowed(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type FgaCheckResponse", field.Name) }, } return fc, nil } -func (ec *executionContext) _Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(ctx, field) +func (ec *executionContext) _FgaCheckResponse_allowed(ctx context.Context, field graphql.CollectedField, obj *model.FgaCheckResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaCheckResponse_allowed(ctx, field) if err != nil { return graphql.Null } @@ -10553,7 +9645,7 @@ func (ec *executionContext) _Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(ctx context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableMultiFactorAuthentication, nil + return obj.Allowed, nil }) if err != nil { ec.Error(ctx, err) @@ -10570,9 +9662,9 @@ func (ec *executionContext) _Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(ctx context return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaCheckResponse_allowed(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaCheckResponse", Field: field, IsMethod: false, IsResolver: false, @@ -10583,8 +9675,8 @@ func (ec *executionContext) fieldContext_Env_DISABLE_MULTI_FACTOR_AUTHENTICATION return fc, nil } -func (ec *executionContext) _Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx, field) +func (ec *executionContext) _FgaListObjectsResponse_objects(ctx context.Context, field graphql.CollectedField, obj *model.FgaListObjectsResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaListObjectsResponse_objects(ctx, field) if err != nil { return graphql.Null } @@ -10597,7 +9689,7 @@ func (ec *executionContext) _Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.EnforceMultiFactorAuthentication, nil + return obj.Objects, nil }) if err != nil { ec.Error(ctx, err) @@ -10609,26 +9701,26 @@ func (ec *executionContext) _Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx context } return graphql.Null } - res := resTmp.(bool) + res := resTmp.([]string) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNString2ᚕstringᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaListObjectsResponse_objects(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaListObjectsResponse", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_ROLES(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ROLES(ctx, field) +func (ec *executionContext) _FgaModel_id(ctx context.Context, field graphql.CollectedField, obj *model.FgaModel) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaModel_id(ctx, field) if err != nil { return graphql.Null } @@ -10641,23 +9733,26 @@ func (ec *executionContext) _Env_ROLES(ctx context.Context, field graphql.Collec }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Roles, nil + return obj.ID, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.([]string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ROLES(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaModel_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaModel", Field: field, IsMethod: false, IsResolver: false, @@ -10668,8 +9763,8 @@ func (ec *executionContext) fieldContext_Env_ROLES(_ context.Context, field grap return fc, nil } -func (ec *executionContext) _Env_PROTECTED_ROLES(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_PROTECTED_ROLES(ctx, field) +func (ec *executionContext) _FgaModel_dsl(ctx context.Context, field graphql.CollectedField, obj *model.FgaModel) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaModel_dsl(ctx, field) if err != nil { return graphql.Null } @@ -10682,23 +9777,26 @@ func (ec *executionContext) _Env_PROTECTED_ROLES(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ProtectedRoles, nil + return obj.Dsl, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.([]string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_PROTECTED_ROLES(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaModel_dsl(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaModel", Field: field, IsMethod: false, IsResolver: false, @@ -10709,8 +9807,8 @@ func (ec *executionContext) fieldContext_Env_PROTECTED_ROLES(_ context.Context, return fc, nil } -func (ec *executionContext) _Env_DEFAULT_ROLES(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DEFAULT_ROLES(ctx, field) +func (ec *executionContext) _FgaTuple_user(ctx context.Context, field graphql.CollectedField, obj *model.FgaTuple) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaTuple_user(ctx, field) if err != nil { return graphql.Null } @@ -10723,23 +9821,26 @@ func (ec *executionContext) _Env_DEFAULT_ROLES(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DefaultRoles, nil + return obj.User, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.([]string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DEFAULT_ROLES(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaTuple_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaTuple", Field: field, IsMethod: false, IsResolver: false, @@ -10750,8 +9851,8 @@ func (ec *executionContext) fieldContext_Env_DEFAULT_ROLES(_ context.Context, fi return fc, nil } -func (ec *executionContext) _Env_JWT_ROLE_CLAIM(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_JWT_ROLE_CLAIM(ctx, field) +func (ec *executionContext) _FgaTuple_relation(ctx context.Context, field graphql.CollectedField, obj *model.FgaTuple) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaTuple_relation(ctx, field) if err != nil { return graphql.Null } @@ -10764,23 +9865,26 @@ func (ec *executionContext) _Env_JWT_ROLE_CLAIM(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.JwtRoleClaim, nil + return obj.Relation, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_JWT_ROLE_CLAIM(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaTuple_relation(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaTuple", Field: field, IsMethod: false, IsResolver: false, @@ -10791,8 +9895,8 @@ func (ec *executionContext) fieldContext_Env_JWT_ROLE_CLAIM(_ context.Context, f return fc, nil } -func (ec *executionContext) _Env_GOOGLE_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_GOOGLE_CLIENT_ID(ctx, field) +func (ec *executionContext) _FgaTuple_object(ctx context.Context, field graphql.CollectedField, obj *model.FgaTuple) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaTuple_object(ctx, field) if err != nil { return graphql.Null } @@ -10805,23 +9909,26 @@ func (ec *executionContext) _Env_GOOGLE_CLIENT_ID(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.GoogleClientID, nil + return obj.Object, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_GOOGLE_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaTuple_object(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaTuple", Field: field, IsMethod: false, IsResolver: false, @@ -10832,8 +9939,8 @@ func (ec *executionContext) fieldContext_Env_GOOGLE_CLIENT_ID(_ context.Context, return fc, nil } -func (ec *executionContext) _Env_GOOGLE_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_GOOGLE_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _FgaTuples_tuples(ctx context.Context, field graphql.CollectedField, obj *model.FgaTuples) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaTuples_tuples(ctx, field) if err != nil { return graphql.Null } @@ -10846,35 +9953,46 @@ func (ec *executionContext) _Env_GOOGLE_CLIENT_SECRET(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.GoogleClientSecret, nil + return obj.Tuples, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.([]*model.FgaTuple) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNFgaTuple2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_GOOGLE_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaTuples_tuples(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaTuples", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "user": + return ec.fieldContext_FgaTuple_user(ctx, field) + case "relation": + return ec.fieldContext_FgaTuple_relation(ctx, field) + case "object": + return ec.fieldContext_FgaTuple_object(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type FgaTuple", field.Name) }, } return fc, nil } -func (ec *executionContext) _Env_GITHUB_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_GITHUB_CLIENT_ID(ctx, field) +func (ec *executionContext) _FgaTuples_continuation_token(ctx context.Context, field graphql.CollectedField, obj *model.FgaTuples) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FgaTuples_continuation_token(ctx, field) if err != nil { return graphql.Null } @@ -10887,7 +10005,7 @@ func (ec *executionContext) _Env_GITHUB_CLIENT_ID(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.GithubClientID, nil + return obj.ContinuationToken, nil }) if err != nil { ec.Error(ctx, err) @@ -10901,9 +10019,9 @@ func (ec *executionContext) _Env_GITHUB_CLIENT_ID(ctx context.Context, field gra return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_GITHUB_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_FgaTuples_continuation_token(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "FgaTuples", Field: field, IsMethod: false, IsResolver: false, @@ -10914,8 +10032,8 @@ func (ec *executionContext) fieldContext_Env_GITHUB_CLIENT_ID(_ context.Context, return fc, nil } -func (ec *executionContext) _Env_GITHUB_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_GITHUB_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _ForgotPasswordResponse_message(ctx context.Context, field graphql.CollectedField, obj *model.ForgotPasswordResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ForgotPasswordResponse_message(ctx, field) if err != nil { return graphql.Null } @@ -10928,23 +10046,26 @@ func (ec *executionContext) _Env_GITHUB_CLIENT_SECRET(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.GithubClientSecret, nil + return obj.Message, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_GITHUB_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_ForgotPasswordResponse_message(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "ForgotPasswordResponse", Field: field, IsMethod: false, IsResolver: false, @@ -10955,8 +10076,8 @@ func (ec *executionContext) fieldContext_Env_GITHUB_CLIENT_SECRET(_ context.Cont return fc, nil } -func (ec *executionContext) _Env_FACEBOOK_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_FACEBOOK_CLIENT_ID(ctx, field) +func (ec *executionContext) _ForgotPasswordResponse_should_show_mobile_otp_screen(ctx context.Context, field graphql.CollectedField, obj *model.ForgotPasswordResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ForgotPasswordResponse_should_show_mobile_otp_screen(ctx, field) if err != nil { return graphql.Null } @@ -10969,7 +10090,7 @@ func (ec *executionContext) _Env_FACEBOOK_CLIENT_ID(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.FacebookClientID, nil + return obj.ShouldShowMobileOtpScreen, nil }) if err != nil { ec.Error(ctx, err) @@ -10978,26 +10099,26 @@ func (ec *executionContext) _Env_FACEBOOK_CLIENT_ID(ctx context.Context, field g if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_FACEBOOK_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_ForgotPasswordResponse_should_show_mobile_otp_screen(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "ForgotPasswordResponse", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_FACEBOOK_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_FACEBOOK_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _GenerateJWTKeysResponse_secret(ctx context.Context, field graphql.CollectedField, obj *model.GenerateJWTKeysResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GenerateJWTKeysResponse_secret(ctx, field) if err != nil { return graphql.Null } @@ -11010,7 +10131,7 @@ func (ec *executionContext) _Env_FACEBOOK_CLIENT_SECRET(ctx context.Context, fie }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.FacebookClientSecret, nil + return obj.Secret, nil }) if err != nil { ec.Error(ctx, err) @@ -11024,9 +10145,9 @@ func (ec *executionContext) _Env_FACEBOOK_CLIENT_SECRET(ctx context.Context, fie return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_FACEBOOK_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_GenerateJWTKeysResponse_secret(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "GenerateJWTKeysResponse", Field: field, IsMethod: false, IsResolver: false, @@ -11037,8 +10158,8 @@ func (ec *executionContext) fieldContext_Env_FACEBOOK_CLIENT_SECRET(_ context.Co return fc, nil } -func (ec *executionContext) _Env_LINKEDIN_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_LINKEDIN_CLIENT_ID(ctx, field) +func (ec *executionContext) _GenerateJWTKeysResponse_public_key(ctx context.Context, field graphql.CollectedField, obj *model.GenerateJWTKeysResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GenerateJWTKeysResponse_public_key(ctx, field) if err != nil { return graphql.Null } @@ -11051,7 +10172,7 @@ func (ec *executionContext) _Env_LINKEDIN_CLIENT_ID(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.LinkedinClientID, nil + return obj.PublicKey, nil }) if err != nil { ec.Error(ctx, err) @@ -11065,9 +10186,9 @@ func (ec *executionContext) _Env_LINKEDIN_CLIENT_ID(ctx context.Context, field g return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_LINKEDIN_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_GenerateJWTKeysResponse_public_key(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "GenerateJWTKeysResponse", Field: field, IsMethod: false, IsResolver: false, @@ -11078,8 +10199,8 @@ func (ec *executionContext) fieldContext_Env_LINKEDIN_CLIENT_ID(_ context.Contex return fc, nil } -func (ec *executionContext) _Env_LINKEDIN_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_LINKEDIN_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _GenerateJWTKeysResponse_private_key(ctx context.Context, field graphql.CollectedField, obj *model.GenerateJWTKeysResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GenerateJWTKeysResponse_private_key(ctx, field) if err != nil { return graphql.Null } @@ -11092,7 +10213,7 @@ func (ec *executionContext) _Env_LINKEDIN_CLIENT_SECRET(ctx context.Context, fie }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.LinkedinClientSecret, nil + return obj.PrivateKey, nil }) if err != nil { ec.Error(ctx, err) @@ -11106,9 +10227,9 @@ func (ec *executionContext) _Env_LINKEDIN_CLIENT_SECRET(ctx context.Context, fie return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_LINKEDIN_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_GenerateJWTKeysResponse_private_key(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "GenerateJWTKeysResponse", Field: field, IsMethod: false, IsResolver: false, @@ -11119,8 +10240,8 @@ func (ec *executionContext) fieldContext_Env_LINKEDIN_CLIENT_SECRET(_ context.Co return fc, nil } -func (ec *executionContext) _Env_APPLE_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_APPLE_CLIENT_ID(ctx, field) +func (ec *executionContext) _InviteMembersResponse_message(ctx context.Context, field graphql.CollectedField, obj *model.InviteMembersResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_InviteMembersResponse_message(ctx, field) if err != nil { return graphql.Null } @@ -11133,23 +10254,26 @@ func (ec *executionContext) _Env_APPLE_CLIENT_ID(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.AppleClientID, nil + return obj.Message, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_APPLE_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_InviteMembersResponse_message(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "InviteMembersResponse", Field: field, IsMethod: false, IsResolver: false, @@ -11160,8 +10284,8 @@ func (ec *executionContext) fieldContext_Env_APPLE_CLIENT_ID(_ context.Context, return fc, nil } -func (ec *executionContext) _Env_APPLE_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_APPLE_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _InviteMembersResponse_Users(ctx context.Context, field graphql.CollectedField, obj *model.InviteMembersResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_InviteMembersResponse_Users(ctx, field) if err != nil { return graphql.Null } @@ -11174,35 +10298,80 @@ func (ec *executionContext) _Env_APPLE_CLIENT_SECRET(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.AppleClientSecret, nil + return obj.Users, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.([]*model.User) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNUser2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUserᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_APPLE_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_InviteMembersResponse_Users(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "InviteMembersResponse", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "id": + return ec.fieldContext_User_id(ctx, field) + case "email": + return ec.fieldContext_User_email(ctx, field) + case "email_verified": + return ec.fieldContext_User_email_verified(ctx, field) + case "signup_methods": + return ec.fieldContext_User_signup_methods(ctx, field) + case "given_name": + return ec.fieldContext_User_given_name(ctx, field) + case "family_name": + return ec.fieldContext_User_family_name(ctx, field) + case "middle_name": + return ec.fieldContext_User_middle_name(ctx, field) + case "nickname": + return ec.fieldContext_User_nickname(ctx, field) + case "preferred_username": + return ec.fieldContext_User_preferred_username(ctx, field) + case "gender": + return ec.fieldContext_User_gender(ctx, field) + case "birthdate": + return ec.fieldContext_User_birthdate(ctx, field) + case "phone_number": + return ec.fieldContext_User_phone_number(ctx, field) + case "phone_number_verified": + return ec.fieldContext_User_phone_number_verified(ctx, field) + case "picture": + return ec.fieldContext_User_picture(ctx, field) + case "roles": + return ec.fieldContext_User_roles(ctx, field) + case "created_at": + return ec.fieldContext_User_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_User_updated_at(ctx, field) + case "revoked_timestamp": + return ec.fieldContext_User_revoked_timestamp(ctx, field) + case "is_multi_factor_auth_enabled": + return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) + case "app_data": + return ec.fieldContext_User_app_data(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type User", field.Name) }, } return fc, nil } -func (ec *executionContext) _Env_DISCORD_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISCORD_CLIENT_ID(ctx, field) +func (ec *executionContext) _Meta_version(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_version(ctx, field) if err != nil { return graphql.Null } @@ -11215,23 +10384,26 @@ func (ec *executionContext) _Env_DISCORD_CLIENT_ID(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DiscordClientID, nil + return obj.Version, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISCORD_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_version(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, @@ -11242,8 +10414,8 @@ func (ec *executionContext) fieldContext_Env_DISCORD_CLIENT_ID(_ context.Context return fc, nil } -func (ec *executionContext) _Env_DISCORD_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISCORD_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _Meta_client_id(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_client_id(ctx, field) if err != nil { return graphql.Null } @@ -11256,23 +10428,26 @@ func (ec *executionContext) _Env_DISCORD_CLIENT_SECRET(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DiscordClientSecret, nil + return obj.ClientID, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISCORD_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_client_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, @@ -11283,8 +10458,8 @@ func (ec *executionContext) fieldContext_Env_DISCORD_CLIENT_SECRET(_ context.Con return fc, nil } -func (ec *executionContext) _Env_TWITTER_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_TWITTER_CLIENT_ID(ctx, field) +func (ec *executionContext) _Meta_is_google_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_google_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11297,35 +10472,38 @@ func (ec *executionContext) _Env_TWITTER_CLIENT_ID(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.TwitterClientID, nil + return obj.IsGoogleLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_TWITTER_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_google_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_TWITTER_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_TWITTER_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _Meta_is_facebook_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_facebook_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11338,35 +10516,38 @@ func (ec *executionContext) _Env_TWITTER_CLIENT_SECRET(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.TwitterClientSecret, nil + return obj.IsFacebookLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_TWITTER_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_facebook_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_MICROSOFT_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_MICROSOFT_CLIENT_ID(ctx, field) +func (ec *executionContext) _Meta_is_github_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_github_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11379,35 +10560,38 @@ func (ec *executionContext) _Env_MICROSOFT_CLIENT_ID(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.MicrosoftClientID, nil + return obj.IsGithubLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_MICROSOFT_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_github_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_MICROSOFT_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_MICROSOFT_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _Meta_is_linkedin_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_linkedin_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11420,35 +10604,38 @@ func (ec *executionContext) _Env_MICROSOFT_CLIENT_SECRET(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.MicrosoftClientSecret, nil + return obj.IsLinkedinLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_MICROSOFT_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_linkedin_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(ctx, field) +func (ec *executionContext) _Meta_is_apple_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_apple_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11461,35 +10648,38 @@ func (ec *executionContext) _Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(ctx contex }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.MicrosoftActiveDirectoryTenantID, nil + return obj.IsAppleLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_apple_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_TWITCH_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_TWITCH_CLIENT_ID(ctx, field) +func (ec *executionContext) _Meta_is_discord_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_discord_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11502,35 +10692,38 @@ func (ec *executionContext) _Env_TWITCH_CLIENT_ID(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.TwitchClientID, nil + return obj.IsDiscordLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_TWITCH_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_discord_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_TWITCH_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_TWITCH_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _Meta_is_twitter_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_twitter_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11543,35 +10736,38 @@ func (ec *executionContext) _Env_TWITCH_CLIENT_SECRET(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.TwitchClientSecret, nil + return obj.IsTwitterLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_TWITCH_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_twitter_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_ROBLOX_CLIENT_ID(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ROBLOX_CLIENT_ID(ctx, field) +func (ec *executionContext) _Meta_is_microsoft_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_microsoft_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11584,35 +10780,38 @@ func (ec *executionContext) _Env_ROBLOX_CLIENT_ID(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.RobloxClientID, nil + return obj.IsMicrosoftLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ROBLOX_CLIENT_ID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_microsoft_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_ROBLOX_CLIENT_SECRET(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ROBLOX_CLIENT_SECRET(ctx, field) +func (ec *executionContext) _Meta_is_twitch_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_twitch_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11625,35 +10824,38 @@ func (ec *executionContext) _Env_ROBLOX_CLIENT_SECRET(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.RobloxClientSecret, nil + return obj.IsTwitchLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ROBLOX_CLIENT_SECRET(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_twitch_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_ORGANIZATION_NAME(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ORGANIZATION_NAME(ctx, field) +func (ec *executionContext) _Meta_is_roblox_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_roblox_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11666,35 +10868,38 @@ func (ec *executionContext) _Env_ORGANIZATION_NAME(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.OrganizationName, nil + return obj.IsRobloxLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ORGANIZATION_NAME(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_roblox_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_ORGANIZATION_LOGO(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ORGANIZATION_LOGO(ctx, field) +func (ec *executionContext) _Meta_is_email_verification_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_email_verification_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11707,35 +10912,38 @@ func (ec *executionContext) _Env_ORGANIZATION_LOGO(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.OrganizationLogo, nil + return obj.IsEmailVerificationEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ORGANIZATION_LOGO(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_email_verification_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_APP_COOKIE_SECURE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_APP_COOKIE_SECURE(ctx, field) +func (ec *executionContext) _Meta_is_basic_authentication_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_basic_authentication_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11748,7 +10956,7 @@ func (ec *executionContext) _Env_APP_COOKIE_SECURE(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.AppCookieSecure, nil + return obj.IsBasicAuthenticationEnabled, nil }) if err != nil { ec.Error(ctx, err) @@ -11765,9 +10973,9 @@ func (ec *executionContext) _Env_APP_COOKIE_SECURE(ctx context.Context, field gr return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_APP_COOKIE_SECURE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_basic_authentication_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, @@ -11778,8 +10986,8 @@ func (ec *executionContext) fieldContext_Env_APP_COOKIE_SECURE(_ context.Context return fc, nil } -func (ec *executionContext) _Env_ADMIN_COOKIE_SECURE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_ADMIN_COOKIE_SECURE(ctx, field) +func (ec *executionContext) _Meta_is_magic_link_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_magic_link_login_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11792,7 +11000,7 @@ func (ec *executionContext) _Env_ADMIN_COOKIE_SECURE(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.AdminCookieSecure, nil + return obj.IsMagicLinkLoginEnabled, nil }) if err != nil { ec.Error(ctx, err) @@ -11809,9 +11017,9 @@ func (ec *executionContext) _Env_ADMIN_COOKIE_SECURE(ctx context.Context, field return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_ADMIN_COOKIE_SECURE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_magic_link_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, @@ -11822,8 +11030,8 @@ func (ec *executionContext) fieldContext_Env_ADMIN_COOKIE_SECURE(_ context.Conte return fc, nil } -func (ec *executionContext) _Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(ctx, field) +func (ec *executionContext) _Meta_is_sign_up_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_sign_up_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11836,35 +11044,38 @@ func (ec *executionContext) _Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(ctx context.Con }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DefaultAuthorizeResponseType, nil + return obj.IsSignUpEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_sign_up_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(ctx, field) +func (ec *executionContext) _Meta_is_strong_password_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_strong_password_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11877,35 +11088,38 @@ func (ec *executionContext) _Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(ctx context.Con }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DefaultAuthorizeResponseMode, nil + return obj.IsStrongPasswordEnabled, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_strong_password_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Env_DISABLE_PLAYGROUND(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_PLAYGROUND(ctx, field) +func (ec *executionContext) _Meta_is_multi_factor_auth_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_multi_factor_auth_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11918,7 +11132,7 @@ func (ec *executionContext) _Env_DISABLE_PLAYGROUND(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisablePlayground, nil + return obj.IsMultiFactorAuthEnabled, nil }) if err != nil { ec.Error(ctx, err) @@ -11935,9 +11149,9 @@ func (ec *executionContext) _Env_DISABLE_PLAYGROUND(ctx context.Context, field g return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_PLAYGROUND(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_multi_factor_auth_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, @@ -11948,8 +11162,8 @@ func (ec *executionContext) fieldContext_Env_DISABLE_PLAYGROUND(_ context.Contex return fc, nil } -func (ec *executionContext) _Env_DISABLE_MAIL_OTP_LOGIN(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_MAIL_OTP_LOGIN(ctx, field) +func (ec *executionContext) _Meta_is_mobile_basic_authentication_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_mobile_basic_authentication_enabled(ctx, field) if err != nil { return graphql.Null } @@ -11962,7 +11176,7 @@ func (ec *executionContext) _Env_DISABLE_MAIL_OTP_LOGIN(ctx context.Context, fie }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableMailOtpLogin, nil + return obj.IsMobileBasicAuthenticationEnabled, nil }) if err != nil { ec.Error(ctx, err) @@ -11979,9 +11193,9 @@ func (ec *executionContext) _Env_DISABLE_MAIL_OTP_LOGIN(ctx context.Context, fie return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_MAIL_OTP_LOGIN(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_mobile_basic_authentication_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, @@ -11992,8 +11206,8 @@ func (ec *executionContext) fieldContext_Env_DISABLE_MAIL_OTP_LOGIN(_ context.Co return fc, nil } -func (ec *executionContext) _Env_DISABLE_TOTP_LOGIN(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Env_DISABLE_TOTP_LOGIN(ctx, field) +func (ec *executionContext) _Meta_is_phone_verification_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Meta_is_phone_verification_enabled(ctx, field) if err != nil { return graphql.Null } @@ -12006,7 +11220,7 @@ func (ec *executionContext) _Env_DISABLE_TOTP_LOGIN(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.DisableTotpLogin, nil + return obj.IsPhoneVerificationEnabled, nil }) if err != nil { ec.Error(ctx, err) @@ -12023,9 +11237,9 @@ func (ec *executionContext) _Env_DISABLE_TOTP_LOGIN(ctx context.Context, field g return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Env_DISABLE_TOTP_LOGIN(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Meta_is_phone_verification_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Env", + Object: "Meta", Field: field, IsMethod: false, IsResolver: false, @@ -12036,8 +11250,8 @@ func (ec *executionContext) fieldContext_Env_DISABLE_TOTP_LOGIN(_ context.Contex return fc, nil } -func (ec *executionContext) _Error_message(ctx context.Context, field graphql.CollectedField, obj *model.Error) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Error_message(ctx, field) +func (ec *executionContext) _Mutation_signup(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_signup(ctx, field) if err != nil { return graphql.Null } @@ -12050,7 +11264,7 @@ func (ec *executionContext) _Error_message(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Message, nil + return ec.resolvers.Mutation().Signup(rctx, fc.Args["params"].(model.SignUpRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12062,26 +11276,63 @@ func (ec *executionContext) _Error_message(ctx context.Context, field graphql.Co } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*model.AuthResponse) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Error_message(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_signup(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Error", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_AuthResponse_message(ctx, field) + case "should_show_email_otp_screen": + return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) + case "should_show_mobile_otp_screen": + return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) + case "should_show_totp_screen": + return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) + case "access_token": + return ec.fieldContext_AuthResponse_access_token(ctx, field) + case "id_token": + return ec.fieldContext_AuthResponse_id_token(ctx, field) + case "refresh_token": + return ec.fieldContext_AuthResponse_refresh_token(ctx, field) + case "expires_in": + return ec.fieldContext_AuthResponse_expires_in(ctx, field) + case "user": + return ec.fieldContext_AuthResponse_user(ctx, field) + case "authenticator_scanner_image": + return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) + case "authenticator_secret": + return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) + case "authenticator_recovery_codes": + return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_signup_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Error_reason(ctx context.Context, field graphql.CollectedField, obj *model.Error) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Error_reason(ctx, field) +func (ec *executionContext) _Mutation_mobile_signup(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_mobile_signup(ctx, field) if err != nil { return graphql.Null } @@ -12094,7 +11345,7 @@ func (ec *executionContext) _Error_reason(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Reason, nil + return ec.resolvers.Mutation().MobileSignup(rctx, fc.Args["params"].(*model.MobileSignUpRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12106,26 +11357,63 @@ func (ec *executionContext) _Error_reason(ctx context.Context, field graphql.Col } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*model.AuthResponse) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Error_reason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_mobile_signup(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Error", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_AuthResponse_message(ctx, field) + case "should_show_email_otp_screen": + return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) + case "should_show_mobile_otp_screen": + return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) + case "should_show_totp_screen": + return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) + case "access_token": + return ec.fieldContext_AuthResponse_access_token(ctx, field) + case "id_token": + return ec.fieldContext_AuthResponse_id_token(ctx, field) + case "refresh_token": + return ec.fieldContext_AuthResponse_refresh_token(ctx, field) + case "expires_in": + return ec.fieldContext_AuthResponse_expires_in(ctx, field) + case "user": + return ec.fieldContext_AuthResponse_user(ctx, field) + case "authenticator_scanner_image": + return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) + case "authenticator_secret": + return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) + case "authenticator_recovery_codes": + return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_mobile_signup_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _ForgotPasswordResponse_message(ctx context.Context, field graphql.CollectedField, obj *model.ForgotPasswordResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_ForgotPasswordResponse_message(ctx, field) +func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_login(ctx, field) if err != nil { return graphql.Null } @@ -12138,7 +11426,7 @@ func (ec *executionContext) _ForgotPasswordResponse_message(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Message, nil + return ec.resolvers.Mutation().Login(rctx, fc.Args["params"].(model.LoginRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12150,26 +11438,63 @@ func (ec *executionContext) _ForgotPasswordResponse_message(ctx context.Context, } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*model.AuthResponse) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_ForgotPasswordResponse_message(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "ForgotPasswordResponse", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_AuthResponse_message(ctx, field) + case "should_show_email_otp_screen": + return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) + case "should_show_mobile_otp_screen": + return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) + case "should_show_totp_screen": + return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) + case "access_token": + return ec.fieldContext_AuthResponse_access_token(ctx, field) + case "id_token": + return ec.fieldContext_AuthResponse_id_token(ctx, field) + case "refresh_token": + return ec.fieldContext_AuthResponse_refresh_token(ctx, field) + case "expires_in": + return ec.fieldContext_AuthResponse_expires_in(ctx, field) + case "user": + return ec.fieldContext_AuthResponse_user(ctx, field) + case "authenticator_scanner_image": + return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) + case "authenticator_secret": + return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) + case "authenticator_recovery_codes": + return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _ForgotPasswordResponse_should_show_mobile_otp_screen(ctx context.Context, field graphql.CollectedField, obj *model.ForgotPasswordResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_ForgotPasswordResponse_should_show_mobile_otp_screen(ctx, field) +func (ec *executionContext) _Mutation_mobile_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_mobile_login(ctx, field) if err != nil { return graphql.Null } @@ -12182,35 +11507,75 @@ func (ec *executionContext) _ForgotPasswordResponse_should_show_mobile_otp_scree }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ShouldShowMobileOtpScreen, nil + return ec.resolvers.Mutation().MobileLogin(rctx, fc.Args["params"].(model.MobileLoginRequest)) }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*bool) + res := resTmp.(*model.AuthResponse) fc.Result = res - return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) + return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_ForgotPasswordResponse_should_show_mobile_otp_screen(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_mobile_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "ForgotPasswordResponse", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_AuthResponse_message(ctx, field) + case "should_show_email_otp_screen": + return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) + case "should_show_mobile_otp_screen": + return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) + case "should_show_totp_screen": + return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) + case "access_token": + return ec.fieldContext_AuthResponse_access_token(ctx, field) + case "id_token": + return ec.fieldContext_AuthResponse_id_token(ctx, field) + case "refresh_token": + return ec.fieldContext_AuthResponse_refresh_token(ctx, field) + case "expires_in": + return ec.fieldContext_AuthResponse_expires_in(ctx, field) + case "user": + return ec.fieldContext_AuthResponse_user(ctx, field) + case "authenticator_scanner_image": + return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) + case "authenticator_secret": + return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) + case "authenticator_recovery_codes": + return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_mobile_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _GenerateJWTKeysResponse_secret(ctx context.Context, field graphql.CollectedField, obj *model.GenerateJWTKeysResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_GenerateJWTKeysResponse_secret(ctx, field) +func (ec *executionContext) _Mutation_magic_link_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_magic_link_login(ctx, field) if err != nil { return graphql.Null } @@ -12223,35 +11588,53 @@ func (ec *executionContext) _GenerateJWTKeysResponse_secret(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Secret, nil + return ec.resolvers.Mutation().MagicLinkLogin(rctx, fc.Args["params"].(model.MagicLinkLoginRequest)) }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_GenerateJWTKeysResponse_secret(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_magic_link_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "GenerateJWTKeysResponse", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_magic_link_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _GenerateJWTKeysResponse_public_key(ctx context.Context, field graphql.CollectedField, obj *model.GenerateJWTKeysResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_GenerateJWTKeysResponse_public_key(ctx, field) +func (ec *executionContext) _Mutation_logout(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_logout(ctx, field) if err != nil { return graphql.Null } @@ -12264,35 +11647,42 @@ func (ec *executionContext) _GenerateJWTKeysResponse_public_key(ctx context.Cont }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.PublicKey, nil + return ec.resolvers.Mutation().Logout(rctx) }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_GenerateJWTKeysResponse_public_key(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_logout(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "GenerateJWTKeysResponse", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } return fc, nil } -func (ec *executionContext) _GenerateJWTKeysResponse_private_key(ctx context.Context, field graphql.CollectedField, obj *model.GenerateJWTKeysResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_GenerateJWTKeysResponse_private_key(ctx, field) +func (ec *executionContext) _Mutation_update_profile(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_update_profile(ctx, field) if err != nil { return graphql.Null } @@ -12305,79 +11695,53 @@ func (ec *executionContext) _GenerateJWTKeysResponse_private_key(ctx context.Con }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.PrivateKey, nil + return ec.resolvers.Mutation().UpdateProfile(rctx, fc.Args["params"].(model.UpdateProfileRequest)) }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_GenerateJWTKeysResponse_private_key(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_update_profile(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "GenerateJWTKeysResponse", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) _InviteMembersResponse_message(ctx context.Context, field graphql.CollectedField, obj *model.InviteMembersResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_InviteMembersResponse_message(ctx, field) - if err != nil { - return graphql.Null + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + }, } - ctx = graphql.WithFieldContext(ctx, fc) defer func() { if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + err = ec.Recover(ctx, r) + ec.Error(ctx, err) } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Message, nil - }) - if err != nil { + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_update_profile_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext_InviteMembersResponse_message(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "InviteMembersResponse", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, + return fc, err } return fc, nil } -func (ec *executionContext) _InviteMembersResponse_Users(ctx context.Context, field graphql.CollectedField, obj *model.InviteMembersResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_InviteMembersResponse_Users(ctx, field) +func (ec *executionContext) _Mutation_verify_email(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_verify_email(ctx, field) if err != nil { return graphql.Null } @@ -12390,7 +11754,7 @@ func (ec *executionContext) _InviteMembersResponse_Users(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Users, nil + return ec.resolvers.Mutation().VerifyEmail(rctx, fc.Args["params"].(model.VerifyEmailRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12402,68 +11766,63 @@ func (ec *executionContext) _InviteMembersResponse_Users(ctx context.Context, fi } return graphql.Null } - res := resTmp.([]*model.User) + res := resTmp.(*model.AuthResponse) fc.Result = res - return ec.marshalNUser2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUserᚄ(ctx, field.Selections, res) + return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_InviteMembersResponse_Users(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_verify_email(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "InviteMembersResponse", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "id": - return ec.fieldContext_User_id(ctx, field) - case "email": - return ec.fieldContext_User_email(ctx, field) - case "email_verified": - return ec.fieldContext_User_email_verified(ctx, field) - case "signup_methods": - return ec.fieldContext_User_signup_methods(ctx, field) - case "given_name": - return ec.fieldContext_User_given_name(ctx, field) - case "family_name": - return ec.fieldContext_User_family_name(ctx, field) - case "middle_name": - return ec.fieldContext_User_middle_name(ctx, field) - case "nickname": - return ec.fieldContext_User_nickname(ctx, field) - case "preferred_username": - return ec.fieldContext_User_preferred_username(ctx, field) - case "gender": - return ec.fieldContext_User_gender(ctx, field) - case "birthdate": - return ec.fieldContext_User_birthdate(ctx, field) - case "phone_number": - return ec.fieldContext_User_phone_number(ctx, field) - case "phone_number_verified": - return ec.fieldContext_User_phone_number_verified(ctx, field) - case "picture": - return ec.fieldContext_User_picture(ctx, field) - case "roles": - return ec.fieldContext_User_roles(ctx, field) - case "created_at": - return ec.fieldContext_User_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_User_updated_at(ctx, field) - case "revoked_timestamp": - return ec.fieldContext_User_revoked_timestamp(ctx, field) - case "is_multi_factor_auth_enabled": - return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) - case "app_data": - return ec.fieldContext_User_app_data(ctx, field) + case "message": + return ec.fieldContext_AuthResponse_message(ctx, field) + case "should_show_email_otp_screen": + return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) + case "should_show_mobile_otp_screen": + return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) + case "should_show_totp_screen": + return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) + case "access_token": + return ec.fieldContext_AuthResponse_access_token(ctx, field) + case "id_token": + return ec.fieldContext_AuthResponse_id_token(ctx, field) + case "refresh_token": + return ec.fieldContext_AuthResponse_refresh_token(ctx, field) + case "expires_in": + return ec.fieldContext_AuthResponse_expires_in(ctx, field) + case "user": + return ec.fieldContext_AuthResponse_user(ctx, field) + case "authenticator_scanner_image": + return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) + case "authenticator_secret": + return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) + case "authenticator_recovery_codes": + return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_verify_email_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_version(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_version(ctx, field) +func (ec *executionContext) _Mutation_resend_verify_email(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_resend_verify_email(ctx, field) if err != nil { return graphql.Null } @@ -12476,7 +11835,7 @@ func (ec *executionContext) _Meta_version(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Version, nil + return ec.resolvers.Mutation().ResendVerifyEmail(rctx, fc.Args["params"].(model.ResendVerifyEmailRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12488,26 +11847,41 @@ func (ec *executionContext) _Meta_version(ctx context.Context, field graphql.Col } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_version(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_resend_verify_email(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_resend_verify_email_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_client_id(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_client_id(ctx, field) +func (ec *executionContext) _Mutation_forgot_password(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_forgot_password(ctx, field) if err != nil { return graphql.Null } @@ -12520,7 +11894,7 @@ func (ec *executionContext) _Meta_client_id(ctx context.Context, field graphql.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ClientID, nil + return ec.resolvers.Mutation().ForgotPassword(rctx, fc.Args["params"].(model.ForgotPasswordRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12532,26 +11906,43 @@ func (ec *executionContext) _Meta_client_id(ctx context.Context, field graphql.C } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*model.ForgotPasswordResponse) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNForgotPasswordResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐForgotPasswordResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_client_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_forgot_password(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_ForgotPasswordResponse_message(ctx, field) + case "should_show_mobile_otp_screen": + return ec.fieldContext_ForgotPasswordResponse_should_show_mobile_otp_screen(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type ForgotPasswordResponse", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_forgot_password_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_google_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_google_login_enabled(ctx, field) +func (ec *executionContext) _Mutation_reset_password(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_reset_password(ctx, field) if err != nil { return graphql.Null } @@ -12564,7 +11955,7 @@ func (ec *executionContext) _Meta_is_google_login_enabled(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsGoogleLoginEnabled, nil + return ec.resolvers.Mutation().ResetPassword(rctx, fc.Args["params"].(model.ResetPasswordRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12576,26 +11967,41 @@ func (ec *executionContext) _Meta_is_google_login_enabled(ctx context.Context, f } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_google_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_reset_password(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_reset_password_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_facebook_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_facebook_login_enabled(ctx, field) +func (ec *executionContext) _Mutation_revoke(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_revoke(ctx, field) if err != nil { return graphql.Null } @@ -12608,7 +12014,7 @@ func (ec *executionContext) _Meta_is_facebook_login_enabled(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsFacebookLoginEnabled, nil + return ec.resolvers.Mutation().Revoke(rctx, fc.Args["params"].(model.OAuthRevokeRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12620,26 +12026,41 @@ func (ec *executionContext) _Meta_is_facebook_login_enabled(ctx context.Context, } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_facebook_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_revoke(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_revoke_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_github_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_github_login_enabled(ctx, field) +func (ec *executionContext) _Mutation_verify_otp(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_verify_otp(ctx, field) if err != nil { return graphql.Null } @@ -12652,7 +12073,7 @@ func (ec *executionContext) _Meta_is_github_login_enabled(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsGithubLoginEnabled, nil + return ec.resolvers.Mutation().VerifyOtp(rctx, fc.Args["params"].(model.VerifyOTPRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12664,26 +12085,63 @@ func (ec *executionContext) _Meta_is_github_login_enabled(ctx context.Context, f } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.AuthResponse) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_github_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_verify_otp(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_AuthResponse_message(ctx, field) + case "should_show_email_otp_screen": + return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) + case "should_show_mobile_otp_screen": + return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) + case "should_show_totp_screen": + return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) + case "access_token": + return ec.fieldContext_AuthResponse_access_token(ctx, field) + case "id_token": + return ec.fieldContext_AuthResponse_id_token(ctx, field) + case "refresh_token": + return ec.fieldContext_AuthResponse_refresh_token(ctx, field) + case "expires_in": + return ec.fieldContext_AuthResponse_expires_in(ctx, field) + case "user": + return ec.fieldContext_AuthResponse_user(ctx, field) + case "authenticator_scanner_image": + return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) + case "authenticator_secret": + return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) + case "authenticator_recovery_codes": + return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_verify_otp_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_linkedin_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_linkedin_login_enabled(ctx, field) +func (ec *executionContext) _Mutation_resend_otp(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_resend_otp(ctx, field) if err != nil { return graphql.Null } @@ -12696,7 +12154,7 @@ func (ec *executionContext) _Meta_is_linkedin_login_enabled(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsLinkedinLoginEnabled, nil + return ec.resolvers.Mutation().ResendOtp(rctx, fc.Args["params"].(model.ResendOTPRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12708,26 +12166,41 @@ func (ec *executionContext) _Meta_is_linkedin_login_enabled(ctx context.Context, } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_linkedin_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_resend_otp(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_resend_otp_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_apple_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_apple_login_enabled(ctx, field) +func (ec *executionContext) _Mutation_deactivate_account(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_deactivate_account(ctx, field) if err != nil { return graphql.Null } @@ -12740,7 +12213,7 @@ func (ec *executionContext) _Meta_is_apple_login_enabled(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsAppleLoginEnabled, nil + return ec.resolvers.Mutation().DeactivateAccount(rctx) }) if err != nil { ec.Error(ctx, err) @@ -12752,26 +12225,30 @@ func (ec *executionContext) _Meta_is_apple_login_enabled(ctx context.Context, fi } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_apple_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_deactivate_account(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } return fc, nil } -func (ec *executionContext) _Meta_is_discord_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_discord_login_enabled(ctx, field) +func (ec *executionContext) _Mutation__delete_user(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__delete_user(ctx, field) if err != nil { return graphql.Null } @@ -12784,7 +12261,7 @@ func (ec *executionContext) _Meta_is_discord_login_enabled(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsDiscordLoginEnabled, nil + return ec.resolvers.Mutation().DeleteUser(rctx, fc.Args["params"].(model.DeleteUserRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12796,26 +12273,41 @@ func (ec *executionContext) _Meta_is_discord_login_enabled(ctx context.Context, } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_discord_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__delete_user(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__delete_user_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_twitter_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_twitter_login_enabled(ctx, field) +func (ec *executionContext) _Mutation__update_user(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__update_user(ctx, field) if err != nil { return graphql.Null } @@ -12828,7 +12320,7 @@ func (ec *executionContext) _Meta_is_twitter_login_enabled(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsTwitterLoginEnabled, nil + return ec.resolvers.Mutation().UpdateUser(rctx, fc.Args["params"].(model.UpdateUserRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12840,26 +12332,79 @@ func (ec *executionContext) _Meta_is_twitter_login_enabled(ctx context.Context, } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.User) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNUser2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_twitter_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__update_user(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "id": + return ec.fieldContext_User_id(ctx, field) + case "email": + return ec.fieldContext_User_email(ctx, field) + case "email_verified": + return ec.fieldContext_User_email_verified(ctx, field) + case "signup_methods": + return ec.fieldContext_User_signup_methods(ctx, field) + case "given_name": + return ec.fieldContext_User_given_name(ctx, field) + case "family_name": + return ec.fieldContext_User_family_name(ctx, field) + case "middle_name": + return ec.fieldContext_User_middle_name(ctx, field) + case "nickname": + return ec.fieldContext_User_nickname(ctx, field) + case "preferred_username": + return ec.fieldContext_User_preferred_username(ctx, field) + case "gender": + return ec.fieldContext_User_gender(ctx, field) + case "birthdate": + return ec.fieldContext_User_birthdate(ctx, field) + case "phone_number": + return ec.fieldContext_User_phone_number(ctx, field) + case "phone_number_verified": + return ec.fieldContext_User_phone_number_verified(ctx, field) + case "picture": + return ec.fieldContext_User_picture(ctx, field) + case "roles": + return ec.fieldContext_User_roles(ctx, field) + case "created_at": + return ec.fieldContext_User_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_User_updated_at(ctx, field) + case "revoked_timestamp": + return ec.fieldContext_User_revoked_timestamp(ctx, field) + case "is_multi_factor_auth_enabled": + return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) + case "app_data": + return ec.fieldContext_User_app_data(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type User", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__update_user_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_microsoft_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_microsoft_login_enabled(ctx, field) +func (ec *executionContext) _Mutation__admin_signup(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__admin_signup(ctx, field) if err != nil { return graphql.Null } @@ -12872,7 +12417,7 @@ func (ec *executionContext) _Meta_is_microsoft_login_enabled(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsMicrosoftLoginEnabled, nil + return ec.resolvers.Mutation().AdminSignup(rctx, fc.Args["params"].(model.AdminSignupRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12884,26 +12429,41 @@ func (ec *executionContext) _Meta_is_microsoft_login_enabled(ctx context.Context } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_microsoft_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__admin_signup(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__admin_signup_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_twitch_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_twitch_login_enabled(ctx, field) +func (ec *executionContext) _Mutation__admin_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__admin_login(ctx, field) if err != nil { return graphql.Null } @@ -12916,7 +12476,7 @@ func (ec *executionContext) _Meta_is_twitch_login_enabled(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsTwitchLoginEnabled, nil + return ec.resolvers.Mutation().AdminLogin(rctx, fc.Args["params"].(model.AdminLoginRequest)) }) if err != nil { ec.Error(ctx, err) @@ -12928,26 +12488,41 @@ func (ec *executionContext) _Meta_is_twitch_login_enabled(ctx context.Context, f } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_twitch_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__admin_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__admin_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_roblox_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_roblox_login_enabled(ctx, field) +func (ec *executionContext) _Mutation__admin_logout(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__admin_logout(ctx, field) if err != nil { return graphql.Null } @@ -12960,7 +12535,7 @@ func (ec *executionContext) _Meta_is_roblox_login_enabled(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsRobloxLoginEnabled, nil + return ec.resolvers.Mutation().AdminLogout(rctx) }) if err != nil { ec.Error(ctx, err) @@ -12972,26 +12547,30 @@ func (ec *executionContext) _Meta_is_roblox_login_enabled(ctx context.Context, f } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_roblox_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__admin_logout(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } return fc, nil } -func (ec *executionContext) _Meta_is_email_verification_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_email_verification_enabled(ctx, field) +func (ec *executionContext) _Mutation__update_env(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__update_env(ctx, field) if err != nil { return graphql.Null } @@ -13004,7 +12583,7 @@ func (ec *executionContext) _Meta_is_email_verification_enabled(ctx context.Cont }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsEmailVerificationEnabled, nil + return ec.resolvers.Mutation().UpdateEnv(rctx, fc.Args["params"].(model.UpdateEnvRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13016,26 +12595,41 @@ func (ec *executionContext) _Meta_is_email_verification_enabled(ctx context.Cont } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_email_verification_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__update_env(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__update_env_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_basic_authentication_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_basic_authentication_enabled(ctx, field) +func (ec *executionContext) _Mutation__invite_members(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__invite_members(ctx, field) if err != nil { return graphql.Null } @@ -13048,7 +12642,7 @@ func (ec *executionContext) _Meta_is_basic_authentication_enabled(ctx context.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsBasicAuthenticationEnabled, nil + return ec.resolvers.Mutation().InviteMembers(rctx, fc.Args["params"].(model.InviteMemberRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13060,26 +12654,43 @@ func (ec *executionContext) _Meta_is_basic_authentication_enabled(ctx context.Co } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.InviteMembersResponse) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNInviteMembersResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐInviteMembersResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_basic_authentication_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__invite_members(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_InviteMembersResponse_message(ctx, field) + case "Users": + return ec.fieldContext_InviteMembersResponse_Users(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type InviteMembersResponse", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__invite_members_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_magic_link_login_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_magic_link_login_enabled(ctx, field) +func (ec *executionContext) _Mutation__revoke_access(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__revoke_access(ctx, field) if err != nil { return graphql.Null } @@ -13092,7 +12703,7 @@ func (ec *executionContext) _Meta_is_magic_link_login_enabled(ctx context.Contex }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsMagicLinkLoginEnabled, nil + return ec.resolvers.Mutation().RevokeAccess(rctx, fc.Args["param"].(model.UpdateAccessRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13104,26 +12715,41 @@ func (ec *executionContext) _Meta_is_magic_link_login_enabled(ctx context.Contex } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_magic_link_login_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__revoke_access(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__revoke_access_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_sign_up_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_sign_up_enabled(ctx, field) +func (ec *executionContext) _Mutation__enable_access(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__enable_access(ctx, field) if err != nil { return graphql.Null } @@ -13136,7 +12762,7 @@ func (ec *executionContext) _Meta_is_sign_up_enabled(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsSignUpEnabled, nil + return ec.resolvers.Mutation().EnableAccess(rctx, fc.Args["param"].(model.UpdateAccessRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13148,26 +12774,41 @@ func (ec *executionContext) _Meta_is_sign_up_enabled(ctx context.Context, field } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_sign_up_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__enable_access(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__enable_access_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_strong_password_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_strong_password_enabled(ctx, field) +func (ec *executionContext) _Mutation__generate_jwt_keys(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__generate_jwt_keys(ctx, field) if err != nil { return graphql.Null } @@ -13180,7 +12821,7 @@ func (ec *executionContext) _Meta_is_strong_password_enabled(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsStrongPasswordEnabled, nil + return ec.resolvers.Mutation().GenerateJwtKeys(rctx, fc.Args["params"].(model.GenerateJWTKeysRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13192,70 +12833,45 @@ func (ec *executionContext) _Meta_is_strong_password_enabled(ctx context.Context } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.GenerateJWTKeysResponse) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNGenerateJWTKeysResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐGenerateJWTKeysResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_strong_password_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__generate_jwt_keys(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) _Meta_is_multi_factor_auth_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_multi_factor_auth_enabled(ctx, field) - if err != nil { - return graphql.Null + switch field.Name { + case "secret": + return ec.fieldContext_GenerateJWTKeysResponse_secret(ctx, field) + case "public_key": + return ec.fieldContext_GenerateJWTKeysResponse_public_key(ctx, field) + case "private_key": + return ec.fieldContext_GenerateJWTKeysResponse_private_key(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type GenerateJWTKeysResponse", field.Name) + }, } - ctx = graphql.WithFieldContext(ctx, fc) defer func() { if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + err = ec.Recover(ctx, r) + ec.Error(ctx, err) } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.IsMultiFactorAuthEnabled, nil - }) - if err != nil { + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__generate_jwt_keys_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(bool) - fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext_Meta_is_multi_factor_auth_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Meta", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, + return fc, err } return fc, nil } -func (ec *executionContext) _Meta_is_mobile_basic_authentication_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_mobile_basic_authentication_enabled(ctx, field) +func (ec *executionContext) _Mutation__add_webhook(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__add_webhook(ctx, field) if err != nil { return graphql.Null } @@ -13268,7 +12884,7 @@ func (ec *executionContext) _Meta_is_mobile_basic_authentication_enabled(ctx con }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsMobileBasicAuthenticationEnabled, nil + return ec.resolvers.Mutation().AddWebhook(rctx, fc.Args["params"].(model.AddWebhookRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13280,26 +12896,41 @@ func (ec *executionContext) _Meta_is_mobile_basic_authentication_enabled(ctx con } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_mobile_basic_authentication_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__add_webhook(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__add_webhook_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Meta_is_phone_verification_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Meta) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Meta_is_phone_verification_enabled(ctx, field) +func (ec *executionContext) _Mutation__update_webhook(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__update_webhook(ctx, field) if err != nil { return graphql.Null } @@ -13312,7 +12943,7 @@ func (ec *executionContext) _Meta_is_phone_verification_enabled(ctx context.Cont }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsPhoneVerificationEnabled, nil + return ec.resolvers.Mutation().UpdateWebhook(rctx, fc.Args["params"].(model.UpdateWebhookRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13324,26 +12955,41 @@ func (ec *executionContext) _Meta_is_phone_verification_enabled(ctx context.Cont } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Meta_is_phone_verification_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__update_webhook(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Meta", + Object: "Mutation", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__update_webhook_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Mutation_signup(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_signup(ctx, field) +func (ec *executionContext) _Mutation__delete_webhook(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__delete_webhook(ctx, field) if err != nil { return graphql.Null } @@ -13356,7 +13002,7 @@ func (ec *executionContext) _Mutation_signup(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().Signup(rctx, fc.Args["params"].(model.SignUpRequest)) + return ec.resolvers.Mutation().DeleteWebhook(rctx, fc.Args["params"].(model.WebhookRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13368,12 +13014,12 @@ func (ec *executionContext) _Mutation_signup(ctx context.Context, field graphql. } return graphql.Null } - res := resTmp.(*model.AuthResponse) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_signup(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__delete_webhook(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", Field: field, @@ -13382,31 +13028,9 @@ func (ec *executionContext) fieldContext_Mutation_signup(ctx context.Context, fi Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "message": - return ec.fieldContext_AuthResponse_message(ctx, field) - case "should_show_email_otp_screen": - return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) - case "should_show_mobile_otp_screen": - return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) - case "should_show_totp_screen": - return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) - case "access_token": - return ec.fieldContext_AuthResponse_access_token(ctx, field) - case "id_token": - return ec.fieldContext_AuthResponse_id_token(ctx, field) - case "refresh_token": - return ec.fieldContext_AuthResponse_refresh_token(ctx, field) - case "expires_in": - return ec.fieldContext_AuthResponse_expires_in(ctx, field) - case "user": - return ec.fieldContext_AuthResponse_user(ctx, field) - case "authenticator_scanner_image": - return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) - case "authenticator_secret": - return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) - case "authenticator_recovery_codes": - return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + return ec.fieldContext_Response_message(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } defer func() { @@ -13416,15 +13040,15 @@ func (ec *executionContext) fieldContext_Mutation_signup(ctx context.Context, fi } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_signup_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Mutation__delete_webhook_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation_mobile_signup(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_mobile_signup(ctx, field) +func (ec *executionContext) _Mutation__test_endpoint(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__test_endpoint(ctx, field) if err != nil { return graphql.Null } @@ -13437,7 +13061,7 @@ func (ec *executionContext) _Mutation_mobile_signup(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().MobileSignup(rctx, fc.Args["params"].(*model.MobileSignUpRequest)) + return ec.resolvers.Mutation().TestEndpoint(rctx, fc.Args["params"].(model.TestEndpointRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13449,12 +13073,12 @@ func (ec *executionContext) _Mutation_mobile_signup(ctx context.Context, field g } return graphql.Null } - res := resTmp.(*model.AuthResponse) + res := resTmp.(*model.TestEndpointResponse) fc.Result = res - return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) + return ec.marshalNTestEndpointResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐTestEndpointResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_mobile_signup(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__test_endpoint(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", Field: field, @@ -13462,32 +13086,12 @@ func (ec *executionContext) fieldContext_Mutation_mobile_signup(ctx context.Cont IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_AuthResponse_message(ctx, field) - case "should_show_email_otp_screen": - return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) - case "should_show_mobile_otp_screen": - return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) - case "should_show_totp_screen": - return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) - case "access_token": - return ec.fieldContext_AuthResponse_access_token(ctx, field) - case "id_token": - return ec.fieldContext_AuthResponse_id_token(ctx, field) - case "refresh_token": - return ec.fieldContext_AuthResponse_refresh_token(ctx, field) - case "expires_in": - return ec.fieldContext_AuthResponse_expires_in(ctx, field) - case "user": - return ec.fieldContext_AuthResponse_user(ctx, field) - case "authenticator_scanner_image": - return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) - case "authenticator_secret": - return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) - case "authenticator_recovery_codes": - return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + case "http_status": + return ec.fieldContext_TestEndpointResponse_http_status(ctx, field) + case "response": + return ec.fieldContext_TestEndpointResponse_response(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) + return nil, fmt.Errorf("no field named %q was found under type TestEndpointResponse", field.Name) }, } defer func() { @@ -13497,15 +13101,15 @@ func (ec *executionContext) fieldContext_Mutation_mobile_signup(ctx context.Cont } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_mobile_signup_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Mutation__test_endpoint_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_login(ctx, field) +func (ec *executionContext) _Mutation__add_email_template(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__add_email_template(ctx, field) if err != nil { return graphql.Null } @@ -13518,7 +13122,7 @@ func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().Login(rctx, fc.Args["params"].(model.LoginRequest)) + return ec.resolvers.Mutation().AddEmailTemplate(rctx, fc.Args["params"].(model.AddEmailTemplateRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13530,12 +13134,12 @@ func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.C } return graphql.Null } - res := resTmp.(*model.AuthResponse) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__add_email_template(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", Field: field, @@ -13544,31 +13148,9 @@ func (ec *executionContext) fieldContext_Mutation_login(ctx context.Context, fie Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "message": - return ec.fieldContext_AuthResponse_message(ctx, field) - case "should_show_email_otp_screen": - return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) - case "should_show_mobile_otp_screen": - return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) - case "should_show_totp_screen": - return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) - case "access_token": - return ec.fieldContext_AuthResponse_access_token(ctx, field) - case "id_token": - return ec.fieldContext_AuthResponse_id_token(ctx, field) - case "refresh_token": - return ec.fieldContext_AuthResponse_refresh_token(ctx, field) - case "expires_in": - return ec.fieldContext_AuthResponse_expires_in(ctx, field) - case "user": - return ec.fieldContext_AuthResponse_user(ctx, field) - case "authenticator_scanner_image": - return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) - case "authenticator_secret": - return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) - case "authenticator_recovery_codes": - return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + return ec.fieldContext_Response_message(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } defer func() { @@ -13578,15 +13160,15 @@ func (ec *executionContext) fieldContext_Mutation_login(ctx context.Context, fie } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Mutation__add_email_template_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation_mobile_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_mobile_login(ctx, field) +func (ec *executionContext) _Mutation__update_email_template(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__update_email_template(ctx, field) if err != nil { return graphql.Null } @@ -13599,7 +13181,7 @@ func (ec *executionContext) _Mutation_mobile_login(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().MobileLogin(rctx, fc.Args["params"].(model.MobileLoginRequest)) + return ec.resolvers.Mutation().UpdateEmailTemplate(rctx, fc.Args["params"].(model.UpdateEmailTemplateRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13611,12 +13193,12 @@ func (ec *executionContext) _Mutation_mobile_login(ctx context.Context, field gr } return graphql.Null } - res := resTmp.(*model.AuthResponse) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_mobile_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__update_email_template(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", Field: field, @@ -13625,31 +13207,9 @@ func (ec *executionContext) fieldContext_Mutation_mobile_login(ctx context.Conte Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "message": - return ec.fieldContext_AuthResponse_message(ctx, field) - case "should_show_email_otp_screen": - return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) - case "should_show_mobile_otp_screen": - return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) - case "should_show_totp_screen": - return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) - case "access_token": - return ec.fieldContext_AuthResponse_access_token(ctx, field) - case "id_token": - return ec.fieldContext_AuthResponse_id_token(ctx, field) - case "refresh_token": - return ec.fieldContext_AuthResponse_refresh_token(ctx, field) - case "expires_in": - return ec.fieldContext_AuthResponse_expires_in(ctx, field) - case "user": - return ec.fieldContext_AuthResponse_user(ctx, field) - case "authenticator_scanner_image": - return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) - case "authenticator_secret": - return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) - case "authenticator_recovery_codes": - return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + return ec.fieldContext_Response_message(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } defer func() { @@ -13659,15 +13219,15 @@ func (ec *executionContext) fieldContext_Mutation_mobile_login(ctx context.Conte } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_mobile_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Mutation__update_email_template_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation_magic_link_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_magic_link_login(ctx, field) +func (ec *executionContext) _Mutation__delete_email_template(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__delete_email_template(ctx, field) if err != nil { return graphql.Null } @@ -13680,7 +13240,7 @@ func (ec *executionContext) _Mutation_magic_link_login(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().MagicLinkLogin(rctx, fc.Args["params"].(model.MagicLinkLoginRequest)) + return ec.resolvers.Mutation().DeleteEmailTemplate(rctx, fc.Args["params"].(model.DeleteEmailTemplateRequest)) }) if err != nil { ec.Error(ctx, err) @@ -13697,7 +13257,7 @@ func (ec *executionContext) _Mutation_magic_link_login(ctx context.Context, fiel return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_magic_link_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__delete_email_template(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", Field: field, @@ -13718,15 +13278,15 @@ func (ec *executionContext) fieldContext_Mutation_magic_link_login(ctx context.C } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_magic_link_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Mutation__delete_email_template_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation_logout(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_logout(ctx, field) +func (ec *executionContext) _Mutation__fga_write_model(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__fga_write_model(ctx, field) if err != nil { return graphql.Null } @@ -13739,7 +13299,7 @@ func (ec *executionContext) _Mutation_logout(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().Logout(rctx) + return ec.resolvers.Mutation().FgaWriteModel(rctx, fc.Args["params"].(model.FgaWriteModelInput)) }) if err != nil { ec.Error(ctx, err) @@ -13751,12 +13311,12 @@ func (ec *executionContext) _Mutation_logout(ctx context.Context, field graphql. } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.FgaModel) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNFgaModel2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaModel(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_logout(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__fga_write_model(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", Field: field, @@ -13764,17 +13324,30 @@ func (ec *executionContext) fieldContext_Mutation_logout(_ context.Context, fiel IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "id": + return ec.fieldContext_FgaModel_id(ctx, field) + case "dsl": + return ec.fieldContext_FgaModel_dsl(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type FgaModel", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation__fga_write_model_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Mutation_update_profile(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_update_profile(ctx, field) +func (ec *executionContext) _Mutation__fga_write_tuples(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__fga_write_tuples(ctx, field) if err != nil { return graphql.Null } @@ -13787,7 +13360,7 @@ func (ec *executionContext) _Mutation_update_profile(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().UpdateProfile(rctx, fc.Args["params"].(model.UpdateProfileRequest)) + return ec.resolvers.Mutation().FgaWriteTuples(rctx, fc.Args["params"].(model.FgaWriteTuplesInput)) }) if err != nil { ec.Error(ctx, err) @@ -13804,7 +13377,7 @@ func (ec *executionContext) _Mutation_update_profile(ctx context.Context, field return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_update_profile(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__fga_write_tuples(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", Field: field, @@ -13825,15 +13398,15 @@ func (ec *executionContext) fieldContext_Mutation_update_profile(ctx context.Con } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_update_profile_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Mutation__fga_write_tuples_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation_verify_email(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_verify_email(ctx, field) +func (ec *executionContext) _Mutation__fga_delete_tuples(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation__fga_delete_tuples(ctx, field) if err != nil { return graphql.Null } @@ -13846,7 +13419,7 @@ func (ec *executionContext) _Mutation_verify_email(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().VerifyEmail(rctx, fc.Args["params"].(model.VerifyEmailRequest)) + return ec.resolvers.Mutation().FgaDeleteTuples(rctx, fc.Args["params"].(model.FgaWriteTuplesInput)) }) if err != nil { ec.Error(ctx, err) @@ -13858,12 +13431,12 @@ func (ec *executionContext) _Mutation_verify_email(ctx context.Context, field gr } return graphql.Null } - res := resTmp.(*model.AuthResponse) + res := resTmp.(*model.Response) fc.Result = res - return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_verify_email(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation__fga_delete_tuples(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", Field: field, @@ -13872,31 +13445,9 @@ func (ec *executionContext) fieldContext_Mutation_verify_email(ctx context.Conte Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "message": - return ec.fieldContext_AuthResponse_message(ctx, field) - case "should_show_email_otp_screen": - return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) - case "should_show_mobile_otp_screen": - return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) - case "should_show_totp_screen": - return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) - case "access_token": - return ec.fieldContext_AuthResponse_access_token(ctx, field) - case "id_token": - return ec.fieldContext_AuthResponse_id_token(ctx, field) - case "refresh_token": - return ec.fieldContext_AuthResponse_refresh_token(ctx, field) - case "expires_in": - return ec.fieldContext_AuthResponse_expires_in(ctx, field) - case "user": - return ec.fieldContext_AuthResponse_user(ctx, field) - case "authenticator_scanner_image": - return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) - case "authenticator_secret": - return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) - case "authenticator_recovery_codes": - return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) + return ec.fieldContext_Response_message(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } defer func() { @@ -13906,15 +13457,15 @@ func (ec *executionContext) fieldContext_Mutation_verify_email(ctx context.Conte } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_verify_email_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Mutation__fga_delete_tuples_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation_resend_verify_email(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_resend_verify_email(ctx, field) +func (ec *executionContext) _Pagination_limit(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Pagination_limit(ctx, field) if err != nil { return graphql.Null } @@ -13927,7 +13478,7 @@ func (ec *executionContext) _Mutation_resend_verify_email(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().ResendVerifyEmail(rctx, fc.Args["params"].(model.ResendVerifyEmailRequest)) + return obj.Limit, nil }) if err != nil { ec.Error(ctx, err) @@ -13939,41 +13490,26 @@ func (ec *executionContext) _Mutation_resend_verify_email(ctx context.Context, f } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(int64) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNInt642int64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_resend_verify_email(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Pagination_limit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Pagination", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_resend_verify_email_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation_forgot_password(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_forgot_password(ctx, field) +func (ec *executionContext) _Pagination_page(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Pagination_page(ctx, field) if err != nil { return graphql.Null } @@ -13986,7 +13522,7 @@ func (ec *executionContext) _Mutation_forgot_password(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().ForgotPassword(rctx, fc.Args["params"].(model.ForgotPasswordRequest)) + return obj.Page, nil }) if err != nil { ec.Error(ctx, err) @@ -13998,43 +13534,26 @@ func (ec *executionContext) _Mutation_forgot_password(ctx context.Context, field } return graphql.Null } - res := resTmp.(*model.ForgotPasswordResponse) + res := resTmp.(int64) fc.Result = res - return ec.marshalNForgotPasswordResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐForgotPasswordResponse(ctx, field.Selections, res) + return ec.marshalNInt642int64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_forgot_password(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Pagination_page(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Pagination", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_ForgotPasswordResponse_message(ctx, field) - case "should_show_mobile_otp_screen": - return ec.fieldContext_ForgotPasswordResponse_should_show_mobile_otp_screen(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type ForgotPasswordResponse", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_forgot_password_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation_reset_password(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_reset_password(ctx, field) +func (ec *executionContext) _Pagination_offset(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Pagination_offset(ctx, field) if err != nil { return graphql.Null } @@ -14047,7 +13566,7 @@ func (ec *executionContext) _Mutation_reset_password(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().ResetPassword(rctx, fc.Args["params"].(model.ResetPasswordRequest)) + return obj.Offset, nil }) if err != nil { ec.Error(ctx, err) @@ -14059,41 +13578,26 @@ func (ec *executionContext) _Mutation_reset_password(ctx context.Context, field } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(int64) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNInt642int64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_reset_password(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Pagination_offset(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Pagination", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_reset_password_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation_revoke(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_revoke(ctx, field) +func (ec *executionContext) _Pagination_total(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Pagination_total(ctx, field) if err != nil { return graphql.Null } @@ -14106,7 +13610,7 @@ func (ec *executionContext) _Mutation_revoke(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().Revoke(rctx, fc.Args["params"].(model.OAuthRevokeRequest)) + return obj.Total, nil }) if err != nil { ec.Error(ctx, err) @@ -14118,41 +13622,26 @@ func (ec *executionContext) _Mutation_revoke(ctx context.Context, field graphql. } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(int64) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNInt642int64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_revoke(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Pagination_total(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Pagination", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_revoke_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation_verify_otp(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_verify_otp(ctx, field) +func (ec *executionContext) _Query_meta(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_meta(ctx, field) if err != nil { return graphql.Null } @@ -14165,7 +13654,7 @@ func (ec *executionContext) _Mutation_verify_otp(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().VerifyOtp(rctx, fc.Args["params"].(model.VerifyOTPRequest)) + return ec.resolvers.Query().Meta(rctx) }) if err != nil { ec.Error(ctx, err) @@ -14177,23 +13666,109 @@ func (ec *executionContext) _Mutation_verify_otp(ctx context.Context, field grap } return graphql.Null } - res := resTmp.(*model.AuthResponse) + res := resTmp.(*model.Meta) fc.Result = res - return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) + return ec.marshalNMeta2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐMeta(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_verify_otp(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query_meta(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_AuthResponse_message(ctx, field) - case "should_show_email_otp_screen": - return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) + case "version": + return ec.fieldContext_Meta_version(ctx, field) + case "client_id": + return ec.fieldContext_Meta_client_id(ctx, field) + case "is_google_login_enabled": + return ec.fieldContext_Meta_is_google_login_enabled(ctx, field) + case "is_facebook_login_enabled": + return ec.fieldContext_Meta_is_facebook_login_enabled(ctx, field) + case "is_github_login_enabled": + return ec.fieldContext_Meta_is_github_login_enabled(ctx, field) + case "is_linkedin_login_enabled": + return ec.fieldContext_Meta_is_linkedin_login_enabled(ctx, field) + case "is_apple_login_enabled": + return ec.fieldContext_Meta_is_apple_login_enabled(ctx, field) + case "is_discord_login_enabled": + return ec.fieldContext_Meta_is_discord_login_enabled(ctx, field) + case "is_twitter_login_enabled": + return ec.fieldContext_Meta_is_twitter_login_enabled(ctx, field) + case "is_microsoft_login_enabled": + return ec.fieldContext_Meta_is_microsoft_login_enabled(ctx, field) + case "is_twitch_login_enabled": + return ec.fieldContext_Meta_is_twitch_login_enabled(ctx, field) + case "is_roblox_login_enabled": + return ec.fieldContext_Meta_is_roblox_login_enabled(ctx, field) + case "is_email_verification_enabled": + return ec.fieldContext_Meta_is_email_verification_enabled(ctx, field) + case "is_basic_authentication_enabled": + return ec.fieldContext_Meta_is_basic_authentication_enabled(ctx, field) + case "is_magic_link_login_enabled": + return ec.fieldContext_Meta_is_magic_link_login_enabled(ctx, field) + case "is_sign_up_enabled": + return ec.fieldContext_Meta_is_sign_up_enabled(ctx, field) + case "is_strong_password_enabled": + return ec.fieldContext_Meta_is_strong_password_enabled(ctx, field) + case "is_multi_factor_auth_enabled": + return ec.fieldContext_Meta_is_multi_factor_auth_enabled(ctx, field) + case "is_mobile_basic_authentication_enabled": + return ec.fieldContext_Meta_is_mobile_basic_authentication_enabled(ctx, field) + case "is_phone_verification_enabled": + return ec.fieldContext_Meta_is_phone_verification_enabled(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Meta", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_session(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_session(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().Session(rctx, fc.Args["params"].(*model.SessionQueryRequest)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*model.AuthResponse) + fc.Result = res + return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_session(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "message": + return ec.fieldContext_AuthResponse_message(ctx, field) + case "should_show_email_otp_screen": + return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) case "should_show_mobile_otp_screen": return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) case "should_show_totp_screen": @@ -14225,15 +13800,15 @@ func (ec *executionContext) fieldContext_Mutation_verify_otp(ctx context.Context } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_verify_otp_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query_session_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation_resend_otp(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_resend_otp(ctx, field) +func (ec *executionContext) _Query_profile(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_profile(ctx, field) if err != nil { return graphql.Null } @@ -14246,7 +13821,7 @@ func (ec *executionContext) _Mutation_resend_otp(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().ResendOtp(rctx, fc.Args["params"].(model.ResendOTPRequest)) + return ec.resolvers.Query().Profile(rctx) }) if err != nil { ec.Error(ctx, err) @@ -14258,41 +13833,68 @@ func (ec *executionContext) _Mutation_resend_otp(ctx context.Context, field grap } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.User) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNUser2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_resend_otp(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query_profile(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "id": + return ec.fieldContext_User_id(ctx, field) + case "email": + return ec.fieldContext_User_email(ctx, field) + case "email_verified": + return ec.fieldContext_User_email_verified(ctx, field) + case "signup_methods": + return ec.fieldContext_User_signup_methods(ctx, field) + case "given_name": + return ec.fieldContext_User_given_name(ctx, field) + case "family_name": + return ec.fieldContext_User_family_name(ctx, field) + case "middle_name": + return ec.fieldContext_User_middle_name(ctx, field) + case "nickname": + return ec.fieldContext_User_nickname(ctx, field) + case "preferred_username": + return ec.fieldContext_User_preferred_username(ctx, field) + case "gender": + return ec.fieldContext_User_gender(ctx, field) + case "birthdate": + return ec.fieldContext_User_birthdate(ctx, field) + case "phone_number": + return ec.fieldContext_User_phone_number(ctx, field) + case "phone_number_verified": + return ec.fieldContext_User_phone_number_verified(ctx, field) + case "picture": + return ec.fieldContext_User_picture(ctx, field) + case "roles": + return ec.fieldContext_User_roles(ctx, field) + case "created_at": + return ec.fieldContext_User_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_User_updated_at(ctx, field) + case "revoked_timestamp": + return ec.fieldContext_User_revoked_timestamp(ctx, field) + case "is_multi_factor_auth_enabled": + return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) + case "app_data": + return ec.fieldContext_User_app_data(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type User", field.Name) }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_resend_otp_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation_deactivate_account(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_deactivate_account(ctx, field) +func (ec *executionContext) _Query_validate_jwt_token(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_validate_jwt_token(ctx, field) if err != nil { return graphql.Null } @@ -14305,7 +13907,7 @@ func (ec *executionContext) _Mutation_deactivate_account(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().DeactivateAccount(rctx) + return ec.resolvers.Query().ValidateJwtToken(rctx, fc.Args["params"].(model.ValidateJWTTokenRequest)) }) if err != nil { ec.Error(ctx, err) @@ -14317,30 +13919,43 @@ func (ec *executionContext) _Mutation_deactivate_account(ctx context.Context, fi } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.ValidateJWTTokenResponse) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNValidateJWTTokenResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐValidateJWTTokenResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_deactivate_account(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query_validate_jwt_token(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "is_valid": + return ec.fieldContext_ValidateJWTTokenResponse_is_valid(ctx, field) + case "claims": + return ec.fieldContext_ValidateJWTTokenResponse_claims(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type ValidateJWTTokenResponse", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_validate_jwt_token_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Mutation__delete_user(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__delete_user(ctx, field) +func (ec *executionContext) _Query_validate_session(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_validate_session(ctx, field) if err != nil { return graphql.Null } @@ -14353,7 +13968,7 @@ func (ec *executionContext) _Mutation__delete_user(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().DeleteUser(rctx, fc.Args["params"].(model.DeleteUserRequest)) + return ec.resolvers.Query().ValidateSession(rctx, fc.Args["params"].(*model.ValidateSessionRequest)) }) if err != nil { ec.Error(ctx, err) @@ -14365,23 +13980,25 @@ func (ec *executionContext) _Mutation__delete_user(ctx context.Context, field gr } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.ValidateSessionResponse) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNValidateSessionResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐValidateSessionResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__delete_user(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query_validate_session(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "is_valid": + return ec.fieldContext_ValidateSessionResponse_is_valid(ctx, field) + case "user": + return ec.fieldContext_ValidateSessionResponse_user(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type ValidateSessionResponse", field.Name) }, } defer func() { @@ -14391,15 +14008,15 @@ func (ec *executionContext) fieldContext_Mutation__delete_user(ctx context.Conte } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__delete_user_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query_validate_session_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__update_user(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__update_user(ctx, field) +func (ec *executionContext) _Query__users(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__users(ctx, field) if err != nil { return graphql.Null } @@ -14412,7 +14029,7 @@ func (ec *executionContext) _Mutation__update_user(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().UpdateUser(rctx, fc.Args["params"].(model.UpdateUserRequest)) + return ec.resolvers.Query().Users(rctx, fc.Args["params"].(*model.PaginatedRequest)) }) if err != nil { ec.Error(ctx, err) @@ -14424,61 +14041,25 @@ func (ec *executionContext) _Mutation__update_user(ctx context.Context, field gr } return graphql.Null } - res := resTmp.(*model.User) + res := resTmp.(*model.Users) fc.Result = res - return ec.marshalNUser2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) + return ec.marshalNUsers2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUsers(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__update_user(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__users(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "id": - return ec.fieldContext_User_id(ctx, field) - case "email": - return ec.fieldContext_User_email(ctx, field) - case "email_verified": - return ec.fieldContext_User_email_verified(ctx, field) - case "signup_methods": - return ec.fieldContext_User_signup_methods(ctx, field) - case "given_name": - return ec.fieldContext_User_given_name(ctx, field) - case "family_name": - return ec.fieldContext_User_family_name(ctx, field) - case "middle_name": - return ec.fieldContext_User_middle_name(ctx, field) - case "nickname": - return ec.fieldContext_User_nickname(ctx, field) - case "preferred_username": - return ec.fieldContext_User_preferred_username(ctx, field) - case "gender": - return ec.fieldContext_User_gender(ctx, field) - case "birthdate": - return ec.fieldContext_User_birthdate(ctx, field) - case "phone_number": - return ec.fieldContext_User_phone_number(ctx, field) - case "phone_number_verified": - return ec.fieldContext_User_phone_number_verified(ctx, field) - case "picture": - return ec.fieldContext_User_picture(ctx, field) - case "roles": - return ec.fieldContext_User_roles(ctx, field) - case "created_at": - return ec.fieldContext_User_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_User_updated_at(ctx, field) - case "revoked_timestamp": - return ec.fieldContext_User_revoked_timestamp(ctx, field) - case "is_multi_factor_auth_enabled": - return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) - case "app_data": - return ec.fieldContext_User_app_data(ctx, field) + case "pagination": + return ec.fieldContext_Users_pagination(ctx, field) + case "users": + return ec.fieldContext_Users_users(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Users", field.Name) }, } defer func() { @@ -14488,15 +14069,15 @@ func (ec *executionContext) fieldContext_Mutation__update_user(ctx context.Conte } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__update_user_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query__users_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__admin_signup(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__admin_signup(ctx, field) +func (ec *executionContext) _Query__user(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__user(ctx, field) if err != nil { return graphql.Null } @@ -14509,7 +14090,7 @@ func (ec *executionContext) _Mutation__admin_signup(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AdminSignup(rctx, fc.Args["params"].(model.AdminSignupRequest)) + return ec.resolvers.Query().User(rctx, fc.Args["params"].(model.GetUserRequest)) }) if err != nil { ec.Error(ctx, err) @@ -14521,23 +14102,61 @@ func (ec *executionContext) _Mutation__admin_signup(ctx context.Context, field g } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.User) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNUser2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__admin_signup(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__user(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "id": + return ec.fieldContext_User_id(ctx, field) + case "email": + return ec.fieldContext_User_email(ctx, field) + case "email_verified": + return ec.fieldContext_User_email_verified(ctx, field) + case "signup_methods": + return ec.fieldContext_User_signup_methods(ctx, field) + case "given_name": + return ec.fieldContext_User_given_name(ctx, field) + case "family_name": + return ec.fieldContext_User_family_name(ctx, field) + case "middle_name": + return ec.fieldContext_User_middle_name(ctx, field) + case "nickname": + return ec.fieldContext_User_nickname(ctx, field) + case "preferred_username": + return ec.fieldContext_User_preferred_username(ctx, field) + case "gender": + return ec.fieldContext_User_gender(ctx, field) + case "birthdate": + return ec.fieldContext_User_birthdate(ctx, field) + case "phone_number": + return ec.fieldContext_User_phone_number(ctx, field) + case "phone_number_verified": + return ec.fieldContext_User_phone_number_verified(ctx, field) + case "picture": + return ec.fieldContext_User_picture(ctx, field) + case "roles": + return ec.fieldContext_User_roles(ctx, field) + case "created_at": + return ec.fieldContext_User_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_User_updated_at(ctx, field) + case "revoked_timestamp": + return ec.fieldContext_User_revoked_timestamp(ctx, field) + case "is_multi_factor_auth_enabled": + return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) + case "app_data": + return ec.fieldContext_User_app_data(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type User", field.Name) }, } defer func() { @@ -14547,15 +14166,15 @@ func (ec *executionContext) fieldContext_Mutation__admin_signup(ctx context.Cont } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__admin_signup_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query__user_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__admin_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__admin_login(ctx, field) +func (ec *executionContext) _Query__verification_requests(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__verification_requests(ctx, field) if err != nil { return graphql.Null } @@ -14568,7 +14187,7 @@ func (ec *executionContext) _Mutation__admin_login(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AdminLogin(rctx, fc.Args["params"].(model.AdminLoginRequest)) + return ec.resolvers.Query().VerificationRequests(rctx, fc.Args["params"].(*model.PaginatedRequest)) }) if err != nil { ec.Error(ctx, err) @@ -14580,23 +14199,25 @@ func (ec *executionContext) _Mutation__admin_login(ctx context.Context, field gr } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.VerificationRequests) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNVerificationRequests2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐVerificationRequests(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__admin_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__verification_requests(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "pagination": + return ec.fieldContext_VerificationRequests_pagination(ctx, field) + case "verification_requests": + return ec.fieldContext_VerificationRequests_verification_requests(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type VerificationRequests", field.Name) }, } defer func() { @@ -14606,63 +14227,15 @@ func (ec *executionContext) fieldContext_Mutation__admin_login(ctx context.Conte } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__admin_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query__verification_requests_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__admin_logout(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__admin_logout(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AdminLogout(rctx) - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(*model.Response) - fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext_Mutation__admin_logout(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) _Mutation__update_env(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__update_env(ctx, field) +func (ec *executionContext) _Query__admin_session(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__admin_session(ctx, field) if err != nil { return graphql.Null } @@ -14675,7 +14248,7 @@ func (ec *executionContext) _Mutation__update_env(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().UpdateEnv(rctx, fc.Args["params"].(model.UpdateEnvRequest)) + return ec.resolvers.Query().AdminSession(rctx) }) if err != nil { ec.Error(ctx, err) @@ -14692,9 +14265,9 @@ func (ec *executionContext) _Mutation__update_env(ctx context.Context, field gra return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__update_env(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__admin_session(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, @@ -14706,83 +14279,11 @@ func (ec *executionContext) fieldContext_Mutation__update_env(ctx context.Contex return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__update_env_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation__invite_members(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__invite_members(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().InviteMembers(rctx, fc.Args["params"].(model.InviteMemberRequest)) - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(*model.InviteMembersResponse) - fc.Result = res - return ec.marshalNInviteMembersResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐInviteMembersResponse(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext_Mutation__invite_members(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_InviteMembersResponse_message(ctx, field) - case "Users": - return ec.fieldContext_InviteMembersResponse_Users(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type InviteMembersResponse", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__invite_members_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__revoke_access(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__revoke_access(ctx, field) +func (ec *executionContext) _Query__env(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__env(ctx, field) if err != nil { return graphql.Null } @@ -14795,7 +14296,7 @@ func (ec *executionContext) _Mutation__revoke_access(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().RevokeAccess(rctx, fc.Args["param"].(model.UpdateAccessRequest)) + return ec.resolvers.Query().Env(rctx) }) if err != nil { ec.Error(ctx, err) @@ -14807,41 +14308,170 @@ func (ec *executionContext) _Mutation__revoke_access(ctx context.Context, field } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.Env) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNEnv2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEnv(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__revoke_access(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__env(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + case "ACCESS_TOKEN_EXPIRY_TIME": + return ec.fieldContext_Env_ACCESS_TOKEN_EXPIRY_TIME(ctx, field) + case "ADMIN_SECRET": + return ec.fieldContext_Env_ADMIN_SECRET(ctx, field) + case "DATABASE_NAME": + return ec.fieldContext_Env_DATABASE_NAME(ctx, field) + case "DATABASE_URL": + return ec.fieldContext_Env_DATABASE_URL(ctx, field) + case "DATABASE_TYPE": + return ec.fieldContext_Env_DATABASE_TYPE(ctx, field) + case "DATABASE_USERNAME": + return ec.fieldContext_Env_DATABASE_USERNAME(ctx, field) + case "DATABASE_PASSWORD": + return ec.fieldContext_Env_DATABASE_PASSWORD(ctx, field) + case "DATABASE_HOST": + return ec.fieldContext_Env_DATABASE_HOST(ctx, field) + case "DATABASE_PORT": + return ec.fieldContext_Env_DATABASE_PORT(ctx, field) + case "CLIENT_ID": + return ec.fieldContext_Env_CLIENT_ID(ctx, field) + case "CLIENT_SECRET": + return ec.fieldContext_Env_CLIENT_SECRET(ctx, field) + case "CUSTOM_ACCESS_TOKEN_SCRIPT": + return ec.fieldContext_Env_CUSTOM_ACCESS_TOKEN_SCRIPT(ctx, field) + case "SMTP_HOST": + return ec.fieldContext_Env_SMTP_HOST(ctx, field) + case "SMTP_PORT": + return ec.fieldContext_Env_SMTP_PORT(ctx, field) + case "SMTP_USERNAME": + return ec.fieldContext_Env_SMTP_USERNAME(ctx, field) + case "SMTP_PASSWORD": + return ec.fieldContext_Env_SMTP_PASSWORD(ctx, field) + case "SMTP_LOCAL_NAME": + return ec.fieldContext_Env_SMTP_LOCAL_NAME(ctx, field) + case "SENDER_EMAIL": + return ec.fieldContext_Env_SENDER_EMAIL(ctx, field) + case "SENDER_NAME": + return ec.fieldContext_Env_SENDER_NAME(ctx, field) + case "JWT_TYPE": + return ec.fieldContext_Env_JWT_TYPE(ctx, field) + case "JWT_SECRET": + return ec.fieldContext_Env_JWT_SECRET(ctx, field) + case "JWT_PRIVATE_KEY": + return ec.fieldContext_Env_JWT_PRIVATE_KEY(ctx, field) + case "JWT_PUBLIC_KEY": + return ec.fieldContext_Env_JWT_PUBLIC_KEY(ctx, field) + case "ALLOWED_ORIGINS": + return ec.fieldContext_Env_ALLOWED_ORIGINS(ctx, field) + case "APP_URL": + return ec.fieldContext_Env_APP_URL(ctx, field) + case "REDIS_URL": + return ec.fieldContext_Env_REDIS_URL(ctx, field) + case "RESET_PASSWORD_URL": + return ec.fieldContext_Env_RESET_PASSWORD_URL(ctx, field) + case "DISABLE_EMAIL_VERIFICATION": + return ec.fieldContext_Env_DISABLE_EMAIL_VERIFICATION(ctx, field) + case "DISABLE_BASIC_AUTHENTICATION": + return ec.fieldContext_Env_DISABLE_BASIC_AUTHENTICATION(ctx, field) + case "DISABLE_MOBILE_BASIC_AUTHENTICATION": + return ec.fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx, field) + case "DISABLE_MAGIC_LINK_LOGIN": + return ec.fieldContext_Env_DISABLE_MAGIC_LINK_LOGIN(ctx, field) + case "DISABLE_LOGIN_PAGE": + return ec.fieldContext_Env_DISABLE_LOGIN_PAGE(ctx, field) + case "DISABLE_SIGN_UP": + return ec.fieldContext_Env_DISABLE_SIGN_UP(ctx, field) + case "DISABLE_REDIS_FOR_ENV": + return ec.fieldContext_Env_DISABLE_REDIS_FOR_ENV(ctx, field) + case "DISABLE_STRONG_PASSWORD": + return ec.fieldContext_Env_DISABLE_STRONG_PASSWORD(ctx, field) + case "DISABLE_MULTI_FACTOR_AUTHENTICATION": + return ec.fieldContext_Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(ctx, field) + case "ENFORCE_MULTI_FACTOR_AUTHENTICATION": + return ec.fieldContext_Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx, field) + case "ROLES": + return ec.fieldContext_Env_ROLES(ctx, field) + case "PROTECTED_ROLES": + return ec.fieldContext_Env_PROTECTED_ROLES(ctx, field) + case "DEFAULT_ROLES": + return ec.fieldContext_Env_DEFAULT_ROLES(ctx, field) + case "JWT_ROLE_CLAIM": + return ec.fieldContext_Env_JWT_ROLE_CLAIM(ctx, field) + case "GOOGLE_CLIENT_ID": + return ec.fieldContext_Env_GOOGLE_CLIENT_ID(ctx, field) + case "GOOGLE_CLIENT_SECRET": + return ec.fieldContext_Env_GOOGLE_CLIENT_SECRET(ctx, field) + case "GITHUB_CLIENT_ID": + return ec.fieldContext_Env_GITHUB_CLIENT_ID(ctx, field) + case "GITHUB_CLIENT_SECRET": + return ec.fieldContext_Env_GITHUB_CLIENT_SECRET(ctx, field) + case "FACEBOOK_CLIENT_ID": + return ec.fieldContext_Env_FACEBOOK_CLIENT_ID(ctx, field) + case "FACEBOOK_CLIENT_SECRET": + return ec.fieldContext_Env_FACEBOOK_CLIENT_SECRET(ctx, field) + case "LINKEDIN_CLIENT_ID": + return ec.fieldContext_Env_LINKEDIN_CLIENT_ID(ctx, field) + case "LINKEDIN_CLIENT_SECRET": + return ec.fieldContext_Env_LINKEDIN_CLIENT_SECRET(ctx, field) + case "APPLE_CLIENT_ID": + return ec.fieldContext_Env_APPLE_CLIENT_ID(ctx, field) + case "APPLE_CLIENT_SECRET": + return ec.fieldContext_Env_APPLE_CLIENT_SECRET(ctx, field) + case "DISCORD_CLIENT_ID": + return ec.fieldContext_Env_DISCORD_CLIENT_ID(ctx, field) + case "DISCORD_CLIENT_SECRET": + return ec.fieldContext_Env_DISCORD_CLIENT_SECRET(ctx, field) + case "TWITTER_CLIENT_ID": + return ec.fieldContext_Env_TWITTER_CLIENT_ID(ctx, field) + case "TWITTER_CLIENT_SECRET": + return ec.fieldContext_Env_TWITTER_CLIENT_SECRET(ctx, field) + case "MICROSOFT_CLIENT_ID": + return ec.fieldContext_Env_MICROSOFT_CLIENT_ID(ctx, field) + case "MICROSOFT_CLIENT_SECRET": + return ec.fieldContext_Env_MICROSOFT_CLIENT_SECRET(ctx, field) + case "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID": + return ec.fieldContext_Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(ctx, field) + case "TWITCH_CLIENT_ID": + return ec.fieldContext_Env_TWITCH_CLIENT_ID(ctx, field) + case "TWITCH_CLIENT_SECRET": + return ec.fieldContext_Env_TWITCH_CLIENT_SECRET(ctx, field) + case "ROBLOX_CLIENT_ID": + return ec.fieldContext_Env_ROBLOX_CLIENT_ID(ctx, field) + case "ROBLOX_CLIENT_SECRET": + return ec.fieldContext_Env_ROBLOX_CLIENT_SECRET(ctx, field) + case "ORGANIZATION_NAME": + return ec.fieldContext_Env_ORGANIZATION_NAME(ctx, field) + case "ORGANIZATION_LOGO": + return ec.fieldContext_Env_ORGANIZATION_LOGO(ctx, field) + case "APP_COOKIE_SECURE": + return ec.fieldContext_Env_APP_COOKIE_SECURE(ctx, field) + case "ADMIN_COOKIE_SECURE": + return ec.fieldContext_Env_ADMIN_COOKIE_SECURE(ctx, field) + case "DEFAULT_AUTHORIZE_RESPONSE_TYPE": + return ec.fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(ctx, field) + case "DEFAULT_AUTHORIZE_RESPONSE_MODE": + return ec.fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(ctx, field) + case "DISABLE_PLAYGROUND": + return ec.fieldContext_Env_DISABLE_PLAYGROUND(ctx, field) + case "DISABLE_MAIL_OTP_LOGIN": + return ec.fieldContext_Env_DISABLE_MAIL_OTP_LOGIN(ctx, field) + case "DISABLE_TOTP_LOGIN": + return ec.fieldContext_Env_DISABLE_TOTP_LOGIN(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Env", field.Name) }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__revoke_access_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__enable_access(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__enable_access(ctx, field) +func (ec *executionContext) _Query__webhook(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__webhook(ctx, field) if err != nil { return graphql.Null } @@ -14854,7 +14484,7 @@ func (ec *executionContext) _Mutation__enable_access(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().EnableAccess(rctx, fc.Args["param"].(model.UpdateAccessRequest)) + return ec.resolvers.Query().Webhook(rctx, fc.Args["params"].(model.WebhookRequest)) }) if err != nil { ec.Error(ctx, err) @@ -14866,23 +14496,37 @@ func (ec *executionContext) _Mutation__enable_access(ctx context.Context, field } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.Webhook) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNWebhook2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhook(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__enable_access(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__webhook(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "id": + return ec.fieldContext_Webhook_id(ctx, field) + case "event_name": + return ec.fieldContext_Webhook_event_name(ctx, field) + case "event_description": + return ec.fieldContext_Webhook_event_description(ctx, field) + case "endpoint": + return ec.fieldContext_Webhook_endpoint(ctx, field) + case "enabled": + return ec.fieldContext_Webhook_enabled(ctx, field) + case "headers": + return ec.fieldContext_Webhook_headers(ctx, field) + case "created_at": + return ec.fieldContext_Webhook_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_Webhook_updated_at(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Webhook", field.Name) }, } defer func() { @@ -14892,15 +14536,15 @@ func (ec *executionContext) fieldContext_Mutation__enable_access(ctx context.Con } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__enable_access_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query__webhook_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__generate_jwt_keys(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__generate_jwt_keys(ctx, field) +func (ec *executionContext) _Query__webhooks(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__webhooks(ctx, field) if err != nil { return graphql.Null } @@ -14913,7 +14557,7 @@ func (ec *executionContext) _Mutation__generate_jwt_keys(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().GenerateJwtKeys(rctx, fc.Args["params"].(model.GenerateJWTKeysRequest)) + return ec.resolvers.Query().Webhooks(rctx, fc.Args["params"].(*model.PaginatedRequest)) }) if err != nil { ec.Error(ctx, err) @@ -14925,27 +14569,25 @@ func (ec *executionContext) _Mutation__generate_jwt_keys(ctx context.Context, fi } return graphql.Null } - res := resTmp.(*model.GenerateJWTKeysResponse) + res := resTmp.(*model.Webhooks) fc.Result = res - return ec.marshalNGenerateJWTKeysResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐGenerateJWTKeysResponse(ctx, field.Selections, res) + return ec.marshalNWebhooks2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhooks(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__generate_jwt_keys(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__webhooks(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "secret": - return ec.fieldContext_GenerateJWTKeysResponse_secret(ctx, field) - case "public_key": - return ec.fieldContext_GenerateJWTKeysResponse_public_key(ctx, field) - case "private_key": - return ec.fieldContext_GenerateJWTKeysResponse_private_key(ctx, field) + case "pagination": + return ec.fieldContext_Webhooks_pagination(ctx, field) + case "webhooks": + return ec.fieldContext_Webhooks_webhooks(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type GenerateJWTKeysResponse", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Webhooks", field.Name) }, } defer func() { @@ -14955,15 +14597,15 @@ func (ec *executionContext) fieldContext_Mutation__generate_jwt_keys(ctx context } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__generate_jwt_keys_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query__webhooks_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__add_webhook(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__add_webhook(ctx, field) +func (ec *executionContext) _Query__webhook_logs(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__webhook_logs(ctx, field) if err != nil { return graphql.Null } @@ -14976,7 +14618,7 @@ func (ec *executionContext) _Mutation__add_webhook(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AddWebhook(rctx, fc.Args["params"].(model.AddWebhookRequest)) + return ec.resolvers.Query().WebhookLogs(rctx, fc.Args["params"].(*model.ListWebhookLogRequest)) }) if err != nil { ec.Error(ctx, err) @@ -14988,23 +14630,25 @@ func (ec *executionContext) _Mutation__add_webhook(ctx context.Context, field gr } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.WebhookLogs) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNWebhookLogs2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookLogs(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__add_webhook(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__webhook_logs(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "pagination": + return ec.fieldContext_WebhookLogs_pagination(ctx, field) + case "webhook_logs": + return ec.fieldContext_WebhookLogs_webhook_logs(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type WebhookLogs", field.Name) }, } defer func() { @@ -15014,15 +14658,15 @@ func (ec *executionContext) fieldContext_Mutation__add_webhook(ctx context.Conte } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__add_webhook_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query__webhook_logs_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__update_webhook(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__update_webhook(ctx, field) +func (ec *executionContext) _Query__email_templates(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__email_templates(ctx, field) if err != nil { return graphql.Null } @@ -15035,7 +14679,7 @@ func (ec *executionContext) _Mutation__update_webhook(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().UpdateWebhook(rctx, fc.Args["params"].(model.UpdateWebhookRequest)) + return ec.resolvers.Query().EmailTemplates(rctx, fc.Args["params"].(*model.PaginatedRequest)) }) if err != nil { ec.Error(ctx, err) @@ -15047,23 +14691,25 @@ func (ec *executionContext) _Mutation__update_webhook(ctx context.Context, field } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.EmailTemplates) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNEmailTemplates2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplates(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__update_webhook(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__email_templates(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "pagination": + return ec.fieldContext_EmailTemplates_pagination(ctx, field) + case "email_templates": + return ec.fieldContext_EmailTemplates_email_templates(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type EmailTemplates", field.Name) }, } defer func() { @@ -15073,15 +14719,15 @@ func (ec *executionContext) fieldContext_Mutation__update_webhook(ctx context.Co } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__update_webhook_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query__email_templates_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__delete_webhook(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__delete_webhook(ctx, field) +func (ec *executionContext) _Query__audit_logs(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__audit_logs(ctx, field) if err != nil { return graphql.Null } @@ -15094,7 +14740,7 @@ func (ec *executionContext) _Mutation__delete_webhook(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().DeleteWebhook(rctx, fc.Args["params"].(model.WebhookRequest)) + return ec.resolvers.Query().AuditLogs(rctx, fc.Args["params"].(*model.ListAuditLogRequest)) }) if err != nil { ec.Error(ctx, err) @@ -15106,23 +14752,25 @@ func (ec *executionContext) _Mutation__delete_webhook(ctx context.Context, field } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.AuditLogs) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNAuditLogs2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuditLogs(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__delete_webhook(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__audit_logs(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "pagination": + return ec.fieldContext_AuditLogs_pagination(ctx, field) + case "audit_logs": + return ec.fieldContext_AuditLogs_audit_logs(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type AuditLogs", field.Name) }, } defer func() { @@ -15132,15 +14780,15 @@ func (ec *executionContext) fieldContext_Mutation__delete_webhook(ctx context.Co } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__delete_webhook_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query__audit_logs_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__test_endpoint(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__test_endpoint(ctx, field) +func (ec *executionContext) _Query__fga_get_model(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__fga_get_model(ctx, field) if err != nil { return graphql.Null } @@ -15153,7 +14801,7 @@ func (ec *executionContext) _Mutation__test_endpoint(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().TestEndpoint(rctx, fc.Args["params"].(model.TestEndpointRequest)) + return ec.resolvers.Query().FgaGetModel(rctx) }) if err != nil { ec.Error(ctx, err) @@ -15165,43 +14813,32 @@ func (ec *executionContext) _Mutation__test_endpoint(ctx context.Context, field } return graphql.Null } - res := resTmp.(*model.TestEndpointResponse) + res := resTmp.(*model.FgaModel) fc.Result = res - return ec.marshalNTestEndpointResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐTestEndpointResponse(ctx, field.Selections, res) + return ec.marshalNFgaModel2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaModel(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__test_endpoint(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__fga_get_model(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "http_status": - return ec.fieldContext_TestEndpointResponse_http_status(ctx, field) - case "response": - return ec.fieldContext_TestEndpointResponse_response(ctx, field) + case "id": + return ec.fieldContext_FgaModel_id(ctx, field) + case "dsl": + return ec.fieldContext_FgaModel_dsl(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type TestEndpointResponse", field.Name) + return nil, fmt.Errorf("no field named %q was found under type FgaModel", field.Name) }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__test_endpoint_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__add_email_template(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__add_email_template(ctx, field) +func (ec *executionContext) _Query__fga_read_tuples(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query__fga_read_tuples(ctx, field) if err != nil { return graphql.Null } @@ -15214,7 +14851,7 @@ func (ec *executionContext) _Mutation__add_email_template(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AddEmailTemplate(rctx, fc.Args["params"].(model.AddEmailTemplateRequest)) + return ec.resolvers.Query().FgaReadTuples(rctx, fc.Args["params"].(model.FgaReadTuplesInput)) }) if err != nil { ec.Error(ctx, err) @@ -15226,23 +14863,25 @@ func (ec *executionContext) _Mutation__add_email_template(ctx context.Context, f } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.FgaTuples) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNFgaTuples2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTuples(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__add_email_template(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query__fga_read_tuples(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "tuples": + return ec.fieldContext_FgaTuples_tuples(ctx, field) + case "continuation_token": + return ec.fieldContext_FgaTuples_continuation_token(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type FgaTuples", field.Name) }, } defer func() { @@ -15252,15 +14891,15 @@ func (ec *executionContext) fieldContext_Mutation__add_email_template(ctx contex } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__add_email_template_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query__fga_read_tuples_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__update_email_template(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__update_email_template(ctx, field) +func (ec *executionContext) _Query_fga_check(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_fga_check(ctx, field) if err != nil { return graphql.Null } @@ -15273,7 +14912,7 @@ func (ec *executionContext) _Mutation__update_email_template(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().UpdateEmailTemplate(rctx, fc.Args["params"].(model.UpdateEmailTemplateRequest)) + return ec.resolvers.Query().FgaCheck(rctx, fc.Args["params"].(model.FgaCheckInput)) }) if err != nil { ec.Error(ctx, err) @@ -15285,23 +14924,23 @@ func (ec *executionContext) _Mutation__update_email_template(ctx context.Context } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.FgaCheckResponse) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNFgaCheckResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__update_email_template(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query_fga_check(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "allowed": + return ec.fieldContext_FgaCheckResponse_allowed(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type FgaCheckResponse", field.Name) }, } defer func() { @@ -15311,15 +14950,15 @@ func (ec *executionContext) fieldContext_Mutation__update_email_template(ctx con } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__update_email_template_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query_fga_check_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__delete_email_template(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__delete_email_template(ctx, field) +func (ec *executionContext) _Query_fga_batch_check(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_fga_batch_check(ctx, field) if err != nil { return graphql.Null } @@ -15332,7 +14971,7 @@ func (ec *executionContext) _Mutation__delete_email_template(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().DeleteEmailTemplate(rctx, fc.Args["params"].(model.DeleteEmailTemplateRequest)) + return ec.resolvers.Query().FgaBatchCheck(rctx, fc.Args["params"].(model.FgaBatchCheckInput)) }) if err != nil { ec.Error(ctx, err) @@ -15344,23 +14983,23 @@ func (ec *executionContext) _Mutation__delete_email_template(ctx context.Context } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*model.FgaBatchCheckResponse) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNFgaBatchCheckResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaBatchCheckResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__delete_email_template(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query_fga_batch_check(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "results": + return ec.fieldContext_FgaBatchCheckResponse_results(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type FgaBatchCheckResponse", field.Name) }, } defer func() { @@ -15370,15 +15009,15 @@ func (ec *executionContext) fieldContext_Mutation__delete_email_template(ctx con } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__delete_email_template_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query_fga_batch_check_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__authz_add_resource(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_add_resource(ctx, field) +func (ec *executionContext) _Query_fga_list_objects(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_fga_list_objects(ctx, field) if err != nil { return graphql.Null } @@ -15391,7 +15030,7 @@ func (ec *executionContext) _Mutation__authz_add_resource(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzAddResource(rctx, fc.Args["params"].(model.AddResourceInput)) + return ec.resolvers.Query().FgaListObjects(rctx, fc.Args["params"].(model.FgaListObjectsInput)) }) if err != nil { ec.Error(ctx, err) @@ -15403,31 +15042,23 @@ func (ec *executionContext) _Mutation__authz_add_resource(ctx context.Context, f } return graphql.Null } - res := resTmp.(*model.AuthzResource) + res := resTmp.(*model.FgaListObjectsResponse) fc.Result = res - return ec.marshalNAuthzResource2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResource(ctx, field.Selections, res) + return ec.marshalNFgaListObjectsResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaListObjectsResponse(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_add_resource(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query_fga_list_objects(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "id": - return ec.fieldContext_AuthzResource_id(ctx, field) - case "name": - return ec.fieldContext_AuthzResource_name(ctx, field) - case "description": - return ec.fieldContext_AuthzResource_description(ctx, field) - case "created_at": - return ec.fieldContext_AuthzResource_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzResource_updated_at(ctx, field) + case "objects": + return ec.fieldContext_FgaListObjectsResponse_objects(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type AuthzResource", field.Name) + return nil, fmt.Errorf("no field named %q was found under type FgaListObjectsResponse", field.Name) }, } defer func() { @@ -15437,15 +15068,15 @@ func (ec *executionContext) fieldContext_Mutation__authz_add_resource(ctx contex } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_add_resource_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query_fga_list_objects_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__authz_update_resource(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_update_resource(ctx, field) +func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query___type(ctx, field) if err != nil { return graphql.Null } @@ -15458,43 +15089,52 @@ func (ec *executionContext) _Mutation__authz_update_resource(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzUpdateResource(rctx, fc.Args["params"].(model.UpdateResourceInput)) + return ec.introspectType(fc.Args["name"].(string)) }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuthzResource) + res := resTmp.(*introspection.Type) fc.Result = res - return ec.marshalNAuthzResource2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResource(ctx, field.Selections, res) + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_update_resource(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, - IsResolver: true, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "id": - return ec.fieldContext_AuthzResource_id(ctx, field) + case "kind": + return ec.fieldContext___Type_kind(ctx, field) case "name": - return ec.fieldContext_AuthzResource_name(ctx, field) + return ec.fieldContext___Type_name(ctx, field) case "description": - return ec.fieldContext_AuthzResource_description(ctx, field) - case "created_at": - return ec.fieldContext_AuthzResource_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzResource_updated_at(ctx, field) + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type AuthzResource", field.Name) + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } defer func() { @@ -15504,15 +15144,15 @@ func (ec *executionContext) fieldContext_Mutation__authz_update_resource(ctx con } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_update_resource_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Query___type_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } return fc, nil } -func (ec *executionContext) _Mutation__authz_delete_resource(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_delete_resource(ctx, field) +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query___schema(ctx, field) if err != nil { return graphql.Null } @@ -15525,53 +15165,49 @@ func (ec *executionContext) _Mutation__authz_delete_resource(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzDeleteResource(rctx, fc.Args["id"].(string)) + return ec.introspectSchema() }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*introspection.Schema) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_delete_resource(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query___schema(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Query", Field: field, IsMethod: true, - IsResolver: true, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) + case "description": + return ec.fieldContext___Schema_description(ctx, field) + case "types": + return ec.fieldContext___Schema_types(ctx, field) + case "queryType": + return ec.fieldContext___Schema_queryType(ctx, field) + case "mutationType": + return ec.fieldContext___Schema_mutationType(ctx, field) + case "subscriptionType": + return ec.fieldContext___Schema_subscriptionType(ctx, field) + case "directives": + return ec.fieldContext___Schema_directives(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, fmt.Errorf("no field named %q was found under type __Schema", field.Name) }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_delete_resource_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__authz_add_scope(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_add_scope(ctx, field) +func (ec *executionContext) _Response_message(ctx context.Context, field graphql.CollectedField, obj *model.Response) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Response_message(ctx, field) if err != nil { return graphql.Null } @@ -15584,7 +15220,7 @@ func (ec *executionContext) _Mutation__authz_add_scope(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzAddScope(rctx, fc.Args["params"].(model.AddScopeInput)) + return obj.Message, nil }) if err != nil { ec.Error(ctx, err) @@ -15596,49 +15232,26 @@ func (ec *executionContext) _Mutation__authz_add_scope(ctx context.Context, fiel } return graphql.Null } - res := resTmp.(*model.AuthzScope) + res := resTmp.(string) fc.Result = res - return ec.marshalNAuthzScope2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScope(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_add_scope(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Response_message(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "Response", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzScope_id(ctx, field) - case "name": - return ec.fieldContext_AuthzScope_name(ctx, field) - case "description": - return ec.fieldContext_AuthzScope_description(ctx, field) - case "created_at": - return ec.fieldContext_AuthzScope_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzScope_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzScope", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_add_scope_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__authz_update_scope(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_update_scope(ctx, field) +func (ec *executionContext) _TestEndpointResponse_http_status(ctx context.Context, field graphql.CollectedField, obj *model.TestEndpointResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TestEndpointResponse_http_status(ctx, field) if err != nil { return graphql.Null } @@ -15651,61 +15264,35 @@ func (ec *executionContext) _Mutation__authz_update_scope(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzUpdateScope(rctx, fc.Args["params"].(model.UpdateScopeInput)) + return obj.HTTPStatus, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuthzScope) + res := resTmp.(*int64) fc.Result = res - return ec.marshalNAuthzScope2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScope(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_update_scope(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TestEndpointResponse_http_status(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "TestEndpointResponse", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzScope_id(ctx, field) - case "name": - return ec.fieldContext_AuthzScope_name(ctx, field) - case "description": - return ec.fieldContext_AuthzScope_description(ctx, field) - case "created_at": - return ec.fieldContext_AuthzScope_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzScope_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzScope", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_update_scope_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__authz_delete_scope(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_delete_scope(ctx, field) +func (ec *executionContext) _TestEndpointResponse_response(ctx context.Context, field graphql.CollectedField, obj *model.TestEndpointResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TestEndpointResponse_response(ctx, field) if err != nil { return graphql.Null } @@ -15718,53 +15305,35 @@ func (ec *executionContext) _Mutation__authz_delete_scope(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzDeleteScope(rctx, fc.Args["id"].(string)) + return obj.Response, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*string) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_delete_scope(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TestEndpointResponse_response(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "TestEndpointResponse", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_delete_scope_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__authz_add_policy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_add_policy(ctx, field) +func (ec *executionContext) _User_id(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_id(ctx, field) if err != nil { return graphql.Null } @@ -15777,7 +15346,7 @@ func (ec *executionContext) _Mutation__authz_add_policy(ctx context.Context, fie }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzAddPolicy(rctx, fc.Args["params"].(model.AddPolicyInput)) + return obj.ID, nil }) if err != nil { ec.Error(ctx, err) @@ -15789,57 +15358,26 @@ func (ec *executionContext) _Mutation__authz_add_policy(ctx context.Context, fie } return graphql.Null } - res := resTmp.(*model.AuthzPolicy) + res := resTmp.(string) fc.Result = res - return ec.marshalNAuthzPolicy2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicy(ctx, field.Selections, res) + return ec.marshalNID2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_add_policy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzPolicy_id(ctx, field) - case "name": - return ec.fieldContext_AuthzPolicy_name(ctx, field) - case "description": - return ec.fieldContext_AuthzPolicy_description(ctx, field) - case "type": - return ec.fieldContext_AuthzPolicy_type(ctx, field) - case "logic": - return ec.fieldContext_AuthzPolicy_logic(ctx, field) - case "decision_strategy": - return ec.fieldContext_AuthzPolicy_decision_strategy(ctx, field) - case "targets": - return ec.fieldContext_AuthzPolicy_targets(ctx, field) - case "created_at": - return ec.fieldContext_AuthzPolicy_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzPolicy_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPolicy", field.Name) + return nil, errors.New("field of type ID does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_add_policy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__authz_update_policy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_update_policy(ctx, field) +func (ec *executionContext) _User_email(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_email(ctx, field) if err != nil { return graphql.Null } @@ -15852,69 +15390,35 @@ func (ec *executionContext) _Mutation__authz_update_policy(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzUpdatePolicy(rctx, fc.Args["params"].(model.UpdatePolicyInput)) + return obj.Email, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuthzPolicy) + res := resTmp.(*string) fc.Result = res - return ec.marshalNAuthzPolicy2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicy(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_update_policy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_email(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzPolicy_id(ctx, field) - case "name": - return ec.fieldContext_AuthzPolicy_name(ctx, field) - case "description": - return ec.fieldContext_AuthzPolicy_description(ctx, field) - case "type": - return ec.fieldContext_AuthzPolicy_type(ctx, field) - case "logic": - return ec.fieldContext_AuthzPolicy_logic(ctx, field) - case "decision_strategy": - return ec.fieldContext_AuthzPolicy_decision_strategy(ctx, field) - case "targets": - return ec.fieldContext_AuthzPolicy_targets(ctx, field) - case "created_at": - return ec.fieldContext_AuthzPolicy_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzPolicy_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPolicy", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_update_policy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__authz_delete_policy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_delete_policy(ctx, field) +func (ec *executionContext) _User_email_verified(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_email_verified(ctx, field) if err != nil { return graphql.Null } @@ -15927,7 +15431,7 @@ func (ec *executionContext) _Mutation__authz_delete_policy(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzDeletePolicy(rctx, fc.Args["id"].(string)) + return obj.EmailVerified, nil }) if err != nil { ec.Error(ctx, err) @@ -15939,41 +15443,26 @@ func (ec *executionContext) _Mutation__authz_delete_policy(ctx context.Context, } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(bool) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_delete_policy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_email_verified(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, errors.New("field of type Boolean does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_delete_policy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__authz_add_permission(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_add_permission(ctx, field) +func (ec *executionContext) _User_signup_methods(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_signup_methods(ctx, field) if err != nil { return graphql.Null } @@ -15986,7 +15475,7 @@ func (ec *executionContext) _Mutation__authz_add_permission(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzAddPermission(rctx, fc.Args["params"].(model.AddPermissionInput)) + return obj.SignupMethods, nil }) if err != nil { ec.Error(ctx, err) @@ -15998,57 +15487,26 @@ func (ec *executionContext) _Mutation__authz_add_permission(ctx context.Context, } return graphql.Null } - res := resTmp.(*model.AuthzPermission) + res := resTmp.(string) fc.Result = res - return ec.marshalNAuthzPermission2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermission(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_add_permission(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_signup_methods(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzPermission_id(ctx, field) - case "name": - return ec.fieldContext_AuthzPermission_name(ctx, field) - case "description": - return ec.fieldContext_AuthzPermission_description(ctx, field) - case "resource": - return ec.fieldContext_AuthzPermission_resource(ctx, field) - case "scopes": - return ec.fieldContext_AuthzPermission_scopes(ctx, field) - case "policies": - return ec.fieldContext_AuthzPermission_policies(ctx, field) - case "decision_strategy": - return ec.fieldContext_AuthzPermission_decision_strategy(ctx, field) - case "created_at": - return ec.fieldContext_AuthzPermission_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzPermission_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPermission", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_add_permission_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__authz_update_permission(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_update_permission(ctx, field) +func (ec *executionContext) _User_given_name(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_given_name(ctx, field) if err != nil { return graphql.Null } @@ -16061,69 +15519,35 @@ func (ec *executionContext) _Mutation__authz_update_permission(ctx context.Conte }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzUpdatePermission(rctx, fc.Args["params"].(model.UpdatePermissionInput)) + return obj.GivenName, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuthzPermission) + res := resTmp.(*string) fc.Result = res - return ec.marshalNAuthzPermission2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermission(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_update_permission(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_given_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_AuthzPermission_id(ctx, field) - case "name": - return ec.fieldContext_AuthzPermission_name(ctx, field) - case "description": - return ec.fieldContext_AuthzPermission_description(ctx, field) - case "resource": - return ec.fieldContext_AuthzPermission_resource(ctx, field) - case "scopes": - return ec.fieldContext_AuthzPermission_scopes(ctx, field) - case "policies": - return ec.fieldContext_AuthzPermission_policies(ctx, field) - case "decision_strategy": - return ec.fieldContext_AuthzPermission_decision_strategy(ctx, field) - case "created_at": - return ec.fieldContext_AuthzPermission_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_AuthzPermission_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPermission", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_update_permission_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Mutation__authz_delete_permission(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation__authz_delete_permission(ctx, field) +func (ec *executionContext) _User_family_name(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_family_name(ctx, field) if err != nil { return graphql.Null } @@ -16136,53 +15560,35 @@ func (ec *executionContext) _Mutation__authz_delete_permission(ctx context.Conte }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().AuthzDeletePermission(rctx, fc.Args["id"].(string)) + return obj.FamilyName, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(*string) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation__authz_delete_permission(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_family_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Mutation", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation__authz_delete_permission_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Pagination_limit(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Pagination_limit(ctx, field) +func (ec *executionContext) _User_middle_name(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_middle_name(ctx, field) if err != nil { return graphql.Null } @@ -16195,38 +15601,35 @@ func (ec *executionContext) _Pagination_limit(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Limit, nil + return obj.MiddleName, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Pagination_limit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_middle_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Pagination", + Object: "User", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Pagination_page(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Pagination_page(ctx, field) +func (ec *executionContext) _User_nickname(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_nickname(ctx, field) if err != nil { return graphql.Null } @@ -16239,38 +15642,35 @@ func (ec *executionContext) _Pagination_page(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Page, nil + return obj.Nickname, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Pagination_page(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_nickname(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Pagination", + Object: "User", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Pagination_offset(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Pagination_offset(ctx, field) +func (ec *executionContext) _User_preferred_username(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_preferred_username(ctx, field) if err != nil { return graphql.Null } @@ -16283,38 +15683,35 @@ func (ec *executionContext) _Pagination_offset(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Offset, nil + return obj.PreferredUsername, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Pagination_offset(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_preferred_username(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Pagination", + Object: "User", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Pagination_total(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Pagination_total(ctx, field) +func (ec *executionContext) _User_gender(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_gender(ctx, field) if err != nil { return graphql.Null } @@ -16327,38 +15724,35 @@ func (ec *executionContext) _Pagination_total(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Total, nil + return obj.Gender, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalNInt642int64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Pagination_total(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_gender(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Pagination", + Object: "User", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Permission_resource(ctx context.Context, field graphql.CollectedField, obj *model.Permission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Permission_resource(ctx, field) +func (ec *executionContext) _User_birthdate(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_birthdate(ctx, field) if err != nil { return graphql.Null } @@ -16371,26 +15765,23 @@ func (ec *executionContext) _Permission_resource(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Resource, nil + return obj.Birthdate, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Permission_resource(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_birthdate(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Permission", + Object: "User", Field: field, IsMethod: false, IsResolver: false, @@ -16401,8 +15792,8 @@ func (ec *executionContext) fieldContext_Permission_resource(_ context.Context, return fc, nil } -func (ec *executionContext) _Permission_scope(ctx context.Context, field graphql.CollectedField, obj *model.Permission) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Permission_scope(ctx, field) +func (ec *executionContext) _User_phone_number(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_phone_number(ctx, field) if err != nil { return graphql.Null } @@ -16415,26 +15806,23 @@ func (ec *executionContext) _Permission_scope(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Scope, nil + return obj.PhoneNumber, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Permission_scope(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_phone_number(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Permission", + Object: "User", Field: field, IsMethod: false, IsResolver: false, @@ -16445,8 +15833,8 @@ func (ec *executionContext) fieldContext_Permission_scope(_ context.Context, fie return fc, nil } -func (ec *executionContext) _Query_meta(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query_meta(ctx, field) +func (ec *executionContext) _User_phone_number_verified(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_phone_number_verified(ctx, field) if err != nil { return graphql.Null } @@ -16459,7 +15847,7 @@ func (ec *executionContext) _Query_meta(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Meta(rctx) + return obj.PhoneNumberVerified, nil }) if err != nil { ec.Error(ctx, err) @@ -16471,68 +15859,26 @@ func (ec *executionContext) _Query_meta(ctx context.Context, field graphql.Colle } return graphql.Null } - res := resTmp.(*model.Meta) + res := resTmp.(bool) fc.Result = res - return ec.marshalNMeta2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐMeta(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query_meta(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_phone_number_verified(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "version": - return ec.fieldContext_Meta_version(ctx, field) - case "client_id": - return ec.fieldContext_Meta_client_id(ctx, field) - case "is_google_login_enabled": - return ec.fieldContext_Meta_is_google_login_enabled(ctx, field) - case "is_facebook_login_enabled": - return ec.fieldContext_Meta_is_facebook_login_enabled(ctx, field) - case "is_github_login_enabled": - return ec.fieldContext_Meta_is_github_login_enabled(ctx, field) - case "is_linkedin_login_enabled": - return ec.fieldContext_Meta_is_linkedin_login_enabled(ctx, field) - case "is_apple_login_enabled": - return ec.fieldContext_Meta_is_apple_login_enabled(ctx, field) - case "is_discord_login_enabled": - return ec.fieldContext_Meta_is_discord_login_enabled(ctx, field) - case "is_twitter_login_enabled": - return ec.fieldContext_Meta_is_twitter_login_enabled(ctx, field) - case "is_microsoft_login_enabled": - return ec.fieldContext_Meta_is_microsoft_login_enabled(ctx, field) - case "is_twitch_login_enabled": - return ec.fieldContext_Meta_is_twitch_login_enabled(ctx, field) - case "is_roblox_login_enabled": - return ec.fieldContext_Meta_is_roblox_login_enabled(ctx, field) - case "is_email_verification_enabled": - return ec.fieldContext_Meta_is_email_verification_enabled(ctx, field) - case "is_basic_authentication_enabled": - return ec.fieldContext_Meta_is_basic_authentication_enabled(ctx, field) - case "is_magic_link_login_enabled": - return ec.fieldContext_Meta_is_magic_link_login_enabled(ctx, field) - case "is_sign_up_enabled": - return ec.fieldContext_Meta_is_sign_up_enabled(ctx, field) - case "is_strong_password_enabled": - return ec.fieldContext_Meta_is_strong_password_enabled(ctx, field) - case "is_multi_factor_auth_enabled": - return ec.fieldContext_Meta_is_multi_factor_auth_enabled(ctx, field) - case "is_mobile_basic_authentication_enabled": - return ec.fieldContext_Meta_is_mobile_basic_authentication_enabled(ctx, field) - case "is_phone_verification_enabled": - return ec.fieldContext_Meta_is_phone_verification_enabled(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Meta", field.Name) + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Query_session(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query_session(ctx, field) +func (ec *executionContext) _User_picture(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_picture(ctx, field) if err != nil { return graphql.Null } @@ -16545,75 +15891,35 @@ func (ec *executionContext) _Query_session(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Session(rctx, fc.Args["params"].(*model.SessionQueryRequest)) + return obj.Picture, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuthResponse) + res := resTmp.(*string) fc.Result = res - return ec.marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthResponse(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query_session(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_picture(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_AuthResponse_message(ctx, field) - case "should_show_email_otp_screen": - return ec.fieldContext_AuthResponse_should_show_email_otp_screen(ctx, field) - case "should_show_mobile_otp_screen": - return ec.fieldContext_AuthResponse_should_show_mobile_otp_screen(ctx, field) - case "should_show_totp_screen": - return ec.fieldContext_AuthResponse_should_show_totp_screen(ctx, field) - case "access_token": - return ec.fieldContext_AuthResponse_access_token(ctx, field) - case "id_token": - return ec.fieldContext_AuthResponse_id_token(ctx, field) - case "refresh_token": - return ec.fieldContext_AuthResponse_refresh_token(ctx, field) - case "expires_in": - return ec.fieldContext_AuthResponse_expires_in(ctx, field) - case "user": - return ec.fieldContext_AuthResponse_user(ctx, field) - case "authenticator_scanner_image": - return ec.fieldContext_AuthResponse_authenticator_scanner_image(ctx, field) - case "authenticator_secret": - return ec.fieldContext_AuthResponse_authenticator_secret(ctx, field) - case "authenticator_recovery_codes": - return ec.fieldContext_AuthResponse_authenticator_recovery_codes(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthResponse", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query_session_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query_profile(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query_profile(ctx, field) +func (ec *executionContext) _User_roles(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_roles(ctx, field) if err != nil { return graphql.Null } @@ -16626,7 +15932,7 @@ func (ec *executionContext) _Query_profile(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Profile(rctx) + return obj.Roles, nil }) if err != nil { ec.Error(ctx, err) @@ -16638,68 +15944,26 @@ func (ec *executionContext) _Query_profile(ctx context.Context, field graphql.Co } return graphql.Null } - res := resTmp.(*model.User) + res := resTmp.([]string) fc.Result = res - return ec.marshalNUser2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) + return ec.marshalNString2ᚕstringᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query_profile(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_roles(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_User_id(ctx, field) - case "email": - return ec.fieldContext_User_email(ctx, field) - case "email_verified": - return ec.fieldContext_User_email_verified(ctx, field) - case "signup_methods": - return ec.fieldContext_User_signup_methods(ctx, field) - case "given_name": - return ec.fieldContext_User_given_name(ctx, field) - case "family_name": - return ec.fieldContext_User_family_name(ctx, field) - case "middle_name": - return ec.fieldContext_User_middle_name(ctx, field) - case "nickname": - return ec.fieldContext_User_nickname(ctx, field) - case "preferred_username": - return ec.fieldContext_User_preferred_username(ctx, field) - case "gender": - return ec.fieldContext_User_gender(ctx, field) - case "birthdate": - return ec.fieldContext_User_birthdate(ctx, field) - case "phone_number": - return ec.fieldContext_User_phone_number(ctx, field) - case "phone_number_verified": - return ec.fieldContext_User_phone_number_verified(ctx, field) - case "picture": - return ec.fieldContext_User_picture(ctx, field) - case "roles": - return ec.fieldContext_User_roles(ctx, field) - case "created_at": - return ec.fieldContext_User_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_User_updated_at(ctx, field) - case "revoked_timestamp": - return ec.fieldContext_User_revoked_timestamp(ctx, field) - case "is_multi_factor_auth_enabled": - return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) - case "app_data": - return ec.fieldContext_User_app_data(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Query_validate_jwt_token(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query_validate_jwt_token(ctx, field) +func (ec *executionContext) _User_created_at(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_created_at(ctx, field) if err != nil { return graphql.Null } @@ -16712,55 +15976,76 @@ func (ec *executionContext) _Query_validate_jwt_token(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().ValidateJwtToken(rctx, fc.Args["params"].(model.ValidateJWTTokenRequest)) + return obj.CreatedAt, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.ValidateJWTTokenResponse) + res := resTmp.(*int64) fc.Result = res - return ec.marshalNValidateJWTTokenResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐValidateJWTTokenResponse(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query_validate_jwt_token(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "is_valid": - return ec.fieldContext_ValidateJWTTokenResponse_is_valid(ctx, field) - case "claims": - return ec.fieldContext_ValidateJWTTokenResponse_claims(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type ValidateJWTTokenResponse", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } + return fc, nil +} + +func (ec *executionContext) _User_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_updated_at(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) defer func() { if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null } }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query_validate_jwt_token_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.UpdatedAt, nil + }) + if err != nil { ec.Error(ctx, err) - return fc, err + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int64) + fc.Result = res + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_User_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "User", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int64 does not have child fields") + }, } return fc, nil } -func (ec *executionContext) _Query_validate_session(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query_validate_session(ctx, field) +func (ec *executionContext) _User_revoked_timestamp(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_revoked_timestamp(ctx, field) if err != nil { return graphql.Null } @@ -16773,55 +16058,76 @@ func (ec *executionContext) _Query_validate_session(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().ValidateSession(rctx, fc.Args["params"].(*model.ValidateSessionRequest)) + return obj.RevokedTimestamp, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.ValidateSessionResponse) + res := resTmp.(*int64) fc.Result = res - return ec.marshalNValidateSessionResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐValidateSessionResponse(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query_validate_session(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_revoked_timestamp(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "is_valid": - return ec.fieldContext_ValidateSessionResponse_is_valid(ctx, field) - case "user": - return ec.fieldContext_ValidateSessionResponse_user(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type ValidateSessionResponse", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } + return fc, nil +} + +func (ec *executionContext) _User_is_multi_factor_auth_enabled(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) defer func() { if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null } }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query_validate_session_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsMultiFactorAuthEnabled, nil + }) + if err != nil { ec.Error(ctx, err) - return fc, err + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*bool) + fc.Result = res + return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_User_is_multi_factor_auth_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "User", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, } return fc, nil } -func (ec *executionContext) _Query__users(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__users(ctx, field) +func (ec *executionContext) _User_app_data(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_User_app_data(ctx, field) if err != nil { return graphql.Null } @@ -16834,55 +16140,89 @@ func (ec *executionContext) _Query__users(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Users(rctx, fc.Args["params"].(*model.PaginatedRequest)) + return obj.AppData, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Users) + res := resTmp.(map[string]any) fc.Result = res - return ec.marshalNUsers2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUsers(ctx, field.Selections, res) + return ec.marshalOMap2map(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__users(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_User_app_data(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "User", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_Users_pagination(ctx, field) - case "users": - return ec.fieldContext_Users_users(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Users", field.Name) + return nil, errors.New("field of type Map does not have child fields") }, } + return fc, nil +} + +func (ec *executionContext) _Users_pagination(ctx context.Context, field graphql.CollectedField, obj *model.Users) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Users_pagination(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) defer func() { if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null } }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__users_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Pagination, nil + }) + if err != nil { ec.Error(ctx, err) - return fc, err + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*model.Pagination) + fc.Result = res + return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Users_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Users", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "limit": + return ec.fieldContext_Pagination_limit(ctx, field) + case "page": + return ec.fieldContext_Pagination_page(ctx, field) + case "offset": + return ec.fieldContext_Pagination_offset(ctx, field) + case "total": + return ec.fieldContext_Pagination_total(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + }, } return fc, nil } -func (ec *executionContext) _Query__user(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__user(ctx, field) +func (ec *executionContext) _Users_users(ctx context.Context, field graphql.CollectedField, obj *model.Users) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Users_users(ctx, field) if err != nil { return graphql.Null } @@ -16895,7 +16235,7 @@ func (ec *executionContext) _Query__user(ctx context.Context, field graphql.Coll }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().User(rctx, fc.Args["params"].(model.GetUserRequest)) + return obj.Users, nil }) if err != nil { ec.Error(ctx, err) @@ -16907,17 +16247,17 @@ func (ec *executionContext) _Query__user(ctx context.Context, field graphql.Coll } return graphql.Null } - res := resTmp.(*model.User) + res := resTmp.([]*model.User) fc.Result = res - return ec.marshalNUser2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) + return ec.marshalNUser2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUserᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__user(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Users_users(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "Users", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "id": @@ -16964,22 +16304,11 @@ func (ec *executionContext) fieldContext_Query__user(ctx context.Context, field return nil, fmt.Errorf("no field named %q was found under type User", field.Name) }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__user_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query__verification_requests(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__verification_requests(ctx, field) +func (ec *executionContext) _ValidateJWTTokenResponse_is_valid(ctx context.Context, field graphql.CollectedField, obj *model.ValidateJWTTokenResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ValidateJWTTokenResponse_is_valid(ctx, field) if err != nil { return graphql.Null } @@ -16992,7 +16321,7 @@ func (ec *executionContext) _Query__verification_requests(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().VerificationRequests(rctx, fc.Args["params"].(*model.PaginatedRequest)) + return obj.IsValid, nil }) if err != nil { ec.Error(ctx, err) @@ -17004,43 +16333,26 @@ func (ec *executionContext) _Query__verification_requests(ctx context.Context, f } return graphql.Null } - res := resTmp.(*model.VerificationRequests) + res := resTmp.(bool) fc.Result = res - return ec.marshalNVerificationRequests2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐVerificationRequests(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__verification_requests(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_ValidateJWTTokenResponse_is_valid(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "ValidateJWTTokenResponse", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_VerificationRequests_pagination(ctx, field) - case "verification_requests": - return ec.fieldContext_VerificationRequests_verification_requests(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type VerificationRequests", field.Name) + return nil, errors.New("field of type Boolean does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__verification_requests_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query__admin_session(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__admin_session(ctx, field) +func (ec *executionContext) _ValidateJWTTokenResponse_claims(ctx context.Context, field graphql.CollectedField, obj *model.ValidateJWTTokenResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ValidateJWTTokenResponse_claims(ctx, field) if err != nil { return graphql.Null } @@ -17053,42 +16365,35 @@ func (ec *executionContext) _Query__admin_session(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().AdminSession(rctx) + return obj.Claims, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Response) + res := resTmp.(map[string]any) fc.Result = res - return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) + return ec.marshalOMap2map(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__admin_session(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_ValidateJWTTokenResponse_claims(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "ValidateJWTTokenResponse", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "message": - return ec.fieldContext_Response_message(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Response", field.Name) + return nil, errors.New("field of type Map does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Query__env(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__env(ctx, field) +func (ec *executionContext) _ValidateSessionResponse_is_valid(ctx context.Context, field graphql.CollectedField, obj *model.ValidateSessionResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ValidateSessionResponse_is_valid(ctx, field) if err != nil { return graphql.Null } @@ -17101,7 +16406,7 @@ func (ec *executionContext) _Query__env(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Env(rctx) + return obj.IsValid, nil }) if err != nil { ec.Error(ctx, err) @@ -17113,170 +16418,26 @@ func (ec *executionContext) _Query__env(ctx context.Context, field graphql.Colle } return graphql.Null } - res := resTmp.(*model.Env) + res := resTmp.(bool) fc.Result = res - return ec.marshalNEnv2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEnv(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__env(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_ValidateSessionResponse_is_valid(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "ValidateSessionResponse", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "ACCESS_TOKEN_EXPIRY_TIME": - return ec.fieldContext_Env_ACCESS_TOKEN_EXPIRY_TIME(ctx, field) - case "ADMIN_SECRET": - return ec.fieldContext_Env_ADMIN_SECRET(ctx, field) - case "DATABASE_NAME": - return ec.fieldContext_Env_DATABASE_NAME(ctx, field) - case "DATABASE_URL": - return ec.fieldContext_Env_DATABASE_URL(ctx, field) - case "DATABASE_TYPE": - return ec.fieldContext_Env_DATABASE_TYPE(ctx, field) - case "DATABASE_USERNAME": - return ec.fieldContext_Env_DATABASE_USERNAME(ctx, field) - case "DATABASE_PASSWORD": - return ec.fieldContext_Env_DATABASE_PASSWORD(ctx, field) - case "DATABASE_HOST": - return ec.fieldContext_Env_DATABASE_HOST(ctx, field) - case "DATABASE_PORT": - return ec.fieldContext_Env_DATABASE_PORT(ctx, field) - case "CLIENT_ID": - return ec.fieldContext_Env_CLIENT_ID(ctx, field) - case "CLIENT_SECRET": - return ec.fieldContext_Env_CLIENT_SECRET(ctx, field) - case "CUSTOM_ACCESS_TOKEN_SCRIPT": - return ec.fieldContext_Env_CUSTOM_ACCESS_TOKEN_SCRIPT(ctx, field) - case "SMTP_HOST": - return ec.fieldContext_Env_SMTP_HOST(ctx, field) - case "SMTP_PORT": - return ec.fieldContext_Env_SMTP_PORT(ctx, field) - case "SMTP_USERNAME": - return ec.fieldContext_Env_SMTP_USERNAME(ctx, field) - case "SMTP_PASSWORD": - return ec.fieldContext_Env_SMTP_PASSWORD(ctx, field) - case "SMTP_LOCAL_NAME": - return ec.fieldContext_Env_SMTP_LOCAL_NAME(ctx, field) - case "SENDER_EMAIL": - return ec.fieldContext_Env_SENDER_EMAIL(ctx, field) - case "SENDER_NAME": - return ec.fieldContext_Env_SENDER_NAME(ctx, field) - case "JWT_TYPE": - return ec.fieldContext_Env_JWT_TYPE(ctx, field) - case "JWT_SECRET": - return ec.fieldContext_Env_JWT_SECRET(ctx, field) - case "JWT_PRIVATE_KEY": - return ec.fieldContext_Env_JWT_PRIVATE_KEY(ctx, field) - case "JWT_PUBLIC_KEY": - return ec.fieldContext_Env_JWT_PUBLIC_KEY(ctx, field) - case "ALLOWED_ORIGINS": - return ec.fieldContext_Env_ALLOWED_ORIGINS(ctx, field) - case "APP_URL": - return ec.fieldContext_Env_APP_URL(ctx, field) - case "REDIS_URL": - return ec.fieldContext_Env_REDIS_URL(ctx, field) - case "RESET_PASSWORD_URL": - return ec.fieldContext_Env_RESET_PASSWORD_URL(ctx, field) - case "DISABLE_EMAIL_VERIFICATION": - return ec.fieldContext_Env_DISABLE_EMAIL_VERIFICATION(ctx, field) - case "DISABLE_BASIC_AUTHENTICATION": - return ec.fieldContext_Env_DISABLE_BASIC_AUTHENTICATION(ctx, field) - case "DISABLE_MOBILE_BASIC_AUTHENTICATION": - return ec.fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx, field) - case "DISABLE_MAGIC_LINK_LOGIN": - return ec.fieldContext_Env_DISABLE_MAGIC_LINK_LOGIN(ctx, field) - case "DISABLE_LOGIN_PAGE": - return ec.fieldContext_Env_DISABLE_LOGIN_PAGE(ctx, field) - case "DISABLE_SIGN_UP": - return ec.fieldContext_Env_DISABLE_SIGN_UP(ctx, field) - case "DISABLE_REDIS_FOR_ENV": - return ec.fieldContext_Env_DISABLE_REDIS_FOR_ENV(ctx, field) - case "DISABLE_STRONG_PASSWORD": - return ec.fieldContext_Env_DISABLE_STRONG_PASSWORD(ctx, field) - case "DISABLE_MULTI_FACTOR_AUTHENTICATION": - return ec.fieldContext_Env_DISABLE_MULTI_FACTOR_AUTHENTICATION(ctx, field) - case "ENFORCE_MULTI_FACTOR_AUTHENTICATION": - return ec.fieldContext_Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx, field) - case "ROLES": - return ec.fieldContext_Env_ROLES(ctx, field) - case "PROTECTED_ROLES": - return ec.fieldContext_Env_PROTECTED_ROLES(ctx, field) - case "DEFAULT_ROLES": - return ec.fieldContext_Env_DEFAULT_ROLES(ctx, field) - case "JWT_ROLE_CLAIM": - return ec.fieldContext_Env_JWT_ROLE_CLAIM(ctx, field) - case "GOOGLE_CLIENT_ID": - return ec.fieldContext_Env_GOOGLE_CLIENT_ID(ctx, field) - case "GOOGLE_CLIENT_SECRET": - return ec.fieldContext_Env_GOOGLE_CLIENT_SECRET(ctx, field) - case "GITHUB_CLIENT_ID": - return ec.fieldContext_Env_GITHUB_CLIENT_ID(ctx, field) - case "GITHUB_CLIENT_SECRET": - return ec.fieldContext_Env_GITHUB_CLIENT_SECRET(ctx, field) - case "FACEBOOK_CLIENT_ID": - return ec.fieldContext_Env_FACEBOOK_CLIENT_ID(ctx, field) - case "FACEBOOK_CLIENT_SECRET": - return ec.fieldContext_Env_FACEBOOK_CLIENT_SECRET(ctx, field) - case "LINKEDIN_CLIENT_ID": - return ec.fieldContext_Env_LINKEDIN_CLIENT_ID(ctx, field) - case "LINKEDIN_CLIENT_SECRET": - return ec.fieldContext_Env_LINKEDIN_CLIENT_SECRET(ctx, field) - case "APPLE_CLIENT_ID": - return ec.fieldContext_Env_APPLE_CLIENT_ID(ctx, field) - case "APPLE_CLIENT_SECRET": - return ec.fieldContext_Env_APPLE_CLIENT_SECRET(ctx, field) - case "DISCORD_CLIENT_ID": - return ec.fieldContext_Env_DISCORD_CLIENT_ID(ctx, field) - case "DISCORD_CLIENT_SECRET": - return ec.fieldContext_Env_DISCORD_CLIENT_SECRET(ctx, field) - case "TWITTER_CLIENT_ID": - return ec.fieldContext_Env_TWITTER_CLIENT_ID(ctx, field) - case "TWITTER_CLIENT_SECRET": - return ec.fieldContext_Env_TWITTER_CLIENT_SECRET(ctx, field) - case "MICROSOFT_CLIENT_ID": - return ec.fieldContext_Env_MICROSOFT_CLIENT_ID(ctx, field) - case "MICROSOFT_CLIENT_SECRET": - return ec.fieldContext_Env_MICROSOFT_CLIENT_SECRET(ctx, field) - case "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID": - return ec.fieldContext_Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(ctx, field) - case "TWITCH_CLIENT_ID": - return ec.fieldContext_Env_TWITCH_CLIENT_ID(ctx, field) - case "TWITCH_CLIENT_SECRET": - return ec.fieldContext_Env_TWITCH_CLIENT_SECRET(ctx, field) - case "ROBLOX_CLIENT_ID": - return ec.fieldContext_Env_ROBLOX_CLIENT_ID(ctx, field) - case "ROBLOX_CLIENT_SECRET": - return ec.fieldContext_Env_ROBLOX_CLIENT_SECRET(ctx, field) - case "ORGANIZATION_NAME": - return ec.fieldContext_Env_ORGANIZATION_NAME(ctx, field) - case "ORGANIZATION_LOGO": - return ec.fieldContext_Env_ORGANIZATION_LOGO(ctx, field) - case "APP_COOKIE_SECURE": - return ec.fieldContext_Env_APP_COOKIE_SECURE(ctx, field) - case "ADMIN_COOKIE_SECURE": - return ec.fieldContext_Env_ADMIN_COOKIE_SECURE(ctx, field) - case "DEFAULT_AUTHORIZE_RESPONSE_TYPE": - return ec.fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(ctx, field) - case "DEFAULT_AUTHORIZE_RESPONSE_MODE": - return ec.fieldContext_Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(ctx, field) - case "DISABLE_PLAYGROUND": - return ec.fieldContext_Env_DISABLE_PLAYGROUND(ctx, field) - case "DISABLE_MAIL_OTP_LOGIN": - return ec.fieldContext_Env_DISABLE_MAIL_OTP_LOGIN(ctx, field) - case "DISABLE_TOTP_LOGIN": - return ec.fieldContext_Env_DISABLE_TOTP_LOGIN(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Env", field.Name) + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Query__webhook(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__webhook(ctx, field) +func (ec *executionContext) _ValidateSessionResponse_user(ctx context.Context, field graphql.CollectedField, obj *model.ValidateSessionResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ValidateSessionResponse_user(ctx, field) if err != nil { return graphql.Null } @@ -17289,7 +16450,7 @@ func (ec *executionContext) _Query__webhook(ctx context.Context, field graphql.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Webhook(rctx, fc.Args["params"].(model.WebhookRequest)) + return obj.User, nil }) if err != nil { ec.Error(ctx, err) @@ -17301,55 +16462,68 @@ func (ec *executionContext) _Query__webhook(ctx context.Context, field graphql.C } return graphql.Null } - res := resTmp.(*model.Webhook) + res := resTmp.(*model.User) fc.Result = res - return ec.marshalNWebhook2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhook(ctx, field.Selections, res) + return ec.marshalNUser2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__webhook(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_ValidateSessionResponse_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "ValidateSessionResponse", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "id": - return ec.fieldContext_Webhook_id(ctx, field) - case "event_name": - return ec.fieldContext_Webhook_event_name(ctx, field) - case "event_description": - return ec.fieldContext_Webhook_event_description(ctx, field) - case "endpoint": - return ec.fieldContext_Webhook_endpoint(ctx, field) - case "enabled": - return ec.fieldContext_Webhook_enabled(ctx, field) - case "headers": - return ec.fieldContext_Webhook_headers(ctx, field) - case "created_at": - return ec.fieldContext_Webhook_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_Webhook_updated_at(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Webhook", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__webhook_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} + return ec.fieldContext_User_id(ctx, field) + case "email": + return ec.fieldContext_User_email(ctx, field) + case "email_verified": + return ec.fieldContext_User_email_verified(ctx, field) + case "signup_methods": + return ec.fieldContext_User_signup_methods(ctx, field) + case "given_name": + return ec.fieldContext_User_given_name(ctx, field) + case "family_name": + return ec.fieldContext_User_family_name(ctx, field) + case "middle_name": + return ec.fieldContext_User_middle_name(ctx, field) + case "nickname": + return ec.fieldContext_User_nickname(ctx, field) + case "preferred_username": + return ec.fieldContext_User_preferred_username(ctx, field) + case "gender": + return ec.fieldContext_User_gender(ctx, field) + case "birthdate": + return ec.fieldContext_User_birthdate(ctx, field) + case "phone_number": + return ec.fieldContext_User_phone_number(ctx, field) + case "phone_number_verified": + return ec.fieldContext_User_phone_number_verified(ctx, field) + case "picture": + return ec.fieldContext_User_picture(ctx, field) + case "roles": + return ec.fieldContext_User_roles(ctx, field) + case "created_at": + return ec.fieldContext_User_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_User_updated_at(ctx, field) + case "revoked_timestamp": + return ec.fieldContext_User_revoked_timestamp(ctx, field) + case "is_multi_factor_auth_enabled": + return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) + case "app_data": + return ec.fieldContext_User_app_data(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + }, + } + return fc, nil +} -func (ec *executionContext) _Query__webhooks(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__webhooks(ctx, field) +func (ec *executionContext) _VerificationRequest_id(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequest_id(ctx, field) if err != nil { return graphql.Null } @@ -17362,7 +16536,7 @@ func (ec *executionContext) _Query__webhooks(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Webhooks(rctx, fc.Args["params"].(*model.PaginatedRequest)) + return obj.ID, nil }) if err != nil { ec.Error(ctx, err) @@ -17374,43 +16548,26 @@ func (ec *executionContext) _Query__webhooks(ctx context.Context, field graphql. } return graphql.Null } - res := resTmp.(*model.Webhooks) + res := resTmp.(string) fc.Result = res - return ec.marshalNWebhooks2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhooks(ctx, field.Selections, res) + return ec.marshalNID2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__webhooks(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequest_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequest", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_Webhooks_pagination(ctx, field) - case "webhooks": - return ec.fieldContext_Webhooks_webhooks(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Webhooks", field.Name) + return nil, errors.New("field of type ID does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__webhooks_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query__webhook_logs(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__webhook_logs(ctx, field) +func (ec *executionContext) _VerificationRequest_identifier(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequest_identifier(ctx, field) if err != nil { return graphql.Null } @@ -17423,55 +16580,35 @@ func (ec *executionContext) _Query__webhook_logs(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().WebhookLogs(rctx, fc.Args["params"].(*model.ListWebhookLogRequest)) + return obj.Identifier, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.WebhookLogs) + res := resTmp.(*string) fc.Result = res - return ec.marshalNWebhookLogs2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookLogs(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__webhook_logs(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequest_identifier(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequest", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_WebhookLogs_pagination(ctx, field) - case "webhook_logs": - return ec.fieldContext_WebhookLogs_webhook_logs(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type WebhookLogs", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__webhook_logs_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query__email_templates(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__email_templates(ctx, field) +func (ec *executionContext) _VerificationRequest_token(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequest_token(ctx, field) if err != nil { return graphql.Null } @@ -17484,55 +16621,35 @@ func (ec *executionContext) _Query__email_templates(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().EmailTemplates(rctx, fc.Args["params"].(*model.PaginatedRequest)) + return obj.Token, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.EmailTemplates) + res := resTmp.(*string) fc.Result = res - return ec.marshalNEmailTemplates2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplates(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__email_templates(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequest_token(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequest", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_EmailTemplates_pagination(ctx, field) - case "email_templates": - return ec.fieldContext_EmailTemplates_email_templates(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type EmailTemplates", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__email_templates_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query__audit_logs(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__audit_logs(ctx, field) +func (ec *executionContext) _VerificationRequest_email(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequest_email(ctx, field) if err != nil { return graphql.Null } @@ -17545,55 +16662,35 @@ func (ec *executionContext) _Query__audit_logs(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().AuditLogs(rctx, fc.Args["params"].(*model.ListAuditLogRequest)) + return obj.Email, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuditLogs) + res := resTmp.(*string) fc.Result = res - return ec.marshalNAuditLogs2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuditLogs(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__audit_logs(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequest_email(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequest", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_AuditLogs_pagination(ctx, field) - case "audit_logs": - return ec.fieldContext_AuditLogs_audit_logs(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuditLogs", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__audit_logs_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query__authz_resources(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__authz_resources(ctx, field) +func (ec *executionContext) _VerificationRequest_expires(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequest_expires(ctx, field) if err != nil { return graphql.Null } @@ -17606,55 +16703,35 @@ func (ec *executionContext) _Query__authz_resources(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().AuthzResources(rctx, fc.Args["params"].(*model.PaginatedRequest)) + return obj.Expires, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuthzResources) + res := resTmp.(*int64) fc.Result = res - return ec.marshalNAuthzResources2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResources(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__authz_resources(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequest_expires(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequest", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_AuthzResources_pagination(ctx, field) - case "resources": - return ec.fieldContext_AuthzResources_resources(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzResources", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__authz_resources_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query__authz_scopes(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__authz_scopes(ctx, field) +func (ec *executionContext) _VerificationRequest_created_at(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequest_created_at(ctx, field) if err != nil { return graphql.Null } @@ -17667,55 +16744,35 @@ func (ec *executionContext) _Query__authz_scopes(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().AuthzScopes(rctx, fc.Args["params"].(*model.PaginatedRequest)) + return obj.CreatedAt, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuthzScopes) + res := resTmp.(*int64) fc.Result = res - return ec.marshalNAuthzScopes2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScopes(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__authz_scopes(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequest_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequest", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_AuthzScopes_pagination(ctx, field) - case "scopes": - return ec.fieldContext_AuthzScopes_scopes(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzScopes", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__authz_scopes_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query__authz_policies(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__authz_policies(ctx, field) +func (ec *executionContext) _VerificationRequest_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequest_updated_at(ctx, field) if err != nil { return graphql.Null } @@ -17728,55 +16785,35 @@ func (ec *executionContext) _Query__authz_policies(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().AuthzPolicies(rctx, fc.Args["params"].(*model.PaginatedRequest)) + return obj.UpdatedAt, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuthzPolicies) + res := resTmp.(*int64) fc.Result = res - return ec.marshalNAuthzPolicies2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicies(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__authz_policies(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequest_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequest", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_AuthzPolicies_pagination(ctx, field) - case "policies": - return ec.fieldContext_AuthzPolicies_policies(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPolicies", field.Name) + return nil, errors.New("field of type Int64 does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__authz_policies_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query__authz_permissions(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query__authz_permissions(ctx, field) +func (ec *executionContext) _VerificationRequest_nonce(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequest_nonce(ctx, field) if err != nil { return graphql.Null } @@ -17789,55 +16826,35 @@ func (ec *executionContext) _Query__authz_permissions(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().AuthzPermissions(rctx, fc.Args["params"].(*model.PaginatedRequest)) + return obj.Nonce, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.AuthzPermissions) + res := resTmp.(*string) fc.Result = res - return ec.marshalNAuthzPermissions2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermissions(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query__authz_permissions(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequest_nonce(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequest", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "pagination": - return ec.fieldContext_AuthzPermissions_pagination(ctx, field) - case "permissions": - return ec.fieldContext_AuthzPermissions_permissions(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthzPermissions", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query__authz_permissions_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query_permissions(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query_permissions(ctx, field) +func (ec *executionContext) _VerificationRequest_redirect_uri(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequest_redirect_uri(ctx, field) if err != nil { return graphql.Null } @@ -17850,44 +16867,35 @@ func (ec *executionContext) _Query_permissions(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Permissions(rctx) + return obj.RedirectURI, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.([]*model.Permission) + res := resTmp.(*string) fc.Result = res - return ec.marshalNPermission2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermissionᚄ(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query_permissions(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequest_redirect_uri(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequest", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "resource": - return ec.fieldContext_Permission_resource(ctx, field) - case "scope": - return ec.fieldContext_Permission_scope(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Permission", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query___type(ctx, field) +func (ec *executionContext) _VerificationRequests_pagination(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequests) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequests_pagination(ctx, field) if err != nil { return graphql.Null } @@ -17900,70 +16908,48 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.introspectType(fc.Args["name"].(string)) + return obj.Pagination, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*introspection.Type) + res := resTmp.(*model.Pagination) fc.Result = res - return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) + return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequests_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequests", Field: field, - IsMethod: true, + IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) + case "limit": + return ec.fieldContext_Pagination_limit(ctx, field) + case "page": + return ec.fieldContext_Pagination_page(ctx, field) + case "offset": + return ec.fieldContext_Pagination_offset(ctx, field) + case "total": + return ec.fieldContext_Pagination_total(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) }, } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query___type_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } return fc, nil } -func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query___schema(ctx, field) +func (ec *executionContext) _VerificationRequests_verification_requests(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequests) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_VerificationRequests_verification_requests(ctx, field) if err != nil { return graphql.Null } @@ -17976,49 +16962,58 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.introspectSchema() + return obj.VerificationRequests, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*introspection.Schema) + res := resTmp.([]*model.VerificationRequest) fc.Result = res - return ec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx, field.Selections, res) + return ec.marshalNVerificationRequest2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐVerificationRequestᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Query___schema(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_VerificationRequests_verification_requests(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Query", + Object: "VerificationRequests", Field: field, - IsMethod: true, + IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "description": - return ec.fieldContext___Schema_description(ctx, field) - case "types": - return ec.fieldContext___Schema_types(ctx, field) - case "queryType": - return ec.fieldContext___Schema_queryType(ctx, field) - case "mutationType": - return ec.fieldContext___Schema_mutationType(ctx, field) - case "subscriptionType": - return ec.fieldContext___Schema_subscriptionType(ctx, field) - case "directives": - return ec.fieldContext___Schema_directives(ctx, field) + case "id": + return ec.fieldContext_VerificationRequest_id(ctx, field) + case "identifier": + return ec.fieldContext_VerificationRequest_identifier(ctx, field) + case "token": + return ec.fieldContext_VerificationRequest_token(ctx, field) + case "email": + return ec.fieldContext_VerificationRequest_email(ctx, field) + case "expires": + return ec.fieldContext_VerificationRequest_expires(ctx, field) + case "created_at": + return ec.fieldContext_VerificationRequest_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_VerificationRequest_updated_at(ctx, field) + case "nonce": + return ec.fieldContext_VerificationRequest_nonce(ctx, field) + case "redirect_uri": + return ec.fieldContext_VerificationRequest_redirect_uri(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type __Schema", field.Name) + return nil, fmt.Errorf("no field named %q was found under type VerificationRequest", field.Name) }, } return fc, nil } -func (ec *executionContext) _Response_message(ctx context.Context, field graphql.CollectedField, obj *model.Response) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Response_message(ctx, field) +func (ec *executionContext) _Webhook_id(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhook_id(ctx, field) if err != nil { return graphql.Null } @@ -18031,7 +17026,7 @@ func (ec *executionContext) _Response_message(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Message, nil + return obj.ID, nil }) if err != nil { ec.Error(ctx, err) @@ -18045,24 +17040,24 @@ func (ec *executionContext) _Response_message(ctx context.Context, field graphql } res := resTmp.(string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNID2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Response_message(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhook_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Response", + Object: "Webhook", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type ID does not have child fields") }, } return fc, nil } -func (ec *executionContext) _TestEndpointResponse_http_status(ctx context.Context, field graphql.CollectedField, obj *model.TestEndpointResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_TestEndpointResponse_http_status(ctx, field) +func (ec *executionContext) _Webhook_event_name(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhook_event_name(ctx, field) if err != nil { return graphql.Null } @@ -18075,7 +17070,7 @@ func (ec *executionContext) _TestEndpointResponse_http_status(ctx context.Contex }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.HTTPStatus, nil + return obj.EventName, nil }) if err != nil { ec.Error(ctx, err) @@ -18084,26 +17079,26 @@ func (ec *executionContext) _TestEndpointResponse_http_status(ctx context.Contex if resTmp == nil { return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TestEndpointResponse_http_status(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhook_event_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TestEndpointResponse", + Object: "Webhook", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _TestEndpointResponse_response(ctx context.Context, field graphql.CollectedField, obj *model.TestEndpointResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_TestEndpointResponse_response(ctx, field) +func (ec *executionContext) _Webhook_event_description(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhook_event_description(ctx, field) if err != nil { return graphql.Null } @@ -18116,7 +17111,7 @@ func (ec *executionContext) _TestEndpointResponse_response(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Response, nil + return obj.EventDescription, nil }) if err != nil { ec.Error(ctx, err) @@ -18130,9 +17125,9 @@ func (ec *executionContext) _TestEndpointResponse_response(ctx context.Context, return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TestEndpointResponse_response(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhook_event_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TestEndpointResponse", + Object: "Webhook", Field: field, IsMethod: false, IsResolver: false, @@ -18143,8 +17138,8 @@ func (ec *executionContext) fieldContext_TestEndpointResponse_response(_ context return fc, nil } -func (ec *executionContext) _User_id(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_id(ctx, field) +func (ec *executionContext) _Webhook_endpoint(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhook_endpoint(ctx, field) if err != nil { return graphql.Null } @@ -18157,38 +17152,35 @@ func (ec *executionContext) _User_id(ctx context.Context, field graphql.Collecte }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ID, nil + return obj.Endpoint, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhook_endpoint(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "Webhook", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_email(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_email(ctx, field) +func (ec *executionContext) _Webhook_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhook_enabled(ctx, field) if err != nil { return graphql.Null } @@ -18201,7 +17193,7 @@ func (ec *executionContext) _User_email(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Email, nil + return obj.Enabled, nil }) if err != nil { ec.Error(ctx, err) @@ -18210,26 +17202,26 @@ func (ec *executionContext) _User_email(ctx context.Context, field graphql.Colle if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_email(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhook_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "Webhook", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_email_verified(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_email_verified(ctx, field) +func (ec *executionContext) _Webhook_headers(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhook_headers(ctx, field) if err != nil { return graphql.Null } @@ -18242,38 +17234,35 @@ func (ec *executionContext) _User_email_verified(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.EmailVerified, nil + return obj.Headers, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(map[string]any) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalOMap2map(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_email_verified(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhook_headers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "Webhook", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + return nil, errors.New("field of type Map does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_signup_methods(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_signup_methods(ctx, field) +func (ec *executionContext) _Webhook_created_at(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhook_created_at(ctx, field) if err != nil { return graphql.Null } @@ -18286,38 +17275,35 @@ func (ec *executionContext) _User_signup_methods(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.SignupMethods, nil + return obj.CreatedAt, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*int64) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_signup_methods(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhook_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "Webhook", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Int64 does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_given_name(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_given_name(ctx, field) +func (ec *executionContext) _Webhook_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhook_updated_at(ctx, field) if err != nil { return graphql.Null } @@ -18330,7 +17316,7 @@ func (ec *executionContext) _User_given_name(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.GivenName, nil + return obj.UpdatedAt, nil }) if err != nil { ec.Error(ctx, err) @@ -18339,26 +17325,26 @@ func (ec *executionContext) _User_given_name(ctx context.Context, field graphql. if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*int64) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_given_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhook_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "Webhook", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Int64 does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_family_name(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_family_name(ctx, field) +func (ec *executionContext) _WebhookLog_id(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_WebhookLog_id(ctx, field) if err != nil { return graphql.Null } @@ -18371,35 +17357,38 @@ func (ec *executionContext) _User_family_name(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.FamilyName, nil + return obj.ID, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNID2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_family_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_WebhookLog_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "WebhookLog", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type ID does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_middle_name(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_middle_name(ctx, field) +func (ec *executionContext) _WebhookLog_http_status(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_WebhookLog_http_status(ctx, field) if err != nil { return graphql.Null } @@ -18412,7 +17401,7 @@ func (ec *executionContext) _User_middle_name(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.MiddleName, nil + return obj.HTTPStatus, nil }) if err != nil { ec.Error(ctx, err) @@ -18421,26 +17410,26 @@ func (ec *executionContext) _User_middle_name(ctx context.Context, field graphql if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*int64) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_middle_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_WebhookLog_http_status(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "WebhookLog", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Int64 does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_nickname(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_nickname(ctx, field) +func (ec *executionContext) _WebhookLog_response(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_WebhookLog_response(ctx, field) if err != nil { return graphql.Null } @@ -18453,7 +17442,7 @@ func (ec *executionContext) _User_nickname(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Nickname, nil + return obj.Response, nil }) if err != nil { ec.Error(ctx, err) @@ -18467,9 +17456,9 @@ func (ec *executionContext) _User_nickname(ctx context.Context, field graphql.Co return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_nickname(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_WebhookLog_response(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "WebhookLog", Field: field, IsMethod: false, IsResolver: false, @@ -18480,8 +17469,8 @@ func (ec *executionContext) fieldContext_User_nickname(_ context.Context, field return fc, nil } -func (ec *executionContext) _User_preferred_username(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_preferred_username(ctx, field) +func (ec *executionContext) _WebhookLog_request(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_WebhookLog_request(ctx, field) if err != nil { return graphql.Null } @@ -18494,7 +17483,7 @@ func (ec *executionContext) _User_preferred_username(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.PreferredUsername, nil + return obj.Request, nil }) if err != nil { ec.Error(ctx, err) @@ -18508,9 +17497,9 @@ func (ec *executionContext) _User_preferred_username(ctx context.Context, field return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_preferred_username(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_WebhookLog_request(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "WebhookLog", Field: field, IsMethod: false, IsResolver: false, @@ -18521,8 +17510,8 @@ func (ec *executionContext) fieldContext_User_preferred_username(_ context.Conte return fc, nil } -func (ec *executionContext) _User_gender(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_gender(ctx, field) +func (ec *executionContext) _WebhookLog_webhook_id(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_WebhookLog_webhook_id(ctx, field) if err != nil { return graphql.Null } @@ -18535,7 +17524,7 @@ func (ec *executionContext) _User_gender(ctx context.Context, field graphql.Coll }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Gender, nil + return obj.WebhookID, nil }) if err != nil { ec.Error(ctx, err) @@ -18546,24 +17535,24 @@ func (ec *executionContext) _User_gender(ctx context.Context, field graphql.Coll } res := resTmp.(*string) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalOID2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_gender(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_WebhookLog_webhook_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "WebhookLog", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type ID does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_birthdate(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_birthdate(ctx, field) +func (ec *executionContext) _WebhookLog_created_at(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_WebhookLog_created_at(ctx, field) if err != nil { return graphql.Null } @@ -18576,7 +17565,7 @@ func (ec *executionContext) _User_birthdate(ctx context.Context, field graphql.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Birthdate, nil + return obj.CreatedAt, nil }) if err != nil { ec.Error(ctx, err) @@ -18585,26 +17574,26 @@ func (ec *executionContext) _User_birthdate(ctx context.Context, field graphql.C if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*int64) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_birthdate(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_WebhookLog_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "WebhookLog", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Int64 does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_phone_number(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_phone_number(ctx, field) +func (ec *executionContext) _WebhookLog_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_WebhookLog_updated_at(ctx, field) if err != nil { return graphql.Null } @@ -18617,7 +17606,7 @@ func (ec *executionContext) _User_phone_number(ctx context.Context, field graphq }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.PhoneNumber, nil + return obj.UpdatedAt, nil }) if err != nil { ec.Error(ctx, err) @@ -18626,26 +17615,26 @@ func (ec *executionContext) _User_phone_number(ctx context.Context, field graphq if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*int64) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_phone_number(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_WebhookLog_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "WebhookLog", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Int64 does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_phone_number_verified(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_phone_number_verified(ctx, field) +func (ec *executionContext) _WebhookLogs_pagination(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLogs) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_WebhookLogs_pagination(ctx, field) if err != nil { return graphql.Null } @@ -18658,7 +17647,7 @@ func (ec *executionContext) _User_phone_number_verified(ctx context.Context, fie }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.PhoneNumberVerified, nil + return obj.Pagination, nil }) if err != nil { ec.Error(ctx, err) @@ -18670,26 +17659,36 @@ func (ec *executionContext) _User_phone_number_verified(ctx context.Context, fie } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*model.Pagination) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_phone_number_verified(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_WebhookLogs_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "WebhookLogs", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "limit": + return ec.fieldContext_Pagination_limit(ctx, field) + case "page": + return ec.fieldContext_Pagination_page(ctx, field) + case "offset": + return ec.fieldContext_Pagination_offset(ctx, field) + case "total": + return ec.fieldContext_Pagination_total(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) }, } return fc, nil } -func (ec *executionContext) _User_picture(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_picture(ctx, field) +func (ec *executionContext) _WebhookLogs_webhook_logs(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLogs) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_WebhookLogs_webhook_logs(ctx, field) if err != nil { return graphql.Null } @@ -18702,35 +17701,54 @@ func (ec *executionContext) _User_picture(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Picture, nil + return obj.WebhookLogs, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.([]*model.WebhookLog) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNWebhookLog2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookLogᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_picture(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_WebhookLogs_webhook_logs(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "WebhookLogs", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "id": + return ec.fieldContext_WebhookLog_id(ctx, field) + case "http_status": + return ec.fieldContext_WebhookLog_http_status(ctx, field) + case "response": + return ec.fieldContext_WebhookLog_response(ctx, field) + case "request": + return ec.fieldContext_WebhookLog_request(ctx, field) + case "webhook_id": + return ec.fieldContext_WebhookLog_webhook_id(ctx, field) + case "created_at": + return ec.fieldContext_WebhookLog_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_WebhookLog_updated_at(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type WebhookLog", field.Name) }, } return fc, nil } -func (ec *executionContext) _User_roles(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_roles(ctx, field) +func (ec *executionContext) _Webhooks_pagination(ctx context.Context, field graphql.CollectedField, obj *model.Webhooks) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhooks_pagination(ctx, field) if err != nil { return graphql.Null } @@ -18743,7 +17761,7 @@ func (ec *executionContext) _User_roles(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Roles, nil + return obj.Pagination, nil }) if err != nil { ec.Error(ctx, err) @@ -18755,26 +17773,36 @@ func (ec *executionContext) _User_roles(ctx context.Context, field graphql.Colle } return graphql.Null } - res := resTmp.([]string) + res := resTmp.(*model.Pagination) fc.Result = res - return ec.marshalNString2ᚕstringᚄ(ctx, field.Selections, res) + return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_roles(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhooks_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "Webhooks", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "limit": + return ec.fieldContext_Pagination_limit(ctx, field) + case "page": + return ec.fieldContext_Pagination_page(ctx, field) + case "offset": + return ec.fieldContext_Pagination_offset(ctx, field) + case "total": + return ec.fieldContext_Pagination_total(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) }, } return fc, nil } -func (ec *executionContext) _User_created_at(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_created_at(ctx, field) +func (ec *executionContext) _Webhooks_webhooks(ctx context.Context, field graphql.CollectedField, obj *model.Webhooks) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Webhooks_webhooks(ctx, field) if err != nil { return graphql.Null } @@ -18787,35 +17815,56 @@ func (ec *executionContext) _User_created_at(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CreatedAt, nil + return obj.Webhooks, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*int64) + res := resTmp.([]*model.Webhook) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalNWebhook2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Webhooks_webhooks(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "Webhooks", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + switch field.Name { + case "id": + return ec.fieldContext_Webhook_id(ctx, field) + case "event_name": + return ec.fieldContext_Webhook_event_name(ctx, field) + case "event_description": + return ec.fieldContext_Webhook_event_description(ctx, field) + case "endpoint": + return ec.fieldContext_Webhook_endpoint(ctx, field) + case "enabled": + return ec.fieldContext_Webhook_enabled(ctx, field) + case "headers": + return ec.fieldContext_Webhook_headers(ctx, field) + case "created_at": + return ec.fieldContext_Webhook_created_at(ctx, field) + case "updated_at": + return ec.fieldContext_Webhook_updated_at(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Webhook", field.Name) }, } return fc, nil } -func (ec *executionContext) _User_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_updated_at(ctx, field) +func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_name(ctx, field) if err != nil { return graphql.Null } @@ -18828,35 +17877,38 @@ func (ec *executionContext) _User_updated_at(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.UpdatedAt, nil + return obj.Name, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(string) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Directive_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "__Directive", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_revoked_timestamp(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_revoked_timestamp(ctx, field) +func (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_description(ctx, field) if err != nil { return graphql.Null } @@ -18869,7 +17921,7 @@ func (ec *executionContext) _User_revoked_timestamp(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.RevokedTimestamp, nil + return obj.Description(), nil }) if err != nil { ec.Error(ctx, err) @@ -18878,26 +17930,26 @@ func (ec *executionContext) _User_revoked_timestamp(ctx context.Context, field g if resTmp == nil { return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_revoked_timestamp(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Directive_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "__Directive", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _User_is_multi_factor_auth_enabled(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) +func (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_isRepeatable(ctx, field) if err != nil { return graphql.Null } @@ -18910,23 +17962,26 @@ func (ec *executionContext) _User_is_multi_factor_auth_enabled(ctx context.Conte }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsMultiFactorAuthEnabled, nil + return obj.IsRepeatable, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*bool) + res := resTmp.(bool) fc.Result = res - return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_is_multi_factor_auth_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Directive_isRepeatable(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "__Directive", Field: field, IsMethod: false, IsResolver: false, @@ -18937,8 +17992,8 @@ func (ec *executionContext) fieldContext_User_is_multi_factor_auth_enabled(_ con return fc, nil } -func (ec *executionContext) _User_app_data(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_User_app_data(ctx, field) +func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_locations(ctx, field) if err != nil { return graphql.Null } @@ -18951,35 +18006,38 @@ func (ec *executionContext) _User_app_data(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.AppData, nil + return obj.Locations, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(map[string]any) + res := resTmp.([]string) fc.Result = res - return ec.marshalOMap2map(ctx, field.Selections, res) + return ec.marshalN__DirectiveLocation2ᚕstringᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_User_app_data(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Directive_locations(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "User", + Object: "__Directive", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Map does not have child fields") + return nil, errors.New("field of type __DirectiveLocation does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Users_pagination(ctx context.Context, field graphql.CollectedField, obj *model.Users) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Users_pagination(ctx, field) +func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_args(ctx, field) if err != nil { return graphql.Null } @@ -18992,7 +18050,7 @@ func (ec *executionContext) _Users_pagination(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Pagination, nil + return obj.Args, nil }) if err != nil { ec.Error(ctx, err) @@ -19004,36 +18062,51 @@ func (ec *executionContext) _Users_pagination(ctx context.Context, field graphql } return graphql.Null } - res := resTmp.(*model.Pagination) + res := resTmp.([]introspection.InputValue) fc.Result = res - return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Users_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Directive_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Users", + Object: "__Directive", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "limit": - return ec.fieldContext_Pagination_limit(ctx, field) - case "page": - return ec.fieldContext_Pagination_page(ctx, field) - case "offset": - return ec.fieldContext_Pagination_offset(ctx, field) - case "total": - return ec.fieldContext_Pagination_total(ctx, field) + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Directive_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _Users_users(ctx context.Context, field graphql.CollectedField, obj *model.Users) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Users_users(ctx, field) +func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_name(ctx, field) if err != nil { return graphql.Null } @@ -19046,7 +18119,7 @@ func (ec *executionContext) _Users_users(ctx context.Context, field graphql.Coll }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Users, nil + return obj.Name, nil }) if err != nil { ec.Error(ctx, err) @@ -19058,68 +18131,26 @@ func (ec *executionContext) _Users_users(ctx context.Context, field graphql.Coll } return graphql.Null } - res := resTmp.([]*model.User) + res := resTmp.(string) fc.Result = res - return ec.marshalNUser2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUserᚄ(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Users_users(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___EnumValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Users", + Object: "__EnumValue", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_User_id(ctx, field) - case "email": - return ec.fieldContext_User_email(ctx, field) - case "email_verified": - return ec.fieldContext_User_email_verified(ctx, field) - case "signup_methods": - return ec.fieldContext_User_signup_methods(ctx, field) - case "given_name": - return ec.fieldContext_User_given_name(ctx, field) - case "family_name": - return ec.fieldContext_User_family_name(ctx, field) - case "middle_name": - return ec.fieldContext_User_middle_name(ctx, field) - case "nickname": - return ec.fieldContext_User_nickname(ctx, field) - case "preferred_username": - return ec.fieldContext_User_preferred_username(ctx, field) - case "gender": - return ec.fieldContext_User_gender(ctx, field) - case "birthdate": - return ec.fieldContext_User_birthdate(ctx, field) - case "phone_number": - return ec.fieldContext_User_phone_number(ctx, field) - case "phone_number_verified": - return ec.fieldContext_User_phone_number_verified(ctx, field) - case "picture": - return ec.fieldContext_User_picture(ctx, field) - case "roles": - return ec.fieldContext_User_roles(ctx, field) - case "created_at": - return ec.fieldContext_User_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_User_updated_at(ctx, field) - case "revoked_timestamp": - return ec.fieldContext_User_revoked_timestamp(ctx, field) - case "is_multi_factor_auth_enabled": - return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) - case "app_data": - return ec.fieldContext_User_app_data(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _ValidateJWTTokenResponse_is_valid(ctx context.Context, field graphql.CollectedField, obj *model.ValidateJWTTokenResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_ValidateJWTTokenResponse_is_valid(ctx, field) +func (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_description(ctx, field) if err != nil { return graphql.Null } @@ -19132,38 +18163,35 @@ func (ec *executionContext) _ValidateJWTTokenResponse_is_valid(ctx context.Conte }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsValid, nil + return obj.Description(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*string) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_ValidateJWTTokenResponse_is_valid(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___EnumValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "ValidateJWTTokenResponse", + Object: "__EnumValue", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _ValidateJWTTokenResponse_claims(ctx context.Context, field graphql.CollectedField, obj *model.ValidateJWTTokenResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_ValidateJWTTokenResponse_claims(ctx, field) +func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_isDeprecated(ctx, field) if err != nil { return graphql.Null } @@ -19176,35 +18204,38 @@ func (ec *executionContext) _ValidateJWTTokenResponse_claims(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Claims, nil + return obj.IsDeprecated(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(map[string]any) + res := resTmp.(bool) fc.Result = res - return ec.marshalOMap2map(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_ValidateJWTTokenResponse_claims(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___EnumValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "ValidateJWTTokenResponse", + Object: "__EnumValue", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Map does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _ValidateSessionResponse_is_valid(ctx context.Context, field graphql.CollectedField, obj *model.ValidateSessionResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_ValidateSessionResponse_is_valid(ctx, field) +func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_deprecationReason(ctx, field) if err != nil { return graphql.Null } @@ -19217,38 +18248,35 @@ func (ec *executionContext) _ValidateSessionResponse_is_valid(ctx context.Contex }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.IsValid, nil + return obj.DeprecationReason(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(bool) + res := resTmp.(*string) fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_ValidateSessionResponse_is_valid(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___EnumValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "ValidateSessionResponse", + Object: "__EnumValue", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _ValidateSessionResponse_user(ctx context.Context, field graphql.CollectedField, obj *model.ValidateSessionResponse) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_ValidateSessionResponse_user(ctx, field) +func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_name(ctx, field) if err != nil { return graphql.Null } @@ -19261,7 +18289,7 @@ func (ec *executionContext) _ValidateSessionResponse_user(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.User, nil + return obj.Name, nil }) if err != nil { ec.Error(ctx, err) @@ -19273,68 +18301,26 @@ func (ec *executionContext) _ValidateSessionResponse_user(ctx context.Context, f } return graphql.Null } - res := resTmp.(*model.User) + res := resTmp.(string) fc.Result = res - return ec.marshalNUser2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_ValidateSessionResponse_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Field_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "ValidateSessionResponse", + Object: "__Field", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_User_id(ctx, field) - case "email": - return ec.fieldContext_User_email(ctx, field) - case "email_verified": - return ec.fieldContext_User_email_verified(ctx, field) - case "signup_methods": - return ec.fieldContext_User_signup_methods(ctx, field) - case "given_name": - return ec.fieldContext_User_given_name(ctx, field) - case "family_name": - return ec.fieldContext_User_family_name(ctx, field) - case "middle_name": - return ec.fieldContext_User_middle_name(ctx, field) - case "nickname": - return ec.fieldContext_User_nickname(ctx, field) - case "preferred_username": - return ec.fieldContext_User_preferred_username(ctx, field) - case "gender": - return ec.fieldContext_User_gender(ctx, field) - case "birthdate": - return ec.fieldContext_User_birthdate(ctx, field) - case "phone_number": - return ec.fieldContext_User_phone_number(ctx, field) - case "phone_number_verified": - return ec.fieldContext_User_phone_number_verified(ctx, field) - case "picture": - return ec.fieldContext_User_picture(ctx, field) - case "roles": - return ec.fieldContext_User_roles(ctx, field) - case "created_at": - return ec.fieldContext_User_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_User_updated_at(ctx, field) - case "revoked_timestamp": - return ec.fieldContext_User_revoked_timestamp(ctx, field) - case "is_multi_factor_auth_enabled": - return ec.fieldContext_User_is_multi_factor_auth_enabled(ctx, field) - case "app_data": - return ec.fieldContext_User_app_data(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _VerificationRequest_id(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequest_id(ctx, field) +func (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_description(ctx, field) if err != nil { return graphql.Null } @@ -19347,38 +18333,35 @@ func (ec *executionContext) _VerificationRequest_id(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ID, nil + return obj.Description(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequest_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Field_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequest", + Object: "__Field", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _VerificationRequest_identifier(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequest_identifier(ctx, field) +func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_args(ctx, field) if err != nil { return graphql.Null } @@ -19391,35 +18374,63 @@ func (ec *executionContext) _VerificationRequest_identifier(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Identifier, nil + return obj.Args, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.([]introspection.InputValue) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequest_identifier(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Field_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequest", + Object: "__Field", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Field_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _VerificationRequest_token(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequest_token(ctx, field) +func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_type(ctx, field) if err != nil { return graphql.Null } @@ -19432,35 +18443,62 @@ func (ec *executionContext) _VerificationRequest_token(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Token, nil + return obj.Type, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*introspection.Type) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequest_token(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Field_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequest", + Object: "__Field", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } return fc, nil } -func (ec *executionContext) _VerificationRequest_email(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequest_email(ctx, field) +func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_isDeprecated(ctx, field) if err != nil { return graphql.Null } @@ -19473,35 +18511,38 @@ func (ec *executionContext) _VerificationRequest_email(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Email, nil + return obj.IsDeprecated(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(bool) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequest_email(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Field_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequest", + Object: "__Field", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _VerificationRequest_expires(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequest_expires(ctx, field) +func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_deprecationReason(ctx, field) if err != nil { return graphql.Null } @@ -19514,7 +18555,7 @@ func (ec *executionContext) _VerificationRequest_expires(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Expires, nil + return obj.DeprecationReason(), nil }) if err != nil { ec.Error(ctx, err) @@ -19523,26 +18564,26 @@ func (ec *executionContext) _VerificationRequest_expires(ctx context.Context, fi if resTmp == nil { return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequest_expires(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Field_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequest", + Object: "__Field", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _VerificationRequest_created_at(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequest_created_at(ctx, field) +func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_name(ctx, field) if err != nil { return graphql.Null } @@ -19555,35 +18596,38 @@ func (ec *executionContext) _VerificationRequest_created_at(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CreatedAt, nil + return obj.Name, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(string) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequest_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___InputValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequest", + Object: "__InputValue", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _VerificationRequest_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequest_updated_at(ctx, field) +func (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_description(ctx, field) if err != nil { return graphql.Null } @@ -19596,7 +18640,7 @@ func (ec *executionContext) _VerificationRequest_updated_at(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.UpdatedAt, nil + return obj.Description(), nil }) if err != nil { ec.Error(ctx, err) @@ -19605,26 +18649,26 @@ func (ec *executionContext) _VerificationRequest_updated_at(ctx context.Context, if resTmp == nil { return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequest_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___InputValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequest", + Object: "__InputValue", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _VerificationRequest_nonce(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequest_nonce(ctx, field) +func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_type(ctx, field) if err != nil { return graphql.Null } @@ -19637,35 +18681,62 @@ func (ec *executionContext) _VerificationRequest_nonce(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Nonce, nil + return obj.Type, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*introspection.Type) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequest_nonce(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___InputValue_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequest", + Object: "__InputValue", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } return fc, nil } -func (ec *executionContext) _VerificationRequest_redirect_uri(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequest_redirect_uri(ctx, field) +func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_defaultValue(ctx, field) if err != nil { return graphql.Null } @@ -19678,7 +18749,7 @@ func (ec *executionContext) _VerificationRequest_redirect_uri(ctx context.Contex }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.RedirectURI, nil + return obj.DefaultValue, nil }) if err != nil { ec.Error(ctx, err) @@ -19692,9 +18763,9 @@ func (ec *executionContext) _VerificationRequest_redirect_uri(ctx context.Contex return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequest_redirect_uri(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___InputValue_defaultValue(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequest", + Object: "__InputValue", Field: field, IsMethod: false, IsResolver: false, @@ -19705,8 +18776,8 @@ func (ec *executionContext) fieldContext_VerificationRequest_redirect_uri(_ cont return fc, nil } -func (ec *executionContext) _VerificationRequests_pagination(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequests) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequests_pagination(ctx, field) +func (ec *executionContext) ___InputValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_isDeprecated(ctx, field) if err != nil { return graphql.Null } @@ -19719,7 +18790,7 @@ func (ec *executionContext) _VerificationRequests_pagination(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Pagination, nil + return obj.IsDeprecated(), nil }) if err != nil { ec.Error(ctx, err) @@ -19731,36 +18802,26 @@ func (ec *executionContext) _VerificationRequests_pagination(ctx context.Context } return graphql.Null } - res := resTmp.(*model.Pagination) + res := resTmp.(bool) fc.Result = res - return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) + return ec.marshalNBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequests_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___InputValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequests", + Object: "__InputValue", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "limit": - return ec.fieldContext_Pagination_limit(ctx, field) - case "page": - return ec.fieldContext_Pagination_page(ctx, field) - case "offset": - return ec.fieldContext_Pagination_offset(ctx, field) - case "total": - return ec.fieldContext_Pagination_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _VerificationRequests_verification_requests(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequests) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_VerificationRequests_verification_requests(ctx, field) +func (ec *executionContext) ___InputValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_deprecationReason(ctx, field) if err != nil { return graphql.Null } @@ -19773,58 +18834,35 @@ func (ec *executionContext) _VerificationRequests_verification_requests(ctx cont }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.VerificationRequests, nil + return obj.DeprecationReason(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.([]*model.VerificationRequest) + res := resTmp.(*string) fc.Result = res - return ec.marshalNVerificationRequest2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐVerificationRequestᚄ(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_VerificationRequests_verification_requests(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___InputValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "VerificationRequests", + Object: "__InputValue", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_VerificationRequest_id(ctx, field) - case "identifier": - return ec.fieldContext_VerificationRequest_identifier(ctx, field) - case "token": - return ec.fieldContext_VerificationRequest_token(ctx, field) - case "email": - return ec.fieldContext_VerificationRequest_email(ctx, field) - case "expires": - return ec.fieldContext_VerificationRequest_expires(ctx, field) - case "created_at": - return ec.fieldContext_VerificationRequest_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_VerificationRequest_updated_at(ctx, field) - case "nonce": - return ec.fieldContext_VerificationRequest_nonce(ctx, field) - case "redirect_uri": - return ec.fieldContext_VerificationRequest_redirect_uri(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type VerificationRequest", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Webhook_id(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhook_id(ctx, field) +func (ec *executionContext) ___Schema_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_description(ctx, field) if err != nil { return graphql.Null } @@ -19837,38 +18875,35 @@ func (ec *executionContext) _Webhook_id(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ID, nil + return obj.Description(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Webhook_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Schema_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Webhook", + Object: "__Schema", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Webhook_event_name(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhook_event_name(ctx, field) +func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_types(ctx, field) if err != nil { return graphql.Null } @@ -19881,35 +18916,62 @@ func (ec *executionContext) _Webhook_event_name(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.EventName, nil + return obj.Types(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.([]introspection.Type) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Webhook_event_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Schema_types(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Webhook", + Object: "__Schema", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } return fc, nil } -func (ec *executionContext) _Webhook_event_description(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhook_event_description(ctx, field) +func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_queryType(ctx, field) if err != nil { return graphql.Null } @@ -19922,35 +18984,62 @@ func (ec *executionContext) _Webhook_event_description(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.EventDescription, nil + return obj.QueryType(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*introspection.Type) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Webhook_event_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Schema_queryType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Webhook", + Object: "__Schema", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } return fc, nil } -func (ec *executionContext) _Webhook_endpoint(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhook_endpoint(ctx, field) +func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_mutationType(ctx, field) if err != nil { return graphql.Null } @@ -19963,7 +19052,7 @@ func (ec *executionContext) _Webhook_endpoint(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Endpoint, nil + return obj.MutationType(), nil }) if err != nil { ec.Error(ctx, err) @@ -19972,26 +19061,50 @@ func (ec *executionContext) _Webhook_endpoint(ctx context.Context, field graphql if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.(*introspection.Type) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Webhook_endpoint(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Schema_mutationType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Webhook", + Object: "__Schema", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } return fc, nil } -func (ec *executionContext) _Webhook_enabled(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhook_enabled(ctx, field) +func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_subscriptionType(ctx, field) if err != nil { return graphql.Null } @@ -20004,7 +19117,7 @@ func (ec *executionContext) _Webhook_enabled(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Enabled, nil + return obj.SubscriptionType(), nil }) if err != nil { ec.Error(ctx, err) @@ -20013,26 +19126,50 @@ func (ec *executionContext) _Webhook_enabled(ctx context.Context, field graphql. if resTmp == nil { return graphql.Null } - res := resTmp.(*bool) + res := resTmp.(*introspection.Type) fc.Result = res - return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Webhook_enabled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Schema_subscriptionType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Webhook", + Object: "__Schema", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } return fc, nil } -func (ec *executionContext) _Webhook_headers(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhook_headers(ctx, field) +func (ec *executionContext) ___Schema_directives(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_directives(ctx, field) if err != nil { return graphql.Null } @@ -20045,35 +19182,50 @@ func (ec *executionContext) _Webhook_headers(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Headers, nil + return obj.Directives(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(map[string]any) + res := resTmp.([]introspection.Directive) fc.Result = res - return ec.marshalOMap2map(ctx, field.Selections, res) + return ec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Webhook_headers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Schema_directives(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Webhook", + Object: "__Schema", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Map does not have child fields") + switch field.Name { + case "name": + return ec.fieldContext___Directive_name(ctx, field) + case "description": + return ec.fieldContext___Directive_description(ctx, field) + case "isRepeatable": + return ec.fieldContext___Directive_isRepeatable(ctx, field) + case "locations": + return ec.fieldContext___Directive_locations(ctx, field) + case "args": + return ec.fieldContext___Directive_args(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Directive", field.Name) }, } return fc, nil } -func (ec *executionContext) _Webhook_created_at(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhook_created_at(ctx, field) +func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_kind(ctx, field) if err != nil { return graphql.Null } @@ -20086,35 +19238,38 @@ func (ec *executionContext) _Webhook_created_at(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CreatedAt, nil + return obj.Kind(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(string) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalN__TypeKind2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Webhook_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_kind(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Webhook", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type __TypeKind does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Webhook_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.Webhook) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhook_updated_at(ctx, field) +func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_name(ctx, field) if err != nil { return graphql.Null } @@ -20127,7 +19282,7 @@ func (ec *executionContext) _Webhook_updated_at(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.UpdatedAt, nil + return obj.Name(), nil }) if err != nil { ec.Error(ctx, err) @@ -20136,26 +19291,26 @@ func (ec *executionContext) _Webhook_updated_at(ctx context.Context, field graph if resTmp == nil { return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Webhook_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Webhook", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _WebhookLog_id(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_WebhookLog_id(ctx, field) +func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_description(ctx, field) if err != nil { return graphql.Null } @@ -20168,38 +19323,35 @@ func (ec *executionContext) _WebhookLog_id(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ID, nil + return obj.Description(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_WebhookLog_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "WebhookLog", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _WebhookLog_http_status(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_WebhookLog_http_status(ctx, field) +func (ec *executionContext) ___Type_specifiedByURL(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_specifiedByURL(ctx, field) if err != nil { return graphql.Null } @@ -20212,7 +19364,7 @@ func (ec *executionContext) _WebhookLog_http_status(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.HTTPStatus, nil + return obj.SpecifiedByURL(), nil }) if err != nil { ec.Error(ctx, err) @@ -20221,26 +19373,26 @@ func (ec *executionContext) _WebhookLog_http_status(ctx context.Context, field g if resTmp == nil { return graphql.Null } - res := resTmp.(*int64) + res := resTmp.(*string) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_WebhookLog_http_status(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_specifiedByURL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "WebhookLog", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _WebhookLog_response(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_WebhookLog_response(ctx, field) +func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_fields(ctx, field) if err != nil { return graphql.Null } @@ -20253,7 +19405,7 @@ func (ec *executionContext) _WebhookLog_response(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Response, nil + return obj.Fields(fc.Args["includeDeprecated"].(bool)), nil }) if err != nil { ec.Error(ctx, err) @@ -20262,26 +19414,51 @@ func (ec *executionContext) _WebhookLog_response(ctx context.Context, field grap if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.([]introspection.Field) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_WebhookLog_response(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "WebhookLog", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "name": + return ec.fieldContext___Field_name(ctx, field) + case "description": + return ec.fieldContext___Field_description(ctx, field) + case "args": + return ec.fieldContext___Field_args(ctx, field) + case "type": + return ec.fieldContext___Field_type(ctx, field) + case "isDeprecated": + return ec.fieldContext___Field_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___Field_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Field", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Type_fields_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _WebhookLog_request(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_WebhookLog_request(ctx, field) +func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_interfaces(ctx, field) if err != nil { return graphql.Null } @@ -20294,7 +19471,7 @@ func (ec *executionContext) _WebhookLog_request(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Request, nil + return obj.Interfaces(), nil }) if err != nil { ec.Error(ctx, err) @@ -20303,67 +19480,50 @@ func (ec *executionContext) _WebhookLog_request(ctx context.Context, field graph if resTmp == nil { return graphql.Null } - res := resTmp.(*string) + res := resTmp.([]introspection.Type) fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_WebhookLog_request(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_interfaces(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "WebhookLog", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) _WebhookLog_webhook_id(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_WebhookLog_webhook_id(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.WebhookID, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOID2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext_WebhookLog_webhook_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "WebhookLog", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } return fc, nil } -func (ec *executionContext) _WebhookLog_created_at(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_WebhookLog_created_at(ctx, field) +func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_possibleTypes(ctx, field) if err != nil { return graphql.Null } @@ -20376,7 +19536,7 @@ func (ec *executionContext) _WebhookLog_created_at(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.CreatedAt, nil + return obj.PossibleTypes(), nil }) if err != nil { ec.Error(ctx, err) @@ -20385,26 +19545,50 @@ func (ec *executionContext) _WebhookLog_created_at(ctx context.Context, field gr if resTmp == nil { return graphql.Null } - res := resTmp.(*int64) + res := resTmp.([]introspection.Type) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_WebhookLog_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_possibleTypes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "WebhookLog", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } return fc, nil } -func (ec *executionContext) _WebhookLog_updated_at(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLog) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_WebhookLog_updated_at(ctx, field) +func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_enumValues(ctx, field) if err != nil { return graphql.Null } @@ -20417,7 +19601,7 @@ func (ec *executionContext) _WebhookLog_updated_at(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.UpdatedAt, nil + return obj.EnumValues(fc.Args["includeDeprecated"].(bool)), nil }) if err != nil { ec.Error(ctx, err) @@ -20426,26 +19610,47 @@ func (ec *executionContext) _WebhookLog_updated_at(ctx context.Context, field gr if resTmp == nil { return graphql.Null } - res := resTmp.(*int64) + res := resTmp.([]introspection.EnumValue) fc.Result = res - return ec.marshalOInt642ᚖint64(ctx, field.Selections, res) + return ec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_WebhookLog_updated_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "WebhookLog", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int64 does not have child fields") + switch field.Name { + case "name": + return ec.fieldContext___EnumValue_name(ctx, field) + case "description": + return ec.fieldContext___EnumValue_description(ctx, field) + case "isDeprecated": + return ec.fieldContext___EnumValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___EnumValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __EnumValue", field.Name) }, } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Type_enumValues_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } return fc, nil } -func (ec *executionContext) _WebhookLogs_pagination(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLogs) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_WebhookLogs_pagination(ctx, field) +func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_inputFields(ctx, field) if err != nil { return graphql.Null } @@ -20458,48 +19663,49 @@ func (ec *executionContext) _WebhookLogs_pagination(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Pagination, nil + return obj.InputFields(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Pagination) + res := resTmp.([]introspection.InputValue) fc.Result = res - return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) + return ec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_WebhookLogs_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_inputFields(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "WebhookLogs", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "limit": - return ec.fieldContext_Pagination_limit(ctx, field) - case "page": - return ec.fieldContext_Pagination_page(ctx, field) - case "offset": - return ec.fieldContext_Pagination_offset(ctx, field) - case "total": - return ec.fieldContext_Pagination_total(ctx, field) + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) }, } return fc, nil } -func (ec *executionContext) _WebhookLogs_webhook_logs(ctx context.Context, field graphql.CollectedField, obj *model.WebhookLogs) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_WebhookLogs_webhook_logs(ctx, field) +func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_ofType(ctx, field) if err != nil { return graphql.Null } @@ -20512,54 +19718,59 @@ func (ec *executionContext) _WebhookLogs_webhook_logs(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.WebhookLogs, nil + return obj.OfType(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.([]*model.WebhookLog) + res := resTmp.(*introspection.Type) fc.Result = res - return ec.marshalNWebhookLog2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookLogᚄ(ctx, field.Selections, res) + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_WebhookLogs_webhook_logs(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_ofType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "WebhookLogs", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "id": - return ec.fieldContext_WebhookLog_id(ctx, field) - case "http_status": - return ec.fieldContext_WebhookLog_http_status(ctx, field) - case "response": - return ec.fieldContext_WebhookLog_response(ctx, field) - case "request": - return ec.fieldContext_WebhookLog_request(ctx, field) - case "webhook_id": - return ec.fieldContext_WebhookLog_webhook_id(ctx, field) - case "created_at": - return ec.fieldContext_WebhookLog_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_WebhookLog_updated_at(ctx, field) + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type WebhookLog", field.Name) + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) }, } return fc, nil } -func (ec *executionContext) _Webhooks_pagination(ctx context.Context, field graphql.CollectedField, obj *model.Webhooks) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhooks_pagination(ctx, field) +func (ec *executionContext) ___Type_isOneOf(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_isOneOf(ctx, field) if err != nil { return graphql.Null } @@ -20572,3368 +19783,829 @@ func (ec *executionContext) _Webhooks_pagination(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.Pagination, nil + return obj.IsOneOf(), nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*model.Pagination) + res := resTmp.(bool) fc.Result = res - return ec.marshalNPagination2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPagination(ctx, field.Selections, res) + return ec.marshalOBoolean2bool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Webhooks_pagination(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext___Type_isOneOf(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "Webhooks", + Object: "__Type", Field: field, - IsMethod: false, + IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "limit": - return ec.fieldContext_Pagination_limit(ctx, field) - case "page": - return ec.fieldContext_Pagination_page(ctx, field) - case "offset": - return ec.fieldContext_Pagination_offset(ctx, field) - case "total": - return ec.fieldContext_Pagination_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Pagination", field.Name) + return nil, errors.New("field of type Boolean does not have child fields") }, } return fc, nil } -func (ec *executionContext) _Webhooks_webhooks(ctx context.Context, field graphql.CollectedField, obj *model.Webhooks) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Webhooks_webhooks(ctx, field) - if err != nil { - return graphql.Null +// endregion **************************** field.gotpl ***************************** + +// region **************************** input.gotpl ***************************** + +func (ec *executionContext) unmarshalInputAddEmailTemplateRequest(ctx context.Context, obj any) (model.AddEmailTemplateRequest, error) { + var it model.AddEmailTemplateRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + + fieldsInOrder := [...]string{"event_name", "subject", "template", "design"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Webhooks, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") + switch k { + case "event_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.EventName = data + case "subject": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("subject")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Subject = data + case "template": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("template")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Template = data + case "design": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("design")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Design = data } - return graphql.Null } - res := resTmp.([]*model.Webhook) - fc.Result = res - return ec.marshalNWebhook2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐWebhookᚄ(ctx, field.Selections, res) + + return it, nil } -func (ec *executionContext) fieldContext_Webhooks_webhooks(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Webhooks", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Webhook_id(ctx, field) - case "event_name": - return ec.fieldContext_Webhook_event_name(ctx, field) - case "event_description": - return ec.fieldContext_Webhook_event_description(ctx, field) - case "endpoint": - return ec.fieldContext_Webhook_endpoint(ctx, field) - case "enabled": - return ec.fieldContext_Webhook_enabled(ctx, field) - case "headers": - return ec.fieldContext_Webhook_headers(ctx, field) - case "created_at": - return ec.fieldContext_Webhook_created_at(ctx, field) - case "updated_at": - return ec.fieldContext_Webhook_updated_at(ctx, field) +func (ec *executionContext) unmarshalInputAddWebhookRequest(ctx context.Context, obj any) (model.AddWebhookRequest, error) { + var it model.AddWebhookRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"event_name", "event_description", "endpoint", "enabled", "headers"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "event_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err } - return nil, fmt.Errorf("no field named %q was found under type Webhook", field.Name) - }, + it.EventName = data + case "event_description": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_description")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.EventDescription = data + case "endpoint": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("endpoint")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Endpoint = data + case "enabled": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("enabled")) + data, err := ec.unmarshalNBoolean2bool(ctx, v) + if err != nil { + return it, err + } + it.Enabled = data + case "headers": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("headers")) + data, err := ec.unmarshalOMap2map(ctx, v) + if err != nil { + return it, err + } + it.Headers = data + } } - return fc, nil + + return it, nil } -func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Directive_name(ctx, field) - if err != nil { - return graphql.Null +func (ec *executionContext) unmarshalInputAdminLoginRequest(ctx context.Context, obj any) (model.AdminLoginRequest, error) { + var it model.AdminLoginRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + + fieldsInOrder := [...]string{"admin_secret"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") + switch k { + case "admin_secret": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("admin_secret")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.AdminSecret = data } - return graphql.Null } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} -func (ec *executionContext) fieldContext___Directive_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Directive", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return it, nil } -func (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Directive_description(ctx, field) - if err != nil { - return graphql.Null +func (ec *executionContext) unmarshalInputAdminSignupRequest(ctx context.Context, obj any) (model.AdminSignupRequest, error) { + var it model.AdminSignupRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + + fieldsInOrder := [...]string{"admin_secret"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "admin_secret": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("admin_secret")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.AdminSecret = data } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) + + return it, nil } -func (ec *executionContext) fieldContext___Directive_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Directive", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, +func (ec *executionContext) unmarshalInputDeleteEmailTemplateRequest(ctx context.Context, obj any) (model.DeleteEmailTemplateRequest, error) { + var it model.DeleteEmailTemplateRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - return fc, nil -} -func (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Directive_isRepeatable(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + fieldsInOrder := [...]string{"id"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.IsRepeatable, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") + switch k { + case "id": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) + data, err := ec.unmarshalNID2string(ctx, v) + if err != nil { + return it, err + } + it.ID = data } - return graphql.Null } - res := resTmp.(bool) - fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) -} -func (ec *executionContext) fieldContext___Directive_isRepeatable(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Directive", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return it, nil } -func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Directive_locations(ctx, field) - if err != nil { - return graphql.Null +func (ec *executionContext) unmarshalInputDeleteUserRequest(ctx context.Context, obj any) (model.DeleteUserRequest, error) { + var it model.DeleteUserRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + + fieldsInOrder := [...]string{"email"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Locations, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") + switch k { + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Email = data } - return graphql.Null } - res := resTmp.([]string) - fc.Result = res - return ec.marshalN__DirectiveLocation2ᚕstringᚄ(ctx, field.Selections, res) -} -func (ec *executionContext) fieldContext___Directive_locations(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Directive", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type __DirectiveLocation does not have child fields") - }, - } - return fc, nil + return it, nil } -func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Directive_args(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Args, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null +func (ec *executionContext) unmarshalInputFgaBatchCheckInput(ctx context.Context, obj any) (model.FgaBatchCheckInput, error) { + var it model.FgaBatchCheckInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - res := resTmp.([]introspection.InputValue) - fc.Result = res - return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) -} -func (ec *executionContext) fieldContext___Directive_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Directive", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___InputValue_name(ctx, field) - case "description": - return ec.fieldContext___InputValue_description(ctx, field) - case "type": - return ec.fieldContext___InputValue_type(ctx, field) - case "defaultValue": - return ec.fieldContext___InputValue_defaultValue(ctx, field) - case "isDeprecated": - return ec.fieldContext___InputValue_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___InputValue_deprecationReason(ctx, field) + fieldsInOrder := [...]string{"checks"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "checks": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("checks")) + data, err := ec.unmarshalNFgaCheckPairInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckPairInputᚄ(ctx, v) + if err != nil { + return it, err } - return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) + it.Checks = data } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field___Directive_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err } - return fc, nil + + return it, nil } -func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___EnumValue_name(ctx, field) - if err != nil { - return graphql.Null +func (ec *executionContext) unmarshalInputFgaCheckInput(ctx context.Context, obj any) (model.FgaCheckInput, error) { + var it model.FgaCheckInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + + fieldsInOrder := [...]string{"relation", "object", "contextual_tuples"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") + switch k { + case "relation": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("relation")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Relation = data + case "object": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("object")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Object = data + case "contextual_tuples": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("contextual_tuples")) + data, err := ec.unmarshalOFgaTupleInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleInputᚄ(ctx, v) + if err != nil { + return it, err + } + it.ContextualTuples = data } - return graphql.Null } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} -func (ec *executionContext) fieldContext___EnumValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return it, nil } -func (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___EnumValue_description(ctx, field) - if err != nil { - return graphql.Null +func (ec *executionContext) unmarshalInputFgaCheckPairInput(ctx context.Context, obj any) (model.FgaCheckPairInput, error) { + var it model.FgaCheckPairInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + + fieldsInOrder := [...]string{"relation", "object", "contextual_tuples"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "relation": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("relation")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Relation = data + case "object": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("object")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Object = data + case "contextual_tuples": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("contextual_tuples")) + data, err := ec.unmarshalOFgaTupleInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleInputᚄ(ctx, v) + if err != nil { + return it, err + } + it.ContextualTuples = data } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} -func (ec *executionContext) fieldContext___EnumValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return it, nil } -func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___EnumValue_isDeprecated(ctx, field) - if err != nil { - return graphql.Null +func (ec *executionContext) unmarshalInputFgaListObjectsInput(ctx context.Context, obj any) (model.FgaListObjectsInput, error) { + var it model.FgaListObjectsInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + + fieldsInOrder := [...]string{"relation", "object_type"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.IsDeprecated(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") + switch k { + case "relation": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("relation")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Relation = data + case "object_type": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("object_type")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.ObjectType = data } - return graphql.Null } - res := resTmp.(bool) - fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) -} -func (ec *executionContext) fieldContext___EnumValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return it, nil } -func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___EnumValue_deprecationReason(ctx, field) - if err != nil { - return graphql.Null +func (ec *executionContext) unmarshalInputFgaReadTuplesInput(ctx context.Context, obj any) (model.FgaReadTuplesInput, error) { + var it model.FgaReadTuplesInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + + fieldsInOrder := [...]string{"user", "relation", "object", "page_size", "continuation_token"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "user": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("user")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.User = data + case "relation": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("relation")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Relation = data + case "object": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("object")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Object = data + case "page_size": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("page_size")) + data, err := ec.unmarshalOInt642ᚖint64(ctx, v) + if err != nil { + return it, err + } + it.PageSize = data + case "continuation_token": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("continuation_token")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.ContinuationToken = data } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.DeprecationReason(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} -func (ec *executionContext) fieldContext___EnumValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return it, nil } -func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Field_name(ctx, field) - if err != nil { - return graphql.Null +func (ec *executionContext) unmarshalInputFgaRelationInput(ctx context.Context, obj any) (model.FgaRelationInput, error) { + var it model.FgaRelationInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null + + fieldsInOrder := [...]string{"relation", "object"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") + switch k { + case "relation": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("relation")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Relation = data + case "object": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("object")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Object = data } - return graphql.Null } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} -func (ec *executionContext) fieldContext___Field_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return it, nil } -func (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Field_description(ctx, field) - if err != nil { - return graphql.Null +func (ec *executionContext) unmarshalInputFgaTupleInput(ctx context.Context, obj any) (model.FgaTupleInput, error) { + var it model.FgaTupleInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Field_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Field_args(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Args, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.([]introspection.InputValue) - fc.Result = res - return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Field_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___InputValue_name(ctx, field) - case "description": - return ec.fieldContext___InputValue_description(ctx, field) - case "type": - return ec.fieldContext___InputValue_type(ctx, field) - case "defaultValue": - return ec.fieldContext___InputValue_defaultValue(ctx, field) - case "isDeprecated": - return ec.fieldContext___InputValue_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___InputValue_deprecationReason(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field___Field_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Field_type(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Type, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Field_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Field_isDeprecated(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.IsDeprecated(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(bool) - fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Field_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Field_deprecationReason(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.DeprecationReason(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Field_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___InputValue_name(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___InputValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___InputValue_description(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___InputValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___InputValue_type(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Type, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___InputValue_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___InputValue_defaultValue(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.DefaultValue, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___InputValue_defaultValue(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___InputValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___InputValue_isDeprecated(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.IsDeprecated(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(bool) - fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___InputValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___InputValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___InputValue_deprecationReason(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.DeprecationReason(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___InputValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___Schema_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Schema_description(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Schema_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Schema", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Schema_types(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Types(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.([]introspection.Type) - fc.Result = res - return ec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Schema_types(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Schema", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Schema_queryType(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.QueryType(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Schema_queryType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Schema", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Schema_mutationType(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.MutationType(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Schema_mutationType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Schema", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Schema_subscriptionType(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.SubscriptionType(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Schema_subscriptionType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Schema", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Schema_directives(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Schema_directives(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Directives(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.([]introspection.Directive) - fc.Result = res - return ec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Schema_directives(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Schema", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___Directive_name(ctx, field) - case "description": - return ec.fieldContext___Directive_description(ctx, field) - case "isRepeatable": - return ec.fieldContext___Directive_isRepeatable(ctx, field) - case "locations": - return ec.fieldContext___Directive_locations(ctx, field) - case "args": - return ec.fieldContext___Directive_args(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Directive", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_kind(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Kind(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalN__TypeKind2string(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_kind(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type __TypeKind does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_name(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_description(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___Type_specifiedByURL(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_specifiedByURL(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.SpecifiedByURL(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_specifiedByURL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil -} - -func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_fields(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Fields(fc.Args["includeDeprecated"].(bool)), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.Field) - fc.Result = res - return ec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___Field_name(ctx, field) - case "description": - return ec.fieldContext___Field_description(ctx, field) - case "args": - return ec.fieldContext___Field_args(ctx, field) - case "type": - return ec.fieldContext___Field_type(ctx, field) - case "isDeprecated": - return ec.fieldContext___Field_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___Field_deprecationReason(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Field", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field___Type_fields_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_interfaces(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.Interfaces(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_interfaces(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_possibleTypes(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.PossibleTypes(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_possibleTypes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_enumValues(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.EnumValues(fc.Args["includeDeprecated"].(bool)), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.EnumValue) - fc.Result = res - return ec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___EnumValue_name(ctx, field) - case "description": - return ec.fieldContext___EnumValue_description(ctx, field) - case "isDeprecated": - return ec.fieldContext___EnumValue_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___EnumValue_deprecationReason(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __EnumValue", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field___Type_enumValues_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_inputFields(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.InputFields(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.InputValue) - fc.Result = res - return ec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_inputFields(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___InputValue_name(ctx, field) - case "description": - return ec.fieldContext___InputValue_description(ctx, field) - case "type": - return ec.fieldContext___InputValue_type(ctx, field) - case "defaultValue": - return ec.fieldContext___InputValue_defaultValue(ctx, field) - case "isDeprecated": - return ec.fieldContext___InputValue_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___InputValue_deprecationReason(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_ofType(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.OfType(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_ofType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) ___Type_isOneOf(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - fc, err := ec.fieldContext___Type_isOneOf(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.IsOneOf(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(bool) - fc.Result = res - return ec.marshalOBoolean2bool(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext___Type_isOneOf(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil -} - -// endregion **************************** field.gotpl ***************************** - -// region **************************** input.gotpl ***************************** - -func (ec *executionContext) unmarshalInputAddEmailTemplateRequest(ctx context.Context, obj any) (model.AddEmailTemplateRequest, error) { - var it model.AddEmailTemplateRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"event_name", "subject", "template", "design"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "event_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.EventName = data - case "subject": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("subject")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Subject = data - case "template": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("template")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Template = data - case "design": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("design")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Design = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputAddPermissionInput(ctx context.Context, obj any) (model.AddPermissionInput, error) { - var it model.AddPermissionInput - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"name", "description", "resource_id", "scope_ids", "policy_ids", "decision_strategy"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Name = data - case "description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("description")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Description = data - case "resource_id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("resource_id")) - data, err := ec.unmarshalNID2string(ctx, v) - if err != nil { - return it, err - } - it.ResourceID = data - case "scope_ids": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope_ids")) - data, err := ec.unmarshalNID2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.ScopeIds = data - case "policy_ids": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("policy_ids")) - data, err := ec.unmarshalNID2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.PolicyIds = data - case "decision_strategy": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("decision_strategy")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.DecisionStrategy = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputAddPolicyInput(ctx context.Context, obj any) (model.AddPolicyInput, error) { - var it model.AddPolicyInput - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"name", "description", "type", "logic", "decision_strategy", "targets"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Name = data - case "description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("description")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Description = data - case "type": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("type")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Type = data - case "logic": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("logic")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Logic = data - case "decision_strategy": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("decision_strategy")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.DecisionStrategy = data - case "targets": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("targets")) - data, err := ec.unmarshalNPolicyTargetInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPolicyTargetInputᚄ(ctx, v) - if err != nil { - return it, err - } - it.Targets = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputAddResourceInput(ctx context.Context, obj any) (model.AddResourceInput, error) { - var it model.AddResourceInput - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"name", "description"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Name = data - case "description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("description")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Description = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputAddScopeInput(ctx context.Context, obj any) (model.AddScopeInput, error) { - var it model.AddScopeInput - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"name", "description"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Name = data - case "description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("description")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Description = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputAddWebhookRequest(ctx context.Context, obj any) (model.AddWebhookRequest, error) { - var it model.AddWebhookRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"event_name", "event_description", "endpoint", "enabled", "headers"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "event_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.EventName = data - case "event_description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_description")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.EventDescription = data - case "endpoint": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("endpoint")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Endpoint = data - case "enabled": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("enabled")) - data, err := ec.unmarshalNBoolean2bool(ctx, v) - if err != nil { - return it, err - } - it.Enabled = data - case "headers": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("headers")) - data, err := ec.unmarshalOMap2map(ctx, v) - if err != nil { - return it, err - } - it.Headers = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputAdminLoginRequest(ctx context.Context, obj any) (model.AdminLoginRequest, error) { - var it model.AdminLoginRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"admin_secret"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "admin_secret": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("admin_secret")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.AdminSecret = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputAdminSignupRequest(ctx context.Context, obj any) (model.AdminSignupRequest, error) { - var it model.AdminSignupRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"admin_secret"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "admin_secret": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("admin_secret")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.AdminSecret = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputDeleteEmailTemplateRequest(ctx context.Context, obj any) (model.DeleteEmailTemplateRequest, error) { - var it model.DeleteEmailTemplateRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"id"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - data, err := ec.unmarshalNID2string(ctx, v) - if err != nil { - return it, err - } - it.ID = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputDeleteUserRequest(ctx context.Context, obj any) (model.DeleteUserRequest, error) { - var it model.DeleteUserRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"email"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Email = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputForgotPasswordRequest(ctx context.Context, obj any) (model.ForgotPasswordRequest, error) { - var it model.ForgotPasswordRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"email", "phone_number", "state", "redirect_uri"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Email = data - case "phone_number": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.PhoneNumber = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.State = data - case "redirect_uri": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.RedirectURI = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputGenerateJWTKeysRequest(ctx context.Context, obj any) (model.GenerateJWTKeysRequest, error) { - var it model.GenerateJWTKeysRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"type"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "type": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("type")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Type = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputGetUserRequest(ctx context.Context, obj any) (model.GetUserRequest, error) { - var it model.GetUserRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"id", "email"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.ID = data - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Email = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputInviteMemberRequest(ctx context.Context, obj any) (model.InviteMemberRequest, error) { - var it model.InviteMemberRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"emails", "redirect_uri"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "emails": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("emails")) - data, err := ec.unmarshalNString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Emails = data - case "redirect_uri": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.RedirectURI = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputListAuditLogRequest(ctx context.Context, obj any) (model.ListAuditLogRequest, error) { - var it model.ListAuditLogRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"pagination", "action", "actor_id", "resource_type", "resource_id", "from_timestamp", "to_timestamp"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "pagination": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) - data, err := ec.unmarshalOPaginationRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginationRequest(ctx, v) - if err != nil { - return it, err - } - it.Pagination = data - case "action": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("action")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Action = data - case "actor_id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("actor_id")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.ActorID = data - case "resource_type": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("resource_type")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.ResourceType = data - case "resource_id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("resource_id")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.ResourceID = data - case "from_timestamp": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("from_timestamp")) - data, err := ec.unmarshalOInt642ᚖint64(ctx, v) - if err != nil { - return it, err - } - it.FromTimestamp = data - case "to_timestamp": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("to_timestamp")) - data, err := ec.unmarshalOInt642ᚖint64(ctx, v) - if err != nil { - return it, err - } - it.ToTimestamp = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputListWebhookLogRequest(ctx context.Context, obj any) (model.ListWebhookLogRequest, error) { - var it model.ListWebhookLogRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"pagination", "webhook_id"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "pagination": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) - data, err := ec.unmarshalOPaginationRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginationRequest(ctx, v) - if err != nil { - return it, err - } - it.Pagination = data - case "webhook_id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("webhook_id")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.WebhookID = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputLoginRequest(ctx context.Context, obj any) (model.LoginRequest, error) { - var it model.LoginRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"email", "phone_number", "password", "roles", "scope", "state"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Email = data - case "phone_number": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.PhoneNumber = data - case "password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("password")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Password = data - case "roles": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Roles = data - case "scope": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Scope = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.State = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputMagicLinkLoginRequest(ctx context.Context, obj any) (model.MagicLinkLoginRequest, error) { - var it model.MagicLinkLoginRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"email", "roles", "scope", "state", "redirect_uri"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Email = data - case "roles": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Roles = data - case "scope": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Scope = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.State = data - case "redirect_uri": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.RedirectURI = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputMobileLoginRequest(ctx context.Context, obj any) (model.MobileLoginRequest, error) { - var it model.MobileLoginRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"phone_number", "password", "roles", "scope", "state"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "phone_number": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.PhoneNumber = data - case "password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("password")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Password = data - case "roles": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Roles = data - case "scope": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Scope = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.State = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputMobileSignUpRequest(ctx context.Context, obj any) (model.MobileSignUpRequest, error) { - var it model.MobileSignUpRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"email", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "picture", "password", "confirm_password", "roles", "scope", "redirect_uri", "is_multi_factor_auth_enabled", "state", "app_data"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue + + fieldsInOrder := [...]string{"user", "relation", "object"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue } switch k { - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Email = data - case "given_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("given_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.GivenName = data - case "family_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("family_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.FamilyName = data - case "middle_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("middle_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.MiddleName = data - case "nickname": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("nickname")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Nickname = data - case "gender": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gender")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Gender = data - case "birthdate": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("birthdate")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Birthdate = data - case "phone_number": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + case "user": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("user")) data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.PhoneNumber = data - case "picture": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("picture")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Picture = data - case "password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("password")) + it.User = data + case "relation": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("relation")) data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.Password = data - case "confirm_password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("confirm_password")) + it.Relation = data + case "object": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("object")) data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.ConfirmPassword = data - case "roles": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Roles = data - case "scope": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Scope = data - case "redirect_uri": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.RedirectURI = data - case "is_multi_factor_auth_enabled": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_multi_factor_auth_enabled")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) - if err != nil { - return it, err - } - it.IsMultiFactorAuthEnabled = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.State = data - case "app_data": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("app_data")) - data, err := ec.unmarshalOMap2map(ctx, v) - if err != nil { - return it, err - } - it.AppData = data + it.Object = data } } return it, nil } -func (ec *executionContext) unmarshalInputOAuthRevokeRequest(ctx context.Context, obj any) (model.OAuthRevokeRequest, error) { - var it model.OAuthRevokeRequest +func (ec *executionContext) unmarshalInputFgaWriteModelInput(ctx context.Context, obj any) (model.FgaWriteModelInput, error) { + var it model.FgaWriteModelInput asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"refresh_token"} + fieldsInOrder := [...]string{"dsl"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "refresh_token": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("refresh_token")) + case "dsl": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("dsl")) data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.RefreshToken = data + it.Dsl = data } } return it, nil } -func (ec *executionContext) unmarshalInputPaginatedRequest(ctx context.Context, obj any) (model.PaginatedRequest, error) { - var it model.PaginatedRequest +func (ec *executionContext) unmarshalInputFgaWriteTuplesInput(ctx context.Context, obj any) (model.FgaWriteTuplesInput, error) { + var it model.FgaWriteTuplesInput asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"pagination"} + fieldsInOrder := [...]string{"tuples"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "pagination": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) - data, err := ec.unmarshalOPaginationRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginationRequest(ctx, v) + case "tuples": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("tuples")) + data, err := ec.unmarshalNFgaTupleInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleInputᚄ(ctx, v) if err != nil { return it, err } - it.Pagination = data + it.Tuples = data } } return it, nil } -func (ec *executionContext) unmarshalInputPaginationRequest(ctx context.Context, obj any) (model.PaginationRequest, error) { - var it model.PaginationRequest +func (ec *executionContext) unmarshalInputForgotPasswordRequest(ctx context.Context, obj any) (model.ForgotPasswordRequest, error) { + var it model.ForgotPasswordRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"limit", "page"} + fieldsInOrder := [...]string{"email", "phone_number", "state", "redirect_uri"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "limit": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("limit")) - data, err := ec.unmarshalOInt642ᚖint64(ctx, v) + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Limit = data - case "page": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("page")) - data, err := ec.unmarshalOInt642ᚖint64(ctx, v) + it.Email = data + case "phone_number": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Page = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputPermissionInput(ctx context.Context, obj any) (model.PermissionInput, error) { - var it model.PermissionInput - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"resource", "scope"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "resource": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("resource")) - data, err := ec.unmarshalNString2string(ctx, v) + it.PhoneNumber = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Resource = data - case "scope": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) - data, err := ec.unmarshalNString2string(ctx, v) + it.State = data + case "redirect_uri": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Scope = data + it.RedirectURI = data } } return it, nil } -func (ec *executionContext) unmarshalInputPolicyTargetInput(ctx context.Context, obj any) (model.PolicyTargetInput, error) { - var it model.PolicyTargetInput +func (ec *executionContext) unmarshalInputGenerateJWTKeysRequest(ctx context.Context, obj any) (model.GenerateJWTKeysRequest, error) { + var it model.GenerateJWTKeysRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"target_type", "target_value"} + fieldsInOrder := [...]string{"type"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "target_type": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("target_type")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.TargetType = data - case "target_value": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("target_value")) + case "type": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("type")) data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.TargetValue = data + it.Type = data } } return it, nil } -func (ec *executionContext) unmarshalInputResendOTPRequest(ctx context.Context, obj any) (model.ResendOTPRequest, error) { - var it model.ResendOTPRequest +func (ec *executionContext) unmarshalInputGetUserRequest(ctx context.Context, obj any) (model.GetUserRequest, error) { + var it model.GetUserRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"email", "phone_number", "state"} + fieldsInOrder := [...]string{"id", "email"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Email = data - case "phone_number": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + case "id": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.PhoneNumber = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + it.ID = data + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.State = data + it.Email = data } } return it, nil } -func (ec *executionContext) unmarshalInputResendVerifyEmailRequest(ctx context.Context, obj any) (model.ResendVerifyEmailRequest, error) { - var it model.ResendVerifyEmailRequest +func (ec *executionContext) unmarshalInputInviteMemberRequest(ctx context.Context, obj any) (model.InviteMemberRequest, error) { + var it model.InviteMemberRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"email", "identifier", "state"} + fieldsInOrder := [...]string{"emails", "redirect_uri"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Email = data - case "identifier": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("identifier")) - data, err := ec.unmarshalNString2string(ctx, v) + case "emails": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("emails")) + data, err := ec.unmarshalNString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.Identifier = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + it.Emails = data + case "redirect_uri": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.State = data + it.RedirectURI = data } } return it, nil } -func (ec *executionContext) unmarshalInputResetPasswordRequest(ctx context.Context, obj any) (model.ResetPasswordRequest, error) { - var it model.ResetPasswordRequest +func (ec *executionContext) unmarshalInputListAuditLogRequest(ctx context.Context, obj any) (model.ListAuditLogRequest, error) { + var it model.ListAuditLogRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"token", "otp", "phone_number", "password", "confirm_password"} + fieldsInOrder := [...]string{"pagination", "action", "actor_id", "resource_type", "resource_id", "from_timestamp", "to_timestamp"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "token": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("token")) + case "pagination": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) + data, err := ec.unmarshalOPaginationRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginationRequest(ctx, v) + if err != nil { + return it, err + } + it.Pagination = data + case "action": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("action")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Token = data - case "otp": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("otp")) + it.Action = data + case "actor_id": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("actor_id")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Otp = data - case "phone_number": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + it.ActorID = data + case "resource_type": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("resource_type")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.PhoneNumber = data - case "password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("password")) - data, err := ec.unmarshalNString2string(ctx, v) + it.ResourceType = data + case "resource_id": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("resource_id")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Password = data - case "confirm_password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("confirm_password")) - data, err := ec.unmarshalNString2string(ctx, v) + it.ResourceID = data + case "from_timestamp": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("from_timestamp")) + data, err := ec.unmarshalOInt642ᚖint64(ctx, v) if err != nil { return it, err } - it.ConfirmPassword = data + it.FromTimestamp = data + case "to_timestamp": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("to_timestamp")) + data, err := ec.unmarshalOInt642ᚖint64(ctx, v) + if err != nil { + return it, err + } + it.ToTimestamp = data } } return it, nil } -func (ec *executionContext) unmarshalInputSessionQueryRequest(ctx context.Context, obj any) (model.SessionQueryRequest, error) { - var it model.SessionQueryRequest +func (ec *executionContext) unmarshalInputListWebhookLogRequest(ctx context.Context, obj any) (model.ListWebhookLogRequest, error) { + var it model.ListWebhookLogRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"roles", "scope", "state", "required_permissions"} + fieldsInOrder := [...]string{"pagination", "webhook_id"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "roles": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.Roles = data - case "scope": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) + case "pagination": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) + data, err := ec.unmarshalOPaginationRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginationRequest(ctx, v) if err != nil { return it, err } - it.Scope = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + it.Pagination = data + case "webhook_id": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("webhook_id")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.State = data - case "required_permissions": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("required_permissions")) - data, err := ec.unmarshalOPermissionInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermissionInputᚄ(ctx, v) - if err != nil { - return it, err - } - it.RequiredPermissions = data + it.WebhookID = data } } return it, nil } -func (ec *executionContext) unmarshalInputSignUpRequest(ctx context.Context, obj any) (model.SignUpRequest, error) { - var it model.SignUpRequest +func (ec *executionContext) unmarshalInputLoginRequest(ctx context.Context, obj any) (model.LoginRequest, error) { + var it model.LoginRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"email", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "picture", "password", "confirm_password", "roles", "scope", "redirect_uri", "is_multi_factor_auth_enabled", "state", "app_data"} + fieldsInOrder := [...]string{"email", "phone_number", "password", "roles", "scope", "state"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -23947,48 +20619,6 @@ func (ec *executionContext) unmarshalInputSignUpRequest(ctx context.Context, obj return it, err } it.Email = data - case "given_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("given_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.GivenName = data - case "family_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("family_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.FamilyName = data - case "middle_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("middle_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.MiddleName = data - case "nickname": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("nickname")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Nickname = data - case "gender": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gender")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Gender = data - case "birthdate": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("birthdate")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Birthdate = data case "phone_number": ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) @@ -23996,13 +20626,6 @@ func (ec *executionContext) unmarshalInputSignUpRequest(ctx context.Context, obj return it, err } it.PhoneNumber = data - case "picture": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("picture")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.Picture = data case "password": ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("password")) data, err := ec.unmarshalNString2string(ctx, v) @@ -24010,13 +20633,6 @@ func (ec *executionContext) unmarshalInputSignUpRequest(ctx context.Context, obj return it, err } it.Password = data - case "confirm_password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("confirm_password")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.ConfirmPassword = data case "roles": ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) @@ -24031,20 +20647,6 @@ func (ec *executionContext) unmarshalInputSignUpRequest(ctx context.Context, obj return it, err } it.Scope = data - case "redirect_uri": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.RedirectURI = data - case "is_multi_factor_auth_enabled": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_multi_factor_auth_enabled")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) - if err != nil { - return it, err - } - it.IsMultiFactorAuthEnabled = data case "state": ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) @@ -24052,611 +20654,756 @@ func (ec *executionContext) unmarshalInputSignUpRequest(ctx context.Context, obj return it, err } it.State = data - case "app_data": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("app_data")) - data, err := ec.unmarshalOMap2map(ctx, v) - if err != nil { - return it, err - } - it.AppData = data } } return it, nil } -func (ec *executionContext) unmarshalInputTestEndpointRequest(ctx context.Context, obj any) (model.TestEndpointRequest, error) { - var it model.TestEndpointRequest +func (ec *executionContext) unmarshalInputMagicLinkLoginRequest(ctx context.Context, obj any) (model.MagicLinkLoginRequest, error) { + var it model.MagicLinkLoginRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"endpoint", "event_name", "event_description", "headers"} + fieldsInOrder := [...]string{"email", "roles", "scope", "state", "redirect_uri"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "endpoint": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("endpoint")) + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.Endpoint = data - case "event_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) - data, err := ec.unmarshalNString2string(ctx, v) + it.Email = data + case "roles": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.EventName = data - case "event_description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_description")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Roles = data + case "scope": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.EventDescription = data - case "headers": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("headers")) - data, err := ec.unmarshalOMap2map(ctx, v) + it.Scope = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Headers = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputUpdateAccessRequest(ctx context.Context, obj any) (model.UpdateAccessRequest, error) { - var it model.UpdateAccessRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"user_id"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "user_id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("user_id")) - data, err := ec.unmarshalNString2string(ctx, v) + it.State = data + case "redirect_uri": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.UserID = data + it.RedirectURI = data } } return it, nil } -func (ec *executionContext) unmarshalInputUpdateEmailTemplateRequest(ctx context.Context, obj any) (model.UpdateEmailTemplateRequest, error) { - var it model.UpdateEmailTemplateRequest +func (ec *executionContext) unmarshalInputMobileLoginRequest(ctx context.Context, obj any) (model.MobileLoginRequest, error) { + var it model.MobileLoginRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"id", "event_name", "template", "subject", "design"} + fieldsInOrder := [...]string{"phone_number", "password", "roles", "scope", "state"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - data, err := ec.unmarshalNID2string(ctx, v) + case "phone_number": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.ID = data - case "event_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.PhoneNumber = data + case "password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("password")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.EventName = data - case "template": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("template")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Password = data + case "roles": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.Template = data - case "subject": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("subject")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Roles = data + case "scope": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.Subject = data - case "design": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("design")) + it.Scope = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Design = data + it.State = data } } return it, nil } -func (ec *executionContext) unmarshalInputUpdateEnvRequest(ctx context.Context, obj any) (model.UpdateEnvRequest, error) { - var it model.UpdateEnvRequest +func (ec *executionContext) unmarshalInputMobileSignUpRequest(ctx context.Context, obj any) (model.MobileSignUpRequest, error) { + var it model.MobileSignUpRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"ACCESS_TOKEN_EXPIRY_TIME", "ADMIN_SECRET", "CUSTOM_ACCESS_TOKEN_SCRIPT", "OLD_ADMIN_SECRET", "SMTP_HOST", "SMTP_PORT", "SMTP_USERNAME", "SMTP_PASSWORD", "SMTP_LOCAL_NAME", "SENDER_EMAIL", "SENDER_NAME", "JWT_TYPE", "JWT_SECRET", "JWT_PRIVATE_KEY", "JWT_PUBLIC_KEY", "ALLOWED_ORIGINS", "APP_URL", "RESET_PASSWORD_URL", "APP_COOKIE_SECURE", "ADMIN_COOKIE_SECURE", "DISABLE_EMAIL_VERIFICATION", "DISABLE_BASIC_AUTHENTICATION", "DISABLE_MOBILE_BASIC_AUTHENTICATION", "DISABLE_MAGIC_LINK_LOGIN", "DISABLE_LOGIN_PAGE", "DISABLE_SIGN_UP", "DISABLE_REDIS_FOR_ENV", "DISABLE_STRONG_PASSWORD", "DISABLE_MULTI_FACTOR_AUTHENTICATION", "ENFORCE_MULTI_FACTOR_AUTHENTICATION", "ROLES", "PROTECTED_ROLES", "DEFAULT_ROLES", "JWT_ROLE_CLAIM", "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "GITHUB_CLIENT_ID", "GITHUB_CLIENT_SECRET", "FACEBOOK_CLIENT_ID", "FACEBOOK_CLIENT_SECRET", "LINKEDIN_CLIENT_ID", "LINKEDIN_CLIENT_SECRET", "APPLE_CLIENT_ID", "APPLE_CLIENT_SECRET", "DISCORD_CLIENT_ID", "DISCORD_CLIENT_SECRET", "TWITTER_CLIENT_ID", "TWITTER_CLIENT_SECRET", "MICROSOFT_CLIENT_ID", "MICROSOFT_CLIENT_SECRET", "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID", "TWITCH_CLIENT_ID", "TWITCH_CLIENT_SECRET", "ROBLOX_CLIENT_ID", "ROBLOX_CLIENT_SECRET", "ORGANIZATION_NAME", "ORGANIZATION_LOGO", "DEFAULT_AUTHORIZE_RESPONSE_TYPE", "DEFAULT_AUTHORIZE_RESPONSE_MODE", "DISABLE_PLAYGROUND", "DISABLE_MAIL_OTP_LOGIN", "DISABLE_TOTP_LOGIN"} + fieldsInOrder := [...]string{"email", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "picture", "password", "confirm_password", "roles", "scope", "redirect_uri", "is_multi_factor_auth_enabled", "state", "app_data"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "ACCESS_TOKEN_EXPIRY_TIME": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ACCESS_TOKEN_EXPIRY_TIME")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.AccessTokenExpiryTime = data - case "ADMIN_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ADMIN_SECRET")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.AdminSecret = data - case "CUSTOM_ACCESS_TOKEN_SCRIPT": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("CUSTOM_ACCESS_TOKEN_SCRIPT")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.CustomAccessTokenScript = data - case "OLD_ADMIN_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("OLD_ADMIN_SECRET")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } - it.OldAdminSecret = data - case "SMTP_HOST": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_HOST")) + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.SMTPHost = data - case "SMTP_PORT": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_PORT")) + it.Email = data + case "given_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("given_name")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.SMTPPort = data - case "SMTP_USERNAME": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_USERNAME")) + it.GivenName = data + case "family_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("family_name")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.SMTPUsername = data - case "SMTP_PASSWORD": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_PASSWORD")) + it.FamilyName = data + case "middle_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("middle_name")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.SMTPPassword = data - case "SMTP_LOCAL_NAME": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_LOCAL_NAME")) + it.MiddleName = data + case "nickname": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("nickname")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.SMTPLocalName = data - case "SENDER_EMAIL": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SENDER_EMAIL")) + it.Nickname = data + case "gender": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gender")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.SenderEmail = data - case "SENDER_NAME": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SENDER_NAME")) + it.Gender = data + case "birthdate": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("birthdate")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.SenderName = data - case "JWT_TYPE": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_TYPE")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Birthdate = data + case "phone_number": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.JwtType = data - case "JWT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_SECRET")) + it.PhoneNumber = data + case "picture": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("picture")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.JwtSecret = data - case "JWT_PRIVATE_KEY": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_PRIVATE_KEY")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Picture = data + case "password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("password")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.JwtPrivateKey = data - case "JWT_PUBLIC_KEY": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_PUBLIC_KEY")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Password = data + case "confirm_password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("confirm_password")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.JwtPublicKey = data - case "ALLOWED_ORIGINS": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ALLOWED_ORIGINS")) + it.ConfirmPassword = data + case "roles": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.AllowedOrigins = data - case "APP_URL": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("APP_URL")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Roles = data + case "scope": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.AppURL = data - case "RESET_PASSWORD_URL": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("RESET_PASSWORD_URL")) + it.Scope = data + case "redirect_uri": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.ResetPasswordURL = data - case "APP_COOKIE_SECURE": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("APP_COOKIE_SECURE")) + it.RedirectURI = data + case "is_multi_factor_auth_enabled": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_multi_factor_auth_enabled")) data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.AppCookieSecure = data - case "ADMIN_COOKIE_SECURE": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ADMIN_COOKIE_SECURE")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.IsMultiFactorAuthEnabled = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.AdminCookieSecure = data - case "DISABLE_EMAIL_VERIFICATION": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_EMAIL_VERIFICATION")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.State = data + case "app_data": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("app_data")) + data, err := ec.unmarshalOMap2map(ctx, v) if err != nil { return it, err } - it.DisableEmailVerification = data - case "DISABLE_BASIC_AUTHENTICATION": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_BASIC_AUTHENTICATION")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.AppData = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputOAuthRevokeRequest(ctx context.Context, obj any) (model.OAuthRevokeRequest, error) { + var it model.OAuthRevokeRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"refresh_token"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "refresh_token": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("refresh_token")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.DisableBasicAuthentication = data - case "DISABLE_MOBILE_BASIC_AUTHENTICATION": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_MOBILE_BASIC_AUTHENTICATION")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.RefreshToken = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputPaginatedRequest(ctx context.Context, obj any) (model.PaginatedRequest, error) { + var it model.PaginatedRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"pagination"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "pagination": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) + data, err := ec.unmarshalOPaginationRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPaginationRequest(ctx, v) if err != nil { return it, err } - it.DisableMobileBasicAuthentication = data - case "DISABLE_MAGIC_LINK_LOGIN": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_MAGIC_LINK_LOGIN")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.Pagination = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputPaginationRequest(ctx context.Context, obj any) (model.PaginationRequest, error) { + var it model.PaginationRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"limit", "page"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "limit": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("limit")) + data, err := ec.unmarshalOInt642ᚖint64(ctx, v) if err != nil { return it, err } - it.DisableMagicLinkLogin = data - case "DISABLE_LOGIN_PAGE": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_LOGIN_PAGE")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.Limit = data + case "page": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("page")) + data, err := ec.unmarshalOInt642ᚖint64(ctx, v) if err != nil { return it, err } - it.DisableLoginPage = data - case "DISABLE_SIGN_UP": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_SIGN_UP")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.Page = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputResendOTPRequest(ctx context.Context, obj any) (model.ResendOTPRequest, error) { + var it model.ResendOTPRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"email", "phone_number", "state"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.DisableSignUp = data - case "DISABLE_REDIS_FOR_ENV": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_REDIS_FOR_ENV")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.Email = data + case "phone_number": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.DisableRedisForEnv = data - case "DISABLE_STRONG_PASSWORD": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_STRONG_PASSWORD")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.PhoneNumber = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.DisableStrongPassword = data - case "DISABLE_MULTI_FACTOR_AUTHENTICATION": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_MULTI_FACTOR_AUTHENTICATION")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.State = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputResendVerifyEmailRequest(ctx context.Context, obj any) (model.ResendVerifyEmailRequest, error) { + var it model.ResendVerifyEmailRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"email", "identifier", "state"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.DisableMultiFactorAuthentication = data - case "ENFORCE_MULTI_FACTOR_AUTHENTICATION": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ENFORCE_MULTI_FACTOR_AUTHENTICATION")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.Email = data + case "identifier": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("identifier")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.EnforceMultiFactorAuthentication = data - case "ROLES": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ROLES")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) + it.Identifier = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Roles = data - case "PROTECTED_ROLES": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("PROTECTED_ROLES")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) + it.State = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputResetPasswordRequest(ctx context.Context, obj any) (model.ResetPasswordRequest, error) { + var it model.ResetPasswordRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"token", "otp", "phone_number", "password", "confirm_password"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "token": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("token")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.ProtectedRoles = data - case "DEFAULT_ROLES": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DEFAULT_ROLES")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) + it.Token = data + case "otp": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("otp")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.DefaultRoles = data - case "JWT_ROLE_CLAIM": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_ROLE_CLAIM")) + it.Otp = data + case "phone_number": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.JwtRoleClaim = data - case "GOOGLE_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("GOOGLE_CLIENT_ID")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.PhoneNumber = data + case "password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("password")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.GoogleClientID = data - case "GOOGLE_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("GOOGLE_CLIENT_SECRET")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Password = data + case "confirm_password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("confirm_password")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.GoogleClientSecret = data - case "GITHUB_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("GITHUB_CLIENT_ID")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.ConfirmPassword = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputSessionQueryRequest(ctx context.Context, obj any) (model.SessionQueryRequest, error) { + var it model.SessionQueryRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"roles", "scope", "state", "required_relations"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "roles": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.GithubClientID = data - case "GITHUB_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("GITHUB_CLIENT_SECRET")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Roles = data + case "scope": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.GithubClientSecret = data - case "FACEBOOK_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("FACEBOOK_CLIENT_ID")) + it.Scope = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.FacebookClientID = data - case "FACEBOOK_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("FACEBOOK_CLIENT_SECRET")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.State = data + case "required_relations": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("required_relations")) + data, err := ec.unmarshalOFgaRelationInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaRelationInputᚄ(ctx, v) if err != nil { return it, err } - it.FacebookClientSecret = data - case "LINKEDIN_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("LINKEDIN_CLIENT_ID")) + it.RequiredRelations = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputSignUpRequest(ctx context.Context, obj any) (model.SignUpRequest, error) { + var it model.SignUpRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"email", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "picture", "password", "confirm_password", "roles", "scope", "redirect_uri", "is_multi_factor_auth_enabled", "state", "app_data"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.LinkedinClientID = data - case "LINKEDIN_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("LINKEDIN_CLIENT_SECRET")) + it.Email = data + case "given_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("given_name")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.LinkedinClientSecret = data - case "APPLE_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("APPLE_CLIENT_ID")) + it.GivenName = data + case "family_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("family_name")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.AppleClientID = data - case "APPLE_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("APPLE_CLIENT_SECRET")) + it.FamilyName = data + case "middle_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("middle_name")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.AppleClientSecret = data - case "DISCORD_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISCORD_CLIENT_ID")) + it.MiddleName = data + case "nickname": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("nickname")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.DiscordClientID = data - case "DISCORD_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISCORD_CLIENT_SECRET")) + it.Nickname = data + case "gender": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gender")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.DiscordClientSecret = data - case "TWITTER_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TWITTER_CLIENT_ID")) + it.Gender = data + case "birthdate": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("birthdate")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.TwitterClientID = data - case "TWITTER_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TWITTER_CLIENT_SECRET")) + it.Birthdate = data + case "phone_number": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.TwitterClientSecret = data - case "MICROSOFT_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("MICROSOFT_CLIENT_ID")) + it.PhoneNumber = data + case "picture": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("picture")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.MicrosoftClientID = data - case "MICROSOFT_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("MICROSOFT_CLIENT_SECRET")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Picture = data + case "password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("password")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.MicrosoftClientSecret = data - case "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Password = data + case "confirm_password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("confirm_password")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.MicrosoftActiveDirectoryTenantID = data - case "TWITCH_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TWITCH_CLIENT_ID")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.ConfirmPassword = data + case "roles": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.TwitchClientID = data - case "TWITCH_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TWITCH_CLIENT_SECRET")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Roles = data + case "scope": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.TwitchClientSecret = data - case "ROBLOX_CLIENT_ID": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ROBLOX_CLIENT_ID")) + it.Scope = data + case "redirect_uri": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("redirect_uri")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.RobloxClientID = data - case "ROBLOX_CLIENT_SECRET": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ROBLOX_CLIENT_SECRET")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.RedirectURI = data + case "is_multi_factor_auth_enabled": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_multi_factor_auth_enabled")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.RobloxClientSecret = data - case "ORGANIZATION_NAME": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ORGANIZATION_NAME")) + it.IsMultiFactorAuthEnabled = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.OrganizationName = data - case "ORGANIZATION_LOGO": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ORGANIZATION_LOGO")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.State = data + case "app_data": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("app_data")) + data, err := ec.unmarshalOMap2map(ctx, v) if err != nil { return it, err } - it.OrganizationLogo = data - case "DEFAULT_AUTHORIZE_RESPONSE_TYPE": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DEFAULT_AUTHORIZE_RESPONSE_TYPE")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.AppData = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputTestEndpointRequest(ctx context.Context, obj any) (model.TestEndpointRequest, error) { + var it model.TestEndpointRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"endpoint", "event_name", "event_description", "headers"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "endpoint": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("endpoint")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.DefaultAuthorizeResponseType = data - case "DEFAULT_AUTHORIZE_RESPONSE_MODE": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DEFAULT_AUTHORIZE_RESPONSE_MODE")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.Endpoint = data + case "event_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.DefaultAuthorizeResponseMode = data - case "DISABLE_PLAYGROUND": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_PLAYGROUND")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.EventName = data + case "event_description": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_description")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.DisablePlayground = data - case "DISABLE_MAIL_OTP_LOGIN": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_MAIL_OTP_LOGIN")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.EventDescription = data + case "headers": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("headers")) + data, err := ec.unmarshalOMap2map(ctx, v) if err != nil { return it, err } - it.DisableMailOtpLogin = data - case "DISABLE_TOTP_LOGIN": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_TOTP_LOGIN")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.Headers = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputUpdateAccessRequest(ctx context.Context, obj any) (model.UpdateAccessRequest, error) { + var it model.UpdateAccessRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"user_id"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "user_id": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("user_id")) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } - it.DisableTotpLogin = data + it.UserID = data } } return it, nil } -func (ec *executionContext) unmarshalInputUpdatePermissionInput(ctx context.Context, obj any) (model.UpdatePermissionInput, error) { - var it model.UpdatePermissionInput +func (ec *executionContext) unmarshalInputUpdateEmailTemplateRequest(ctx context.Context, obj any) (model.UpdateEmailTemplateRequest, error) { + var it model.UpdateEmailTemplateRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"id", "name", "description", "scope_ids", "policy_ids", "decision_strategy"} + fieldsInOrder := [...]string{"id", "event_name", "template", "subject", "design"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -24670,640 +21417,578 @@ func (ec *executionContext) unmarshalInputUpdatePermissionInput(ctx context.Cont return it, err } it.ID = data - case "name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + case "event_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Name = data - case "description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("description")) + it.EventName = data + case "template": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("template")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Description = data - case "scope_ids": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("scope_ids")) - data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) - if err != nil { - return it, err - } - it.ScopeIds = data - case "policy_ids": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("policy_ids")) - data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) + it.Template = data + case "subject": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("subject")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.PolicyIds = data - case "decision_strategy": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("decision_strategy")) + it.Subject = data + case "design": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("design")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.DecisionStrategy = data + it.Design = data } } return it, nil } -func (ec *executionContext) unmarshalInputUpdatePolicyInput(ctx context.Context, obj any) (model.UpdatePolicyInput, error) { - var it model.UpdatePolicyInput +func (ec *executionContext) unmarshalInputUpdateEnvRequest(ctx context.Context, obj any) (model.UpdateEnvRequest, error) { + var it model.UpdateEnvRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"id", "name", "description", "logic", "decision_strategy", "targets"} + fieldsInOrder := [...]string{"ACCESS_TOKEN_EXPIRY_TIME", "ADMIN_SECRET", "CUSTOM_ACCESS_TOKEN_SCRIPT", "OLD_ADMIN_SECRET", "SMTP_HOST", "SMTP_PORT", "SMTP_USERNAME", "SMTP_PASSWORD", "SMTP_LOCAL_NAME", "SENDER_EMAIL", "SENDER_NAME", "JWT_TYPE", "JWT_SECRET", "JWT_PRIVATE_KEY", "JWT_PUBLIC_KEY", "ALLOWED_ORIGINS", "APP_URL", "RESET_PASSWORD_URL", "APP_COOKIE_SECURE", "ADMIN_COOKIE_SECURE", "DISABLE_EMAIL_VERIFICATION", "DISABLE_BASIC_AUTHENTICATION", "DISABLE_MOBILE_BASIC_AUTHENTICATION", "DISABLE_MAGIC_LINK_LOGIN", "DISABLE_LOGIN_PAGE", "DISABLE_SIGN_UP", "DISABLE_REDIS_FOR_ENV", "DISABLE_STRONG_PASSWORD", "DISABLE_MULTI_FACTOR_AUTHENTICATION", "ENFORCE_MULTI_FACTOR_AUTHENTICATION", "ROLES", "PROTECTED_ROLES", "DEFAULT_ROLES", "JWT_ROLE_CLAIM", "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "GITHUB_CLIENT_ID", "GITHUB_CLIENT_SECRET", "FACEBOOK_CLIENT_ID", "FACEBOOK_CLIENT_SECRET", "LINKEDIN_CLIENT_ID", "LINKEDIN_CLIENT_SECRET", "APPLE_CLIENT_ID", "APPLE_CLIENT_SECRET", "DISCORD_CLIENT_ID", "DISCORD_CLIENT_SECRET", "TWITTER_CLIENT_ID", "TWITTER_CLIENT_SECRET", "MICROSOFT_CLIENT_ID", "MICROSOFT_CLIENT_SECRET", "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID", "TWITCH_CLIENT_ID", "TWITCH_CLIENT_SECRET", "ROBLOX_CLIENT_ID", "ROBLOX_CLIENT_SECRET", "ORGANIZATION_NAME", "ORGANIZATION_LOGO", "DEFAULT_AUTHORIZE_RESPONSE_TYPE", "DEFAULT_AUTHORIZE_RESPONSE_MODE", "DISABLE_PLAYGROUND", "DISABLE_MAIL_OTP_LOGIN", "DISABLE_TOTP_LOGIN"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - data, err := ec.unmarshalNID2string(ctx, v) + case "ACCESS_TOKEN_EXPIRY_TIME": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ACCESS_TOKEN_EXPIRY_TIME")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.AccessTokenExpiryTime = data + case "ADMIN_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ADMIN_SECRET")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.AdminSecret = data + case "CUSTOM_ACCESS_TOKEN_SCRIPT": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("CUSTOM_ACCESS_TOKEN_SCRIPT")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.CustomAccessTokenScript = data + case "OLD_ADMIN_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("OLD_ADMIN_SECRET")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.OldAdminSecret = data + case "SMTP_HOST": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_HOST")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.SMTPHost = data + case "SMTP_PORT": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_PORT")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.SMTPPort = data + case "SMTP_USERNAME": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_USERNAME")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.SMTPUsername = data + case "SMTP_PASSWORD": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_PASSWORD")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.SMTPPassword = data + case "SMTP_LOCAL_NAME": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SMTP_LOCAL_NAME")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.SMTPLocalName = data + case "SENDER_EMAIL": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SENDER_EMAIL")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.SenderEmail = data + case "SENDER_NAME": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("SENDER_NAME")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.SenderName = data + case "JWT_TYPE": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_TYPE")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.JwtType = data + case "JWT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_SECRET")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.JwtSecret = data + case "JWT_PRIVATE_KEY": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_PRIVATE_KEY")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.ID = data - case "name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + it.JwtPrivateKey = data + case "JWT_PUBLIC_KEY": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_PUBLIC_KEY")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Name = data - case "description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("description")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.JwtPublicKey = data + case "ALLOWED_ORIGINS": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ALLOWED_ORIGINS")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.Description = data - case "logic": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("logic")) + it.AllowedOrigins = data + case "APP_URL": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("APP_URL")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Logic = data - case "decision_strategy": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("decision_strategy")) + it.AppURL = data + case "RESET_PASSWORD_URL": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("RESET_PASSWORD_URL")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.DecisionStrategy = data - case "targets": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("targets")) - data, err := ec.unmarshalOPolicyTargetInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPolicyTargetInputᚄ(ctx, v) + it.ResetPasswordURL = data + case "APP_COOKIE_SECURE": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("APP_COOKIE_SECURE")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.Targets = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputUpdateProfileRequest(ctx context.Context, obj any) (model.UpdateProfileRequest, error) { - var it model.UpdateProfileRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"old_password", "new_password", "confirm_new_password", "email", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "picture", "is_multi_factor_auth_enabled", "app_data"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "old_password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("old_password")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.AppCookieSecure = data + case "ADMIN_COOKIE_SECURE": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ADMIN_COOKIE_SECURE")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.OldPassword = data - case "new_password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("new_password")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.AdminCookieSecure = data + case "DISABLE_EMAIL_VERIFICATION": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_EMAIL_VERIFICATION")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.NewPassword = data - case "confirm_new_password": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("confirm_new_password")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DisableEmailVerification = data + case "DISABLE_BASIC_AUTHENTICATION": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_BASIC_AUTHENTICATION")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.ConfirmNewPassword = data - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DisableBasicAuthentication = data + case "DISABLE_MOBILE_BASIC_AUTHENTICATION": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_MOBILE_BASIC_AUTHENTICATION")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.Email = data - case "given_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("given_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DisableMobileBasicAuthentication = data + case "DISABLE_MAGIC_LINK_LOGIN": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_MAGIC_LINK_LOGIN")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.GivenName = data - case "family_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("family_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DisableMagicLinkLogin = data + case "DISABLE_LOGIN_PAGE": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_LOGIN_PAGE")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.FamilyName = data - case "middle_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("middle_name")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DisableLoginPage = data + case "DISABLE_SIGN_UP": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_SIGN_UP")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.MiddleName = data - case "nickname": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("nickname")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DisableSignUp = data + case "DISABLE_REDIS_FOR_ENV": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_REDIS_FOR_ENV")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.Nickname = data - case "gender": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gender")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DisableRedisForEnv = data + case "DISABLE_STRONG_PASSWORD": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_STRONG_PASSWORD")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.Gender = data - case "birthdate": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("birthdate")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DisableStrongPassword = data + case "DISABLE_MULTI_FACTOR_AUTHENTICATION": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_MULTI_FACTOR_AUTHENTICATION")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.Birthdate = data - case "phone_number": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DisableMultiFactorAuthentication = data + case "ENFORCE_MULTI_FACTOR_AUTHENTICATION": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ENFORCE_MULTI_FACTOR_AUTHENTICATION")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.PhoneNumber = data - case "picture": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("picture")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.EnforceMultiFactorAuthentication = data + case "ROLES": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ROLES")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.Picture = data - case "is_multi_factor_auth_enabled": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_multi_factor_auth_enabled")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.Roles = data + case "PROTECTED_ROLES": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("PROTECTED_ROLES")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.IsMultiFactorAuthEnabled = data - case "app_data": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("app_data")) - data, err := ec.unmarshalOMap2map(ctx, v) + it.ProtectedRoles = data + case "DEFAULT_ROLES": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DEFAULT_ROLES")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } - it.AppData = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputUpdateResourceInput(ctx context.Context, obj any) (model.UpdateResourceInput, error) { - var it model.UpdateResourceInput - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"id", "name", "description"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - data, err := ec.unmarshalNID2string(ctx, v) + it.DefaultRoles = data + case "JWT_ROLE_CLAIM": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("JWT_ROLE_CLAIM")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.ID = data - case "name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + it.JwtRoleClaim = data + case "GOOGLE_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("GOOGLE_CLIENT_ID")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Name = data - case "description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("description")) + it.GoogleClientID = data + case "GOOGLE_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("GOOGLE_CLIENT_SECRET")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Description = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputUpdateScopeInput(ctx context.Context, obj any) (model.UpdateScopeInput, error) { - var it model.UpdateScopeInput - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"id", "name", "description"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - data, err := ec.unmarshalNID2string(ctx, v) + it.GoogleClientSecret = data + case "GITHUB_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("GITHUB_CLIENT_ID")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.ID = data - case "name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + it.GithubClientID = data + case "GITHUB_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("GITHUB_CLIENT_SECRET")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Name = data - case "description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("description")) + it.GithubClientSecret = data + case "FACEBOOK_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("FACEBOOK_CLIENT_ID")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Description = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputUpdateUserRequest(ctx context.Context, obj any) (model.UpdateUserRequest, error) { - var it model.UpdateUserRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"id", "email", "email_verified", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "phone_number_verified", "picture", "roles", "is_multi_factor_auth_enabled", "app_data"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - data, err := ec.unmarshalNID2string(ctx, v) + it.FacebookClientID = data + case "FACEBOOK_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("FACEBOOK_CLIENT_SECRET")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.FacebookClientSecret = data + case "LINKEDIN_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("LINKEDIN_CLIENT_ID")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.LinkedinClientID = data + case "LINKEDIN_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("LINKEDIN_CLIENT_SECRET")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.ID = data - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + it.LinkedinClientSecret = data + case "APPLE_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("APPLE_CLIENT_ID")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Email = data - case "email_verified": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email_verified")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.AppleClientID = data + case "APPLE_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("APPLE_CLIENT_SECRET")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.EmailVerified = data - case "given_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("given_name")) + it.AppleClientSecret = data + case "DISCORD_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISCORD_CLIENT_ID")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.GivenName = data - case "family_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("family_name")) + it.DiscordClientID = data + case "DISCORD_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISCORD_CLIENT_SECRET")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.FamilyName = data - case "middle_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("middle_name")) + it.DiscordClientSecret = data + case "TWITTER_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TWITTER_CLIENT_ID")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.MiddleName = data - case "nickname": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("nickname")) + it.TwitterClientID = data + case "TWITTER_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TWITTER_CLIENT_SECRET")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Nickname = data - case "gender": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gender")) + it.TwitterClientSecret = data + case "MICROSOFT_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("MICROSOFT_CLIENT_ID")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Gender = data - case "birthdate": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("birthdate")) + it.MicrosoftClientID = data + case "MICROSOFT_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("MICROSOFT_CLIENT_SECRET")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Birthdate = data - case "phone_number": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + it.MicrosoftClientSecret = data + case "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.PhoneNumber = data - case "phone_number_verified": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number_verified")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.MicrosoftActiveDirectoryTenantID = data + case "TWITCH_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TWITCH_CLIENT_ID")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.PhoneNumberVerified = data - case "picture": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("picture")) + it.TwitchClientID = data + case "TWITCH_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TWITCH_CLIENT_SECRET")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Picture = data - case "roles": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) - data, err := ec.unmarshalOString2ᚕᚖstring(ctx, v) + it.TwitchClientSecret = data + case "ROBLOX_CLIENT_ID": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ROBLOX_CLIENT_ID")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Roles = data - case "is_multi_factor_auth_enabled": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_multi_factor_auth_enabled")) - data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + it.RobloxClientID = data + case "ROBLOX_CLIENT_SECRET": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ROBLOX_CLIENT_SECRET")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.IsMultiFactorAuthEnabled = data - case "app_data": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("app_data")) - data, err := ec.unmarshalOMap2map(ctx, v) + it.RobloxClientSecret = data + case "ORGANIZATION_NAME": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ORGANIZATION_NAME")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.AppData = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputUpdateWebhookRequest(ctx context.Context, obj any) (model.UpdateWebhookRequest, error) { - var it model.UpdateWebhookRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"id", "event_name", "event_description", "endpoint", "enabled", "headers"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "id": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - data, err := ec.unmarshalNID2string(ctx, v) + it.OrganizationName = data + case "ORGANIZATION_LOGO": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ORGANIZATION_LOGO")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.ID = data - case "event_name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) + it.OrganizationLogo = data + case "DEFAULT_AUTHORIZE_RESPONSE_TYPE": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DEFAULT_AUTHORIZE_RESPONSE_TYPE")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.EventName = data - case "event_description": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_description")) + it.DefaultAuthorizeResponseType = data + case "DEFAULT_AUTHORIZE_RESPONSE_MODE": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DEFAULT_AUTHORIZE_RESPONSE_MODE")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.EventDescription = data - case "endpoint": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("endpoint")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.DefaultAuthorizeResponseMode = data + case "DISABLE_PLAYGROUND": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_PLAYGROUND")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.Endpoint = data - case "enabled": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("enabled")) + it.DisablePlayground = data + case "DISABLE_MAIL_OTP_LOGIN": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_MAIL_OTP_LOGIN")) data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.Enabled = data - case "headers": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("headers")) - data, err := ec.unmarshalOMap2map(ctx, v) + it.DisableMailOtpLogin = data + case "DISABLE_TOTP_LOGIN": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_TOTP_LOGIN")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.Headers = data + it.DisableTotpLogin = data } } return it, nil } -func (ec *executionContext) unmarshalInputValidateJWTTokenRequest(ctx context.Context, obj any) (model.ValidateJWTTokenRequest, error) { - var it model.ValidateJWTTokenRequest +func (ec *executionContext) unmarshalInputUpdateProfileRequest(ctx context.Context, obj any) (model.UpdateProfileRequest, error) { + var it model.UpdateProfileRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"token_type", "token", "roles", "required_permissions"} + fieldsInOrder := [...]string{"old_password", "new_password", "confirm_new_password", "email", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "picture", "is_multi_factor_auth_enabled", "app_data"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { continue } switch k { - case "token_type": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("token_type")) - data, err := ec.unmarshalNString2string(ctx, v) + case "old_password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("old_password")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.TokenType = data - case "token": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("token")) - data, err := ec.unmarshalNString2string(ctx, v) + it.OldPassword = data + case "new_password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("new_password")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Token = data - case "roles": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) + it.NewPassword = data + case "confirm_new_password": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("confirm_new_password")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Roles = data - case "required_permissions": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("required_permissions")) - data, err := ec.unmarshalOPermissionInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermissionInputᚄ(ctx, v) + it.ConfirmNewPassword = data + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.RequiredPermissions = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputValidateSessionRequest(ctx context.Context, obj any) (model.ValidateSessionRequest, error) { - var it model.ValidateSessionRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"cookie", "roles", "required_permissions"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "cookie": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("cookie")) - data, err := ec.unmarshalNString2string(ctx, v) + it.Email = data + case "given_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("given_name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Cookie = data - case "roles": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) - data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) + it.GivenName = data + case "family_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("family_name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Roles = data - case "required_permissions": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("required_permissions")) - data, err := ec.unmarshalOPermissionInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermissionInputᚄ(ctx, v) + it.FamilyName = data + case "middle_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("middle_name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.RequiredPermissions = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputVerifyEmailRequest(ctx context.Context, obj any) (model.VerifyEmailRequest, error) { - var it model.VerifyEmailRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"token", "state"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "token": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("token")) - data, err := ec.unmarshalNString2string(ctx, v) + it.MiddleName = data + case "nickname": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("nickname")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Token = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + it.Nickname = data + case "gender": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gender")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.State = data - } - } - - return it, nil -} - -func (ec *executionContext) unmarshalInputVerifyOTPRequest(ctx context.Context, obj any) (model.VerifyOTPRequest, error) { - var it model.VerifyOTPRequest - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"email", "phone_number", "otp", "is_totp", "state"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + it.Gender = data + case "birthdate": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("birthdate")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Email = data + it.Birthdate = data case "phone_number": ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) @@ -25311,41 +21996,41 @@ func (ec *executionContext) unmarshalInputVerifyOTPRequest(ctx context.Context, return it, err } it.PhoneNumber = data - case "otp": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("otp")) - data, err := ec.unmarshalNString2string(ctx, v) + case "picture": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("picture")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } - it.Otp = data - case "is_totp": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_totp")) + it.Picture = data + case "is_multi_factor_auth_enabled": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_multi_factor_auth_enabled")) data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } - it.IsTotp = data - case "state": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) - data, err := ec.unmarshalOString2ᚖstring(ctx, v) + it.IsMultiFactorAuthEnabled = data + case "app_data": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("app_data")) + data, err := ec.unmarshalOMap2map(ctx, v) if err != nil { return it, err } - it.State = data + it.AppData = data } } return it, nil } -func (ec *executionContext) unmarshalInputWebhookRequest(ctx context.Context, obj any) (model.WebhookRequest, error) { - var it model.WebhookRequest +func (ec *executionContext) unmarshalInputUpdateUserRequest(ctx context.Context, obj any) (model.UpdateUserRequest, error) { + var it model.UpdateUserRequest asMap := map[string]any{} for k, v := range obj.(map[string]any) { asMap[k] = v } - fieldsInOrder := [...]string{"id"} + fieldsInOrder := [...]string{"id", "email", "email_verified", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "phone_number_verified", "picture", "roles", "is_multi_factor_auth_enabled", "app_data"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -25359,550 +22044,421 @@ func (ec *executionContext) unmarshalInputWebhookRequest(ctx context.Context, ob return it, err } it.ID = data - } - } - - return it, nil -} - -// endregion **************************** input.gotpl ***************************** - -// region ************************** interface.gotpl *************************** - -// endregion ************************** interface.gotpl *************************** - -// region **************************** object.gotpl **************************** - -var auditLogImplementors = []string{"AuditLog"} - -func (ec *executionContext) _AuditLog(ctx context.Context, sel ast.SelectionSet, obj *model.AuditLog) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, auditLogImplementors) - - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("AuditLog") - case "id": - out.Values[i] = ec._AuditLog_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err } - case "actor_id": - out.Values[i] = ec._AuditLog_actor_id(ctx, field, obj) - case "actor_type": - out.Values[i] = ec._AuditLog_actor_type(ctx, field, obj) - case "actor_email": - out.Values[i] = ec._AuditLog_actor_email(ctx, field, obj) - case "action": - out.Values[i] = ec._AuditLog_action(ctx, field, obj) - case "resource_type": - out.Values[i] = ec._AuditLog_resource_type(ctx, field, obj) - case "resource_id": - out.Values[i] = ec._AuditLog_resource_id(ctx, field, obj) - case "ip_address": - out.Values[i] = ec._AuditLog_ip_address(ctx, field, obj) - case "user_agent": - out.Values[i] = ec._AuditLog_user_agent(ctx, field, obj) - case "metadata": - out.Values[i] = ec._AuditLog_metadata(ctx, field, obj) - case "created_at": - out.Values[i] = ec._AuditLog_created_at(ctx, field, obj) - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - - return out -} - -var auditLogsImplementors = []string{"AuditLogs"} - -func (ec *executionContext) _AuditLogs(ctx context.Context, sel ast.SelectionSet, obj *model.AuditLogs) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, auditLogsImplementors) - - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("AuditLogs") - case "pagination": - out.Values[i] = ec._AuditLogs_pagination(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.Email = data + case "email_verified": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email_verified")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + if err != nil { + return it, err } - case "audit_logs": - out.Values[i] = ec._AuditLogs_audit_logs(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.EmailVerified = data + case "given_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("given_name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err } - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - - return out -} - -var authResponseImplementors = []string{"AuthResponse"} - -func (ec *executionContext) _AuthResponse(ctx context.Context, sel ast.SelectionSet, obj *model.AuthResponse) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authResponseImplementors) - - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("AuthResponse") - case "message": - out.Values[i] = ec._AuthResponse_message(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.GivenName = data + case "family_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("family_name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.FamilyName = data + case "middle_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("middle_name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.MiddleName = data + case "nickname": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("nickname")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Nickname = data + case "gender": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gender")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Gender = data + case "birthdate": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("birthdate")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Birthdate = data + case "phone_number": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.PhoneNumber = data + case "phone_number_verified": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number_verified")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + if err != nil { + return it, err } - case "should_show_email_otp_screen": - out.Values[i] = ec._AuthResponse_should_show_email_otp_screen(ctx, field, obj) - case "should_show_mobile_otp_screen": - out.Values[i] = ec._AuthResponse_should_show_mobile_otp_screen(ctx, field, obj) - case "should_show_totp_screen": - out.Values[i] = ec._AuthResponse_should_show_totp_screen(ctx, field, obj) - case "access_token": - out.Values[i] = ec._AuthResponse_access_token(ctx, field, obj) - case "id_token": - out.Values[i] = ec._AuthResponse_id_token(ctx, field, obj) - case "refresh_token": - out.Values[i] = ec._AuthResponse_refresh_token(ctx, field, obj) - case "expires_in": - out.Values[i] = ec._AuthResponse_expires_in(ctx, field, obj) - case "user": - out.Values[i] = ec._AuthResponse_user(ctx, field, obj) - case "authenticator_scanner_image": - out.Values[i] = ec._AuthResponse_authenticator_scanner_image(ctx, field, obj) - case "authenticator_secret": - out.Values[i] = ec._AuthResponse_authenticator_secret(ctx, field, obj) - case "authenticator_recovery_codes": - out.Values[i] = ec._AuthResponse_authenticator_recovery_codes(ctx, field, obj) - default: - panic("unknown field " + strconv.Quote(field.Name)) + it.PhoneNumberVerified = data + case "picture": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("picture")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Picture = data + case "roles": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) + data, err := ec.unmarshalOString2ᚕᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Roles = data + case "is_multi_factor_auth_enabled": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_multi_factor_auth_enabled")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + if err != nil { + return it, err + } + it.IsMultiFactorAuthEnabled = data + case "app_data": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("app_data")) + data, err := ec.unmarshalOMap2map(ctx, v) + if err != nil { + return it, err + } + it.AppData = data } } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - return out + return it, nil } -var authzPermissionImplementors = []string{"AuthzPermission"} - -func (ec *executionContext) _AuthzPermission(ctx context.Context, sel ast.SelectionSet, obj *model.AuthzPermission) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authzPermissionImplementors) +func (ec *executionContext) unmarshalInputUpdateWebhookRequest(ctx context.Context, obj any) (model.UpdateWebhookRequest, error) { + var it model.UpdateWebhookRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("AuthzPermission") + fieldsInOrder := [...]string{"id", "event_name", "event_description", "endpoint", "enabled", "headers"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { case "id": - out.Values[i] = ec._AuthzPermission_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "name": - out.Values[i] = ec._AuthzPermission_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "description": - out.Values[i] = ec._AuthzPermission_description(ctx, field, obj) - case "resource": - out.Values[i] = ec._AuthzPermission_resource(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) + data, err := ec.unmarshalNID2string(ctx, v) + if err != nil { + return it, err } - case "scopes": - out.Values[i] = ec._AuthzPermission_scopes(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.ID = data + case "event_name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err } - case "policies": - out.Values[i] = ec._AuthzPermission_policies(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.EventName = data + case "event_description": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("event_description")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err } - case "decision_strategy": - out.Values[i] = ec._AuthzPermission_decision_strategy(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.EventDescription = data + case "endpoint": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("endpoint")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err } - case "created_at": - out.Values[i] = ec._AuthzPermission_created_at(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.Endpoint = data + case "enabled": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("enabled")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + if err != nil { + return it, err } - case "updated_at": - out.Values[i] = ec._AuthzPermission_updated_at(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.Enabled = data + case "headers": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("headers")) + data, err := ec.unmarshalOMap2map(ctx, v) + if err != nil { + return it, err } - default: - panic("unknown field " + strconv.Quote(field.Name)) + it.Headers = data } } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - return out + return it, nil } -var authzPermissionsImplementors = []string{"AuthzPermissions"} - -func (ec *executionContext) _AuthzPermissions(ctx context.Context, sel ast.SelectionSet, obj *model.AuthzPermissions) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authzPermissionsImplementors) +func (ec *executionContext) unmarshalInputValidateJWTTokenRequest(ctx context.Context, obj any) (model.ValidateJWTTokenRequest, error) { + var it model.ValidateJWTTokenRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("AuthzPermissions") - case "pagination": - out.Values[i] = ec._AuthzPermissions_pagination(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + fieldsInOrder := [...]string{"token_type", "token", "roles", "required_relations"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "token_type": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("token_type")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err } - case "permissions": - out.Values[i] = ec._AuthzPermissions_permissions(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.TokenType = data + case "token": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("token")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err } - default: - panic("unknown field " + strconv.Quote(field.Name)) + it.Token = data + case "roles": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) + if err != nil { + return it, err + } + it.Roles = data + case "required_relations": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("required_relations")) + data, err := ec.unmarshalOFgaRelationInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaRelationInputᚄ(ctx, v) + if err != nil { + return it, err + } + it.RequiredRelations = data } } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - atomic.AddInt32(&ec.deferred, int32(len(deferred))) + return it, nil +} - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) +func (ec *executionContext) unmarshalInputValidateSessionRequest(ctx context.Context, obj any) (model.ValidateSessionRequest, error) { + var it model.ValidateSessionRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"cookie", "roles", "required_relations"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "cookie": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("cookie")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Cookie = data + case "roles": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("roles")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) + if err != nil { + return it, err + } + it.Roles = data + case "required_relations": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("required_relations")) + data, err := ec.unmarshalOFgaRelationInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaRelationInputᚄ(ctx, v) + if err != nil { + return it, err + } + it.RequiredRelations = data + } } - return out + return it, nil } -var authzPoliciesImplementors = []string{"AuthzPolicies"} - -func (ec *executionContext) _AuthzPolicies(ctx context.Context, sel ast.SelectionSet, obj *model.AuthzPolicies) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authzPoliciesImplementors) +func (ec *executionContext) unmarshalInputVerifyEmailRequest(ctx context.Context, obj any) (model.VerifyEmailRequest, error) { + var it model.VerifyEmailRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("AuthzPolicies") - case "pagination": - out.Values[i] = ec._AuthzPolicies_pagination(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + fieldsInOrder := [...]string{"token", "state"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "token": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("token")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err } - case "policies": - out.Values[i] = ec._AuthzPolicies_policies(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.Token = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err } - default: - panic("unknown field " + strconv.Quote(field.Name)) + it.State = data } } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - return out + return it, nil } -var authzPolicyImplementors = []string{"AuthzPolicy"} - -func (ec *executionContext) _AuthzPolicy(ctx context.Context, sel ast.SelectionSet, obj *model.AuthzPolicy) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authzPolicyImplementors) +func (ec *executionContext) unmarshalInputVerifyOTPRequest(ctx context.Context, obj any) (model.VerifyOTPRequest, error) { + var it model.VerifyOTPRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("AuthzPolicy") - case "id": - out.Values[i] = ec._AuthzPolicy_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "name": - out.Values[i] = ec._AuthzPolicy_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "description": - out.Values[i] = ec._AuthzPolicy_description(ctx, field, obj) - case "type": - out.Values[i] = ec._AuthzPolicy_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "logic": - out.Values[i] = ec._AuthzPolicy_logic(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + fieldsInOrder := [...]string{"email", "phone_number", "otp", "is_totp", "state"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err } - case "decision_strategy": - out.Values[i] = ec._AuthzPolicy_decision_strategy(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.Email = data + case "phone_number": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err } - case "targets": - out.Values[i] = ec._AuthzPolicy_targets(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.PhoneNumber = data + case "otp": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("otp")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err } - case "created_at": - out.Values[i] = ec._AuthzPolicy_created_at(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.Otp = data + case "is_totp": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("is_totp")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + if err != nil { + return it, err } - case "updated_at": - out.Values[i] = ec._AuthzPolicy_updated_at(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + it.IsTotp = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err } - default: - panic("unknown field " + strconv.Quote(field.Name)) + it.State = data } } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - return out + return it, nil } -var authzPolicyTargetImplementors = []string{"AuthzPolicyTarget"} - -func (ec *executionContext) _AuthzPolicyTarget(ctx context.Context, sel ast.SelectionSet, obj *model.AuthzPolicyTarget) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authzPolicyTargetImplementors) +func (ec *executionContext) unmarshalInputWebhookRequest(ctx context.Context, obj any) (model.WebhookRequest, error) { + var it model.WebhookRequest + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("AuthzPolicyTarget") + fieldsInOrder := [...]string{"id"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { case "id": - out.Values[i] = ec._AuthzPolicyTarget_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "target_type": - out.Values[i] = ec._AuthzPolicyTarget_target_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "target_value": - out.Values[i] = ec._AuthzPolicyTarget_target_value(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) + data, err := ec.unmarshalNID2string(ctx, v) + if err != nil { + return it, err } - default: - panic("unknown field " + strconv.Quote(field.Name)) + it.ID = data } } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - return out + return it, nil } -var authzResourceImplementors = []string{"AuthzResource"} - -func (ec *executionContext) _AuthzResource(ctx context.Context, sel ast.SelectionSet, obj *model.AuthzResource) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authzResourceImplementors) - - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("AuthzResource") - case "id": - out.Values[i] = ec._AuthzResource_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "name": - out.Values[i] = ec._AuthzResource_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "description": - out.Values[i] = ec._AuthzResource_description(ctx, field, obj) - case "created_at": - out.Values[i] = ec._AuthzResource_created_at(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "updated_at": - out.Values[i] = ec._AuthzResource_updated_at(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } +// endregion **************************** input.gotpl ***************************** - atomic.AddInt32(&ec.deferred, int32(len(deferred))) +// region ************************** interface.gotpl *************************** - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } +// endregion ************************** interface.gotpl *************************** - return out -} +// region **************************** object.gotpl **************************** -var authzResourcesImplementors = []string{"AuthzResources"} +var auditLogImplementors = []string{"AuditLog"} -func (ec *executionContext) _AuthzResources(ctx context.Context, sel ast.SelectionSet, obj *model.AuthzResources) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authzResourcesImplementors) +func (ec *executionContext) _AuditLog(ctx context.Context, sel ast.SelectionSet, obj *model.AuditLog) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, auditLogImplementors) out := graphql.NewFieldSet(fields) deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": - out.Values[i] = graphql.MarshalString("AuthzResources") - case "pagination": - out.Values[i] = ec._AuthzResources_pagination(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "resources": - out.Values[i] = ec._AuthzResources_resources(ctx, field, obj) + out.Values[i] = graphql.MarshalString("AuditLog") + case "id": + out.Values[i] = ec._AuditLog_id(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } + case "actor_id": + out.Values[i] = ec._AuditLog_actor_id(ctx, field, obj) + case "actor_type": + out.Values[i] = ec._AuditLog_actor_type(ctx, field, obj) + case "actor_email": + out.Values[i] = ec._AuditLog_actor_email(ctx, field, obj) + case "action": + out.Values[i] = ec._AuditLog_action(ctx, field, obj) + case "resource_type": + out.Values[i] = ec._AuditLog_resource_type(ctx, field, obj) + case "resource_id": + out.Values[i] = ec._AuditLog_resource_id(ctx, field, obj) + case "ip_address": + out.Values[i] = ec._AuditLog_ip_address(ctx, field, obj) + case "user_agent": + out.Values[i] = ec._AuditLog_user_agent(ctx, field, obj) + case "metadata": + out.Values[i] = ec._AuditLog_metadata(ctx, field, obj) + case "created_at": + out.Values[i] = ec._AuditLog_created_at(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -25926,36 +22482,24 @@ func (ec *executionContext) _AuthzResources(ctx context.Context, sel ast.Selecti return out } -var authzScopeImplementors = []string{"AuthzScope"} +var auditLogsImplementors = []string{"AuditLogs"} -func (ec *executionContext) _AuthzScope(ctx context.Context, sel ast.SelectionSet, obj *model.AuthzScope) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authzScopeImplementors) +func (ec *executionContext) _AuditLogs(ctx context.Context, sel ast.SelectionSet, obj *model.AuditLogs) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, auditLogsImplementors) out := graphql.NewFieldSet(fields) deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": - out.Values[i] = graphql.MarshalString("AuthzScope") - case "id": - out.Values[i] = ec._AuthzScope_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "name": - out.Values[i] = ec._AuthzScope_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "description": - out.Values[i] = ec._AuthzScope_description(ctx, field, obj) - case "created_at": - out.Values[i] = ec._AuthzScope_created_at(ctx, field, obj) + out.Values[i] = graphql.MarshalString("AuditLogs") + case "pagination": + out.Values[i] = ec._AuditLogs_pagination(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } - case "updated_at": - out.Values[i] = ec._AuthzScope_updated_at(ctx, field, obj) + case "audit_logs": + out.Values[i] = ec._AuditLogs_audit_logs(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } @@ -25982,27 +22526,44 @@ func (ec *executionContext) _AuthzScope(ctx context.Context, sel ast.SelectionSe return out } -var authzScopesImplementors = []string{"AuthzScopes"} +var authResponseImplementors = []string{"AuthResponse"} -func (ec *executionContext) _AuthzScopes(ctx context.Context, sel ast.SelectionSet, obj *model.AuthzScopes) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, authzScopesImplementors) +func (ec *executionContext) _AuthResponse(ctx context.Context, sel ast.SelectionSet, obj *model.AuthResponse) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, authResponseImplementors) out := graphql.NewFieldSet(fields) deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": - out.Values[i] = graphql.MarshalString("AuthzScopes") - case "pagination": - out.Values[i] = ec._AuthzScopes_pagination(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "scopes": - out.Values[i] = ec._AuthzScopes_scopes(ctx, field, obj) + out.Values[i] = graphql.MarshalString("AuthResponse") + case "message": + out.Values[i] = ec._AuthResponse_message(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } + case "should_show_email_otp_screen": + out.Values[i] = ec._AuthResponse_should_show_email_otp_screen(ctx, field, obj) + case "should_show_mobile_otp_screen": + out.Values[i] = ec._AuthResponse_should_show_mobile_otp_screen(ctx, field, obj) + case "should_show_totp_screen": + out.Values[i] = ec._AuthResponse_should_show_totp_screen(ctx, field, obj) + case "access_token": + out.Values[i] = ec._AuthResponse_access_token(ctx, field, obj) + case "id_token": + out.Values[i] = ec._AuthResponse_id_token(ctx, field, obj) + case "refresh_token": + out.Values[i] = ec._AuthResponse_refresh_token(ctx, field, obj) + case "expires_in": + out.Values[i] = ec._AuthResponse_expires_in(ctx, field, obj) + case "user": + out.Values[i] = ec._AuthResponse_user(ctx, field, obj) + case "authenticator_scanner_image": + out.Values[i] = ec._AuthResponse_authenticator_scanner_image(ctx, field, obj) + case "authenticator_secret": + out.Values[i] = ec._AuthResponse_authenticator_secret(ctx, field, obj) + case "authenticator_recovery_codes": + out.Values[i] = ec._AuthResponse_authenticator_recovery_codes(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -26249,91 +22810,345 @@ func (ec *executionContext) _Env(ctx context.Context, sel ast.SelectionSet, obj if out.Values[i] == graphql.Null { out.Invalids++ } - case "ENFORCE_MULTI_FACTOR_AUTHENTICATION": - out.Values[i] = ec._Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx, field, obj) + case "ENFORCE_MULTI_FACTOR_AUTHENTICATION": + out.Values[i] = ec._Env_ENFORCE_MULTI_FACTOR_AUTHENTICATION(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "ROLES": + out.Values[i] = ec._Env_ROLES(ctx, field, obj) + case "PROTECTED_ROLES": + out.Values[i] = ec._Env_PROTECTED_ROLES(ctx, field, obj) + case "DEFAULT_ROLES": + out.Values[i] = ec._Env_DEFAULT_ROLES(ctx, field, obj) + case "JWT_ROLE_CLAIM": + out.Values[i] = ec._Env_JWT_ROLE_CLAIM(ctx, field, obj) + case "GOOGLE_CLIENT_ID": + out.Values[i] = ec._Env_GOOGLE_CLIENT_ID(ctx, field, obj) + case "GOOGLE_CLIENT_SECRET": + out.Values[i] = ec._Env_GOOGLE_CLIENT_SECRET(ctx, field, obj) + case "GITHUB_CLIENT_ID": + out.Values[i] = ec._Env_GITHUB_CLIENT_ID(ctx, field, obj) + case "GITHUB_CLIENT_SECRET": + out.Values[i] = ec._Env_GITHUB_CLIENT_SECRET(ctx, field, obj) + case "FACEBOOK_CLIENT_ID": + out.Values[i] = ec._Env_FACEBOOK_CLIENT_ID(ctx, field, obj) + case "FACEBOOK_CLIENT_SECRET": + out.Values[i] = ec._Env_FACEBOOK_CLIENT_SECRET(ctx, field, obj) + case "LINKEDIN_CLIENT_ID": + out.Values[i] = ec._Env_LINKEDIN_CLIENT_ID(ctx, field, obj) + case "LINKEDIN_CLIENT_SECRET": + out.Values[i] = ec._Env_LINKEDIN_CLIENT_SECRET(ctx, field, obj) + case "APPLE_CLIENT_ID": + out.Values[i] = ec._Env_APPLE_CLIENT_ID(ctx, field, obj) + case "APPLE_CLIENT_SECRET": + out.Values[i] = ec._Env_APPLE_CLIENT_SECRET(ctx, field, obj) + case "DISCORD_CLIENT_ID": + out.Values[i] = ec._Env_DISCORD_CLIENT_ID(ctx, field, obj) + case "DISCORD_CLIENT_SECRET": + out.Values[i] = ec._Env_DISCORD_CLIENT_SECRET(ctx, field, obj) + case "TWITTER_CLIENT_ID": + out.Values[i] = ec._Env_TWITTER_CLIENT_ID(ctx, field, obj) + case "TWITTER_CLIENT_SECRET": + out.Values[i] = ec._Env_TWITTER_CLIENT_SECRET(ctx, field, obj) + case "MICROSOFT_CLIENT_ID": + out.Values[i] = ec._Env_MICROSOFT_CLIENT_ID(ctx, field, obj) + case "MICROSOFT_CLIENT_SECRET": + out.Values[i] = ec._Env_MICROSOFT_CLIENT_SECRET(ctx, field, obj) + case "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID": + out.Values[i] = ec._Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(ctx, field, obj) + case "TWITCH_CLIENT_ID": + out.Values[i] = ec._Env_TWITCH_CLIENT_ID(ctx, field, obj) + case "TWITCH_CLIENT_SECRET": + out.Values[i] = ec._Env_TWITCH_CLIENT_SECRET(ctx, field, obj) + case "ROBLOX_CLIENT_ID": + out.Values[i] = ec._Env_ROBLOX_CLIENT_ID(ctx, field, obj) + case "ROBLOX_CLIENT_SECRET": + out.Values[i] = ec._Env_ROBLOX_CLIENT_SECRET(ctx, field, obj) + case "ORGANIZATION_NAME": + out.Values[i] = ec._Env_ORGANIZATION_NAME(ctx, field, obj) + case "ORGANIZATION_LOGO": + out.Values[i] = ec._Env_ORGANIZATION_LOGO(ctx, field, obj) + case "APP_COOKIE_SECURE": + out.Values[i] = ec._Env_APP_COOKIE_SECURE(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "ADMIN_COOKIE_SECURE": + out.Values[i] = ec._Env_ADMIN_COOKIE_SECURE(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "DEFAULT_AUTHORIZE_RESPONSE_TYPE": + out.Values[i] = ec._Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(ctx, field, obj) + case "DEFAULT_AUTHORIZE_RESPONSE_MODE": + out.Values[i] = ec._Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(ctx, field, obj) + case "DISABLE_PLAYGROUND": + out.Values[i] = ec._Env_DISABLE_PLAYGROUND(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "DISABLE_MAIL_OTP_LOGIN": + out.Values[i] = ec._Env_DISABLE_MAIL_OTP_LOGIN(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "DISABLE_TOTP_LOGIN": + out.Values[i] = ec._Env_DISABLE_TOTP_LOGIN(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var errorImplementors = []string{"Error"} + +func (ec *executionContext) _Error(ctx context.Context, sel ast.SelectionSet, obj *model.Error) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, errorImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("Error") + case "message": + out.Values[i] = ec._Error_message(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "reason": + out.Values[i] = ec._Error_reason(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var fgaBatchCheckResponseImplementors = []string{"FgaBatchCheckResponse"} + +func (ec *executionContext) _FgaBatchCheckResponse(ctx context.Context, sel ast.SelectionSet, obj *model.FgaBatchCheckResponse) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, fgaBatchCheckResponseImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("FgaBatchCheckResponse") + case "results": + out.Values[i] = ec._FgaBatchCheckResponse_results(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var fgaCheckResponseImplementors = []string{"FgaCheckResponse"} + +func (ec *executionContext) _FgaCheckResponse(ctx context.Context, sel ast.SelectionSet, obj *model.FgaCheckResponse) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, fgaCheckResponseImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("FgaCheckResponse") + case "allowed": + out.Values[i] = ec._FgaCheckResponse_allowed(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var fgaListObjectsResponseImplementors = []string{"FgaListObjectsResponse"} + +func (ec *executionContext) _FgaListObjectsResponse(ctx context.Context, sel ast.SelectionSet, obj *model.FgaListObjectsResponse) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, fgaListObjectsResponseImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("FgaListObjectsResponse") + case "objects": + out.Values[i] = ec._FgaListObjectsResponse_objects(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } - case "ROLES": - out.Values[i] = ec._Env_ROLES(ctx, field, obj) - case "PROTECTED_ROLES": - out.Values[i] = ec._Env_PROTECTED_ROLES(ctx, field, obj) - case "DEFAULT_ROLES": - out.Values[i] = ec._Env_DEFAULT_ROLES(ctx, field, obj) - case "JWT_ROLE_CLAIM": - out.Values[i] = ec._Env_JWT_ROLE_CLAIM(ctx, field, obj) - case "GOOGLE_CLIENT_ID": - out.Values[i] = ec._Env_GOOGLE_CLIENT_ID(ctx, field, obj) - case "GOOGLE_CLIENT_SECRET": - out.Values[i] = ec._Env_GOOGLE_CLIENT_SECRET(ctx, field, obj) - case "GITHUB_CLIENT_ID": - out.Values[i] = ec._Env_GITHUB_CLIENT_ID(ctx, field, obj) - case "GITHUB_CLIENT_SECRET": - out.Values[i] = ec._Env_GITHUB_CLIENT_SECRET(ctx, field, obj) - case "FACEBOOK_CLIENT_ID": - out.Values[i] = ec._Env_FACEBOOK_CLIENT_ID(ctx, field, obj) - case "FACEBOOK_CLIENT_SECRET": - out.Values[i] = ec._Env_FACEBOOK_CLIENT_SECRET(ctx, field, obj) - case "LINKEDIN_CLIENT_ID": - out.Values[i] = ec._Env_LINKEDIN_CLIENT_ID(ctx, field, obj) - case "LINKEDIN_CLIENT_SECRET": - out.Values[i] = ec._Env_LINKEDIN_CLIENT_SECRET(ctx, field, obj) - case "APPLE_CLIENT_ID": - out.Values[i] = ec._Env_APPLE_CLIENT_ID(ctx, field, obj) - case "APPLE_CLIENT_SECRET": - out.Values[i] = ec._Env_APPLE_CLIENT_SECRET(ctx, field, obj) - case "DISCORD_CLIENT_ID": - out.Values[i] = ec._Env_DISCORD_CLIENT_ID(ctx, field, obj) - case "DISCORD_CLIENT_SECRET": - out.Values[i] = ec._Env_DISCORD_CLIENT_SECRET(ctx, field, obj) - case "TWITTER_CLIENT_ID": - out.Values[i] = ec._Env_TWITTER_CLIENT_ID(ctx, field, obj) - case "TWITTER_CLIENT_SECRET": - out.Values[i] = ec._Env_TWITTER_CLIENT_SECRET(ctx, field, obj) - case "MICROSOFT_CLIENT_ID": - out.Values[i] = ec._Env_MICROSOFT_CLIENT_ID(ctx, field, obj) - case "MICROSOFT_CLIENT_SECRET": - out.Values[i] = ec._Env_MICROSOFT_CLIENT_SECRET(ctx, field, obj) - case "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID": - out.Values[i] = ec._Env_MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID(ctx, field, obj) - case "TWITCH_CLIENT_ID": - out.Values[i] = ec._Env_TWITCH_CLIENT_ID(ctx, field, obj) - case "TWITCH_CLIENT_SECRET": - out.Values[i] = ec._Env_TWITCH_CLIENT_SECRET(ctx, field, obj) - case "ROBLOX_CLIENT_ID": - out.Values[i] = ec._Env_ROBLOX_CLIENT_ID(ctx, field, obj) - case "ROBLOX_CLIENT_SECRET": - out.Values[i] = ec._Env_ROBLOX_CLIENT_SECRET(ctx, field, obj) - case "ORGANIZATION_NAME": - out.Values[i] = ec._Env_ORGANIZATION_NAME(ctx, field, obj) - case "ORGANIZATION_LOGO": - out.Values[i] = ec._Env_ORGANIZATION_LOGO(ctx, field, obj) - case "APP_COOKIE_SECURE": - out.Values[i] = ec._Env_APP_COOKIE_SECURE(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var fgaModelImplementors = []string{"FgaModel"} + +func (ec *executionContext) _FgaModel(ctx context.Context, sel ast.SelectionSet, obj *model.FgaModel) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, fgaModelImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("FgaModel") + case "id": + out.Values[i] = ec._FgaModel_id(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } - case "ADMIN_COOKIE_SECURE": - out.Values[i] = ec._Env_ADMIN_COOKIE_SECURE(ctx, field, obj) + case "dsl": + out.Values[i] = ec._FgaModel_dsl(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } - case "DEFAULT_AUTHORIZE_RESPONSE_TYPE": - out.Values[i] = ec._Env_DEFAULT_AUTHORIZE_RESPONSE_TYPE(ctx, field, obj) - case "DEFAULT_AUTHORIZE_RESPONSE_MODE": - out.Values[i] = ec._Env_DEFAULT_AUTHORIZE_RESPONSE_MODE(ctx, field, obj) - case "DISABLE_PLAYGROUND": - out.Values[i] = ec._Env_DISABLE_PLAYGROUND(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var fgaTupleImplementors = []string{"FgaTuple"} + +func (ec *executionContext) _FgaTuple(ctx context.Context, sel ast.SelectionSet, obj *model.FgaTuple) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, fgaTupleImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("FgaTuple") + case "user": + out.Values[i] = ec._FgaTuple_user(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } - case "DISABLE_MAIL_OTP_LOGIN": - out.Values[i] = ec._Env_DISABLE_MAIL_OTP_LOGIN(ctx, field, obj) + case "relation": + out.Values[i] = ec._FgaTuple_relation(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } - case "DISABLE_TOTP_LOGIN": - out.Values[i] = ec._Env_DISABLE_TOTP_LOGIN(ctx, field, obj) + case "object": + out.Values[i] = ec._FgaTuple_object(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } @@ -26360,27 +23175,24 @@ func (ec *executionContext) _Env(ctx context.Context, sel ast.SelectionSet, obj return out } -var errorImplementors = []string{"Error"} +var fgaTuplesImplementors = []string{"FgaTuples"} -func (ec *executionContext) _Error(ctx context.Context, sel ast.SelectionSet, obj *model.Error) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, errorImplementors) +func (ec *executionContext) _FgaTuples(ctx context.Context, sel ast.SelectionSet, obj *model.FgaTuples) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, fgaTuplesImplementors) out := graphql.NewFieldSet(fields) deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": - out.Values[i] = graphql.MarshalString("Error") - case "message": - out.Values[i] = ec._Error_message(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "reason": - out.Values[i] = ec._Error_reason(ctx, field, obj) + out.Values[i] = graphql.MarshalString("FgaTuples") + case "tuples": + out.Values[i] = ec._FgaTuples_tuples(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } + case "continuation_token": + out.Values[i] = ec._FgaTuples_continuation_token(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -26801,191 +23613,128 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_admin_signup": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__admin_signup(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "_admin_login": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__admin_login(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "_admin_logout": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__admin_logout(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "_update_env": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__update_env(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "_invite_members": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__invite_members(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "_revoke_access": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__revoke_access(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "_enable_access": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__enable_access(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "_generate_jwt_keys": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__generate_jwt_keys(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "_add_webhook": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__add_webhook(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "_update_webhook": + case "_admin_signup": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__update_webhook(ctx, field) + return ec._Mutation__admin_signup(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_delete_webhook": + case "_admin_login": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__delete_webhook(ctx, field) + return ec._Mutation__admin_login(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_test_endpoint": + case "_admin_logout": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__test_endpoint(ctx, field) + return ec._Mutation__admin_logout(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_add_email_template": + case "_update_env": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__add_email_template(ctx, field) + return ec._Mutation__update_env(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_update_email_template": + case "_invite_members": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__update_email_template(ctx, field) + return ec._Mutation__invite_members(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_delete_email_template": + case "_revoke_access": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__delete_email_template(ctx, field) + return ec._Mutation__revoke_access(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_add_resource": + case "_enable_access": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_add_resource(ctx, field) + return ec._Mutation__enable_access(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_update_resource": + case "_generate_jwt_keys": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_update_resource(ctx, field) + return ec._Mutation__generate_jwt_keys(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_delete_resource": + case "_add_webhook": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_delete_resource(ctx, field) + return ec._Mutation__add_webhook(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_add_scope": + case "_update_webhook": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_add_scope(ctx, field) + return ec._Mutation__update_webhook(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_update_scope": + case "_delete_webhook": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_update_scope(ctx, field) + return ec._Mutation__delete_webhook(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_delete_scope": + case "_test_endpoint": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_delete_scope(ctx, field) + return ec._Mutation__test_endpoint(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_add_policy": + case "_add_email_template": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_add_policy(ctx, field) + return ec._Mutation__add_email_template(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_update_policy": + case "_update_email_template": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_update_policy(ctx, field) + return ec._Mutation__update_email_template(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_delete_policy": + case "_delete_email_template": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_delete_policy(ctx, field) + return ec._Mutation__delete_email_template(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_add_permission": + case "_fga_write_model": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_add_permission(ctx, field) + return ec._Mutation__fga_write_model(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_update_permission": + case "_fga_write_tuples": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_update_permission(ctx, field) + return ec._Mutation__fga_write_tuples(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ } - case "_authz_delete_permission": + case "_fga_delete_tuples": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation__authz_delete_permission(ctx, field) + return ec._Mutation__fga_delete_tuples(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ @@ -27067,50 +23816,6 @@ func (ec *executionContext) _Pagination(ctx context.Context, sel ast.SelectionSe return out } -var permissionImplementors = []string{"Permission"} - -func (ec *executionContext) _Permission(ctx context.Context, sel ast.SelectionSet, obj *model.Permission) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, permissionImplementors) - - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("Permission") - case "resource": - out.Values[i] = ec._Permission_resource(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "scope": - out.Values[i] = ec._Permission_scope(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - - return out -} - var queryImplementors = []string{"Query"} func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { @@ -27460,7 +24165,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "_authz_resources": + case "_fga_get_model": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -27469,7 +24174,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Query__authz_resources(ctx, field) + res = ec._Query__fga_get_model(ctx, field) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -27482,7 +24187,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "_authz_scopes": + case "_fga_read_tuples": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -27491,7 +24196,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Query__authz_scopes(ctx, field) + res = ec._Query__fga_read_tuples(ctx, field) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -27504,7 +24209,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "_authz_policies": + case "fga_check": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -27513,7 +24218,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Query__authz_policies(ctx, field) + res = ec._Query_fga_check(ctx, field) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -27526,7 +24231,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "_authz_permissions": + case "fga_batch_check": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -27535,7 +24240,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Query__authz_permissions(ctx, field) + res = ec._Query_fga_batch_check(ctx, field) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -27548,7 +24253,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "permissions": + case "fga_list_objects": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -27557,7 +24262,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Query_permissions(ctx, field) + res = ec._Query_fga_list_objects(ctx, field) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -28527,26 +25232,6 @@ func (ec *executionContext) unmarshalNAddEmailTemplateRequest2githubᚗcomᚋaut return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) unmarshalNAddPermissionInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAddPermissionInput(ctx context.Context, v any) (model.AddPermissionInput, error) { - res, err := ec.unmarshalInputAddPermissionInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) unmarshalNAddPolicyInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAddPolicyInput(ctx context.Context, v any) (model.AddPolicyInput, error) { - res, err := ec.unmarshalInputAddPolicyInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) unmarshalNAddResourceInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAddResourceInput(ctx context.Context, v any) (model.AddResourceInput, error) { - res, err := ec.unmarshalInputAddResourceInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) unmarshalNAddScopeInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAddScopeInput(ctx context.Context, v any) (model.AddScopeInput, error) { - res, err := ec.unmarshalInputAddScopeInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - func (ec *executionContext) unmarshalNAddWebhookRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAddWebhookRequest(ctx context.Context, v any) (model.AddWebhookRequest, error) { res, err := ec.unmarshalInputAddWebhookRequest(ctx, v) return res, graphql.ErrorOnPath(ctx, err) @@ -28644,151 +25329,33 @@ func (ec *executionContext) marshalNAuthResponse2ᚖgithubᚗcomᚋauthorizerdev return ec._AuthResponse(ctx, sel, v) } -func (ec *executionContext) marshalNAuthzPermission2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermission(ctx context.Context, sel ast.SelectionSet, v model.AuthzPermission) graphql.Marshaler { - return ec._AuthzPermission(ctx, sel, &v) -} - -func (ec *executionContext) marshalNAuthzPermission2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermissionᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.AuthzPermission) graphql.Marshaler { - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalNAuthzPermission2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermission(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalNAuthzPermission2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermission(ctx context.Context, sel ast.SelectionSet, v *model.AuthzPermission) graphql.Marshaler { - if v == nil { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "the requested element is null which the schema does not allow") - } - return graphql.Null - } - return ec._AuthzPermission(ctx, sel, v) -} - -func (ec *executionContext) marshalNAuthzPermissions2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermissions(ctx context.Context, sel ast.SelectionSet, v model.AuthzPermissions) graphql.Marshaler { - return ec._AuthzPermissions(ctx, sel, &v) -} - -func (ec *executionContext) marshalNAuthzPermissions2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPermissions(ctx context.Context, sel ast.SelectionSet, v *model.AuthzPermissions) graphql.Marshaler { - if v == nil { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "the requested element is null which the schema does not allow") - } - return graphql.Null - } - return ec._AuthzPermissions(ctx, sel, v) -} - -func (ec *executionContext) marshalNAuthzPolicies2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicies(ctx context.Context, sel ast.SelectionSet, v model.AuthzPolicies) graphql.Marshaler { - return ec._AuthzPolicies(ctx, sel, &v) +func (ec *executionContext) unmarshalNBoolean2bool(ctx context.Context, v any) (bool, error) { + res, err := graphql.UnmarshalBoolean(v) + return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) marshalNAuthzPolicies2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicies(ctx context.Context, sel ast.SelectionSet, v *model.AuthzPolicies) graphql.Marshaler { - if v == nil { +func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { + _ = sel + res := graphql.MarshalBoolean(v) + if res == graphql.Null { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { ec.Errorf(ctx, "the requested element is null which the schema does not allow") } - return graphql.Null } - return ec._AuthzPolicies(ctx, sel, v) -} - -func (ec *executionContext) marshalNAuthzPolicy2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicy(ctx context.Context, sel ast.SelectionSet, v model.AuthzPolicy) graphql.Marshaler { - return ec._AuthzPolicy(ctx, sel, &v) + return res } -func (ec *executionContext) marshalNAuthzPolicy2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicyᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.AuthzPolicy) graphql.Marshaler { - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalNAuthzPolicy2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicy(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret +func (ec *executionContext) unmarshalNDeleteEmailTemplateRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐDeleteEmailTemplateRequest(ctx context.Context, v any) (model.DeleteEmailTemplateRequest, error) { + res, err := ec.unmarshalInputDeleteEmailTemplateRequest(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) marshalNAuthzPolicy2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicy(ctx context.Context, sel ast.SelectionSet, v *model.AuthzPolicy) graphql.Marshaler { - if v == nil { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "the requested element is null which the schema does not allow") - } - return graphql.Null - } - return ec._AuthzPolicy(ctx, sel, v) +func (ec *executionContext) unmarshalNDeleteUserRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐDeleteUserRequest(ctx context.Context, v any) (model.DeleteUserRequest, error) { + res, err := ec.unmarshalInputDeleteUserRequest(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) marshalNAuthzPolicyTarget2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicyTargetᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.AuthzPolicyTarget) graphql.Marshaler { +func (ec *executionContext) marshalNEmailTemplate2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplateᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.EmailTemplate) graphql.Marshaler { ret := make(graphql.Array, len(v)) var wg sync.WaitGroup isLen1 := len(v) == 1 @@ -28812,7 +25379,7 @@ func (ec *executionContext) marshalNAuthzPolicyTarget2ᚕᚖgithubᚗcomᚋautho if !isLen1 { defer wg.Done() } - ret[i] = ec.marshalNAuthzPolicyTarget2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicyTarget(ctx, sel, v[i]) + ret[i] = ec.marshalNEmailTemplate2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplate(ctx, sel, v[i]) } if isLen1 { f(i) @@ -28832,93 +25399,93 @@ func (ec *executionContext) marshalNAuthzPolicyTarget2ᚕᚖgithubᚗcomᚋautho return ret } -func (ec *executionContext) marshalNAuthzPolicyTarget2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzPolicyTarget(ctx context.Context, sel ast.SelectionSet, v *model.AuthzPolicyTarget) graphql.Marshaler { +func (ec *executionContext) marshalNEmailTemplate2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplate(ctx context.Context, sel ast.SelectionSet, v *model.EmailTemplate) graphql.Marshaler { if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "the requested element is null which the schema does not allow") - } - return graphql.Null - } - return ec._AuthzPolicyTarget(ctx, sel, v) -} - -func (ec *executionContext) marshalNAuthzResource2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResource(ctx context.Context, sel ast.SelectionSet, v model.AuthzResource) graphql.Marshaler { - return ec._AuthzResource(ctx, sel, &v) -} - -func (ec *executionContext) marshalNAuthzResource2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResourceᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.AuthzResource) graphql.Marshaler { - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalNAuthzResource2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResource(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) + ec.Errorf(ctx, "the requested element is null which the schema does not allow") } - + return graphql.Null } - wg.Wait() + return ec._EmailTemplate(ctx, sel, v) +} - for _, e := range ret { - if e == graphql.Null { - return graphql.Null +func (ec *executionContext) marshalNEmailTemplates2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplates(ctx context.Context, sel ast.SelectionSet, v model.EmailTemplates) graphql.Marshaler { + return ec._EmailTemplates(ctx, sel, &v) +} + +func (ec *executionContext) marshalNEmailTemplates2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplates(ctx context.Context, sel ast.SelectionSet, v *model.EmailTemplates) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") } + return graphql.Null } + return ec._EmailTemplates(ctx, sel, v) +} - return ret +func (ec *executionContext) marshalNEnv2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEnv(ctx context.Context, sel ast.SelectionSet, v model.Env) graphql.Marshaler { + return ec._Env(ctx, sel, &v) } -func (ec *executionContext) marshalNAuthzResource2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResource(ctx context.Context, sel ast.SelectionSet, v *model.AuthzResource) graphql.Marshaler { +func (ec *executionContext) marshalNEnv2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEnv(ctx context.Context, sel ast.SelectionSet, v *model.Env) graphql.Marshaler { if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { ec.Errorf(ctx, "the requested element is null which the schema does not allow") } return graphql.Null } - return ec._AuthzResource(ctx, sel, v) + return ec._Env(ctx, sel, v) +} + +func (ec *executionContext) unmarshalNFgaBatchCheckInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaBatchCheckInput(ctx context.Context, v any) (model.FgaBatchCheckInput, error) { + res, err := ec.unmarshalInputFgaBatchCheckInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) marshalNAuthzResources2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResources(ctx context.Context, sel ast.SelectionSet, v model.AuthzResources) graphql.Marshaler { - return ec._AuthzResources(ctx, sel, &v) +func (ec *executionContext) marshalNFgaBatchCheckResponse2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaBatchCheckResponse(ctx context.Context, sel ast.SelectionSet, v model.FgaBatchCheckResponse) graphql.Marshaler { + return ec._FgaBatchCheckResponse(ctx, sel, &v) } -func (ec *executionContext) marshalNAuthzResources2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzResources(ctx context.Context, sel ast.SelectionSet, v *model.AuthzResources) graphql.Marshaler { +func (ec *executionContext) marshalNFgaBatchCheckResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaBatchCheckResponse(ctx context.Context, sel ast.SelectionSet, v *model.FgaBatchCheckResponse) graphql.Marshaler { if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { ec.Errorf(ctx, "the requested element is null which the schema does not allow") } return graphql.Null } - return ec._AuthzResources(ctx, sel, v) + return ec._FgaBatchCheckResponse(ctx, sel, v) +} + +func (ec *executionContext) unmarshalNFgaCheckInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckInput(ctx context.Context, v any) (model.FgaCheckInput, error) { + res, err := ec.unmarshalInputFgaCheckInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) unmarshalNFgaCheckPairInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckPairInputᚄ(ctx context.Context, v any) ([]*model.FgaCheckPairInput, error) { + var vSlice []any + vSlice = graphql.CoerceList(v) + var err error + res := make([]*model.FgaCheckPairInput, len(vSlice)) + for i := range vSlice { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) + res[i], err = ec.unmarshalNFgaCheckPairInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckPairInput(ctx, vSlice[i]) + if err != nil { + return nil, err + } + } + return res, nil +} + +func (ec *executionContext) unmarshalNFgaCheckPairInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckPairInput(ctx context.Context, v any) (*model.FgaCheckPairInput, error) { + res, err := ec.unmarshalInputFgaCheckPairInput(ctx, v) + return &res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) marshalNAuthzScope2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScope(ctx context.Context, sel ast.SelectionSet, v model.AuthzScope) graphql.Marshaler { - return ec._AuthzScope(ctx, sel, &v) +func (ec *executionContext) marshalNFgaCheckResponse2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckResponse(ctx context.Context, sel ast.SelectionSet, v model.FgaCheckResponse) graphql.Marshaler { + return ec._FgaCheckResponse(ctx, sel, &v) } -func (ec *executionContext) marshalNAuthzScope2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScopeᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.AuthzScope) graphql.Marshaler { +func (ec *executionContext) marshalNFgaCheckResponse2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckResponseᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.FgaCheckResponse) graphql.Marshaler { ret := make(graphql.Array, len(v)) var wg sync.WaitGroup isLen1 := len(v) == 1 @@ -28942,7 +25509,7 @@ func (ec *executionContext) marshalNAuthzScope2ᚕᚖgithubᚗcomᚋauthorizerde if !isLen1 { defer wg.Done() } - ret[i] = ec.marshalNAuthzScope2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScope(ctx, sel, v[i]) + ret[i] = ec.marshalNFgaCheckResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckResponse(ctx, sel, v[i]) } if isLen1 { f(i) @@ -28962,57 +25529,60 @@ func (ec *executionContext) marshalNAuthzScope2ᚕᚖgithubᚗcomᚋauthorizerde return ret } -func (ec *executionContext) marshalNAuthzScope2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScope(ctx context.Context, sel ast.SelectionSet, v *model.AuthzScope) graphql.Marshaler { +func (ec *executionContext) marshalNFgaCheckResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaCheckResponse(ctx context.Context, sel ast.SelectionSet, v *model.FgaCheckResponse) graphql.Marshaler { if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { ec.Errorf(ctx, "the requested element is null which the schema does not allow") } return graphql.Null } - return ec._AuthzScope(ctx, sel, v) + return ec._FgaCheckResponse(ctx, sel, v) +} + +func (ec *executionContext) unmarshalNFgaListObjectsInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaListObjectsInput(ctx context.Context, v any) (model.FgaListObjectsInput, error) { + res, err := ec.unmarshalInputFgaListObjectsInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) marshalNAuthzScopes2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScopes(ctx context.Context, sel ast.SelectionSet, v model.AuthzScopes) graphql.Marshaler { - return ec._AuthzScopes(ctx, sel, &v) +func (ec *executionContext) marshalNFgaListObjectsResponse2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaListObjectsResponse(ctx context.Context, sel ast.SelectionSet, v model.FgaListObjectsResponse) graphql.Marshaler { + return ec._FgaListObjectsResponse(ctx, sel, &v) } -func (ec *executionContext) marshalNAuthzScopes2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐAuthzScopes(ctx context.Context, sel ast.SelectionSet, v *model.AuthzScopes) graphql.Marshaler { +func (ec *executionContext) marshalNFgaListObjectsResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaListObjectsResponse(ctx context.Context, sel ast.SelectionSet, v *model.FgaListObjectsResponse) graphql.Marshaler { if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { ec.Errorf(ctx, "the requested element is null which the schema does not allow") } return graphql.Null } - return ec._AuthzScopes(ctx, sel, v) + return ec._FgaListObjectsResponse(ctx, sel, v) } -func (ec *executionContext) unmarshalNBoolean2bool(ctx context.Context, v any) (bool, error) { - res, err := graphql.UnmarshalBoolean(v) - return res, graphql.ErrorOnPath(ctx, err) +func (ec *executionContext) marshalNFgaModel2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaModel(ctx context.Context, sel ast.SelectionSet, v model.FgaModel) graphql.Marshaler { + return ec._FgaModel(ctx, sel, &v) } -func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { - _ = sel - res := graphql.MarshalBoolean(v) - if res == graphql.Null { +func (ec *executionContext) marshalNFgaModel2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaModel(ctx context.Context, sel ast.SelectionSet, v *model.FgaModel) graphql.Marshaler { + if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { ec.Errorf(ctx, "the requested element is null which the schema does not allow") } + return graphql.Null } - return res + return ec._FgaModel(ctx, sel, v) } -func (ec *executionContext) unmarshalNDeleteEmailTemplateRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐDeleteEmailTemplateRequest(ctx context.Context, v any) (model.DeleteEmailTemplateRequest, error) { - res, err := ec.unmarshalInputDeleteEmailTemplateRequest(ctx, v) +func (ec *executionContext) unmarshalNFgaReadTuplesInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaReadTuplesInput(ctx context.Context, v any) (model.FgaReadTuplesInput, error) { + res, err := ec.unmarshalInputFgaReadTuplesInput(ctx, v) return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) unmarshalNDeleteUserRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐDeleteUserRequest(ctx context.Context, v any) (model.DeleteUserRequest, error) { - res, err := ec.unmarshalInputDeleteUserRequest(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) +func (ec *executionContext) unmarshalNFgaRelationInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaRelationInput(ctx context.Context, v any) (*model.FgaRelationInput, error) { + res, err := ec.unmarshalInputFgaRelationInput(ctx, v) + return &res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) marshalNEmailTemplate2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplateᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.EmailTemplate) graphql.Marshaler { +func (ec *executionContext) marshalNFgaTuple2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.FgaTuple) graphql.Marshaler { ret := make(graphql.Array, len(v)) var wg sync.WaitGroup isLen1 := len(v) == 1 @@ -29036,7 +25606,7 @@ func (ec *executionContext) marshalNEmailTemplate2ᚕᚖgithubᚗcomᚋauthorize if !isLen1 { defer wg.Done() } - ret[i] = ec.marshalNEmailTemplate2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplate(ctx, sel, v[i]) + ret[i] = ec.marshalNFgaTuple2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTuple(ctx, sel, v[i]) } if isLen1 { f(i) @@ -29056,42 +25626,58 @@ func (ec *executionContext) marshalNEmailTemplate2ᚕᚖgithubᚗcomᚋauthorize return ret } -func (ec *executionContext) marshalNEmailTemplate2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplate(ctx context.Context, sel ast.SelectionSet, v *model.EmailTemplate) graphql.Marshaler { +func (ec *executionContext) marshalNFgaTuple2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTuple(ctx context.Context, sel ast.SelectionSet, v *model.FgaTuple) graphql.Marshaler { if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { ec.Errorf(ctx, "the requested element is null which the schema does not allow") } return graphql.Null } - return ec._EmailTemplate(ctx, sel, v) -} - -func (ec *executionContext) marshalNEmailTemplates2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplates(ctx context.Context, sel ast.SelectionSet, v model.EmailTemplates) graphql.Marshaler { - return ec._EmailTemplates(ctx, sel, &v) + return ec._FgaTuple(ctx, sel, v) } -func (ec *executionContext) marshalNEmailTemplates2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEmailTemplates(ctx context.Context, sel ast.SelectionSet, v *model.EmailTemplates) graphql.Marshaler { - if v == nil { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "the requested element is null which the schema does not allow") +func (ec *executionContext) unmarshalNFgaTupleInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleInputᚄ(ctx context.Context, v any) ([]*model.FgaTupleInput, error) { + var vSlice []any + vSlice = graphql.CoerceList(v) + var err error + res := make([]*model.FgaTupleInput, len(vSlice)) + for i := range vSlice { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) + res[i], err = ec.unmarshalNFgaTupleInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleInput(ctx, vSlice[i]) + if err != nil { + return nil, err } - return graphql.Null } - return ec._EmailTemplates(ctx, sel, v) + return res, nil } -func (ec *executionContext) marshalNEnv2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEnv(ctx context.Context, sel ast.SelectionSet, v model.Env) graphql.Marshaler { - return ec._Env(ctx, sel, &v) +func (ec *executionContext) unmarshalNFgaTupleInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleInput(ctx context.Context, v any) (*model.FgaTupleInput, error) { + res, err := ec.unmarshalInputFgaTupleInput(ctx, v) + return &res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) marshalNEnv2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐEnv(ctx context.Context, sel ast.SelectionSet, v *model.Env) graphql.Marshaler { +func (ec *executionContext) marshalNFgaTuples2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTuples(ctx context.Context, sel ast.SelectionSet, v model.FgaTuples) graphql.Marshaler { + return ec._FgaTuples(ctx, sel, &v) +} + +func (ec *executionContext) marshalNFgaTuples2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTuples(ctx context.Context, sel ast.SelectionSet, v *model.FgaTuples) graphql.Marshaler { if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { ec.Errorf(ctx, "the requested element is null which the schema does not allow") } return graphql.Null } - return ec._Env(ctx, sel, v) + return ec._FgaTuples(ctx, sel, v) +} + +func (ec *executionContext) unmarshalNFgaWriteModelInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaWriteModelInput(ctx context.Context, v any) (model.FgaWriteModelInput, error) { + res, err := ec.unmarshalInputFgaWriteModelInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) unmarshalNFgaWriteTuplesInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaWriteTuplesInput(ctx context.Context, v any) (model.FgaWriteTuplesInput, error) { + res, err := ec.unmarshalInputFgaWriteTuplesInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) } func (ec *executionContext) unmarshalNForgotPasswordRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐForgotPasswordRequest(ctx context.Context, v any) (model.ForgotPasswordRequest, error) { @@ -29153,36 +25739,6 @@ func (ec *executionContext) marshalNID2string(ctx context.Context, sel ast.Selec return res } -func (ec *executionContext) unmarshalNID2ᚕstringᚄ(ctx context.Context, v any) ([]string, error) { - var vSlice []any - vSlice = graphql.CoerceList(v) - var err error - res := make([]string, len(vSlice)) - for i := range vSlice { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) - res[i], err = ec.unmarshalNID2string(ctx, vSlice[i]) - if err != nil { - return nil, err - } - } - return res, nil -} - -func (ec *executionContext) marshalNID2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler { - ret := make(graphql.Array, len(v)) - for i := range v { - ret[i] = ec.marshalNID2string(ctx, sel, v[i]) - } - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - func (ec *executionContext) unmarshalNInt642int64(ctx context.Context, v any) (int64, error) { res, err := graphql.UnmarshalInt64(v) return res, graphql.ErrorOnPath(ctx, err) @@ -29262,85 +25818,6 @@ func (ec *executionContext) marshalNPagination2ᚖgithubᚗcomᚋauthorizerdev return ec._Pagination(ctx, sel, v) } -func (ec *executionContext) marshalNPermission2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermissionᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.Permission) graphql.Marshaler { - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalNPermission2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermission(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalNPermission2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermission(ctx context.Context, sel ast.SelectionSet, v *model.Permission) graphql.Marshaler { - if v == nil { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "the requested element is null which the schema does not allow") - } - return graphql.Null - } - return ec._Permission(ctx, sel, v) -} - -func (ec *executionContext) unmarshalNPermissionInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermissionInput(ctx context.Context, v any) (*model.PermissionInput, error) { - res, err := ec.unmarshalInputPermissionInput(ctx, v) - return &res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) unmarshalNPolicyTargetInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPolicyTargetInputᚄ(ctx context.Context, v any) ([]*model.PolicyTargetInput, error) { - var vSlice []any - vSlice = graphql.CoerceList(v) - var err error - res := make([]*model.PolicyTargetInput, len(vSlice)) - for i := range vSlice { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) - res[i], err = ec.unmarshalNPolicyTargetInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPolicyTargetInput(ctx, vSlice[i]) - if err != nil { - return nil, err - } - } - return res, nil -} - -func (ec *executionContext) unmarshalNPolicyTargetInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPolicyTargetInput(ctx context.Context, v any) (*model.PolicyTargetInput, error) { - res, err := ec.unmarshalInputPolicyTargetInput(ctx, v) - return &res, graphql.ErrorOnPath(ctx, err) -} - func (ec *executionContext) unmarshalNResendOTPRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐResendOTPRequest(ctx context.Context, v any) (model.ResendOTPRequest, error) { res, err := ec.unmarshalInputResendOTPRequest(ctx, v) return res, graphql.ErrorOnPath(ctx, err) @@ -29455,31 +25932,11 @@ func (ec *executionContext) unmarshalNUpdateEnvRequest2githubᚗcomᚋauthorizer return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) unmarshalNUpdatePermissionInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdatePermissionInput(ctx context.Context, v any) (model.UpdatePermissionInput, error) { - res, err := ec.unmarshalInputUpdatePermissionInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) unmarshalNUpdatePolicyInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdatePolicyInput(ctx context.Context, v any) (model.UpdatePolicyInput, error) { - res, err := ec.unmarshalInputUpdatePolicyInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - func (ec *executionContext) unmarshalNUpdateProfileRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdateProfileRequest(ctx context.Context, v any) (model.UpdateProfileRequest, error) { res, err := ec.unmarshalInputUpdateProfileRequest(ctx, v) return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) unmarshalNUpdateResourceInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdateResourceInput(ctx context.Context, v any) (model.UpdateResourceInput, error) { - res, err := ec.unmarshalInputUpdateResourceInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) unmarshalNUpdateScopeInput2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdateScopeInput(ctx context.Context, v any) (model.UpdateScopeInput, error) { - res, err := ec.unmarshalInputUpdateScopeInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - func (ec *executionContext) unmarshalNUpdateUserRequest2githubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐUpdateUserRequest(ctx context.Context, v any) (model.UpdateUserRequest, error) { res, err := ec.unmarshalInputUpdateUserRequest(ctx, v) return res, graphql.ErrorOnPath(ctx, err) @@ -30101,17 +26558,17 @@ func (ec *executionContext) marshalOBoolean2ᚖbool(ctx context.Context, sel ast return res } -func (ec *executionContext) unmarshalOID2ᚕstringᚄ(ctx context.Context, v any) ([]string, error) { +func (ec *executionContext) unmarshalOFgaRelationInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaRelationInputᚄ(ctx context.Context, v any) ([]*model.FgaRelationInput, error) { if v == nil { return nil, nil } var vSlice []any vSlice = graphql.CoerceList(v) var err error - res := make([]string, len(vSlice)) + res := make([]*model.FgaRelationInput, len(vSlice)) for i := range vSlice { ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) - res[i], err = ec.unmarshalNID2string(ctx, vSlice[i]) + res[i], err = ec.unmarshalNFgaRelationInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaRelationInput(ctx, vSlice[i]) if err != nil { return nil, err } @@ -30119,22 +26576,22 @@ func (ec *executionContext) unmarshalOID2ᚕstringᚄ(ctx context.Context, v any return res, nil } -func (ec *executionContext) marshalOID2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler { +func (ec *executionContext) unmarshalOFgaTupleInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleInputᚄ(ctx context.Context, v any) ([]*model.FgaTupleInput, error) { if v == nil { - return graphql.Null - } - ret := make(graphql.Array, len(v)) - for i := range v { - ret[i] = ec.marshalNID2string(ctx, sel, v[i]) + return nil, nil } - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null + var vSlice []any + vSlice = graphql.CoerceList(v) + var err error + res := make([]*model.FgaTupleInput, len(vSlice)) + for i := range vSlice { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) + res[i], err = ec.unmarshalNFgaTupleInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐFgaTupleInput(ctx, vSlice[i]) + if err != nil { + return nil, err } } - - return ret + return res, nil } func (ec *executionContext) unmarshalOID2ᚖstring(ctx context.Context, v any) (*string, error) { @@ -30231,42 +26688,6 @@ func (ec *executionContext) unmarshalOPaginationRequest2ᚖgithubᚗcomᚋauthor return &res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) unmarshalOPermissionInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermissionInputᚄ(ctx context.Context, v any) ([]*model.PermissionInput, error) { - if v == nil { - return nil, nil - } - var vSlice []any - vSlice = graphql.CoerceList(v) - var err error - res := make([]*model.PermissionInput, len(vSlice)) - for i := range vSlice { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) - res[i], err = ec.unmarshalNPermissionInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPermissionInput(ctx, vSlice[i]) - if err != nil { - return nil, err - } - } - return res, nil -} - -func (ec *executionContext) unmarshalOPolicyTargetInput2ᚕᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPolicyTargetInputᚄ(ctx context.Context, v any) ([]*model.PolicyTargetInput, error) { - if v == nil { - return nil, nil - } - var vSlice []any - vSlice = graphql.CoerceList(v) - var err error - res := make([]*model.PolicyTargetInput, len(vSlice)) - for i := range vSlice { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) - res[i], err = ec.unmarshalNPolicyTargetInput2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐPolicyTargetInput(ctx, vSlice[i]) - if err != nil { - return nil, err - } - } - return res, nil -} - func (ec *executionContext) unmarshalOSessionQueryRequest2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋinternalᚋgraphᚋmodelᚐSessionQueryRequest(ctx context.Context, v any) (*model.SessionQueryRequest, error) { if v == nil { return nil, nil diff --git a/internal/graph/model/models_gen.go b/internal/graph/model/models_gen.go index 028a0b1a..ae7f1c4c 100644 --- a/internal/graph/model/models_gen.go +++ b/internal/graph/model/models_gen.go @@ -9,34 +9,6 @@ type AddEmailTemplateRequest struct { Design *string `json:"design,omitempty"` } -type AddPermissionInput struct { - Name string `json:"name"` - Description *string `json:"description,omitempty"` - ResourceID string `json:"resource_id"` - ScopeIds []string `json:"scope_ids"` - PolicyIds []string `json:"policy_ids"` - DecisionStrategy *string `json:"decision_strategy,omitempty"` -} - -type AddPolicyInput struct { - Name string `json:"name"` - Description *string `json:"description,omitempty"` - Type string `json:"type"` - Logic *string `json:"logic,omitempty"` - DecisionStrategy *string `json:"decision_strategy,omitempty"` - Targets []*PolicyTargetInput `json:"targets"` -} - -type AddResourceInput struct { - Name string `json:"name"` - Description *string `json:"description,omitempty"` -} - -type AddScopeInput struct { - Name string `json:"name"` - Description *string `json:"description,omitempty"` -} - type AddWebhookRequest struct { EventName string `json:"event_name"` EventDescription *string `json:"event_description,omitempty"` @@ -87,72 +59,6 @@ type AuthResponse struct { AuthenticatorRecoveryCodes []*string `json:"authenticator_recovery_codes,omitempty"` } -type AuthzPermission struct { - ID string `json:"id"` - Name string `json:"name"` - Description *string `json:"description,omitempty"` - Resource *AuthzResource `json:"resource"` - Scopes []*AuthzScope `json:"scopes"` - Policies []*AuthzPolicy `json:"policies"` - DecisionStrategy string `json:"decision_strategy"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` -} - -type AuthzPermissions struct { - Pagination *Pagination `json:"pagination"` - Permissions []*AuthzPermission `json:"permissions"` -} - -type AuthzPolicies struct { - Pagination *Pagination `json:"pagination"` - Policies []*AuthzPolicy `json:"policies"` -} - -type AuthzPolicy struct { - ID string `json:"id"` - Name string `json:"name"` - Description *string `json:"description,omitempty"` - Type string `json:"type"` - Logic string `json:"logic"` - DecisionStrategy string `json:"decision_strategy"` - Targets []*AuthzPolicyTarget `json:"targets"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` -} - -type AuthzPolicyTarget struct { - ID string `json:"id"` - TargetType string `json:"target_type"` - TargetValue string `json:"target_value"` -} - -type AuthzResource struct { - ID string `json:"id"` - Name string `json:"name"` - Description *string `json:"description,omitempty"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` -} - -type AuthzResources struct { - Pagination *Pagination `json:"pagination"` - Resources []*AuthzResource `json:"resources"` -} - -type AuthzScope struct { - ID string `json:"id"` - Name string `json:"name"` - Description *string `json:"description,omitempty"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` -} - -type AuthzScopes struct { - Pagination *Pagination `json:"pagination"` - Scopes []*AuthzScope `json:"scopes"` -} - type DeleteEmailTemplateRequest struct { ID string `json:"id"` } @@ -255,6 +161,82 @@ type Error struct { Reason string `json:"reason"` } +type FgaBatchCheckInput struct { + Checks []*FgaCheckPairInput `json:"checks"` +} + +type FgaBatchCheckResponse struct { + Results []*FgaCheckResponse `json:"results"` +} + +type FgaCheckInput struct { + Relation string `json:"relation"` + Object string `json:"object"` + ContextualTuples []*FgaTupleInput `json:"contextual_tuples,omitempty"` +} + +type FgaCheckPairInput struct { + Relation string `json:"relation"` + Object string `json:"object"` + ContextualTuples []*FgaTupleInput `json:"contextual_tuples,omitempty"` +} + +type FgaCheckResponse struct { + Allowed bool `json:"allowed"` +} + +type FgaListObjectsInput struct { + Relation string `json:"relation"` + ObjectType string `json:"object_type"` +} + +type FgaListObjectsResponse struct { + Objects []string `json:"objects"` +} + +type FgaModel struct { + ID string `json:"id"` + Dsl string `json:"dsl"` +} + +type FgaReadTuplesInput struct { + User *string `json:"user,omitempty"` + Relation *string `json:"relation,omitempty"` + Object *string `json:"object,omitempty"` + PageSize *int64 `json:"page_size,omitempty"` + ContinuationToken *string `json:"continuation_token,omitempty"` +} + +type FgaRelationInput struct { + Relation string `json:"relation"` + Object string `json:"object"` +} + +type FgaTuple struct { + User string `json:"user"` + Relation string `json:"relation"` + Object string `json:"object"` +} + +type FgaTupleInput struct { + User string `json:"user"` + Relation string `json:"relation"` + Object string `json:"object"` +} + +type FgaTuples struct { + Tuples []*FgaTuple `json:"tuples"` + ContinuationToken *string `json:"continuation_token,omitempty"` +} + +type FgaWriteModelInput struct { + Dsl string `json:"dsl"` +} + +type FgaWriteTuplesInput struct { + Tuples []*FgaTupleInput `json:"tuples"` +} + type ForgotPasswordRequest struct { Email *string `json:"email,omitempty"` PhoneNumber *string `json:"phone_number,omitempty"` @@ -398,21 +380,6 @@ type PaginationRequest struct { Page *int64 `json:"page,omitempty"` } -type Permission struct { - Resource string `json:"resource"` - Scope string `json:"scope"` -} - -type PermissionInput struct { - Resource string `json:"resource"` - Scope string `json:"scope"` -} - -type PolicyTargetInput struct { - TargetType string `json:"target_type"` - TargetValue string `json:"target_value"` -} - type Query struct { } @@ -441,10 +408,10 @@ type Response struct { } type SessionQueryRequest struct { - Roles []string `json:"roles,omitempty"` - Scope []string `json:"scope,omitempty"` - State *string `json:"state,omitempty"` - RequiredPermissions []*PermissionInput `json:"required_permissions,omitempty"` + Roles []string `json:"roles,omitempty"` + Scope []string `json:"scope,omitempty"` + State *string `json:"state,omitempty"` + RequiredRelations []*FgaRelationInput `json:"required_relations,omitempty"` } type SignUpRequest struct { @@ -556,24 +523,6 @@ type UpdateEnvRequest struct { DisableTotpLogin *bool `json:"DISABLE_TOTP_LOGIN,omitempty"` } -type UpdatePermissionInput struct { - ID string `json:"id"` - Name *string `json:"name,omitempty"` - Description *string `json:"description,omitempty"` - ScopeIds []string `json:"scope_ids,omitempty"` - PolicyIds []string `json:"policy_ids,omitempty"` - DecisionStrategy *string `json:"decision_strategy,omitempty"` -} - -type UpdatePolicyInput struct { - ID string `json:"id"` - Name *string `json:"name,omitempty"` - Description *string `json:"description,omitempty"` - Logic *string `json:"logic,omitempty"` - DecisionStrategy *string `json:"decision_strategy,omitempty"` - Targets []*PolicyTargetInput `json:"targets,omitempty"` -} - type UpdateProfileRequest struct { OldPassword *string `json:"old_password,omitempty"` NewPassword *string `json:"new_password,omitempty"` @@ -591,18 +540,6 @@ type UpdateProfileRequest struct { AppData map[string]any `json:"app_data,omitempty"` } -type UpdateResourceInput struct { - ID string `json:"id"` - Name *string `json:"name,omitempty"` - Description *string `json:"description,omitempty"` -} - -type UpdateScopeInput struct { - ID string `json:"id"` - Name *string `json:"name,omitempty"` - Description *string `json:"description,omitempty"` -} - type UpdateUserRequest struct { ID string `json:"id"` Email *string `json:"email,omitempty"` @@ -659,10 +596,10 @@ type Users struct { } type ValidateJWTTokenRequest struct { - TokenType string `json:"token_type"` - Token string `json:"token"` - Roles []string `json:"roles,omitempty"` - RequiredPermissions []*PermissionInput `json:"required_permissions,omitempty"` + TokenType string `json:"token_type"` + Token string `json:"token"` + Roles []string `json:"roles,omitempty"` + RequiredRelations []*FgaRelationInput `json:"required_relations,omitempty"` } type ValidateJWTTokenResponse struct { @@ -671,9 +608,9 @@ type ValidateJWTTokenResponse struct { } type ValidateSessionRequest struct { - Cookie string `json:"cookie"` - Roles []string `json:"roles,omitempty"` - RequiredPermissions []*PermissionInput `json:"required_permissions,omitempty"` + Cookie string `json:"cookie"` + Roles []string `json:"roles,omitempty"` + RequiredRelations []*FgaRelationInput `json:"required_relations,omitempty"` } type ValidateSessionResponse struct { diff --git a/internal/graph/schema.graphqls b/internal/graph/schema.graphqls index 152f1ab8..af2598a8 100644 --- a/internal/graph/schema.graphqls +++ b/internal/graph/schema.graphqls @@ -110,6 +110,44 @@ type Response { message: String! } +# ---- Fine-grained authorization (FGA) types ---- + +# FgaTuple is a single relationship: user is related to object via relation. +# Identifiers follow OpenFGA conventions: user "user:alice" (or userset +# "role:admin#assignee"), object "document:1". +type FgaTuple { + user: String! + relation: String! + object: String! +} + +# FgaModel describes an authorization model (id + DSL form). +type FgaModel { + id: String! + dsl: String! +} + +# FgaTuples is a page of tuples plus a continuation token (empty when exhausted). +type FgaTuples { + tuples: [FgaTuple!]! + continuation_token: String +} + +# FgaCheckResponse is the result of a single relationship check. +type FgaCheckResponse { + allowed: Boolean! +} + +# FgaBatchCheckResponse is the positionally-aligned result of a batch check. +type FgaBatchCheckResponse { + results: [FgaCheckResponse!]! +} + +# FgaListObjectsResponse lists fully-qualified object ids the caller relates to. +type FgaListObjectsResponse { + objects: [String!]! +} + type ForgotPasswordResponse { message: String! should_show_mobile_otp_screen: Boolean @@ -510,10 +548,10 @@ input SessionQueryRequest { # when a session already exists and the login UI auto-detects it, # passing state ensures the authorization code state is properly stored state: String - # required_permissions is an optional list of resource:scope pairs that - # must all be granted to the principal. If any is denied the query returns - # unauthorized (AND semantics, matching the roles filter). - required_permissions: [PermissionInput!] + # required_relations gates the session on fine-grained authorization. + # Each (relation, object) is checked against the authenticated caller with + # AND semantics, fail-closed. Requires --authorization-engine=fga. + required_relations: [FgaRelationInput!] } input PaginationRequest { @@ -542,13 +580,17 @@ input ValidateJWTTokenRequest { token_type: String! token: String! roles: [String!] - required_permissions: [PermissionInput!] + # required_relations gates validation on fine-grained authorization. + # AND semantics, fail-closed. Requires --authorization-engine=fga. + required_relations: [FgaRelationInput!] } input ValidateSessionRequest { cookie: String! roles: [String!] - required_permissions: [PermissionInput!] + # required_relations gates validation on fine-grained authorization. + # AND semantics, fail-closed. Requires --authorization-engine=fga. + required_relations: [FgaRelationInput!] } input GenerateJWTKeysRequest { @@ -647,143 +689,71 @@ input GetUserRequest { email: String } -type AuthzResource { - id: ID! - name: String! - description: String - created_at: Int64! - updated_at: Int64! -} +# ---- Fine-grained authorization (FGA) inputs ---- -type AuthzResources { - pagination: Pagination! - resources: [AuthzResource!]! +# FgaTupleInput is a single relationship tuple supplied by an admin for write / +# delete / read operations. +input FgaTupleInput { + user: String! + relation: String! + object: String! } -type AuthzScope { - id: ID! - name: String! - description: String - created_at: Int64! - updated_at: Int64! +# FgaWriteModelInput installs a new authorization model from its DSL form. +input FgaWriteModelInput { + dsl: String! } -type AuthzScopes { - pagination: Pagination! - scopes: [AuthzScope!]! +# FgaWriteTuplesInput is used for both writing and deleting tuples. +input FgaWriteTuplesInput { + tuples: [FgaTupleInput!]! } -type AuthzPolicyTarget { - id: ID! - target_type: String! - target_value: String! +# FgaReadTuplesInput is a paginated, optionally-filtered tuple read. Any empty +# field acts as a wildcard for that position. +input FgaReadTuplesInput { + user: String + relation: String + object: String + page_size: Int64 + continuation_token: String } -type AuthzPolicy { - id: ID! - name: String! - description: String - type: String! - logic: String! - decision_strategy: String! - targets: [AuthzPolicyTarget!]! - created_at: Int64! - updated_at: Int64! +# FgaCheckInput asks "is the authenticated caller related to object via +# relation?". The caller (user) is pinned server-side from the auth token and is +# NEVER taken from client input. Only relation, object and optional contextual +# tuples are accepted from the client. +input FgaCheckInput { + relation: String! + object: String! + contextual_tuples: [FgaTupleInput!] } -type AuthzPolicies { - pagination: Pagination! - policies: [AuthzPolicy!]! +# FgaBatchCheckInput evaluates multiple relation/object pairs for the +# authenticated caller (principal pinned server-side). +input FgaBatchCheckInput { + checks: [FgaCheckPairInput!]! } -type AuthzPermission { - id: ID! - name: String! - description: String - resource: AuthzResource! - scopes: [AuthzScope!]! - policies: [AuthzPolicy!]! - decision_strategy: String! - created_at: Int64! - updated_at: Int64! +# FgaCheckPairInput is one relation/object pair within a batch check. +input FgaCheckPairInput { + relation: String! + object: String! + contextual_tuples: [FgaTupleInput!] } -type AuthzPermissions { - pagination: Pagination! - permissions: [AuthzPermission!]! -} - -type Permission { - resource: String! - scope: String! -} - -input AddResourceInput { - name: String! - description: String -} - -input UpdateResourceInput { - id: ID! - name: String - description: String -} - -input AddScopeInput { - name: String! - description: String -} - -input UpdateScopeInput { - id: ID! - name: String - description: String -} - -input PolicyTargetInput { - target_type: String! - target_value: String! -} - -input AddPolicyInput { - name: String! - description: String - type: String! - logic: String - decision_strategy: String - targets: [PolicyTargetInput!]! -} - -input UpdatePolicyInput { - id: ID! - name: String - description: String - logic: String - decision_strategy: String - targets: [PolicyTargetInput!] -} - -input AddPermissionInput { - name: String! - description: String - resource_id: ID! - scope_ids: [ID!]! - policy_ids: [ID!]! - decision_strategy: String -} - -input UpdatePermissionInput { - id: ID! - name: String - description: String - scope_ids: [ID!] - policy_ids: [ID!] - decision_strategy: String +# FgaListObjectsInput enumerates objects of type object_type the authenticated +# caller relates to via relation (principal pinned server-side). +input FgaListObjectsInput { + relation: String! + object_type: String! } -input PermissionInput { - resource: String! - scope: String! +# FgaRelationInput is a (relation, object) requirement evaluated against the +# authenticated caller during session/validate. AND semantics, fail-closed. +input FgaRelationInput { + relation: String! + object: String! } type Mutation { @@ -825,22 +795,10 @@ type Mutation { _add_email_template(params: AddEmailTemplateRequest!): Response! _update_email_template(params: UpdateEmailTemplateRequest!): Response! _delete_email_template(params: DeleteEmailTemplateRequest!): Response! - # Authorization: Resources - _authz_add_resource(params: AddResourceInput!): AuthzResource! - _authz_update_resource(params: UpdateResourceInput!): AuthzResource! - _authz_delete_resource(id: ID!): Response! - # Authorization: Scopes - _authz_add_scope(params: AddScopeInput!): AuthzScope! - _authz_update_scope(params: UpdateScopeInput!): AuthzScope! - _authz_delete_scope(id: ID!): Response! - # Authorization: Policies - _authz_add_policy(params: AddPolicyInput!): AuthzPolicy! - _authz_update_policy(params: UpdatePolicyInput!): AuthzPolicy! - _authz_delete_policy(id: ID!): Response! - # Authorization: Permissions - _authz_add_permission(params: AddPermissionInput!): AuthzPermission! - _authz_update_permission(params: UpdatePermissionInput!): AuthzPermission! - _authz_delete_permission(id: ID!): Response! + # FGA admin mutations (super-admin only) + _fga_write_model(params: FgaWriteModelInput!): FgaModel! + _fga_write_tuples(params: FgaWriteTuplesInput!): Response! + _fga_delete_tuples(params: FgaWriteTuplesInput!): Response! } type Query { @@ -861,11 +819,11 @@ type Query { _webhook_logs(params: ListWebhookLogRequest): WebhookLogs! _email_templates(params: PaginatedRequest): EmailTemplates! _audit_logs(params: ListAuditLogRequest): AuditLogs! - # Authorization: Admin queries - _authz_resources(params: PaginatedRequest): AuthzResources! - _authz_scopes(params: PaginatedRequest): AuthzScopes! - _authz_policies(params: PaginatedRequest): AuthzPolicies! - _authz_permissions(params: PaginatedRequest): AuthzPermissions! - # Authorization: User-facing queries - permissions: [Permission!]! + # FGA admin queries (super-admin only) + _fga_get_model: FgaModel! + _fga_read_tuples(params: FgaReadTuplesInput!): FgaTuples! + # FGA runtime queries (authenticated caller; principal pinned server-side) + fga_check(params: FgaCheckInput!): FgaCheckResponse! + fga_batch_check(params: FgaBatchCheckInput!): FgaBatchCheckResponse! + fga_list_objects(params: FgaListObjectsInput!): FgaListObjectsResponse! } diff --git a/internal/graph/schema.resolvers.go b/internal/graph/schema.resolvers.go index 12c099c2..54795cc1 100644 --- a/internal/graph/schema.resolvers.go +++ b/internal/graph/schema.resolvers.go @@ -172,64 +172,19 @@ func (r *mutationResolver) DeleteEmailTemplate(ctx context.Context, params model return r.GraphQLProvider.DeleteEmailTemplate(ctx, ¶ms) } -// AuthzAddResource is the resolver for the _authz_add_resource field. -func (r *mutationResolver) AuthzAddResource(ctx context.Context, params model.AddResourceInput) (*model.AuthzResource, error) { - return r.GraphQLProvider.AuthzAddResource(ctx, ¶ms) +// FgaWriteModel is the resolver for the _fga_write_model field. +func (r *mutationResolver) FgaWriteModel(ctx context.Context, params model.FgaWriteModelInput) (*model.FgaModel, error) { + return r.GraphQLProvider.FgaWriteModel(ctx, ¶ms) } -// AuthzUpdateResource is the resolver for the _authz_update_resource field. -func (r *mutationResolver) AuthzUpdateResource(ctx context.Context, params model.UpdateResourceInput) (*model.AuthzResource, error) { - return r.GraphQLProvider.AuthzUpdateResource(ctx, ¶ms) +// FgaWriteTuples is the resolver for the _fga_write_tuples field. +func (r *mutationResolver) FgaWriteTuples(ctx context.Context, params model.FgaWriteTuplesInput) (*model.Response, error) { + return r.GraphQLProvider.FgaWriteTuples(ctx, ¶ms) } -// AuthzDeleteResource is the resolver for the _authz_delete_resource field. -func (r *mutationResolver) AuthzDeleteResource(ctx context.Context, id string) (*model.Response, error) { - return r.GraphQLProvider.AuthzDeleteResource(ctx, id) -} - -// AuthzAddScope is the resolver for the _authz_add_scope field. -func (r *mutationResolver) AuthzAddScope(ctx context.Context, params model.AddScopeInput) (*model.AuthzScope, error) { - return r.GraphQLProvider.AuthzAddScope(ctx, ¶ms) -} - -// AuthzUpdateScope is the resolver for the _authz_update_scope field. -func (r *mutationResolver) AuthzUpdateScope(ctx context.Context, params model.UpdateScopeInput) (*model.AuthzScope, error) { - return r.GraphQLProvider.AuthzUpdateScope(ctx, ¶ms) -} - -// AuthzDeleteScope is the resolver for the _authz_delete_scope field. -func (r *mutationResolver) AuthzDeleteScope(ctx context.Context, id string) (*model.Response, error) { - return r.GraphQLProvider.AuthzDeleteScope(ctx, id) -} - -// AuthzAddPolicy is the resolver for the _authz_add_policy field. -func (r *mutationResolver) AuthzAddPolicy(ctx context.Context, params model.AddPolicyInput) (*model.AuthzPolicy, error) { - return r.GraphQLProvider.AuthzAddPolicy(ctx, ¶ms) -} - -// AuthzUpdatePolicy is the resolver for the _authz_update_policy field. -func (r *mutationResolver) AuthzUpdatePolicy(ctx context.Context, params model.UpdatePolicyInput) (*model.AuthzPolicy, error) { - return r.GraphQLProvider.AuthzUpdatePolicy(ctx, ¶ms) -} - -// AuthzDeletePolicy is the resolver for the _authz_delete_policy field. -func (r *mutationResolver) AuthzDeletePolicy(ctx context.Context, id string) (*model.Response, error) { - return r.GraphQLProvider.AuthzDeletePolicy(ctx, id) -} - -// AuthzAddPermission is the resolver for the _authz_add_permission field. -func (r *mutationResolver) AuthzAddPermission(ctx context.Context, params model.AddPermissionInput) (*model.AuthzPermission, error) { - return r.GraphQLProvider.AuthzAddPermission(ctx, ¶ms) -} - -// AuthzUpdatePermission is the resolver for the _authz_update_permission field. -func (r *mutationResolver) AuthzUpdatePermission(ctx context.Context, params model.UpdatePermissionInput) (*model.AuthzPermission, error) { - return r.GraphQLProvider.AuthzUpdatePermission(ctx, ¶ms) -} - -// AuthzDeletePermission is the resolver for the _authz_delete_permission field. -func (r *mutationResolver) AuthzDeletePermission(ctx context.Context, id string) (*model.Response, error) { - return r.GraphQLProvider.AuthzDeletePermission(ctx, id) +// FgaDeleteTuples is the resolver for the _fga_delete_tuples field. +func (r *mutationResolver) FgaDeleteTuples(ctx context.Context, params model.FgaWriteTuplesInput) (*model.Response, error) { + return r.GraphQLProvider.FgaDeleteTuples(ctx, ¶ms) } // Meta is the resolver for the meta field. @@ -307,29 +262,29 @@ func (r *queryResolver) AuditLogs(ctx context.Context, params *model.ListAuditLo return r.GraphQLProvider.AuditLogs(ctx, params) } -// AuthzResources is the resolver for the _authz_resources field. -func (r *queryResolver) AuthzResources(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzResources, error) { - return r.GraphQLProvider.AuthzResources(ctx, params) +// FgaGetModel is the resolver for the _fga_get_model field. +func (r *queryResolver) FgaGetModel(ctx context.Context) (*model.FgaModel, error) { + return r.GraphQLProvider.FgaGetModel(ctx) } -// AuthzScopes is the resolver for the _authz_scopes field. -func (r *queryResolver) AuthzScopes(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzScopes, error) { - return r.GraphQLProvider.AuthzScopes(ctx, params) +// FgaReadTuples is the resolver for the _fga_read_tuples field. +func (r *queryResolver) FgaReadTuples(ctx context.Context, params model.FgaReadTuplesInput) (*model.FgaTuples, error) { + return r.GraphQLProvider.FgaReadTuples(ctx, ¶ms) } -// AuthzPolicies is the resolver for the _authz_policies field. -func (r *queryResolver) AuthzPolicies(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzPolicies, error) { - return r.GraphQLProvider.AuthzPolicies(ctx, params) +// FgaCheck is the resolver for the fga_check field. +func (r *queryResolver) FgaCheck(ctx context.Context, params model.FgaCheckInput) (*model.FgaCheckResponse, error) { + return r.GraphQLProvider.FgaCheck(ctx, ¶ms) } -// AuthzPermissions is the resolver for the _authz_permissions field. -func (r *queryResolver) AuthzPermissions(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzPermissions, error) { - return r.GraphQLProvider.AuthzPermissions(ctx, params) +// FgaBatchCheck is the resolver for the fga_batch_check field. +func (r *queryResolver) FgaBatchCheck(ctx context.Context, params model.FgaBatchCheckInput) (*model.FgaBatchCheckResponse, error) { + return r.GraphQLProvider.FgaBatchCheck(ctx, ¶ms) } -// Permissions is the resolver for the permissions field. -func (r *queryResolver) Permissions(ctx context.Context) ([]*model.Permission, error) { - return r.GraphQLProvider.Permissions(ctx) +// FgaListObjects is the resolver for the fga_list_objects field. +func (r *queryResolver) FgaListObjects(ctx context.Context, params model.FgaListObjectsInput) (*model.FgaListObjectsResponse, error) { + return r.GraphQLProvider.FgaListObjects(ctx, ¶ms) } // Mutation returns generated.MutationResolver implementation. diff --git a/internal/graphql/authz_add_permission.go b/internal/graphql/authz_add_permission.go deleted file mode 100644 index 7b9bdd37..00000000 --- a/internal/graphql/authz_add_permission.go +++ /dev/null @@ -1,176 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - "unicode" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzAddPermission is the method to create a new authorization permission -// binding a resource to scopes and policies. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzAddPermission(ctx context.Context, params *model.AddPermissionInput) (*model.AuthzPermission, error) { - log := g.Log.With().Str("func", "AuthzAddPermission").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - name := strings.TrimSpace(params.Name) - if name == "" { - return nil, fmt.Errorf("permission name is required") - } - if len(name) > constants.MaxAuthzIdentifierLength { - return nil, fmt.Errorf("invalid name: must be %d characters or fewer", constants.MaxAuthzIdentifierLength) - } - for _, r := range name { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '-' && r != '_' { - return nil, fmt.Errorf("invalid name: must contain only letters, digits, hyphens, and underscores") - } - } - - if strings.TrimSpace(params.ResourceID) == "" { - return nil, fmt.Errorf("resource_id is required") - } - - if len(params.ScopeIds) == 0 { - return nil, fmt.Errorf("at least one scope_id is required") - } - - if len(params.PolicyIds) == 0 { - return nil, fmt.Errorf("at least one policy_id is required") - } - - description := "" - if params.Description != nil { - description = *params.Description - } - - decisionStrategy := constants.DecisionStrategyAffirmative - if params.DecisionStrategy != nil { - decisionStrategy = *params.DecisionStrategy - } - if decisionStrategy != constants.DecisionStrategyAffirmative && decisionStrategy != constants.DecisionStrategyUnanimous { - return nil, fmt.Errorf("invalid decision strategy: must be '%s' or '%s'", - constants.DecisionStrategyAffirmative, constants.DecisionStrategyUnanimous) - } - - // Verify resource exists - resource, err := g.StorageProvider.GetResourceByID(ctx, params.ResourceID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get resource by ID") - return nil, fmt.Errorf("resource not found: %s", params.ResourceID) - } - - permission, err := g.StorageProvider.AddPermission(ctx, &schemas.Permission{ - Name: name, - Description: description, - ResourceID: params.ResourceID, - DecisionStrategy: decisionStrategy, - }) - if err != nil { - log.Debug().Err(err).Msg("Failed to add permission") - return nil, err - } - - // Attach scopes + policies. The storage layer does not expose transactions - // across these provider-level calls, so a failure mid-attach would leave - // the newly created permission row orphaned (present but with partial or - // no scope/policy links). To keep the system consistent we compensate by - // deleting the permission when any attach step fails. The delete uses - // context.Background() so it survives request cancellation (mirrors the - // pattern already used for InvalidateCache below). If the compensation - // itself fails, log at ERROR level so operators can manually clean up, - // but still return the ORIGINAL error — that is the failure operators - // need to see first. - apiScopes, apiPolicies, err := g.attachPermissionScopesAndPolicies(ctx, permission.ID, params) - if err != nil { - if delErr := g.StorageProvider.DeletePermission(context.Background(), permission.ID); delErr != nil { - log.Error(). - Err(delErr). - Str("permission_id", permission.ID). - Msg("failed to roll back orphaned permission after partial AddPermission failure; manual cleanup required") - } - return nil, err - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzPermissionCreatedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzPermission, - ResourceID: permission.ID, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return permission.AsAPIPermission(resource.AsAPIResource(), apiScopes, apiPolicies), nil -} - -// attachPermissionScopesAndPolicies creates PermissionScope and PermissionPolicy -// link rows for a newly added permission and returns the API-shape scope and -// policy slices used to build the GraphQL response. It returns the first error -// encountered so the caller can roll back the permission. -func (g *graphqlProvider) attachPermissionScopesAndPolicies( - ctx context.Context, - permissionID string, - params *model.AddPermissionInput, -) ([]*model.AuthzScope, []*model.AuthzPolicy, error) { - log := g.Log.With().Str("func", "attachPermissionScopesAndPolicies").Logger() - - apiScopes := make([]*model.AuthzScope, 0, len(params.ScopeIds)) - for _, scopeID := range params.ScopeIds { - _, err := g.StorageProvider.AddPermissionScope(ctx, &schemas.PermissionScope{ - PermissionID: permissionID, - ScopeID: scopeID, - }) - if err != nil { - log.Debug().Err(err).Str("scope_id", scopeID).Msg("Failed to add permission scope") - return nil, nil, err - } - scope, err := g.StorageProvider.GetScopeByID(ctx, scopeID) - if err != nil { - log.Debug().Err(err).Str("scope_id", scopeID).Msg("Failed to get scope by ID") - return nil, nil, err - } - apiScopes = append(apiScopes, scope.AsAPIScope()) - } - - apiPolicies := make([]*model.AuthzPolicy, 0, len(params.PolicyIds)) - for _, policyID := range params.PolicyIds { - _, err := g.StorageProvider.AddPermissionPolicy(ctx, &schemas.PermissionPolicy{ - PermissionID: permissionID, - PolicyID: policyID, - }) - if err != nil { - log.Debug().Err(err).Str("policy_id", policyID).Msg("Failed to add permission policy") - return nil, nil, err - } - policy, err := g.StorageProvider.GetPolicyByID(ctx, policyID) - if err != nil { - log.Debug().Err(err).Str("policy_id", policyID).Msg("Failed to get policy by ID") - return nil, nil, err - } - targets, err := g.StorageProvider.GetPolicyTargets(ctx, policyID) - if err != nil { - log.Debug().Err(err).Str("policy_id", policyID).Msg("Failed to get policy targets") - return nil, nil, err - } - apiPolicies = append(apiPolicies, policy.AsAPIPolicy(targets)) - } - - return apiScopes, apiPolicies, nil -} diff --git a/internal/graphql/authz_add_policy.go b/internal/graphql/authz_add_policy.go deleted file mode 100644 index 51296499..00000000 --- a/internal/graphql/authz_add_policy.go +++ /dev/null @@ -1,122 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - "unicode" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzAddPolicy is the method to create a new authorization policy with targets. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzAddPolicy(ctx context.Context, params *model.AddPolicyInput) (*model.AuthzPolicy, error) { - log := g.Log.With().Str("func", "AuthzAddPolicy").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - name := strings.TrimSpace(params.Name) - if name == "" { - return nil, fmt.Errorf("policy name is required") - } - if len(name) > constants.MaxAuthzIdentifierLength { - return nil, fmt.Errorf("invalid name: must be %d characters or fewer", constants.MaxAuthzIdentifierLength) - } - for _, r := range name { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '-' && r != '_' { - return nil, fmt.Errorf("invalid name: must contain only letters, digits, hyphens, and underscores") - } - } - - policyType := strings.TrimSpace(params.Type) - if policyType == "" { - return nil, fmt.Errorf("policy type is required") - } - validPolicyTypes := map[string]bool{ - constants.PolicyTypeRole: true, - constants.PolicyTypeUser: true, - } - if !validPolicyTypes[policyType] { - return nil, fmt.Errorf("invalid policy type: must be '%s' or '%s'", - constants.PolicyTypeRole, constants.PolicyTypeUser) - } - - description := "" - if params.Description != nil { - description = *params.Description - } - - logic := constants.PolicyLogicPositive - if params.Logic != nil { - logic = *params.Logic - } - if logic != constants.PolicyLogicPositive && logic != constants.PolicyLogicNegative { - return nil, fmt.Errorf("invalid policy logic: must be '%s' or '%s'", - constants.PolicyLogicPositive, constants.PolicyLogicNegative) - } - - decisionStrategy := constants.DecisionStrategyAffirmative - if params.DecisionStrategy != nil { - decisionStrategy = *params.DecisionStrategy - } - if decisionStrategy != constants.DecisionStrategyAffirmative && decisionStrategy != constants.DecisionStrategyUnanimous { - return nil, fmt.Errorf("invalid decision strategy: must be '%s' or '%s'", - constants.DecisionStrategyAffirmative, constants.DecisionStrategyUnanimous) - } - - if err := validatePolicyTargets(policyType, params.Targets, g.Config.Roles); err != nil { - return nil, err - } - - policy, err := g.StorageProvider.AddPolicy(ctx, &schemas.Policy{ - Name: name, - Description: description, - Type: policyType, - Logic: logic, - DecisionStrategy: decisionStrategy, - }) - if err != nil { - log.Debug().Err(err).Msg("Failed to add policy") - return nil, err - } - - // Create policy targets - var targets []*schemas.PolicyTarget - for _, t := range params.Targets { - target, err := g.StorageProvider.AddPolicyTarget(ctx, &schemas.PolicyTarget{ - PolicyID: policy.ID, - TargetType: t.TargetType, - TargetValue: t.TargetValue, - }) - if err != nil { - log.Debug().Err(err).Msg("Failed to add policy target") - return nil, err - } - targets = append(targets, target) - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzPolicyCreatedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzPolicy, - ResourceID: policy.ID, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return policy.AsAPIPolicy(targets), nil -} diff --git a/internal/graphql/authz_add_resource.go b/internal/graphql/authz_add_resource.go deleted file mode 100644 index 23e41cc7..00000000 --- a/internal/graphql/authz_add_resource.go +++ /dev/null @@ -1,69 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - "unicode" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzAddResource is the method to create a new authorization resource. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzAddResource(ctx context.Context, params *model.AddResourceInput) (*model.AuthzResource, error) { - log := g.Log.With().Str("func", "AuthzAddResource").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - name := strings.TrimSpace(params.Name) - if name == "" { - return nil, fmt.Errorf("resource name is required") - } - if len(name) > constants.MaxAuthzIdentifierLength { - return nil, fmt.Errorf("invalid name: must be %d characters or fewer", constants.MaxAuthzIdentifierLength) - } - for _, r := range name { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '-' && r != '_' { - return nil, fmt.Errorf("invalid name: must contain only letters, digits, hyphens, and underscores") - } - } - - description := "" - if params.Description != nil { - description = *params.Description - } - - resource, err := g.StorageProvider.AddResource(ctx, &schemas.Resource{ - Name: name, - Description: description, - }) - if err != nil { - log.Debug().Err(err).Msg("Failed to add resource") - return nil, err - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzResourceCreatedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzResource, - ResourceID: resource.ID, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return resource.AsAPIResource(), nil -} diff --git a/internal/graphql/authz_add_scope.go b/internal/graphql/authz_add_scope.go deleted file mode 100644 index cd47c282..00000000 --- a/internal/graphql/authz_add_scope.go +++ /dev/null @@ -1,69 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - "unicode" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzAddScope is the method to create a new authorization scope. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzAddScope(ctx context.Context, params *model.AddScopeInput) (*model.AuthzScope, error) { - log := g.Log.With().Str("func", "AuthzAddScope").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - name := strings.TrimSpace(params.Name) - if name == "" { - return nil, fmt.Errorf("scope name is required") - } - if len(name) > constants.MaxAuthzIdentifierLength { - return nil, fmt.Errorf("invalid name: must be %d characters or fewer", constants.MaxAuthzIdentifierLength) - } - for _, r := range name { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '-' && r != '_' { - return nil, fmt.Errorf("invalid name: must contain only letters, digits, hyphens, and underscores") - } - } - - description := "" - if params.Description != nil { - description = *params.Description - } - - scope, err := g.StorageProvider.AddScope(ctx, &schemas.Scope{ - Name: name, - Description: description, - }) - if err != nil { - log.Debug().Err(err).Msg("Failed to add scope") - return nil, err - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzScopeCreatedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzScope, - ResourceID: scope.ID, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return scope.AsAPIScope(), nil -} diff --git a/internal/graphql/authz_delete_permission.go b/internal/graphql/authz_delete_permission.go deleted file mode 100644 index 32ff5154..00000000 --- a/internal/graphql/authz_delete_permission.go +++ /dev/null @@ -1,65 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzDeletePermission is the method to delete an authorization permission. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzDeletePermission(ctx context.Context, id string) (*model.Response, error) { - log := g.Log.With().Str("func", "AuthzDeletePermission").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - if strings.TrimSpace(id) == "" { - return nil, fmt.Errorf("permission ID is required") - } - - // Clean up join tables first - err = g.StorageProvider.DeletePermissionScopesByPermissionID(ctx, id) - if err != nil { - log.Debug().Err(err).Msg("Failed to delete permission scopes") - return nil, err - } - - err = g.StorageProvider.DeletePermissionPoliciesByPermissionID(ctx, id) - if err != nil { - log.Debug().Err(err).Msg("Failed to delete permission policies") - return nil, err - } - - err = g.StorageProvider.DeletePermission(ctx, id) - if err != nil { - log.Debug().Err(err).Msg("Failed to delete permission") - return nil, err - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzPermissionDeletedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzPermission, - ResourceID: id, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return &model.Response{ - Message: "Permission deleted successfully", - }, nil -} diff --git a/internal/graphql/authz_delete_policy.go b/internal/graphql/authz_delete_policy.go deleted file mode 100644 index 584ea1a6..00000000 --- a/internal/graphql/authz_delete_policy.go +++ /dev/null @@ -1,54 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzDeletePolicy is the method to delete an authorization policy. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzDeletePolicy(ctx context.Context, id string) (*model.Response, error) { - log := g.Log.With().Str("func", "AuthzDeletePolicy").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - if strings.TrimSpace(id) == "" { - return nil, fmt.Errorf("policy ID is required") - } - - // DeletePolicy checks referential integrity (permission_policy refs) and - // cascade-deletes policy targets internally. - err = g.StorageProvider.DeletePolicy(ctx, id) - if err != nil { - log.Debug().Err(err).Msg("Failed to delete policy") - return nil, err - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzPolicyDeletedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzPolicy, - ResourceID: id, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return &model.Response{ - Message: "Policy deleted successfully", - }, nil -} diff --git a/internal/graphql/authz_delete_resource.go b/internal/graphql/authz_delete_resource.go deleted file mode 100644 index b5f7b716..00000000 --- a/internal/graphql/authz_delete_resource.go +++ /dev/null @@ -1,52 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzDeleteResource is the method to delete an authorization resource. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzDeleteResource(ctx context.Context, id string) (*model.Response, error) { - log := g.Log.With().Str("func", "AuthzDeleteResource").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - if strings.TrimSpace(id) == "" { - return nil, fmt.Errorf("resource ID is required") - } - - err = g.StorageProvider.DeleteResource(ctx, id) - if err != nil { - log.Debug().Err(err).Msg("Failed to delete resource") - return nil, err - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzResourceDeletedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzResource, - ResourceID: id, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return &model.Response{ - Message: "Resource deleted successfully", - }, nil -} diff --git a/internal/graphql/authz_delete_scope.go b/internal/graphql/authz_delete_scope.go deleted file mode 100644 index 8295dce4..00000000 --- a/internal/graphql/authz_delete_scope.go +++ /dev/null @@ -1,52 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzDeleteScope is the method to delete an authorization scope. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzDeleteScope(ctx context.Context, id string) (*model.Response, error) { - log := g.Log.With().Str("func", "AuthzDeleteScope").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - if strings.TrimSpace(id) == "" { - return nil, fmt.Errorf("scope ID is required") - } - - err = g.StorageProvider.DeleteScope(ctx, id) - if err != nil { - log.Debug().Err(err).Msg("Failed to delete scope") - return nil, err - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzScopeDeletedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzScope, - ResourceID: id, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return &model.Response{ - Message: "Scope deleted successfully", - }, nil -} diff --git a/internal/graphql/authz_permissions.go b/internal/graphql/authz_permissions.go deleted file mode 100644 index a00b44ef..00000000 --- a/internal/graphql/authz_permissions.go +++ /dev/null @@ -1,97 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzPermissions is the method to list authorization permissions with pagination. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzPermissions(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzPermissions, error) { - log := g.Log.With().Str("func", "AuthzPermissions").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - pagination := utils.GetPagination(params) - permissions, pagination, err := g.StorageProvider.ListPermissions(ctx, pagination) - if err != nil { - log.Debug().Err(err).Msg("Failed to list permissions") - return nil, err - } - - res := make([]*model.AuthzPermission, len(permissions)) - for i, p := range permissions { - resource, err := g.StorageProvider.GetResourceByID(ctx, p.ResourceID) - if err != nil { - log.Debug().Err(err).Str("resource_id", p.ResourceID).Msg("Failed to get resource") - return nil, err - } - - apiScopes, err := g.resolvePermissionScopes(ctx, p.ID) - if err != nil { - log.Debug().Err(err).Str("permission_id", p.ID).Msg("Failed to resolve permission scopes") - return nil, err - } - - apiPolicies, err := g.resolvePermissionPolicies(ctx, p.ID) - if err != nil { - log.Debug().Err(err).Str("permission_id", p.ID).Msg("Failed to resolve permission policies") - return nil, err - } - - res[i] = p.AsAPIPermission(resource.AsAPIResource(), apiScopes, apiPolicies) - } - - return &model.AuthzPermissions{ - Pagination: pagination, - Permissions: res, - }, nil -} - -// resolvePermissionScopes resolves the scopes for a permission. -func (g *graphqlProvider) resolvePermissionScopes(ctx context.Context, permissionID string) ([]*model.AuthzScope, error) { - permissionScopes, err := g.StorageProvider.GetPermissionScopes(ctx, permissionID) - if err != nil { - return nil, err - } - apiScopes := make([]*model.AuthzScope, 0, len(permissionScopes)) - for _, ps := range permissionScopes { - scope, err := g.StorageProvider.GetScopeByID(ctx, ps.ScopeID) - if err != nil { - return nil, err - } - apiScopes = append(apiScopes, scope.AsAPIScope()) - } - return apiScopes, nil -} - -// resolvePermissionPolicies resolves the policies with their targets for a permission. -func (g *graphqlProvider) resolvePermissionPolicies(ctx context.Context, permissionID string) ([]*model.AuthzPolicy, error) { - permissionPolicies, err := g.StorageProvider.GetPermissionPolicies(ctx, permissionID) - if err != nil { - return nil, err - } - apiPolicies := make([]*model.AuthzPolicy, 0, len(permissionPolicies)) - for _, pp := range permissionPolicies { - policy, err := g.StorageProvider.GetPolicyByID(ctx, pp.PolicyID) - if err != nil { - return nil, err - } - targets, err := g.StorageProvider.GetPolicyTargets(ctx, policy.ID) - if err != nil { - return nil, err - } - apiPolicies = append(apiPolicies, policy.AsAPIPolicy(targets)) - } - return apiPolicies, nil -} diff --git a/internal/graphql/authz_policies.go b/internal/graphql/authz_policies.go deleted file mode 100644 index 075ea084..00000000 --- a/internal/graphql/authz_policies.go +++ /dev/null @@ -1,46 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzPolicies is the method to list authorization policies with pagination. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzPolicies(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzPolicies, error) { - log := g.Log.With().Str("func", "AuthzPolicies").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - pagination := utils.GetPagination(params) - policies, pagination, err := g.StorageProvider.ListPolicies(ctx, pagination) - if err != nil { - log.Debug().Err(err).Msg("Failed to list policies") - return nil, err - } - - res := make([]*model.AuthzPolicy, len(policies)) - for i, p := range policies { - targets, err := g.StorageProvider.GetPolicyTargets(ctx, p.ID) - if err != nil { - log.Debug().Err(err).Str("policy_id", p.ID).Msg("Failed to get policy targets") - return nil, err - } - res[i] = p.AsAPIPolicy(targets) - } - - return &model.AuthzPolicies{ - Pagination: pagination, - Policies: res, - }, nil -} diff --git a/internal/graphql/authz_resources.go b/internal/graphql/authz_resources.go deleted file mode 100644 index 9377ed47..00000000 --- a/internal/graphql/authz_resources.go +++ /dev/null @@ -1,41 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzResources is the method to list authorization resources with pagination. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzResources(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzResources, error) { - log := g.Log.With().Str("func", "AuthzResources").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - pagination := utils.GetPagination(params) - resources, pagination, err := g.StorageProvider.ListResources(ctx, pagination) - if err != nil { - log.Debug().Err(err).Msg("Failed to list resources") - return nil, err - } - - res := make([]*model.AuthzResource, len(resources)) - for i, r := range resources { - res[i] = r.AsAPIResource() - } - - return &model.AuthzResources{ - Pagination: pagination, - Resources: res, - }, nil -} diff --git a/internal/graphql/authz_scopes.go b/internal/graphql/authz_scopes.go deleted file mode 100644 index 23751511..00000000 --- a/internal/graphql/authz_scopes.go +++ /dev/null @@ -1,41 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzScopes is the method to list authorization scopes with pagination. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzScopes(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzScopes, error) { - log := g.Log.With().Str("func", "AuthzScopes").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - pagination := utils.GetPagination(params) - scopes, pagination, err := g.StorageProvider.ListScopes(ctx, pagination) - if err != nil { - log.Debug().Err(err).Msg("Failed to list scopes") - return nil, err - } - - res := make([]*model.AuthzScope, len(scopes)) - for i, s := range scopes { - res[i] = s.AsAPIScope() - } - - return &model.AuthzScopes{ - Pagination: pagination, - Scopes: res, - }, nil -} diff --git a/internal/graphql/authz_update_permission.go b/internal/graphql/authz_update_permission.go deleted file mode 100644 index 7b6adbc5..00000000 --- a/internal/graphql/authz_update_permission.go +++ /dev/null @@ -1,239 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - "unicode" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzUpdatePermission is the method to update an existing authorization permission. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzUpdatePermission(ctx context.Context, params *model.UpdatePermissionInput) (*model.AuthzPermission, error) { - log := g.Log.With().Str("func", "AuthzUpdatePermission").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - if strings.TrimSpace(params.ID) == "" { - return nil, fmt.Errorf("permission ID is required") - } - - permission, err := g.StorageProvider.GetPermissionByID(ctx, params.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get permission by ID") - return nil, err - } - - // Build a copy of the permission with the requested field changes applied. - // Persistence is deferred until AFTER the link-rebuild loops succeed so that - // a link-attach failure does not leave the row with new fields but old links. - newPermission := *permission - if params.Name != nil { - name := strings.TrimSpace(*params.Name) - if name == "" { - return nil, fmt.Errorf("permission name cannot be empty") - } - if len(name) > constants.MaxAuthzIdentifierLength { - return nil, fmt.Errorf("invalid name: must be %d characters or fewer", constants.MaxAuthzIdentifierLength) - } - for _, r := range name { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '-' && r != '_' { - return nil, fmt.Errorf("invalid name: must contain only letters, digits, hyphens, and underscores") - } - } - newPermission.Name = name - } - if params.Description != nil { - newPermission.Description = *params.Description - } - if params.DecisionStrategy != nil { - ds := *params.DecisionStrategy - if ds != constants.DecisionStrategyAffirmative && ds != constants.DecisionStrategyUnanimous { - return nil, fmt.Errorf("invalid decision strategy: must be '%s' or '%s'", - constants.DecisionStrategyAffirmative, constants.DecisionStrategyUnanimous) - } - newPermission.DecisionStrategy = ds - } - - var apiScopes []*model.AuthzScope - if params.ScopeIds != nil { - if len(params.ScopeIds) == 0 { - return nil, fmt.Errorf("at least one scope_id is required") - } - apiScopes = make([]*model.AuthzScope, 0, len(params.ScopeIds)) - for _, scopeID := range params.ScopeIds { - scope, err := g.StorageProvider.GetScopeByID(ctx, scopeID) - if err != nil { - log.Debug().Err(err).Str("scope_id", scopeID).Msg("Failed to get scope by ID") - return nil, fmt.Errorf("scope not found: %s", scopeID) - } - apiScopes = append(apiScopes, scope.AsAPIScope()) - } - } - - var apiPolicies []*model.AuthzPolicy - if params.PolicyIds != nil { - if len(params.PolicyIds) == 0 { - return nil, fmt.Errorf("at least one policy_id is required") - } - apiPolicies = make([]*model.AuthzPolicy, 0, len(params.PolicyIds)) - for _, policyID := range params.PolicyIds { - policy, err := g.StorageProvider.GetPolicyByID(ctx, policyID) - if err != nil { - log.Debug().Err(err).Str("policy_id", policyID).Msg("Failed to get policy by ID") - return nil, fmt.Errorf("policy not found: %s", policyID) - } - targets, err := g.StorageProvider.GetPolicyTargets(ctx, policyID) - if err != nil { - log.Debug().Err(err).Str("policy_id", policyID).Msg("Failed to get policy targets") - return nil, err - } - apiPolicies = append(apiPolicies, policy.AsAPIPolicy(targets)) - } - } - - oldScopeLinks, err := g.StorageProvider.GetPermissionScopes(ctx, permission.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get existing permission scopes") - return nil, err - } - oldPolicyLinks, err := g.StorageProvider.GetPermissionPolicies(ctx, permission.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get existing permission policies") - return nil, err - } - - // Replace scopes if provided. Delete-then-add ordering avoids accumulating - // duplicates. On failure, restore the previous link sets and bail out - // WITHOUT persisting the field changes (newPermission has not been written - // yet), so the on-disk permission row remains untouched. - if params.ScopeIds != nil { - err = g.StorageProvider.DeletePermissionScopesByPermissionID(ctx, permission.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to delete existing permission scopes") - return nil, err - } - for _, scopeID := range params.ScopeIds { - _, err := g.StorageProvider.AddPermissionScope(ctx, &schemas.PermissionScope{ - PermissionID: permission.ID, - ScopeID: scopeID, - }) - if err != nil { - log.Debug().Err(err).Str("scope_id", scopeID).Msg("Failed to add permission scope") - g.rollbackPermissionLinks(permission.ID, oldScopeLinks, oldPolicyLinks) - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - return nil, err - } - } - } - - // Replace policies if provided. Same delete-then-add semantics as scopes. - if params.PolicyIds != nil { - err = g.StorageProvider.DeletePermissionPoliciesByPermissionID(ctx, permission.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to delete existing permission policies") - g.rollbackPermissionLinks(permission.ID, oldScopeLinks, oldPolicyLinks) - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - return nil, err - } - for _, policyID := range params.PolicyIds { - _, err := g.StorageProvider.AddPermissionPolicy(ctx, &schemas.PermissionPolicy{ - PermissionID: permission.ID, - PolicyID: policyID, - }) - if err != nil { - log.Debug().Err(err).Str("policy_id", policyID).Msg("Failed to add permission policy") - g.rollbackPermissionLinks(permission.ID, oldScopeLinks, oldPolicyLinks) - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - return nil, err - } - } - } - - // Persist the field changes only AFTER both link-rebuild loops have - // succeeded. If this fails, undo the link replacements so the permission - // row + its links remain consistent (old fields, old links). - updated, err := g.StorageProvider.UpdatePermission(ctx, &newPermission) - if err != nil { - log.Debug().Err(err).Msg("Failed to update permission") - g.rollbackPermissionLinks(permission.ID, oldScopeLinks, oldPolicyLinks) - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - return nil, err - } - permission = updated - - // Resolve the full permission for the response - resource, err := g.StorageProvider.GetResourceByID(ctx, permission.ResourceID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get resource") - return nil, err - } - - if params.ScopeIds == nil { - apiScopes, err = g.resolvePermissionScopes(ctx, permission.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to resolve permission scopes") - return nil, err - } - } - - if params.PolicyIds == nil { - apiPolicies, err = g.resolvePermissionPolicies(ctx, permission.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to resolve permission policies") - return nil, err - } - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzPermissionUpdatedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzPermission, - ResourceID: permission.ID, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return permission.AsAPIPermission(resource.AsAPIResource(), apiScopes, apiPolicies), nil -} - -func (g *graphqlProvider) rollbackPermissionLinks(permissionID string, scopes []*schemas.PermissionScope, policies []*schemas.PermissionPolicy) { - log := g.Log.With().Str("func", "rollbackPermissionLinks").Logger() - if err := g.StorageProvider.DeletePermissionScopesByPermissionID(context.Background(), permissionID); err != nil { - log.Error().Err(err).Str("permission_id", permissionID).Msg("failed to delete permission scopes during rollback") - } - for _, scope := range scopes { - if _, err := g.StorageProvider.AddPermissionScope(context.Background(), &schemas.PermissionScope{ - PermissionID: permissionID, - ScopeID: scope.ScopeID, - }); err != nil { - log.Error().Err(err).Str("permission_id", permissionID).Str("scope_id", scope.ScopeID).Msg("failed to restore permission scope during rollback") - } - } - if err := g.StorageProvider.DeletePermissionPoliciesByPermissionID(context.Background(), permissionID); err != nil { - log.Error().Err(err).Str("permission_id", permissionID).Msg("failed to delete permission policies during rollback") - } - for _, policy := range policies { - if _, err := g.StorageProvider.AddPermissionPolicy(context.Background(), &schemas.PermissionPolicy{ - PermissionID: permissionID, - PolicyID: policy.PolicyID, - }); err != nil { - log.Error().Err(err).Str("permission_id", permissionID).Str("policy_id", policy.PolicyID).Msg("failed to restore permission policy during rollback") - } - } -} diff --git a/internal/graphql/authz_update_policy.go b/internal/graphql/authz_update_policy.go deleted file mode 100644 index 392157eb..00000000 --- a/internal/graphql/authz_update_policy.go +++ /dev/null @@ -1,126 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - "unicode" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzUpdatePolicy is the method to update an existing authorization policy. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzUpdatePolicy(ctx context.Context, params *model.UpdatePolicyInput) (*model.AuthzPolicy, error) { - log := g.Log.With().Str("func", "AuthzUpdatePolicy").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - if strings.TrimSpace(params.ID) == "" { - return nil, fmt.Errorf("policy ID is required") - } - - policy, err := g.StorageProvider.GetPolicyByID(ctx, params.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get policy by ID") - return nil, err - } - - if params.Name != nil { - name := strings.TrimSpace(*params.Name) - if name == "" { - return nil, fmt.Errorf("policy name cannot be empty") - } - if len(name) > constants.MaxAuthzIdentifierLength { - return nil, fmt.Errorf("invalid name: must be %d characters or fewer", constants.MaxAuthzIdentifierLength) - } - for _, r := range name { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '-' && r != '_' { - return nil, fmt.Errorf("invalid name: must contain only letters, digits, hyphens, and underscores") - } - } - policy.Name = name - } - if params.Description != nil { - policy.Description = *params.Description - } - if params.Logic != nil { - logic := *params.Logic - if logic != constants.PolicyLogicPositive && logic != constants.PolicyLogicNegative { - return nil, fmt.Errorf("invalid policy logic: must be '%s' or '%s'", - constants.PolicyLogicPositive, constants.PolicyLogicNegative) - } - policy.Logic = logic - } - if params.DecisionStrategy != nil { - ds := *params.DecisionStrategy - if ds != constants.DecisionStrategyAffirmative && ds != constants.DecisionStrategyUnanimous { - return nil, fmt.Errorf("invalid decision strategy: must be '%s' or '%s'", - constants.DecisionStrategyAffirmative, constants.DecisionStrategyUnanimous) - } - policy.DecisionStrategy = ds - } - - policy, err = g.StorageProvider.UpdatePolicy(ctx, policy) - if err != nil { - log.Debug().Err(err).Msg("Failed to update policy") - return nil, err - } - - // Replace targets if provided - var targets []*schemas.PolicyTarget - if params.Targets != nil { - // Validate against the existing policy.Type — Type is immutable on update, - // so targets must conform to whatever the policy was created with. - if err := validatePolicyTargets(policy.Type, params.Targets, g.Config.Roles); err != nil { - return nil, err - } - err = g.StorageProvider.DeletePolicyTargetsByPolicyID(ctx, policy.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to delete existing policy targets") - return nil, err - } - for _, t := range params.Targets { - target, err := g.StorageProvider.AddPolicyTarget(ctx, &schemas.PolicyTarget{ - PolicyID: policy.ID, - TargetType: t.TargetType, - TargetValue: t.TargetValue, - }) - if err != nil { - log.Debug().Err(err).Msg("Failed to add policy target") - return nil, err - } - targets = append(targets, target) - } - } else { - targets, err = g.StorageProvider.GetPolicyTargets(ctx, policy.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get policy targets") - return nil, err - } - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzPolicyUpdatedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzPolicy, - ResourceID: policy.ID, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return policy.AsAPIPolicy(targets), nil -} diff --git a/internal/graphql/authz_update_resource.go b/internal/graphql/authz_update_resource.go deleted file mode 100644 index 0c54ae98..00000000 --- a/internal/graphql/authz_update_resource.go +++ /dev/null @@ -1,76 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - "unicode" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzUpdateResource is the method to update an existing authorization resource. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzUpdateResource(ctx context.Context, params *model.UpdateResourceInput) (*model.AuthzResource, error) { - log := g.Log.With().Str("func", "AuthzUpdateResource").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - if strings.TrimSpace(params.ID) == "" { - return nil, fmt.Errorf("resource ID is required") - } - - resource, err := g.StorageProvider.GetResourceByID(ctx, params.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get resource by ID") - return nil, err - } - - if params.Name != nil { - name := strings.TrimSpace(*params.Name) - if name == "" { - return nil, fmt.Errorf("resource name cannot be empty") - } - if len(name) > constants.MaxAuthzIdentifierLength { - return nil, fmt.Errorf("invalid name: must be %d characters or fewer", constants.MaxAuthzIdentifierLength) - } - for _, r := range name { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '-' && r != '_' { - return nil, fmt.Errorf("invalid name: must contain only letters, digits, hyphens, and underscores") - } - } - resource.Name = name - } - if params.Description != nil { - resource.Description = *params.Description - } - - resource, err = g.StorageProvider.UpdateResource(ctx, resource) - if err != nil { - log.Debug().Err(err).Msg("Failed to update resource") - return nil, err - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzResourceUpdatedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzResource, - ResourceID: resource.ID, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return resource.AsAPIResource(), nil -} diff --git a/internal/graphql/authz_update_scope.go b/internal/graphql/authz_update_scope.go deleted file mode 100644 index 83fe172d..00000000 --- a/internal/graphql/authz_update_scope.go +++ /dev/null @@ -1,76 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - "unicode" - - "github.com/authorizerdev/authorizer/internal/audit" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// AuthzUpdateScope is the method to update an existing authorization scope. -// Permissions: authorizer:admin -func (g *graphqlProvider) AuthzUpdateScope(ctx context.Context, params *model.UpdateScopeInput) (*model.AuthzScope, error) { - log := g.Log.With().Str("func", "AuthzUpdateScope").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - if !g.TokenProvider.IsSuperAdmin(gc) { - log.Debug().Msg("Not logged in as super admin") - return nil, fmt.Errorf("unauthorized") - } - - if strings.TrimSpace(params.ID) == "" { - return nil, fmt.Errorf("scope ID is required") - } - - scope, err := g.StorageProvider.GetScopeByID(ctx, params.ID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get scope by ID") - return nil, err - } - - if params.Name != nil { - name := strings.TrimSpace(*params.Name) - if name == "" { - return nil, fmt.Errorf("scope name cannot be empty") - } - if len(name) > constants.MaxAuthzIdentifierLength { - return nil, fmt.Errorf("invalid name: must be %d characters or fewer", constants.MaxAuthzIdentifierLength) - } - for _, r := range name { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '-' && r != '_' { - return nil, fmt.Errorf("invalid name: must contain only letters, digits, hyphens, and underscores") - } - } - scope.Name = name - } - if params.Description != nil { - scope.Description = *params.Description - } - - scope, err = g.StorageProvider.UpdateScope(ctx, scope) - if err != nil { - log.Debug().Err(err).Msg("Failed to update scope") - return nil, err - } - - g.AuthorizationProvider.InvalidateCache(context.Background(), "authz:") - - g.AuditProvider.LogEvent(audit.Event{ - Action: constants.AuditAdminAuthzScopeUpdatedEvent, - ActorType: constants.AuditActorTypeAdmin, - ResourceType: constants.AuditResourceTypeAuthzScope, - ResourceID: scope.ID, - IPAddress: utils.GetIP(gc.Request), - UserAgent: utils.GetUserAgent(gc.Request), - }) - - return scope.AsAPIScope(), nil -} diff --git a/internal/graphql/fga_admin.go b/internal/graphql/fga_admin.go new file mode 100644 index 00000000..7e71859d --- /dev/null +++ b/internal/graphql/fga_admin.go @@ -0,0 +1,226 @@ +package graphql + +import ( + "context" + "errors" + "fmt" + "strings" + + "github.com/authorizerdev/authorizer/internal/audit" + "github.com/authorizerdev/authorizer/internal/authorization/engine" + "github.com/authorizerdev/authorizer/internal/constants" + "github.com/authorizerdev/authorizer/internal/graph/model" + "github.com/authorizerdev/authorizer/internal/refs" + "github.com/authorizerdev/authorizer/internal/utils" +) + +// errFgaNotEnabled is returned by every FGA resolver when no authorization +// engine is configured (i.e. --authorization-engine != fga). Fail-closed. +var errFgaNotEnabled = errors.New("fine-grained authorization is not enabled") + +// maxFgaTuplesPerWrite caps the number of tuples accepted in a single write or +// delete to bound the work an admin call performs. +const maxFgaTuplesPerWrite = 100 + +// maxFgaReadPageSize caps the page size for tuple reads. OpenFGA's ReadRequest +// enforces a [1, 100] range, so this is both a safety cap and a hard backend +// limit. +const maxFgaReadPageSize = 100 + +// FgaWriteModel installs a new fine-grained authorization model from its DSL. +// Permission: authorizer:admin. Audited. +func (g *graphqlProvider) FgaWriteModel(ctx context.Context, params *model.FgaWriteModelInput) (*model.FgaModel, error) { + log := g.Log.With().Str("func", "FgaWriteModel").Logger() + gc, err := utils.GinContextFromContext(ctx) + if err != nil { + log.Debug().Err(err).Msg("Failed to get GinContext") + return nil, err + } + if !g.TokenProvider.IsSuperAdmin(gc) { + log.Debug().Msg("Not logged in as super admin") + return nil, fmt.Errorf("unauthorized") + } + if g.AuthzEngine == nil { + return nil, errFgaNotEnabled + } + if params == nil || strings.TrimSpace(params.Dsl) == "" { + return nil, fmt.Errorf("dsl is required") + } + modelID, err := g.AuthzEngine.WriteModel(ctx, params.Dsl) + if err != nil { + log.Debug().Err(err).Msg("Failed to write authorization model") + return nil, err + } + g.AuditProvider.LogEvent(audit.Event{ + Action: constants.AuditAdminFgaModelWrittenEvent, + ActorType: constants.AuditActorTypeAdmin, + ResourceType: constants.AuditResourceTypeFgaModel, + ResourceID: modelID, + IPAddress: utils.GetIP(gc.Request), + UserAgent: utils.GetUserAgent(gc.Request), + }) + return &model.FgaModel{ID: modelID, Dsl: params.Dsl}, nil +} + +// FgaGetModel returns the active fine-grained authorization model as DSL. +// Permission: authorizer:admin. +func (g *graphqlProvider) FgaGetModel(ctx context.Context) (*model.FgaModel, error) { + log := g.Log.With().Str("func", "FgaGetModel").Logger() + gc, err := utils.GinContextFromContext(ctx) + if err != nil { + log.Debug().Err(err).Msg("Failed to get GinContext") + return nil, err + } + if !g.TokenProvider.IsSuperAdmin(gc) { + log.Debug().Msg("Not logged in as super admin") + return nil, fmt.Errorf("unauthorized") + } + if g.AuthzEngine == nil { + return nil, errFgaNotEnabled + } + dsl, err := g.AuthzEngine.ReadModel(ctx) + if err != nil { + log.Debug().Err(err).Msg("Failed to read authorization model") + return nil, err + } + return &model.FgaModel{Dsl: dsl}, nil +} + +// FgaWriteTuples persists the given relationship tuples. +// Permission: authorizer:admin. Audited. +func (g *graphqlProvider) FgaWriteTuples(ctx context.Context, params *model.FgaWriteTuplesInput) (*model.Response, error) { + log := g.Log.With().Str("func", "FgaWriteTuples").Logger() + gc, err := utils.GinContextFromContext(ctx) + if err != nil { + log.Debug().Err(err).Msg("Failed to get GinContext") + return nil, err + } + if !g.TokenProvider.IsSuperAdmin(gc) { + log.Debug().Msg("Not logged in as super admin") + return nil, fmt.Errorf("unauthorized") + } + if g.AuthzEngine == nil { + return nil, errFgaNotEnabled + } + tuples, err := toEngineTuples(params) + if err != nil { + return nil, err + } + if err := g.AuthzEngine.WriteTuples(ctx, tuples); err != nil { + log.Debug().Err(err).Msg("Failed to write tuples") + return nil, err + } + g.AuditProvider.LogEvent(audit.Event{ + Action: constants.AuditAdminFgaTuplesWrittenEvent, + ActorType: constants.AuditActorTypeAdmin, + ResourceType: constants.AuditResourceTypeFgaTuple, + IPAddress: utils.GetIP(gc.Request), + UserAgent: utils.GetUserAgent(gc.Request), + Metadata: fmt.Sprintf("count=%d", len(tuples)), + }) + return &model.Response{Message: "Tuples written successfully"}, nil +} + +// FgaDeleteTuples removes the given relationship tuples. +// Permission: authorizer:admin. Audited. +func (g *graphqlProvider) FgaDeleteTuples(ctx context.Context, params *model.FgaWriteTuplesInput) (*model.Response, error) { + log := g.Log.With().Str("func", "FgaDeleteTuples").Logger() + gc, err := utils.GinContextFromContext(ctx) + if err != nil { + log.Debug().Err(err).Msg("Failed to get GinContext") + return nil, err + } + if !g.TokenProvider.IsSuperAdmin(gc) { + log.Debug().Msg("Not logged in as super admin") + return nil, fmt.Errorf("unauthorized") + } + if g.AuthzEngine == nil { + return nil, errFgaNotEnabled + } + tuples, err := toEngineTuples(params) + if err != nil { + return nil, err + } + if err := g.AuthzEngine.DeleteTuples(ctx, tuples); err != nil { + log.Debug().Err(err).Msg("Failed to delete tuples") + return nil, err + } + g.AuditProvider.LogEvent(audit.Event{ + Action: constants.AuditAdminFgaTuplesDeletedEvent, + ActorType: constants.AuditActorTypeAdmin, + ResourceType: constants.AuditResourceTypeFgaTuple, + IPAddress: utils.GetIP(gc.Request), + UserAgent: utils.GetUserAgent(gc.Request), + Metadata: fmt.Sprintf("count=%d", len(tuples)), + }) + return &model.Response{Message: "Tuples deleted successfully"}, nil +} + +// FgaReadTuples returns a page of persisted tuples matching the filter. +// Permission: authorizer:admin. +func (g *graphqlProvider) FgaReadTuples(ctx context.Context, params *model.FgaReadTuplesInput) (*model.FgaTuples, error) { + log := g.Log.With().Str("func", "FgaReadTuples").Logger() + gc, err := utils.GinContextFromContext(ctx) + if err != nil { + log.Debug().Err(err).Msg("Failed to get GinContext") + return nil, err + } + if !g.TokenProvider.IsSuperAdmin(gc) { + log.Debug().Msg("Not logged in as super admin") + return nil, fmt.Errorf("unauthorized") + } + if g.AuthzEngine == nil { + return nil, errFgaNotEnabled + } + filter := engine.ReadTuplesFilter{} + if params != nil { + filter.User = refs.StringValue(params.User) + filter.Relation = refs.StringValue(params.Relation) + filter.Object = refs.StringValue(params.Object) + filter.ContinuationToken = refs.StringValue(params.ContinuationToken) + if params.PageSize != nil { + ps := *params.PageSize + // Cap page size; it is an enumeration surface and the backend + // enforces a [1, 100] range. + if ps <= 0 || ps > maxFgaReadPageSize { + ps = maxFgaReadPageSize + } + filter.PageSize = int32(ps) + } + } + if filter.PageSize == 0 { + filter.PageSize = maxFgaReadPageSize + } + res, err := g.AuthzEngine.ReadTuples(ctx, filter) + if err != nil { + log.Debug().Err(err).Msg("Failed to read tuples") + return nil, err + } + out := &model.FgaTuples{Tuples: make([]*model.FgaTuple, 0, len(res.Tuples))} + for _, t := range res.Tuples { + out.Tuples = append(out.Tuples, &model.FgaTuple{User: t.User, Relation: t.Relation, Object: t.Object}) + } + if res.ContinuationToken != "" { + out.ContinuationToken = refs.NewStringRef(res.ContinuationToken) + } + return out, nil +} + +// toEngineTuples validates and converts admin-supplied tuple inputs into engine +// tuples. It enforces a per-call cap and rejects empty fields. +func toEngineTuples(params *model.FgaWriteTuplesInput) ([]engine.TupleKey, error) { + if params == nil || len(params.Tuples) == 0 { + return nil, fmt.Errorf("at least one tuple is required") + } + if len(params.Tuples) > maxFgaTuplesPerWrite { + return nil, fmt.Errorf("too many tuples: max %d per request", maxFgaTuplesPerWrite) + } + tuples := make([]engine.TupleKey, 0, len(params.Tuples)) + for _, t := range params.Tuples { + if t == nil || strings.TrimSpace(t.User) == "" || strings.TrimSpace(t.Relation) == "" || strings.TrimSpace(t.Object) == "" { + return nil, fmt.Errorf("each tuple requires user, relation and object") + } + tuples = append(tuples, engine.TupleKey{User: t.User, Relation: t.Relation, Object: t.Object}) + } + return tuples, nil +} diff --git a/internal/graphql/fga_relation_check.go b/internal/graphql/fga_relation_check.go new file mode 100644 index 00000000..b7de2224 --- /dev/null +++ b/internal/graphql/fga_relation_check.go @@ -0,0 +1,49 @@ +package graphql + +import ( + "context" + "errors" + "strings" + + "github.com/authorizerdev/authorizer/internal/authorization/engine" + "github.com/authorizerdev/authorizer/internal/graph/model" +) + +// enforceRequiredRelations gates a request on fine-grained authorization. For +// each required (relation, object) it asks the engine whether the caller +// (subject "user:") holds that relation. Semantics: +// +// - AND: every relation must be allowed. +// - Fail-closed: an engine error OR any deny => "unauthorized". +// - Empty list => authorized (preserves the prior common-case behavior where +// no fine-grained gating was requested). +// - Non-empty list with a nil engine => error (FGA not enabled but required). +// +// The subject is always derived server-side from the resolved userID, never +// from client input. +func enforceRequiredRelations(ctx context.Context, eng engine.AuthorizationEngine, userID string, required []*model.FgaRelationInput) error { + if len(required) == 0 { + return nil + } + if eng == nil { + return errFgaNotEnabled + } + if strings.TrimSpace(userID) == "" { + return errors.New("unauthorized") + } + subject := "user:" + userID + for _, r := range required { + if r == nil || strings.TrimSpace(r.Relation) == "" || strings.TrimSpace(r.Object) == "" { + return errors.New("each required relation needs relation and object") + } + allowed, err := eng.Check(ctx, subject, r.Relation, r.Object) + if err != nil { + // Fail closed. + return errors.New("unauthorized") + } + if !allowed { + return errors.New("unauthorized") + } + } + return nil +} diff --git a/internal/graphql/fga_runtime.go b/internal/graphql/fga_runtime.go new file mode 100644 index 00000000..661d975e --- /dev/null +++ b/internal/graphql/fga_runtime.go @@ -0,0 +1,164 @@ +package graphql + +import ( + "context" + "fmt" + "strings" + + "github.com/authorizerdev/authorizer/internal/authorization/engine" + "github.com/authorizerdev/authorizer/internal/graph/model" + "github.com/authorizerdev/authorizer/internal/utils" +) + +// maxFgaListResults caps the number of objects returned by fga_list_objects and +// the page size of admin tuple reads. ListObjects is an expensive enumeration +// surface, so the result set is bounded. +const maxFgaListResults = 1000 + +// maxFgaBatchChecks caps the number of pairs accepted in a single batch check. +const maxFgaBatchChecks = 100 + +// principalForRequest resolves the authenticated caller and returns the pinned +// OpenFGA subject ("user:"). The principal is ALWAYS derived from the auth +// token / session — never from client input — so a caller can only ask about +// their own access. +func (g *graphqlProvider) principalForRequest(ctx context.Context) (string, error) { + gc, err := utils.GinContextFromContext(ctx) + if err != nil { + return "", err + } + tokenData, err := g.TokenProvider.GetUserIDFromSessionOrAccessToken(gc) + if err != nil { + return "", err + } + if strings.TrimSpace(tokenData.UserID) == "" { + return "", fmt.Errorf("unauthorized") + } + return "user:" + tokenData.UserID, nil +} + +// toContextualTuples converts client-supplied contextual tuples. These are +// request-scoped only (never persisted) and are safe to accept from the client. +func toContextualTuples(in []*model.FgaTupleInput) ([]engine.ContextualTuple, error) { + if len(in) == 0 { + return nil, nil + } + out := make([]engine.ContextualTuple, 0, len(in)) + for _, t := range in { + if t == nil || strings.TrimSpace(t.User) == "" || strings.TrimSpace(t.Relation) == "" || strings.TrimSpace(t.Object) == "" { + return nil, fmt.Errorf("each contextual tuple requires user, relation and object") + } + out = append(out, engine.ContextualTuple{User: t.User, Relation: t.Relation, Object: t.Object}) + } + return out, nil +} + +// FgaCheck answers "is the authenticated caller related to object via relation?". +// PRINCIPAL PINNING: the subject is the caller's token sub ("user:"), never +// client input. Fail-closed: any engine error denies. +// Permission: authorized user. +func (g *graphqlProvider) FgaCheck(ctx context.Context, params *model.FgaCheckInput) (*model.FgaCheckResponse, error) { + log := g.Log.With().Str("func", "FgaCheck").Logger() + if g.AuthzEngine == nil { + return nil, errFgaNotEnabled + } + if params == nil || strings.TrimSpace(params.Relation) == "" || strings.TrimSpace(params.Object) == "" { + return nil, fmt.Errorf("relation and object are required") + } + // PRINCIPAL PINNING — derive subject from the authenticated caller only. + principal, err := g.principalForRequest(ctx) + if err != nil { + log.Debug().Err(err).Msg("Failed to resolve principal") + return nil, fmt.Errorf("unauthorized") + } + ctxTuples, err := toContextualTuples(params.ContextualTuples) + if err != nil { + return nil, err + } + allowed, err := g.AuthzEngine.Check(ctx, principal, params.Relation, params.Object, ctxTuples...) + if err != nil { + // Fail closed: treat engine error as deny. + log.Debug().Err(err).Msg("Check failed; denying") + return nil, fmt.Errorf("authorization check failed") + } + return &model.FgaCheckResponse{Allowed: allowed}, nil +} + +// FgaBatchCheck evaluates multiple relation/object pairs for the authenticated +// caller. Principal pinned; fail-closed per the engine contract. +// Permission: authorized user. +func (g *graphqlProvider) FgaBatchCheck(ctx context.Context, params *model.FgaBatchCheckInput) (*model.FgaBatchCheckResponse, error) { + log := g.Log.With().Str("func", "FgaBatchCheck").Logger() + if g.AuthzEngine == nil { + return nil, errFgaNotEnabled + } + if params == nil || len(params.Checks) == 0 { + return nil, fmt.Errorf("at least one check is required") + } + if len(params.Checks) > maxFgaBatchChecks { + return nil, fmt.Errorf("too many checks: max %d per request", maxFgaBatchChecks) + } + // PRINCIPAL PINNING — derive subject from the authenticated caller only. + principal, err := g.principalForRequest(ctx) + if err != nil { + log.Debug().Err(err).Msg("Failed to resolve principal") + return nil, fmt.Errorf("unauthorized") + } + requests := make([]engine.CheckRequest, 0, len(params.Checks)) + for _, c := range params.Checks { + if c == nil || strings.TrimSpace(c.Relation) == "" || strings.TrimSpace(c.Object) == "" { + return nil, fmt.Errorf("each check requires relation and object") + } + ctxTuples, err := toContextualTuples(c.ContextualTuples) + if err != nil { + return nil, err + } + requests = append(requests, engine.CheckRequest{ + User: principal, + Relation: c.Relation, + Object: c.Object, + ContextualTuples: ctxTuples, + }) + } + results, err := g.AuthzEngine.BatchCheck(ctx, requests) + if err != nil { + // Fail closed for the whole batch. + log.Debug().Err(err).Msg("BatchCheck failed; denying") + return nil, fmt.Errorf("authorization check failed") + } + out := &model.FgaBatchCheckResponse{Results: make([]*model.FgaCheckResponse, 0, len(results))} + for _, r := range results { + out.Results = append(out.Results, &model.FgaCheckResponse{Allowed: r.Allowed}) + } + return out, nil +} + +// FgaListObjects enumerates objects of object_type the authenticated caller +// relates to via relation. Principal pinned; result set capped (enumeration +// surface). Fail-closed. +// Permission: authorized user. +func (g *graphqlProvider) FgaListObjects(ctx context.Context, params *model.FgaListObjectsInput) (*model.FgaListObjectsResponse, error) { + log := g.Log.With().Str("func", "FgaListObjects").Logger() + if g.AuthzEngine == nil { + return nil, errFgaNotEnabled + } + if params == nil || strings.TrimSpace(params.Relation) == "" || strings.TrimSpace(params.ObjectType) == "" { + return nil, fmt.Errorf("relation and object_type are required") + } + // PRINCIPAL PINNING — derive subject from the authenticated caller only. + principal, err := g.principalForRequest(ctx) + if err != nil { + log.Debug().Err(err).Msg("Failed to resolve principal") + return nil, fmt.Errorf("unauthorized") + } + objects, err := g.AuthzEngine.ListObjects(ctx, principal, params.Relation, params.ObjectType) + if err != nil { + log.Debug().Err(err).Msg("ListObjects failed; denying") + return nil, fmt.Errorf("authorization list failed") + } + // Cap the result set; ListObjects is an expensive enumeration surface. + if len(objects) > maxFgaListResults { + objects = objects[:maxFgaListResults] + } + return &model.FgaListObjectsResponse{Objects: objects}, nil +} diff --git a/internal/graphql/permission_check.go b/internal/graphql/permission_check.go deleted file mode 100644 index dcf27240..00000000 --- a/internal/graphql/permission_check.go +++ /dev/null @@ -1,67 +0,0 @@ -package graphql - -import ( - "context" - "errors" - - "github.com/rs/zerolog" - - "github.com/authorizerdev/authorizer/internal/authorization" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/metrics" -) - -// enforceRequiredPermissions evaluates each required permission against the -// authorization provider with AND semantics — every entry must be allowed, -// otherwise the caller is treated as unauthorized. -// -// endpoint identifies the GraphQL operation that called this helper and -// becomes the `endpoint` label on authorizer_required_permissions_checks_total. -// It must be one of metrics.RequiredPermissionsEndpoint* — passing an -// unbounded string risks Prometheus cardinality explosion. -// -// When required is empty (the common case) callers observe no error, -// though the metric is still incremented with outcome=not_requested so -// adoption can be measured per endpoint. -// -// Each terminal return below MUST be paired with exactly one -// RecordRequiredPermissionsCheck call. The loop returns on the first -// error or deny, so per-iteration emission cannot double-count — preserve -// that invariant if you refactor. -func (g *graphqlProvider) enforceRequiredPermissions( - ctx context.Context, - log zerolog.Logger, - endpoint string, - userID string, - roles []string, - required []*model.PermissionInput, -) error { - if len(required) == 0 { - metrics.RecordRequiredPermissionsCheck(endpoint, metrics.RequiredPermissionsOutcomeNotRequested) - return nil - } - principal := &authorization.Principal{ - ID: userID, - Type: constants.PrincipalTypeUser, - Roles: roles, - } - for _, p := range required { - if p == nil { - continue - } - res, err := g.AuthorizationProvider.CheckPermission(ctx, principal, p.Resource, p.Scope) - if err != nil { - log.Debug().Err(err).Str("resource", p.Resource).Str("scope", p.Scope).Msg("required permission check errored") - metrics.RecordRequiredPermissionsCheck(endpoint, metrics.RequiredPermissionsOutcomeError) - return errors.New("unauthorized") - } - if res == nil || !res.Allowed { - log.Debug().Str("resource", p.Resource).Str("scope", p.Scope).Msg("required permission denied") - metrics.RecordRequiredPermissionsCheck(endpoint, metrics.RequiredPermissionsOutcomeDenied) - return errors.New("unauthorized") - } - } - metrics.RecordRequiredPermissionsCheck(endpoint, metrics.RequiredPermissionsOutcomeGranted) - return nil -} diff --git a/internal/graphql/permissions.go b/internal/graphql/permissions.go deleted file mode 100644 index 07c66077..00000000 --- a/internal/graphql/permissions.go +++ /dev/null @@ -1,62 +0,0 @@ -package graphql - -import ( - "context" - "fmt" - "strings" - - "github.com/authorizerdev/authorizer/internal/authorization" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/utils" -) - -// Permissions is the method to get all permissions for the authenticated user. -// Permissions: authorized user -func (g *graphqlProvider) Permissions(ctx context.Context) ([]*model.Permission, error) { - log := g.Log.With().Str("func", "Permissions").Logger() - gc, err := utils.GinContextFromContext(ctx) - if err != nil { - log.Debug().Err(err).Msg("Failed to get GinContext") - return nil, err - } - - tokenData, err := g.TokenProvider.GetUserIDFromSessionOrAccessToken(gc) - if err != nil { - log.Debug().Err(err).Msg("Failed to get user from token") - return nil, fmt.Errorf("unauthorized") - } - - user, err := g.StorageProvider.GetUserByID(ctx, tokenData.UserID) - if err != nil { - log.Debug().Err(err).Msg("Failed to get user by ID") - return nil, err - } - - var roles []string - if user.Roles != "" { - roles = strings.Split(user.Roles, ",") - } - - principal := &authorization.Principal{ - ID: user.ID, - Type: constants.PrincipalTypeUser, - Roles: roles, - } - - resourceScopes, err := g.AuthorizationProvider.GetPrincipalPermissions(ctx, principal) - if err != nil { - log.Debug().Err(err).Msg("Failed to get principal permissions") - return nil, err - } - - res := make([]*model.Permission, len(resourceScopes)) - for i, rs := range resourceScopes { - res[i] = &model.Permission{ - Resource: rs.Resource, - Scope: rs.Scope, - } - } - - return res, nil -} diff --git a/internal/graphql/policy_targets.go b/internal/graphql/policy_targets.go deleted file mode 100644 index 430652da..00000000 --- a/internal/graphql/policy_targets.go +++ /dev/null @@ -1,47 +0,0 @@ -package graphql - -import ( - "fmt" - "strings" - - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" -) - -// validatePolicyTargets enforces that every target on a policy is consistent -// with the policy's type and references a real value: -// -// - target_type must equal policyType (role or user) so that the storage row -// and the evaluator agree on how to match it. -// - target_value must be non-empty after trimming. -// - For role targets, target_value must be one of the configured ROLES so -// that policies cannot be silently dead — a typo'd role would evaluate to -// "no match" forever. -// -// User targets are not checked against the users table here: that lookup is -// per-target and would race with deletes, so we only enforce non-emptiness -// and let the evaluator no-op on missing IDs. -func validatePolicyTargets(policyType string, targets []*model.PolicyTargetInput, configRoles []string) error { - if len(targets) == 0 { - return fmt.Errorf("at least one policy target is required") - } - - allowedRoles := make(map[string]bool, len(configRoles)) - for _, r := range configRoles { - allowedRoles[r] = true - } - - for i, t := range targets { - if t.TargetType != policyType { - return fmt.Errorf("target %d: target_type %q does not match policy type %q", i, t.TargetType, policyType) - } - value := strings.TrimSpace(t.TargetValue) - if value == "" { - return fmt.Errorf("target %d: target_value is required", i) - } - if policyType == constants.PolicyTypeRole && !allowedRoles[value] { - return fmt.Errorf("target %d: role %q is not in configured ROLES", i, value) - } - } - return nil -} diff --git a/internal/graphql/policy_targets_test.go b/internal/graphql/policy_targets_test.go deleted file mode 100644 index d1285aa1..00000000 --- a/internal/graphql/policy_targets_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package graphql - -import ( - "testing" - - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/stretchr/testify/assert" -) - -func TestValidatePolicyTargets(t *testing.T) { - roles := []string{"admin", "editor", "viewer"} - - t.Run("rejects empty targets", func(t *testing.T) { - err := validatePolicyTargets(constants.PolicyTypeRole, nil, roles) - assert.Error(t, err) - }) - - t.Run("rejects target_type mismatch", func(t *testing.T) { - err := validatePolicyTargets(constants.PolicyTypeRole, []*model.PolicyTargetInput{ - {TargetType: constants.TargetTypeUser, TargetValue: "admin"}, - }, roles) - assert.ErrorContains(t, err, "does not match policy type") - }) - - t.Run("rejects empty target_value", func(t *testing.T) { - err := validatePolicyTargets(constants.PolicyTypeRole, []*model.PolicyTargetInput{ - {TargetType: constants.TargetTypeRole, TargetValue: " "}, - }, roles) - assert.ErrorContains(t, err, "target_value is required") - }) - - t.Run("rejects role not in configured ROLES", func(t *testing.T) { - err := validatePolicyTargets(constants.PolicyTypeRole, []*model.PolicyTargetInput{ - {TargetType: constants.TargetTypeRole, TargetValue: "ghost"}, - }, roles) - assert.ErrorContains(t, err, "not in configured ROLES") - }) - - t.Run("accepts role in configured ROLES", func(t *testing.T) { - err := validatePolicyTargets(constants.PolicyTypeRole, []*model.PolicyTargetInput{ - {TargetType: constants.TargetTypeRole, TargetValue: "admin"}, - {TargetType: constants.TargetTypeRole, TargetValue: "editor"}, - }, roles) - assert.NoError(t, err) - }) - - t.Run("user targets are not checked against ROLES", func(t *testing.T) { - err := validatePolicyTargets(constants.PolicyTypeUser, []*model.PolicyTargetInput{ - {TargetType: constants.TargetTypeUser, TargetValue: "6f1a2b3c-4d5e-6f70-8a9b-0c1d2e3f4a5b"}, - }, roles) - assert.NoError(t, err) - }) - - t.Run("user targets still require non-empty value", func(t *testing.T) { - err := validatePolicyTargets(constants.PolicyTypeUser, []*model.PolicyTargetInput{ - {TargetType: constants.TargetTypeUser, TargetValue: ""}, - }, roles) - assert.ErrorContains(t, err, "target_value is required") - }) -} diff --git a/internal/graphql/provider.go b/internal/graphql/provider.go index 418c3147..98d36154 100644 --- a/internal/graphql/provider.go +++ b/internal/graphql/provider.go @@ -7,7 +7,7 @@ import ( "github.com/authorizerdev/authorizer/internal/audit" "github.com/authorizerdev/authorizer/internal/authenticators" - "github.com/authorizerdev/authorizer/internal/authorization" + "github.com/authorizerdev/authorizer/internal/authorization/engine" "github.com/authorizerdev/authorizer/internal/config" "github.com/authorizerdev/authorizer/internal/email" "github.com/authorizerdev/authorizer/internal/events" @@ -39,8 +39,14 @@ type Dependencies struct { StorageProvider storage.Provider // TokenProvider is used to generate tokens TokenProvider token.Provider - // AuthorizationProvider is used for fine-grained authorization checks - AuthorizationProvider authorization.Provider + // AuthzEngine is the fine-grained authorization (FGA) engine. + // It is nil unless --authorization-engine=fga; resolvers MUST fail closed + // (return an error) when it is nil. + // + // Named AuthzEngine (not AuthorizationEngine) to avoid an ambiguous-selector + // clash with config.Config.AuthorizationEngine, which graphqlProvider also + // embeds. + AuthzEngine engine.AuthorizationEngine } // New constructs a new graphql provider with given arguments @@ -187,62 +193,28 @@ type Provider interface { // Webhooks is the method to list webhooks. // Permissions: authorizer:admin Webhooks(ctx context.Context, in *model.PaginatedRequest) (*model.Webhooks, error) - - // === Fine-Grained Authorization === - - // AuthzAddResource creates a new authorization resource. - // Permissions: authorizer:admin - AuthzAddResource(ctx context.Context, params *model.AddResourceInput) (*model.AuthzResource, error) - // AuthzUpdateResource updates an existing authorization resource. - // Permissions: authorizer:admin - AuthzUpdateResource(ctx context.Context, params *model.UpdateResourceInput) (*model.AuthzResource, error) - // AuthzDeleteResource deletes an authorization resource by ID. - // Permissions: authorizer:admin - AuthzDeleteResource(ctx context.Context, id string) (*model.Response, error) - // AuthzResources lists authorization resources with pagination. + // FgaWriteModel installs a new fine-grained authorization model. // Permissions: authorizer:admin - AuthzResources(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzResources, error) - - // AuthzAddScope creates a new authorization scope. - // Permissions: authorizer:admin - AuthzAddScope(ctx context.Context, params *model.AddScopeInput) (*model.AuthzScope, error) - // AuthzUpdateScope updates an existing authorization scope. - // Permissions: authorizer:admin - AuthzUpdateScope(ctx context.Context, params *model.UpdateScopeInput) (*model.AuthzScope, error) - // AuthzDeleteScope deletes an authorization scope by ID. + FgaWriteModel(ctx context.Context, params *model.FgaWriteModelInput) (*model.FgaModel, error) + // FgaGetModel returns the active fine-grained authorization model. // Permissions: authorizer:admin - AuthzDeleteScope(ctx context.Context, id string) (*model.Response, error) - // AuthzScopes lists authorization scopes with pagination. - // Permissions: authorizer:admin - AuthzScopes(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzScopes, error) - - // AuthzAddPolicy creates a new authorization policy with targets. + FgaGetModel(ctx context.Context) (*model.FgaModel, error) + // FgaWriteTuples writes fine-grained authorization tuples. // Permissions: authorizer:admin - AuthzAddPolicy(ctx context.Context, params *model.AddPolicyInput) (*model.AuthzPolicy, error) - // AuthzUpdatePolicy updates an existing authorization policy. + FgaWriteTuples(ctx context.Context, params *model.FgaWriteTuplesInput) (*model.Response, error) + // FgaDeleteTuples deletes fine-grained authorization tuples. // Permissions: authorizer:admin - AuthzUpdatePolicy(ctx context.Context, params *model.UpdatePolicyInput) (*model.AuthzPolicy, error) - // AuthzDeletePolicy deletes an authorization policy by ID. + FgaDeleteTuples(ctx context.Context, params *model.FgaWriteTuplesInput) (*model.Response, error) + // FgaReadTuples reads a page of fine-grained authorization tuples. // Permissions: authorizer:admin - AuthzDeletePolicy(ctx context.Context, id string) (*model.Response, error) - // AuthzPolicies lists authorization policies with pagination. - // Permissions: authorizer:admin - AuthzPolicies(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzPolicies, error) - - // AuthzAddPermission creates a new authorization permission binding a resource to scopes and policies. - // Permissions: authorizer:admin - AuthzAddPermission(ctx context.Context, params *model.AddPermissionInput) (*model.AuthzPermission, error) - // AuthzUpdatePermission updates an existing authorization permission. - // Permissions: authorizer:admin - AuthzUpdatePermission(ctx context.Context, params *model.UpdatePermissionInput) (*model.AuthzPermission, error) - // AuthzDeletePermission deletes an authorization permission by ID. - // Permissions: authorizer:admin - AuthzDeletePermission(ctx context.Context, id string) (*model.Response, error) - // AuthzPermissions lists authorization permissions with pagination. - // Permissions: authorizer:admin - AuthzPermissions(ctx context.Context, params *model.PaginatedRequest) (*model.AuthzPermissions, error) - - // Permissions returns all resource:scope pairs the authenticated user has access to. + FgaReadTuples(ctx context.Context, params *model.FgaReadTuplesInput) (*model.FgaTuples, error) + // FgaCheck checks a relation for the authenticated caller (principal pinned). + // Permissions: authorized user + FgaCheck(ctx context.Context, params *model.FgaCheckInput) (*model.FgaCheckResponse, error) + // FgaBatchCheck checks multiple relations for the authenticated caller. + // Permissions: authorized user + FgaBatchCheck(ctx context.Context, params *model.FgaBatchCheckInput) (*model.FgaBatchCheckResponse, error) + // FgaListObjects lists objects the authenticated caller relates to. // Permissions: authorized user - Permissions(ctx context.Context) ([]*model.Permission, error) + FgaListObjects(ctx context.Context, params *model.FgaListObjectsInput) (*model.FgaListObjectsResponse, error) } diff --git a/internal/graphql/session.go b/internal/graphql/session.go index 2539f434..bbbdf760 100644 --- a/internal/graphql/session.go +++ b/internal/graphql/session.go @@ -12,7 +12,6 @@ import ( "github.com/authorizerdev/authorizer/internal/constants" "github.com/authorizerdev/authorizer/internal/cookie" "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/metrics" "github.com/authorizerdev/authorizer/internal/parsers" "github.com/authorizerdev/authorizer/internal/refs" "github.com/authorizerdev/authorizer/internal/token" @@ -64,8 +63,10 @@ func (g *graphqlProvider) Session(ctx context.Context, params *model.SessionQuer } } - if params != nil { - if err := g.enforceRequiredPermissions(ctx, log, metrics.RequiredPermissionsEndpointSession, user.ID, claimRoles, params.RequiredPermissions); err != nil { + // Fine-grained authorization gate (AND semantics, fail-closed). + if params != nil && len(params.RequiredRelations) > 0 { + if err := enforceRequiredRelations(ctx, g.AuthzEngine, userID, params.RequiredRelations); err != nil { + log.Debug().Err(err).Msg("Required relations not satisfied") return nil, err } } diff --git a/internal/graphql/validate_jwt_token.go b/internal/graphql/validate_jwt_token.go index 8b17ff50..c2f7d06a 100644 --- a/internal/graphql/validate_jwt_token.go +++ b/internal/graphql/validate_jwt_token.go @@ -9,7 +9,6 @@ import ( "github.com/authorizerdev/authorizer/internal/constants" "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/metrics" "github.com/authorizerdev/authorizer/internal/parsers" "github.com/authorizerdev/authorizer/internal/storage/schemas" "github.com/authorizerdev/authorizer/internal/token" @@ -126,8 +125,12 @@ func (g *graphqlProvider) ValidateJWTToken(ctx context.Context, params *model.Va } } } - if err := g.enforceRequiredPermissions(ctx, log, metrics.RequiredPermissionsEndpointValidateJWTToken, userID, claimRoles, params.RequiredPermissions); err != nil { - return nil, err + // Fine-grained authorization gate (AND semantics, fail-closed). + if len(params.RequiredRelations) > 0 { + if err := enforceRequiredRelations(ctx, g.AuthzEngine, userID, params.RequiredRelations); err != nil { + log.Debug().Err(err).Msg("Required relations not satisfied") + return nil, err + } } return &model.ValidateJWTTokenResponse{ IsValid: true, diff --git a/internal/graphql/validate_session.go b/internal/graphql/validate_session.go index f5686cad..d8c23f86 100644 --- a/internal/graphql/validate_session.go +++ b/internal/graphql/validate_session.go @@ -7,7 +7,6 @@ import ( "github.com/authorizerdev/authorizer/internal/cookie" "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/metrics" "github.com/authorizerdev/authorizer/internal/utils" ) @@ -61,8 +60,10 @@ func (g *graphqlProvider) ValidateSession(ctx context.Context, params *model.Val } } } - if params != nil { - if err := g.enforceRequiredPermissions(ctx, log, metrics.RequiredPermissionsEndpointValidateSession, user.ID, claimRoles, params.RequiredPermissions); err != nil { + // Fine-grained authorization gate (AND semantics, fail-closed). + if params != nil && len(params.RequiredRelations) > 0 { + if err := enforceRequiredRelations(ctx, g.AuthzEngine, userID, params.RequiredRelations); err != nil { + log.Debug().Err(err).Msg("Required relations not satisfied") return nil, err } } diff --git a/internal/http_handlers/graphql.go b/internal/http_handlers/graphql.go index ad6e5e97..ab098cf9 100644 --- a/internal/http_handlers/graphql.go +++ b/internal/http_handlers/graphql.go @@ -218,7 +218,7 @@ func (h *httpProvider) GraphqlHandler() gin.HandlerFunc { SMSProvider: h.SMSProvider, StorageProvider: h.StorageProvider, TokenProvider: h.TokenProvider, - AuthorizationProvider: h.AuthorizationProvider, + AuthzEngine: h.AuthzEngine, }) if err != nil { h.Log.Error().Err(err).Msg("Failed to create graphql provider") diff --git a/internal/http_handlers/provider.go b/internal/http_handlers/provider.go index 966c2c3c..1fa2fc62 100644 --- a/internal/http_handlers/provider.go +++ b/internal/http_handlers/provider.go @@ -6,7 +6,7 @@ import ( "github.com/authorizerdev/authorizer/internal/audit" "github.com/authorizerdev/authorizer/internal/authenticators" - "github.com/authorizerdev/authorizer/internal/authorization" + "github.com/authorizerdev/authorizer/internal/authorization/engine" "github.com/authorizerdev/authorizer/internal/config" "github.com/authorizerdev/authorizer/internal/email" "github.com/authorizerdev/authorizer/internal/events" @@ -43,8 +43,12 @@ type Dependencies struct { OAuthProvider oauth.Provider // RateLimitProvider is used for per-IP rate limiting RateLimitProvider rate_limit.Provider - // AuthorizationProvider is used for fine-grained authorization checks - AuthorizationProvider authorization.Provider + // AuthzEngine is the fine-grained authorization (FGA) engine. + // It is nil unless --authorization-engine=fga. + // + // Named AuthzEngine (not AuthorizationEngine) to avoid an ambiguous-selector + // clash with config.Config.AuthorizationEngine, which httpProvider embeds. + AuthzEngine engine.AuthorizationEngine } // New constructs a new http provider with given arguments diff --git a/internal/integration_tests/authorization_test.go b/internal/integration_tests/authorization_test.go deleted file mode 100644 index d02c4647..00000000 --- a/internal/integration_tests/authorization_test.go +++ /dev/null @@ -1,1114 +0,0 @@ -package integration_tests - -import ( - "context" - "fmt" - "testing" - - "github.com/authorizerdev/authorizer/internal/authorization" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/crypto" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/metrics" - "github.com/authorizerdev/authorizer/internal/refs" - "github.com/authorizerdev/authorizer/internal/storage/schemas" - "github.com/google/uuid" - "github.com/prometheus/client_golang/prometheus/testutil" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// TestAuthorizationCRUD tests the fine-grained authorization CRUD operations -// and permission checking. -func TestAuthorizationCRUD(t *testing.T) { - cfg := getTestConfig() - ts := initTestSetup(t, cfg) - req, ctx := createContext(ts) - - // Set admin auth cookie for admin operations - adminHash, err := crypto.EncryptPassword(cfg.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - // IDs collected across subtests - var resourceID string - var scopeID string - var policyID string - var permissionID string - - t.Run("should add resource", func(t *testing.T) { - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{ - Name: "documents", - Description: refs.NewStringRef("Document resource for testing"), - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.NotEmpty(t, res.ID) - assert.Equal(t, "documents", res.Name) - assert.NotNil(t, res.Description) - assert.Equal(t, "Document resource for testing", *res.Description) - resourceID = res.ID - }) - - t.Run("should add scope", func(t *testing.T) { - res, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{ - Name: "read", - Description: refs.NewStringRef("Read access scope"), - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.NotEmpty(t, res.ID) - assert.Equal(t, "read", res.Name) - scopeID = res.ID - }) - - t.Run("should add policy", func(t *testing.T) { - res, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "user-role-policy", - Description: refs.NewStringRef("Policy for user role"), - Type: "role", - Targets: []*model.PolicyTargetInput{ - { - TargetType: "role", - TargetValue: "user", - }, - }, - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.NotEmpty(t, res.ID) - assert.Equal(t, "user-role-policy", res.Name) - assert.Equal(t, "role", res.Type) - assert.Equal(t, "positive", res.Logic) - assert.Equal(t, "affirmative", res.DecisionStrategy) - require.Len(t, res.Targets, 1) - assert.Equal(t, "role", res.Targets[0].TargetType) - assert.Equal(t, "user", res.Targets[0].TargetValue) - policyID = res.ID - }) - - t.Run("should add permission", func(t *testing.T) { - require.NotEmpty(t, resourceID, "resourceID must be set from prior subtest") - require.NotEmpty(t, scopeID, "scopeID must be set from prior subtest") - require.NotEmpty(t, policyID, "policyID must be set from prior subtest") - - res, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "documents-read", - ResourceID: resourceID, - ScopeIds: []string{scopeID}, - PolicyIds: []string{policyID}, - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.NotEmpty(t, res.ID) - assert.Equal(t, "documents-read", res.Name) - assert.Equal(t, "affirmative", res.DecisionStrategy) - require.NotNil(t, res.Resource) - assert.Equal(t, resourceID, res.Resource.ID) - require.Len(t, res.Scopes, 1) - assert.Equal(t, scopeID, res.Scopes[0].ID) - require.Len(t, res.Policies, 1) - assert.Equal(t, policyID, res.Policies[0].ID) - permissionID = res.ID - }) - - t.Run("should list resources", func(t *testing.T) { - res, err := ts.GraphQLProvider.AuthzResources(ctx, &model.PaginatedRequest{}) - require.NoError(t, err) - require.NotNil(t, res) - assert.GreaterOrEqual(t, len(res.Resources), 1) - assert.NotNil(t, res.Pagination) - - found := false - for _, r := range res.Resources { - if r.ID == resourceID { - found = true - assert.Equal(t, "documents", r.Name) - break - } - } - assert.True(t, found, "expected resource not found in list") - }) - - t.Run("should list scopes", func(t *testing.T) { - res, err := ts.GraphQLProvider.AuthzScopes(ctx, &model.PaginatedRequest{}) - require.NoError(t, err) - require.NotNil(t, res) - assert.GreaterOrEqual(t, len(res.Scopes), 1) - }) - - t.Run("should list policies", func(t *testing.T) { - res, err := ts.GraphQLProvider.AuthzPolicies(ctx, &model.PaginatedRequest{}) - require.NoError(t, err) - require.NotNil(t, res) - assert.GreaterOrEqual(t, len(res.Policies), 1) - }) - - t.Run("should list permissions", func(t *testing.T) { - res, err := ts.GraphQLProvider.AuthzPermissions(ctx, &model.PaginatedRequest{}) - require.NoError(t, err) - require.NotNil(t, res) - assert.GreaterOrEqual(t, len(res.Permissions), 1) - }) - - t.Run("should update resource", func(t *testing.T) { - require.NotEmpty(t, resourceID) - newName := "documents-updated" - res, err := ts.GraphQLProvider.AuthzUpdateResource(ctx, &model.UpdateResourceInput{ - ID: resourceID, - Name: &newName, - Description: refs.NewStringRef("Updated description"), - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.Equal(t, resourceID, res.ID) - assert.Equal(t, "documents-updated", res.Name) - assert.Equal(t, "Updated description", *res.Description) - - // Revert name for subsequent tests that reference "documents" by ID - origName := "documents" - _, err = ts.GraphQLProvider.AuthzUpdateResource(ctx, &model.UpdateResourceInput{ - ID: resourceID, - Name: &origName, - }) - require.NoError(t, err) - }) - - t.Run("should check permission granted by role", func(t *testing.T) { - res, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: uuid.New().String(), - Type: constants.PrincipalTypeUser, - Roles: []string{"user"}, - }, "documents", "read") - require.NoError(t, err) - require.NotNil(t, res) - assert.True(t, res.Allowed, "principal with 'user' role should have read access to documents") - }) - - t.Run("should check permission denied for wrong role", func(t *testing.T) { - // Add an admin-only policy + a "write" scope + a permission requiring - // the "admin" role for "write" on documents. - adminPolicy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "admin-only-policy", - Type: "role", - Targets: []*model.PolicyTargetInput{ - { - TargetType: "role", - TargetValue: "admin", - }, - }, - }) - require.NoError(t, err) - - writeScope, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{ - Name: "write", - }) - require.NoError(t, err) - - _, err = ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "documents-write", - ResourceID: resourceID, - ScopeIds: []string{writeScope.ID}, - PolicyIds: []string{adminPolicy.ID}, - }) - require.NoError(t, err) - - res, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: uuid.New().String(), - Type: constants.PrincipalTypeUser, - Roles: []string{"user"}, - }, "documents", "write") - require.NoError(t, err) - require.NotNil(t, res) - assert.False(t, res.Allowed, "principal with 'user' role should NOT have write access requiring 'admin' role") - }) - - // Re-set admin cookie for remaining admin operations - t.Run("should delete permission", func(t *testing.T) { - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - require.NotEmpty(t, permissionID) - - res, err := ts.GraphQLProvider.AuthzDeletePermission(ctx, permissionID) - require.NoError(t, err) - require.NotNil(t, res) - assert.Contains(t, res.Message, "deleted") - }) - - t.Run("should delete resource blocked by permission", func(t *testing.T) { - // The "documents-write" permission still references this resource, - // so delete should fail. - _, err := ts.GraphQLProvider.AuthzDeleteResource(ctx, resourceID) - assert.Error(t, err) - assert.Contains(t, err.Error(), "permission") - }) - - t.Run("should delete scope blocked by permission", func(t *testing.T) { - // The "write" scope is referenced by "documents-write" permission. - // Find the write scope ID from the scopes list. - scopes, err := ts.GraphQLProvider.AuthzScopes(ctx, &model.PaginatedRequest{}) - require.NoError(t, err) - var writeScopeID string - for _, s := range scopes.Scopes { - if s.Name == "write" { - writeScopeID = s.ID - break - } - } - require.NotEmpty(t, writeScopeID, "write scope must exist") - - _, err = ts.GraphQLProvider.AuthzDeleteScope(ctx, writeScopeID) - assert.Error(t, err) - assert.Contains(t, err.Error(), "permission") - }) - - t.Run("should delete policy blocked by permission", func(t *testing.T) { - // The "admin-only-policy" is referenced by "documents-write" permission. - policies, err := ts.GraphQLProvider.AuthzPolicies(ctx, &model.PaginatedRequest{}) - require.NoError(t, err) - var adminPolicyID string - for _, p := range policies.Policies { - if p.Name == "admin-only-policy" { - adminPolicyID = p.ID - break - } - } - require.NotEmpty(t, adminPolicyID, "admin-only-policy must exist") - - _, err = ts.GraphQLProvider.AuthzDeletePolicy(ctx, adminPolicyID) - assert.Error(t, err) - assert.Contains(t, err.Error(), "permission") - }) - - // Cleanup: delete the remaining permission first, then the rest - t.Run("cleanup should delete remaining permission then resources", func(t *testing.T) { - // Find and delete the "documents-write" permission - perms, err := ts.GraphQLProvider.AuthzPermissions(ctx, &model.PaginatedRequest{}) - require.NoError(t, err) - - for _, p := range perms.Permissions { - if p.Name == "documents-write" { - res, err := ts.GraphQLProvider.AuthzDeletePermission(ctx, p.ID) - require.NoError(t, err) - assert.Contains(t, res.Message, "deleted") - break - } - } - - // Now resource, scope, and policy should be deletable - res, err := ts.GraphQLProvider.AuthzDeleteResource(ctx, resourceID) - require.NoError(t, err) - assert.Contains(t, res.Message, "deleted") - - res, err = ts.GraphQLProvider.AuthzDeleteScope(ctx, scopeID) - require.NoError(t, err) - assert.Contains(t, res.Message, "deleted") - - res, err = ts.GraphQLProvider.AuthzDeletePolicy(ctx, policyID) - require.NoError(t, err) - assert.Contains(t, res.Message, "deleted") - }) -} - -// TestCheckPermission_NoPermissions_Denies verifies that a check for a -// (resource, scope) pair with no matching permission is denied. -func TestCheckPermission_NoPermissions_Denies(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - _, ctx := createContext(ts) - - result, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - }, "orders", "read") - - require.NoError(t, err) - require.False(t, result.Allowed, "no matching permission must deny") -} - -// TestCheckPermission_ExplicitDenyPolicy_Denies verifies that once a -// permission exists for the (resource, scope) and attaches a negative-logic -// policy that matches the principal, the check is denied. -func TestCheckPermission_ExplicitDenyPolicy_Denies(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - - // Authenticate as admin for seeding operations. - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - // Seed resource + scope + permission + negative role policy targeting "blocked-role". - seedResourceScopePermissionWithDenyPolicy(t, ts, ctx, "orders", "read", "blocked-role") - - // Clear admin cookie — CheckPermission here is a direct provider call; no auth context needed. - req.Header.Del("Cookie") - - result, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - Roles: []string{"blocked-role"}, - }, "orders", "read") - - require.NoError(t, err) - require.False(t, result.Allowed, "explicit deny must apply even in permissive mode") -} - -func TestCheckPermission_ExplicitDenyOverridesAffirmativeGrant(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{Name: "deny-override-docs"}) - require.NoError(t, err) - sc, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{Name: "read-deny-override"}) - require.NoError(t, err) - - positive := constants.PolicyLogicPositive - grantPolicy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "grant-user-" + uuid.New().String(), - Type: constants.PolicyTypeRole, - Logic: &positive, - Targets: []*model.PolicyTargetInput{{ - TargetType: constants.TargetTypeRole, - TargetValue: "user", - }}, - }) - require.NoError(t, err) - - negative := constants.PolicyLogicNegative - denyPolicy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "deny-blocked-" + uuid.New().String(), - Type: constants.PolicyTypeRole, - Logic: &negative, - Targets: []*model.PolicyTargetInput{{ - TargetType: constants.TargetTypeRole, - TargetValue: "blocked-role", - }}, - }) - require.NoError(t, err) - - _, err = ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "deny-override-permission-" + uuid.New().String(), - ResourceID: res.ID, - ScopeIds: []string{sc.ID}, - PolicyIds: []string{grantPolicy.ID, denyPolicy.ID}, - }) - require.NoError(t, err) - - result, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - Roles: []string{"user", "blocked-role"}, - }, "deny-override-docs", "read-deny-override") - require.NoError(t, err) - require.False(t, result.Allowed, "matching negative policy must override an affirmative grant") - - result, err = ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-2", - Type: constants.PrincipalTypeUser, - Roles: []string{"user"}, - }, "deny-override-docs", "read-deny-override") - require.NoError(t, err) - require.True(t, result.Allowed, "non-matching negative policy must not block a positive grant") - - result, err = ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-3", - Type: constants.PrincipalTypeUser, - Roles: []string{"other-role"}, - }, "deny-override-docs", "read-deny-override") - require.NoError(t, err) - require.False(t, result.Allowed, "non-matching negative policy must not grant access by itself") -} - -func TestCheckPermission_CacheKeyIncludesRoles(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - seedResourceScopePermissionWithPositivePolicy(t, ts, ctx, "cached-docs", "read", "viewer") - - result, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - Roles: []string{"viewer"}, - }, "cached-docs", "read") - require.NoError(t, err) - require.True(t, result.Allowed) - - result, err = ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - }, "cached-docs", "read") - require.NoError(t, err) - require.False(t, result.Allowed, "cached allow for viewer role must not apply to the same user without that role") -} - -func TestUpdatePermission_InvalidScopeDoesNotDropExistingLinks(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{Name: "update-safe-docs"}) - require.NoError(t, err) - sc, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{Name: "update-safe-read"}) - require.NoError(t, err) - policy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "update-safe-policy-" + uuid.New().String(), - Type: constants.PolicyTypeRole, - Targets: []*model.PolicyTargetInput{{ - TargetType: constants.TargetTypeRole, - TargetValue: "viewer", - }}, - }) - require.NoError(t, err) - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "update-safe-permission-" + uuid.New().String(), - ResourceID: res.ID, - ScopeIds: []string{sc.ID}, - PolicyIds: []string{policy.ID}, - }) - require.NoError(t, err) - - // Capture pre-failure state. Field-level rollback is part of the contract: - // a failed update must leave Name, Description, and DecisionStrategy - // untouched on the persisted permission row. - origPerm, err := ts.StorageProvider.GetPermissionByID(ctx, perm.ID) - require.NoError(t, err) - origName := origPerm.Name - origDescription := origPerm.Description - origDecision := origPerm.DecisionStrategy - - newName := "should-not-be-applied" - newDescription := "should-not-be-applied-description" - newDecision := constants.DecisionStrategyUnanimous - _, err = ts.GraphQLProvider.AuthzUpdatePermission(ctx, &model.UpdatePermissionInput{ - ID: perm.ID, - Name: &newName, - Description: &newDescription, - DecisionStrategy: &newDecision, - ScopeIds: []string{"missing-scope-id"}, - }) - require.Error(t, err) - - scopes, err := ts.StorageProvider.GetPermissionScopes(ctx, perm.ID) - require.NoError(t, err) - require.Len(t, scopes, 1) - require.Equal(t, sc.ID, scopes[0].ScopeID) - - // Verify field changes were rolled back. The persisted row must still hold - // the original values; the attempted update must have written nothing. - after, err := ts.StorageProvider.GetPermissionByID(ctx, perm.ID) - require.NoError(t, err) - require.Equal(t, origName, after.Name, "name must not change when update fails") - require.Equal(t, origDescription, after.Description, "description must not change when update fails") - require.Equal(t, origDecision, after.DecisionStrategy, "decision strategy must not change when update fails") - - result, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - Roles: []string{"viewer"}, - }, "update-safe-docs", "update-safe-read") - require.NoError(t, err) - require.True(t, result.Allowed, "failed update must not remove existing permission scope") -} - -func TestAddPermission_DuplicateNameReturnsConflict(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{Name: "duplicate-docs"}) - require.NoError(t, err) - sc, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{Name: "duplicate-read"}) - require.NoError(t, err) - policy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "duplicate-policy-" + uuid.New().String(), - Type: constants.PolicyTypeRole, - Targets: []*model.PolicyTargetInput{{ - TargetType: constants.TargetTypeRole, - TargetValue: "viewer", - }}, - }) - require.NoError(t, err) - - input := &model.AddPermissionInput{ - Name: "duplicate-permission", - ResourceID: res.ID, - ScopeIds: []string{sc.ID}, - PolicyIds: []string{policy.ID}, - } - _, err = ts.GraphQLProvider.AuthzAddPermission(ctx, input) - require.NoError(t, err) - - // The exact error wording is provider-specific (SQL emits "already exists", - // while NoSQL backends surface their native duplicate-key errors). Only the - // presence of an error is contractual. - _, err = ts.GraphQLProvider.AuthzAddPermission(ctx, input) - require.Error(t, err, "duplicate permission name must surface as an error from any storage backend") -} - -// TestCheckPermission_IncrementsPrometheusCounters verifies that an unmatched -// check increments metrics.AuthzUnmatchedTotal by exactly one. The -// (resource, scope) pair MUST be registered first so that the "known but no -// matching permission" path is exercised — unknown identifiers intentionally -// do not bump the counter (DoS guard). -func TestCheckPermission_IncrementsPrometheusCounters(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - _, ctx := createContext(ts) - - // Seed resource + scope directly via storage (no permission). This makes - // validateResourceExists / validateScopeExists return known=true, so the - // subsequent CheckPermission lands on the "known, no permission" path - // that DOES bump counters. - seedKnownResourceScopeNoPermission(t, ts, ctx, "orders", "read") - - before := testutil.ToFloat64(metrics.AuthzUnmatchedTotal) - - _, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - }, "orders", "read") - require.NoError(t, err) - - after := testutil.ToFloat64(metrics.AuthzUnmatchedTotal) - require.Equal(t, before+1, after, "unmatched counter must increment once per unmatched check") -} - -// TestCheckPermission_UnknownResource_DeniesAndDoesNotBumpUnmatchedCounter -// verifies the DoS guard: unknown (resource, scope) pairs are denied -// (enforcing is the only mode), and the unmatched counter must NOT grow for -// attacker-controlled input. Authenticated callers can still reach -// CheckPermission with arbitrary identifiers via GraphQL (permissions / -// required_permissions) — without this guard they could flood the in-process -// sync.Map with arbitrary (resource, scope) pairs. -func TestCheckPermission_UnknownResource_DeniesAndDoesNotBumpUnmatchedCounter(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - _, ctx := createContext(ts) - - before := testutil.ToFloat64(metrics.AuthzUnmatchedTotal) - - result, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", Type: constants.PrincipalTypeUser, - }, "unknown-resource", "unknown-scope") - - require.NoError(t, err) - require.False(t, result.Allowed, "unknown resource is always denied (enforcing-only)") - - after := testutil.ToFloat64(metrics.AuthzUnmatchedTotal) - require.Equal(t, before, after, "unknown-resource calls must NOT bump the unmatched counter (DoS guard)") -} - -// seedKnownResourceScopeNoPermission inserts a Resource and Scope row via the -// storage provider without attaching a Permission. This is the minimal seed -// needed to exercise the "known (resource, scope), no matching permission" -// path in CheckPermission after Fix B/C. -func seedKnownResourceScopeNoPermission(t *testing.T, ts *testSetup, _ context.Context, resource, scope string) { - t.Helper() - _, err := ts.StorageProvider.AddResource(context.Background(), &schemas.Resource{ - Name: resource, - Description: "seed (no permission) resource", - }) - require.NoError(t, err) - _, err = ts.StorageProvider.AddScope(context.Background(), &schemas.Scope{ - Name: scope, - Description: "seed (no permission) scope", - }) - require.NoError(t, err) -} - -// seedResourceScopePermissionWithDenyPolicy seeds a resource, scope, a -// negative-logic role policy targeting the given role, and a permission that -// links them. It uses the GraphQL provider (mirroring TestAuthorizationCRUD), -// so the caller must have already authenticated as admin on the request -// attached to ts.GinContext. -func seedResourceScopePermissionWithDenyPolicy( - t *testing.T, - ts *testSetup, - ctx context.Context, - resource, scope, role string, -) { - t.Helper() - - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{ - Name: resource, - Description: refs.NewStringRef("seed resource"), - }) - require.NoError(t, err) - require.NotNil(t, res) - - sc, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{ - Name: scope, - Description: refs.NewStringRef("seed scope"), - }) - require.NoError(t, err) - require.NotNil(t, sc) - - negative := constants.PolicyLogicNegative - policy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "deny-" + role + "-" + uuid.New().String(), - Description: refs.NewStringRef("seed deny policy"), - Type: constants.PolicyTypeRole, - Logic: &negative, - Targets: []*model.PolicyTargetInput{ - { - TargetType: constants.TargetTypeRole, - TargetValue: role, - }, - }, - }) - require.NoError(t, err) - require.NotNil(t, policy) - require.Equal(t, constants.PolicyLogicNegative, policy.Logic, "policy must be stored as negative") - - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: resource + "-" + scope, - ResourceID: res.ID, - ScopeIds: []string{sc.ID}, - PolicyIds: []string{policy.ID}, - }) - require.NoError(t, err) - require.NotNil(t, perm) -} - -// TestCheckPermission_ResultLabels_IncrementCorrectCounter covers the result -// labels on authorizer_authz_checks_total: allowed, denied, unmatched, and -// error. Each subtest builds the exact shape needed to land on one terminal -// path in CheckPermission and asserts that exactly one increment is recorded -// on the matching counter series. -// Co-located with the authz tests because it shares their fixtures. -func TestCheckPermission_ResultLabels_IncrementCorrectCounter(t *testing.T) { - t.Run("allowed", func(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - // Seed a granting role policy + permission for (orders, read) and a - // user principal with the "user" role so the affirmative grant fires. - seedResourceScopePermissionAllowingRole(t, ts, ctx, "orders", "read", "user") - - before := testutil.ToFloat64(metrics.AuthzChecksTotal.WithLabelValues(metrics.AuthzResultAllowed)) - - res, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-allowed", Type: constants.PrincipalTypeUser, Roles: []string{"user"}, - }, "orders", "read") - require.NoError(t, err) - require.True(t, res.Allowed) - - after := testutil.ToFloat64(metrics.AuthzChecksTotal.WithLabelValues(metrics.AuthzResultAllowed)) - require.Equal(t, before+1, after, "allowed counter must increment once") - }) - - t.Run("denied", func(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - // Negative-logic policy targeting "user" — any principal with that - // role is explicitly denied on (orders, read). - seedResourceScopePermissionWithDenyPolicy(t, ts, ctx, "orders", "read", "user") - - before := testutil.ToFloat64(metrics.AuthzChecksTotal.WithLabelValues(metrics.AuthzResultDenied)) - - res, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-denied", Type: constants.PrincipalTypeUser, Roles: []string{"user"}, - }, "orders", "read") - require.NoError(t, err) - require.False(t, res.Allowed) - - after := testutil.ToFloat64(metrics.AuthzChecksTotal.WithLabelValues(metrics.AuthzResultDenied)) - require.Equal(t, before+1, after, "denied counter must increment once") - }) - - t.Run("unmatched", func(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - _, ctx := createContext(ts) - - // Known (resource, scope) with no permission row → denied, increments unmatched. - seedKnownResourceScopeNoPermission(t, ts, ctx, "orders", "read") - - before := testutil.ToFloat64(metrics.AuthzChecksTotal.WithLabelValues(metrics.AuthzResultUnmatched)) - - res, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-unmatched", Type: constants.PrincipalTypeUser, - }, "orders", "read") - require.NoError(t, err) - require.False(t, res.Allowed) - - after := testutil.ToFloat64(metrics.AuthzChecksTotal.WithLabelValues(metrics.AuthzResultUnmatched)) - require.Equal(t, before+1, after, "unmatched counter must increment once") - }) - - t.Run("error", func(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - _, ctx := createContext(ts) - - before := testutil.ToFloat64(metrics.AuthzChecksTotal.WithLabelValues(metrics.AuthzResultError)) - - // Invalid identifier — fails the input validation path which records - // AuthzResultError before any storage or cache lookup. - _, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-error", Type: constants.PrincipalTypeUser, - }, "bad resource with spaces", "read") - require.Error(t, err) - - after := testutil.ToFloat64(metrics.AuthzChecksTotal.WithLabelValues(metrics.AuthzResultError)) - require.Equal(t, before+1, after, "error counter must increment once") - }) -} - -// seedResourceScopePermissionAllowingRole seeds a resource + scope and an -// affirmative-logic role policy targeting `role`, then attaches a permission -// linking them. Mirrors seedResourceScopePermissionWithDenyPolicy but for the -// grant path. -func seedResourceScopePermissionAllowingRole( - t *testing.T, - ts *testSetup, - ctx context.Context, - resource, scope, role string, -) { - t.Helper() - - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{ - Name: resource, - Description: refs.NewStringRef("seed resource"), - }) - require.NoError(t, err) - - sc, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{ - Name: scope, - Description: refs.NewStringRef("seed scope"), - }) - require.NoError(t, err) - - pol, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "allow-" + role + "-" + uuid.New().String()[:8], - Description: refs.NewStringRef("seed allow policy"), - Type: constants.PolicyTypeRole, - Logic: refs.NewStringRef(constants.PolicyLogicPositive), - Targets: []*model.PolicyTargetInput{ - {TargetType: constants.TargetTypeRole, TargetValue: role}, - }, - }) - require.NoError(t, err) - - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "allow-" + resource + "-" + scope + "-" + uuid.New().String()[:8], - Description: refs.NewStringRef("seed allow permission"), - ResourceID: res.ID, - ScopeIds: []string{sc.ID}, - PolicyIds: []string{pol.ID}, - }) - require.NoError(t, err) - require.NotNil(t, perm) -} - -// seedResourceScopePermissionWithRolePolicy seeds a resource, scope, a -// role policy with the given logic targeting the given role, and a permission -// that links them. Shared implementation used by the positive- and -// negative-logic helpers. -func seedResourceScopePermissionWithRolePolicy( - t *testing.T, - ts *testSetup, - ctx context.Context, - resource, scope, role, logic string, -) { - t.Helper() - - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{ - Name: resource, - Description: refs.NewStringRef("seed resource"), - }) - require.NoError(t, err) - require.NotNil(t, res) - - sc, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{ - Name: scope, - Description: refs.NewStringRef("seed scope"), - }) - require.NoError(t, err) - require.NotNil(t, sc) - - logicRef := logic - policy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: logic + "-" + role + "-" + uuid.New().String(), - Description: refs.NewStringRef("seed role policy"), - Type: constants.PolicyTypeRole, - Logic: &logicRef, - Targets: []*model.PolicyTargetInput{ - { - TargetType: constants.TargetTypeRole, - TargetValue: role, - }, - }, - }) - require.NoError(t, err) - require.NotNil(t, policy) - require.Equal(t, logic, policy.Logic, "policy must be stored with requested logic") - - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: resource + "-" + scope + "-" + uuid.New().String(), - ResourceID: res.ID, - ScopeIds: []string{sc.ID}, - PolicyIds: []string{policy.ID}, - }) - require.NoError(t, err) - require.NotNil(t, perm) -} - -// seedResourceScopePermissionWithPositivePolicy seeds a resource, scope, a -// positive-logic role policy targeting the given role, and a permission that -// links them. Mirrors seedResourceScopePermissionWithDenyPolicy but with grant -// semantics. -func seedResourceScopePermissionWithPositivePolicy( - t *testing.T, - ts *testSetup, - ctx context.Context, - resource, scope, role string, -) { - t.Helper() - seedResourceScopePermissionWithRolePolicy(t, ts, ctx, resource, scope, role, constants.PolicyLogicPositive) -} - -// seedResourceScopeWithUnanimousDualRolePolicy seeds a resource, scope, TWO -// positive-logic role policies (one per role), and a permission that links -// them with DecisionStrategy=unanimous. This is the minimal setup to exercise -// the unanimous evaluation path (all attached policies must agree). -func seedResourceScopeWithUnanimousDualRolePolicy( - t *testing.T, - ts *testSetup, - ctx context.Context, - resource, scope, roleA, roleB string, -) { - t.Helper() - - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{ - Name: resource, - Description: refs.NewStringRef("seed resource"), - }) - require.NoError(t, err) - require.NotNil(t, res) - - sc, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{ - Name: scope, - Description: refs.NewStringRef("seed scope"), - }) - require.NoError(t, err) - require.NotNil(t, sc) - - positive := constants.PolicyLogicPositive - - policyA, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "grant-" + roleA + "-" + uuid.New().String(), - Description: refs.NewStringRef("seed positive role policy A"), - Type: constants.PolicyTypeRole, - Logic: &positive, - Targets: []*model.PolicyTargetInput{ - { - TargetType: constants.TargetTypeRole, - TargetValue: roleA, - }, - }, - }) - require.NoError(t, err) - require.NotNil(t, policyA) - - policyB, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "grant-" + roleB + "-" + uuid.New().String(), - Description: refs.NewStringRef("seed positive role policy B"), - Type: constants.PolicyTypeRole, - Logic: &positive, - Targets: []*model.PolicyTargetInput{ - { - TargetType: constants.TargetTypeRole, - TargetValue: roleB, - }, - }, - }) - require.NoError(t, err) - require.NotNil(t, policyB) - - unanimous := constants.DecisionStrategyUnanimous - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: resource + "-" + scope + "-" + uuid.New().String(), - ResourceID: res.ID, - ScopeIds: []string{sc.ID}, - PolicyIds: []string{policyA.ID, policyB.ID}, - DecisionStrategy: &unanimous, - }) - require.NoError(t, err) - require.NotNil(t, perm) - require.Equal(t, constants.DecisionStrategyUnanimous, perm.DecisionStrategy, - "permission must be persisted with unanimous strategy") -} - -// seedResourceScopeWithUserPolicyPermission seeds a resource, scope, a -// positive-logic user policy targeting the given userID, and a permission that -// links them. Exercises the PolicyTypeUser path: the policy matches on -// principal.ID, not roles. -func seedResourceScopeWithUserPolicyPermission( - t *testing.T, - ts *testSetup, - ctx context.Context, - resource, scope, userID string, -) { - t.Helper() - - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{ - Name: resource, - Description: refs.NewStringRef("seed resource"), - }) - require.NoError(t, err) - require.NotNil(t, res) - - sc, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{ - Name: scope, - Description: refs.NewStringRef("seed scope"), - }) - require.NoError(t, err) - require.NotNil(t, sc) - - positive := constants.PolicyLogicPositive - policy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "user-grant-" + uuid.New().String(), - Description: refs.NewStringRef("seed user policy"), - Type: constants.PolicyTypeUser, - Logic: &positive, - Targets: []*model.PolicyTargetInput{ - { - TargetType: constants.TargetTypeUser, - TargetValue: userID, - }, - }, - }) - require.NoError(t, err) - require.NotNil(t, policy) - - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: resource + "-" + scope + "-" + uuid.New().String(), - ResourceID: res.ID, - ScopeIds: []string{sc.ID}, - PolicyIds: []string{policy.ID}, - }) - require.NoError(t, err) - require.NotNil(t, perm) -} - -// TestCheckPermission_MaxScopes_InsideCeiling_UsesPolicy verifies that when a -// principal's delegation ceiling (MaxScopes) explicitly includes the requested -// resource:scope, the normal policy evaluation proceeds and a matching -// positive policy still grants access. -func TestCheckPermission_MaxScopes_InsideCeiling_UsesPolicy(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - seedResourceScopePermissionWithPositivePolicy(t, ts, ctx, "docs", "read", "viewer") - - result, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - Roles: []string{"viewer"}, - MaxScopes: []string{"docs:read"}, - }, "docs", "read") - require.NoError(t, err) - require.True(t, result.Allowed) -} - -// TestCheckPermission_MaxScopes_OutsideCeiling_DeniesBeforePolicy verifies that -// even when a principal's roles/policies would normally grant access, a -// MaxScopes ceiling that does not include the requested resource:scope MUST -// deny the check short-circuit — delegation ceilings are evaluated before -// policy matching. -func TestCheckPermission_MaxScopes_OutsideCeiling_DeniesBeforePolicy(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - seedResourceScopePermissionWithPositivePolicy(t, ts, ctx, "docs", "read", "viewer") - - result, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - Roles: []string{"viewer"}, - MaxScopes: []string{"docs:write"}, - }, "docs", "read") - require.NoError(t, err) - require.False(t, result.Allowed, "MaxScopes ceiling must deny before policy eval") -} - -// TestCheckPermission_UnanimousDecisionStrategy_AllPoliciesMustAgree verifies -// that a permission with DecisionStrategy=unanimous only grants when every -// attached policy's target matches the principal. A principal with only one of -// the two required roles must be denied; a principal with both is allowed. -func TestCheckPermission_UnanimousDecisionStrategy_AllPoliciesMustAgree(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - seedResourceScopeWithUnanimousDualRolePolicy(t, ts, ctx, "ledger", "read", "accountant", "auditor") - - res, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-1", - Type: constants.PrincipalTypeUser, - Roles: []string{"accountant"}, - }, "ledger", "read") - require.NoError(t, err) - require.False(t, res.Allowed, "unanimous: missing one role") - - res2, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-2", - Type: constants.PrincipalTypeUser, - Roles: []string{"accountant", "auditor"}, - }, "ledger", "read") - require.NoError(t, err) - require.True(t, res2.Allowed, "unanimous: all roles present") -} - -// TestCheckPermission_UserTypePolicy_MatchesOnPrincipalID verifies that a -// PolicyTypeUser policy matches the principal by its ID (not by role). The -// seeded policy grants access to a specific user; any other user must be -// denied. -func TestCheckPermission_UserTypePolicy_MatchesOnPrincipalID(t *testing.T) { - ts := initTestSetup(t, getTestConfig()) - req, ctx := createContext(ts) - adminHash, err := crypto.EncryptPassword(ts.Config.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - seedResourceScopeWithUserPolicyPermission(t, ts, ctx, "secret", "read", "user-alice") - - res, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-alice", - Type: constants.PrincipalTypeUser, - }, "secret", "read") - require.NoError(t, err) - require.True(t, res.Allowed) - - res2, err := ts.Authz.CheckPermission(ctx, &authorization.Principal{ - ID: "user-bob", - Type: constants.PrincipalTypeUser, - }, "secret", "read") - require.NoError(t, err) - require.False(t, res2.Allowed) -} diff --git a/internal/integration_tests/authz_cache_invalidation_test.go b/internal/integration_tests/authz_cache_invalidation_test.go deleted file mode 100644 index 1aaf7625..00000000 --- a/internal/integration_tests/authz_cache_invalidation_test.go +++ /dev/null @@ -1,162 +0,0 @@ -package integration_tests - -import ( - "context" - "fmt" - "testing" - - "github.com/google/uuid" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/authorizerdev/authorizer/internal/authorization" - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/crypto" - "github.com/authorizerdev/authorizer/internal/graph/model" -) - -// TestAuthzCacheInvalidation_OnAdminMutations verifies that the memory_store- -// backed decision cache is actually invalidated when the policy graph changes -// via admin mutations. The test enables the authz cache (CacheTTL > 0), -// primes a deny verdict for (resource, scope), then mutates the graph via -// each admin operation that should invalidate cache, and confirms the next -// check produces the new verdict instead of the cached one. -func TestAuthzCacheInvalidation_OnAdminMutations(t *testing.T) { - cfg := getTestConfig() - cfg.AuthorizationCacheTTL = 300 // turn the cache ON for this test - ts := initTestSetup(t, cfg) - req, ctx := createContext(ts) - - adminHash, err := crypto.EncryptPassword(cfg.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - t.Cleanup(func() { req.Header.Del("Cookie") }) - - resource, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{Name: "inv-docs"}) - require.NoError(t, err) - readScope, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{Name: "inv-read"}) - require.NoError(t, err) - writeScope, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{Name: "inv-write"}) - require.NoError(t, err) - policy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "inv-user-role", - Type: "role", - Targets: []*model.PolicyTargetInput{ - {TargetType: "role", TargetValue: "user"}, - }, - }) - require.NoError(t, err) - - principal := &authorization.Principal{ - ID: uuid.New().String(), - Type: constants.PrincipalTypeUser, - Roles: []string{"user"}, - } - - check := func(t *testing.T, scope string) bool { - t.Helper() - res, err := ts.Authz.CheckPermission(context.Background(), principal, "inv-docs", scope) - require.NoError(t, err) - require.NotNil(t, res) - return res.Allowed - } - - t.Run("add permission flips cached deny to allow", func(t *testing.T) { - // Prime: no permission row exists yet, evaluator returns deny and - // memory_store now holds "false" for this (principal, resource, scope). - assert.False(t, check(t, "inv-read"), "must deny before any permission exists") - - // Mutate: add a permission granting inv-docs:inv-read via the - // user-role policy. The graphql layer calls InvalidateCache. - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "inv-docs-read", - ResourceID: resource.ID, - ScopeIds: []string{readScope.ID}, - PolicyIds: []string{policy.ID}, - }) - require.NoError(t, err) - t.Cleanup(func() { - _, _ = ts.GraphQLProvider.AuthzDeletePermission(ctx, perm.ID) - }) - - // Verdict must update — if the cache wasn't invalidated, we'd still - // see the stale "false". - assert.True(t, check(t, "inv-read"), "cached deny must be invalidated; new permission should grant access") - }) - - t.Run("update permission swap-scopes flips verdicts", func(t *testing.T) { - // Seed a permission for inv-read, prime cache (allow for inv-read, - // deny for inv-write). - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "inv-update-perm", - ResourceID: resource.ID, - ScopeIds: []string{readScope.ID}, - PolicyIds: []string{policy.ID}, - }) - require.NoError(t, err) - t.Cleanup(func() { - _, _ = ts.GraphQLProvider.AuthzDeletePermission(ctx, perm.ID) - }) - - require.True(t, check(t, "inv-read"), "precondition: inv-read allowed via new permission") - require.False(t, check(t, "inv-write"), "precondition: inv-write denied (not in any permission row)") - - // Swap the permission's scope set from read → write. Cache for both - // pairs must be invalidated. - _, err = ts.GraphQLProvider.AuthzUpdatePermission(ctx, &model.UpdatePermissionInput{ - ID: perm.ID, - ScopeIds: []string{writeScope.ID}, - }) - require.NoError(t, err) - - assert.False(t, check(t, "inv-read"), "cached allow must be invalidated after scope removed") - assert.True(t, check(t, "inv-write"), "cached deny must be invalidated after scope added") - }) - - t.Run("delete permission flips cached allow back to deny", func(t *testing.T) { - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "inv-delete-perm", - ResourceID: resource.ID, - ScopeIds: []string{readScope.ID}, - PolicyIds: []string{policy.ID}, - }) - require.NoError(t, err) - require.True(t, check(t, "inv-read"), "precondition: inv-read allowed before delete") - - _, err = ts.GraphQLProvider.AuthzDeletePermission(ctx, perm.ID) - require.NoError(t, err) - - assert.False(t, check(t, "inv-read"), "cached allow must be invalidated after permission deletion") - }) - - t.Run("delete resource invalidates downstream cache", func(t *testing.T) { - // Fresh resource so the deletion doesn't disturb the outer fixtures. - tmpResource, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{Name: "inv-tmp"}) - require.NoError(t, err) - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "inv-tmp-perm", - ResourceID: tmpResource.ID, - ScopeIds: []string{readScope.ID}, - PolicyIds: []string{policy.ID}, - }) - require.NoError(t, err) - - res, err := ts.Authz.CheckPermission(context.Background(), principal, "inv-tmp", "inv-read") - require.NoError(t, err) - require.True(t, res.Allowed, "precondition: granted before resource delete") - - // Cascade-delete the permission first (Postgres FK + Mongo lookup - // reasons), then drop the resource. - _, err = ts.GraphQLProvider.AuthzDeletePermission(ctx, perm.ID) - require.NoError(t, err) - _, err = ts.GraphQLProvider.AuthzDeleteResource(ctx, tmpResource.ID) - require.NoError(t, err) - - // Re-check — the cached allow must be gone (DeletePermission already - // invalidates; this assertion guards against a future regression - // where DeleteResource forgets to invalidate.) - res, err = ts.Authz.CheckPermission(context.Background(), principal, "inv-tmp", "inv-read") - require.NoError(t, err) - assert.False(t, res.Allowed, "cached allow must be invalidated after resource deletion") - }) -} diff --git a/internal/integration_tests/authz_pagination_test.go b/internal/integration_tests/authz_pagination_test.go deleted file mode 100644 index dd5c37f3..00000000 --- a/internal/integration_tests/authz_pagination_test.go +++ /dev/null @@ -1,220 +0,0 @@ -package integration_tests - -import ( - "fmt" - "testing" - - "github.com/google/uuid" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/crypto" - "github.com/authorizerdev/authorizer/internal/graph/model" -) - -// TestAuthzListPagination_AdminQueries seeds N rows of each FGA entity and -// asserts the four list resolvers (Resources / Scopes / Policies / -// Permissions) honor limit, page, offset, and total. Each subtest exercises -// page 1 + page 2 + an over-the-end page to confirm offset math and that -// total reflects the full row count regardless of the returned slice size. -func TestAuthzListPagination_AdminQueries(t *testing.T) { - cfg := getTestConfig() - ts := initTestSetup(t, cfg) - req, ctx := createContext(ts) - - adminHash, err := crypto.EncryptPassword(cfg.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - t.Cleanup(func() { req.Header.Del("Cookie") }) - - // Unique prefix isolates this test's fixtures from other tests in the - // same test binary (which all share an SQLite DB inside t.TempDir()). - prefix := "page-" + uuid.New().String()[:8] + "-" - const seedCount = 5 - resourceIDs := make([]string, 0, seedCount) - scopeIDs := make([]string, 0, seedCount) - policyIDs := make([]string, 0, seedCount) - permissionIDs := make([]string, 0, seedCount) - - for i := 0; i < seedCount; i++ { - res, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{ - Name: fmt.Sprintf("%sresource-%d", prefix, i), - }) - require.NoError(t, err) - resourceIDs = append(resourceIDs, res.ID) - - scope, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{ - Name: fmt.Sprintf("%sscope-%d", prefix, i), - }) - require.NoError(t, err) - scopeIDs = append(scopeIDs, scope.ID) - - pol, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: fmt.Sprintf("%spolicy-%d", prefix, i), - Type: "role", - Targets: []*model.PolicyTargetInput{ - {TargetType: "role", TargetValue: "user"}, - }, - }) - require.NoError(t, err) - policyIDs = append(policyIDs, pol.ID) - - perm, err := ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: fmt.Sprintf("%spermission-%d", prefix, i), - ResourceID: res.ID, - ScopeIds: []string{scope.ID}, - PolicyIds: []string{pol.ID}, - }) - require.NoError(t, err) - permissionIDs = append(permissionIDs, perm.ID) - } - - // page1 + page2 + over-the-end behavior is symmetric across the four - // resolvers, so each subtest below makes the same three assertions - // against a different list endpoint. - - t.Run("resources pagination", func(t *testing.T) { - page1, err := ts.GraphQLProvider.AuthzResources(ctx, &model.PaginatedRequest{ - Pagination: &model.PaginationRequest{Limit: ptrInt64(2), Page: ptrInt64(1)}, - }) - require.NoError(t, err) - require.NotNil(t, page1) - require.NotNil(t, page1.Pagination) - assert.Equal(t, int64(2), page1.Pagination.Limit, "limit echoes input") - assert.Equal(t, int64(1), page1.Pagination.Page, "page echoes input") - assert.Equal(t, int64(0), page1.Pagination.Offset, "page 1 offset = 0") - assert.GreaterOrEqual(t, page1.Pagination.Total, int64(seedCount), "total must include all seeded rows") - assert.Len(t, page1.Resources, 2, "page 1 returns Limit items") - - page2, err := ts.GraphQLProvider.AuthzResources(ctx, &model.PaginatedRequest{ - Pagination: &model.PaginationRequest{Limit: ptrInt64(2), Page: ptrInt64(2)}, - }) - require.NoError(t, err) - assert.Equal(t, int64(2), page2.Pagination.Offset, "page 2 offset = (page-1)*limit") - assert.Len(t, page2.Resources, 2, "page 2 returns Limit items") - assertNoOverlap(t, idsOf(page1.Resources), idsOf(page2.Resources)) - - // Page far past the end returns zero items but the total is still - // the full row count. - pageEnd, err := ts.GraphQLProvider.AuthzResources(ctx, &model.PaginatedRequest{ - Pagination: &model.PaginationRequest{Limit: ptrInt64(2), Page: ptrInt64(100)}, - }) - require.NoError(t, err) - assert.Empty(t, pageEnd.Resources, "page past the end is empty") - assert.Equal(t, page1.Pagination.Total, pageEnd.Pagination.Total, "total is invariant across pages") - }) - - t.Run("scopes pagination", func(t *testing.T) { - page1, err := ts.GraphQLProvider.AuthzScopes(ctx, &model.PaginatedRequest{ - Pagination: &model.PaginationRequest{Limit: ptrInt64(2), Page: ptrInt64(1)}, - }) - require.NoError(t, err) - require.NotNil(t, page1) - require.NotNil(t, page1.Pagination) - assert.Equal(t, int64(2), page1.Pagination.Limit) - assert.Equal(t, int64(0), page1.Pagination.Offset) - assert.GreaterOrEqual(t, page1.Pagination.Total, int64(seedCount)) - assert.Len(t, page1.Scopes, 2) - - page2, err := ts.GraphQLProvider.AuthzScopes(ctx, &model.PaginatedRequest{ - Pagination: &model.PaginationRequest{Limit: ptrInt64(2), Page: ptrInt64(2)}, - }) - require.NoError(t, err) - assert.Equal(t, int64(2), page2.Pagination.Offset) - assert.Len(t, page2.Scopes, 2) - assertNoOverlap(t, scopeIdsOf(page1.Scopes), scopeIdsOf(page2.Scopes)) - }) - - t.Run("policies pagination", func(t *testing.T) { - page1, err := ts.GraphQLProvider.AuthzPolicies(ctx, &model.PaginatedRequest{ - Pagination: &model.PaginationRequest{Limit: ptrInt64(2), Page: ptrInt64(1)}, - }) - require.NoError(t, err) - require.NotNil(t, page1) - assert.Equal(t, int64(0), page1.Pagination.Offset) - assert.GreaterOrEqual(t, page1.Pagination.Total, int64(seedCount)) - assert.Len(t, page1.Policies, 2) - - page2, err := ts.GraphQLProvider.AuthzPolicies(ctx, &model.PaginatedRequest{ - Pagination: &model.PaginationRequest{Limit: ptrInt64(2), Page: ptrInt64(2)}, - }) - require.NoError(t, err) - assert.Equal(t, int64(2), page2.Pagination.Offset) - assert.Len(t, page2.Policies, 2) - assertNoOverlap(t, policyIdsOf(page1.Policies), policyIdsOf(page2.Policies)) - }) - - t.Run("permissions pagination", func(t *testing.T) { - page1, err := ts.GraphQLProvider.AuthzPermissions(ctx, &model.PaginatedRequest{ - Pagination: &model.PaginationRequest{Limit: ptrInt64(2), Page: ptrInt64(1)}, - }) - require.NoError(t, err) - require.NotNil(t, page1) - assert.Equal(t, int64(0), page1.Pagination.Offset) - assert.GreaterOrEqual(t, page1.Pagination.Total, int64(seedCount)) - assert.Len(t, page1.Permissions, 2) - - page2, err := ts.GraphQLProvider.AuthzPermissions(ctx, &model.PaginatedRequest{ - Pagination: &model.PaginationRequest{Limit: ptrInt64(2), Page: ptrInt64(2)}, - }) - require.NoError(t, err) - assert.Equal(t, int64(2), page2.Pagination.Offset) - assert.Len(t, page2.Permissions, 2) - assertNoOverlap(t, permissionIdsOf(page1.Permissions), permissionIdsOf(page2.Permissions)) - }) - - // Touch the seeded IDs so the linter sees them as used even if a future - // edit drops a subtest. They're meaningful as fixture witnesses. - _ = resourceIDs - _ = scopeIDs - _ = policyIDs - _ = permissionIDs -} - -func ptrInt64(v int64) *int64 { return &v } - -func idsOf(items []*model.AuthzResource) []string { - ids := make([]string, len(items)) - for i, x := range items { - ids[i] = x.ID - } - return ids -} - -func scopeIdsOf(items []*model.AuthzScope) []string { - ids := make([]string, len(items)) - for i, x := range items { - ids[i] = x.ID - } - return ids -} - -func policyIdsOf(items []*model.AuthzPolicy) []string { - ids := make([]string, len(items)) - for i, x := range items { - ids[i] = x.ID - } - return ids -} - -func permissionIdsOf(items []*model.AuthzPermission) []string { - ids := make([]string, len(items)) - for i, x := range items { - ids[i] = x.ID - } - return ids -} - -func assertNoOverlap(t *testing.T, a, b []string) { - t.Helper() - set := make(map[string]struct{}, len(a)) - for _, id := range a { - set[id] = struct{}{} - } - for _, id := range b { - if _, ok := set[id]; ok { - t.Errorf("page 2 contains ID %q that already appeared on page 1", id) - } - } -} diff --git a/internal/integration_tests/fga_test.go b/internal/integration_tests/fga_test.go new file mode 100644 index 00000000..f5841e32 --- /dev/null +++ b/internal/integration_tests/fga_test.go @@ -0,0 +1,350 @@ +package integration_tests + +import ( + "fmt" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "github.com/rs/zerolog" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/authorizerdev/authorizer/internal/audit" + "github.com/authorizerdev/authorizer/internal/authenticators" + "github.com/authorizerdev/authorizer/internal/authorization/engine" + fgaengine "github.com/authorizerdev/authorizer/internal/authorization/engine/openfga" + "github.com/authorizerdev/authorizer/internal/config" + "github.com/authorizerdev/authorizer/internal/constants" + "github.com/authorizerdev/authorizer/internal/crypto" + "github.com/authorizerdev/authorizer/internal/email" + "github.com/authorizerdev/authorizer/internal/events" + "github.com/authorizerdev/authorizer/internal/graph/model" + "github.com/authorizerdev/authorizer/internal/graphql" + "github.com/authorizerdev/authorizer/internal/http_handlers" + "github.com/authorizerdev/authorizer/internal/memory_store" + "github.com/authorizerdev/authorizer/internal/oauth" + "github.com/authorizerdev/authorizer/internal/rate_limit" + "github.com/authorizerdev/authorizer/internal/sms" + "github.com/authorizerdev/authorizer/internal/storage" + "github.com/authorizerdev/authorizer/internal/token" +) + +// fgaTestModel is a minimal ReBAC model used to exercise the FGA GraphQL surface. +const fgaTestModel = `model + schema 1.1 +type user +type document + relations + define viewer: [user] + define can_view: viewer +` + +// initFGATestSetup mirrors initTestSetup but injects an embedded OpenFGA engine +// (memory store) into both the GraphQL and HTTP providers, so the runtime/admin +// FGA resolvers are routed. +func initFGATestSetup(t *testing.T, cfg *config.Config) (*testSetup, engine.AuthorizationEngine) { + logger := zerolog.New(zerolog.NewTestWriter(t)).With().Timestamp().Logger() + + cfg.DatabaseURL = t.TempDir() + "/authorizer_fga.db" + + storageProvider, err := storage.New(cfg, &storage.Dependencies{Log: &logger}) + require.NoError(t, err) + + authProvider, err := authenticators.New(cfg, &authenticators.Dependencies{Log: &logger, StorageProvider: storageProvider}) + require.NoError(t, err) + emailProvider, err := email.New(cfg, &email.Dependencies{Log: &logger, StorageProvider: storageProvider}) + require.NoError(t, err) + eventsProvider, err := events.New(cfg, &events.Dependencies{Log: &logger, StorageProvider: storageProvider}) + require.NoError(t, err) + memoryStoreProvider, err := memory_store.New(cfg, &memory_store.Dependencies{Log: &logger}) + require.NoError(t, err) + smsProvider, err := sms.New(cfg, &sms.Dependencies{Log: &logger}) + require.NoError(t, err) + tokenProvider, err := token.New(cfg, &token.Dependencies{Log: &logger, MemoryStoreProvider: memoryStoreProvider}) + require.NoError(t, err) + rateLimitProvider, err := rate_limit.New(cfg, &rate_limit.Dependencies{Log: &logger}) + require.NoError(t, err) + oauthProvider, err := oauth.New(cfg, &oauth.Dependencies{Log: &logger}) + require.NoError(t, err) + auditProvider := audit.New(&audit.Dependencies{Log: &logger, StorageProvider: storageProvider}) + + // Embedded OpenFGA engine with an in-memory store (dev/test only). + fgaEngine, err := fgaengine.New( + &fgaengine.Config{Store: fgaengine.StoreMemory, StoreName: "authorizer-test"}, + &fgaengine.Dependencies{Log: &logger}, + ) + require.NoError(t, err) + + gqlProvider, err := graphql.New(cfg, &graphql.Dependencies{ + Log: &logger, + AuditProvider: auditProvider, + AuthenticatorProvider: authProvider, + EmailProvider: emailProvider, + EventsProvider: eventsProvider, + MemoryStoreProvider: memoryStoreProvider, + SMSProvider: smsProvider, + StorageProvider: storageProvider, + TokenProvider: tokenProvider, + AuthzEngine: fgaEngine, + }) + require.NoError(t, err) + + httpProvider, err := http_handlers.New(cfg, &http_handlers.Dependencies{ + Log: &logger, + AuditProvider: auditProvider, + AuthenticatorProvider: authProvider, + EmailProvider: emailProvider, + EventsProvider: eventsProvider, + MemoryStoreProvider: memoryStoreProvider, + SMSProvider: smsProvider, + StorageProvider: storageProvider, + TokenProvider: tokenProvider, + RateLimitProvider: rateLimitProvider, + OAuthProvider: oauthProvider, + AuthzEngine: fgaEngine, + }) + require.NoError(t, err) + + w := httptest.NewRecorder() + ctx, r := gin.CreateTestContext(w) + r.Use(httpProvider.CORSMiddleware()) + r.Use(httpProvider.ContextMiddleware()) + r.Use(httpProvider.LoggerMiddleware()) + r.POST("/graphql", httpProvider.GraphqlHandler()) + server := httptest.NewServer(r) + + t.Cleanup(func() { + server.Close() + if closer, ok := fgaEngine.(interface{ Close() }); ok { + closer.Close() + } + if storageProvider != nil { + if err := storageProvider.Close(); err != nil { + t.Logf("close storage provider: %v", err) + } + } + }) + + return &testSetup{ + GraphQLProvider: gqlProvider, + HttpProvider: httpProvider, + HttpServer: server, + Config: cfg, + Logger: &logger, + GinContext: ctx, + StorageProvider: storageProvider, + MemoryStoreProvider: memoryStoreProvider, + AuthenticatorProvider: authProvider, + TokenProvider: tokenProvider, + }, fgaEngine +} + +// setAdminCookie authenticates the current gin request as super admin. +func setAdminCookie(t *testing.T, ts *testSetup) { + h, err := crypto.EncryptPassword(ts.Config.AdminSecret) + require.NoError(t, err) + ts.GinContext.Request.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, h)) +} + +// clearCookies removes all cookies from the current gin request. +func clearCookies(ts *testSetup) { + ts.GinContext.Request.Header.Del("Cookie") +} + +func TestFGA(t *testing.T) { + cfg := getTestConfig() + cfg.AuthorizationEngine = "fga" + ts, eng := initFGATestSetup(t, cfg) + req, ctx := createContext(ts) + + // Create + log in a regular user; their token sub is the principal. + email := "fga_test_" + uuid.New().String() + "@authorizer.dev" + password := "Password@123" + _, err := ts.GraphQLProvider.SignUp(ctx, &model.SignUpRequest{ + Email: &email, Password: password, ConfirmPassword: password, + }) + require.NoError(t, err) + loginRes, err := ts.GraphQLProvider.Login(ctx, &model.LoginRequest{Email: &email, Password: password}) + require.NoError(t, err) + require.NotNil(t, loginRes) + userID := loginRes.User.ID + sessionToken := latestAppSessionCookie(ts) + require.NotEmpty(t, sessionToken) + + // ---- Admin: write the authorization model. ---- + t.Run("_fga_write_model requires super admin", func(t *testing.T) { + clearCookies(ts) + res, err := ts.GraphQLProvider.FgaWriteModel(ctx, &model.FgaWriteModelInput{Dsl: fgaTestModel}) + assert.Error(t, err) + assert.Nil(t, res) + }) + + setAdminCookie(t, ts) + modelRes, err := ts.GraphQLProvider.FgaWriteModel(ctx, &model.FgaWriteModelInput{Dsl: fgaTestModel}) + require.NoError(t, err) + require.NotNil(t, modelRes) + require.NotEmpty(t, modelRes.ID) + + // ---- Admin: write tuples granting THIS user viewer on document:1 only. ---- + _, err = ts.GraphQLProvider.FgaWriteTuples(ctx, &model.FgaWriteTuplesInput{ + Tuples: []*model.FgaTupleInput{ + {User: "user:" + userID, Relation: "viewer", Object: "document:1"}, + }, + }) + require.NoError(t, err) + + // ---- Admin: read tuples back. ---- + t.Run("_fga_read_tuples returns written tuple", func(t *testing.T) { + tuplesRes, err := ts.GraphQLProvider.FgaReadTuples(ctx, &model.FgaReadTuplesInput{}) + require.NoError(t, err) + require.NotNil(t, tuplesRes) + found := false + for _, tup := range tuplesRes.Tuples { + if tup.User == "user:"+userID && tup.Relation == "viewer" && tup.Object == "document:1" { + found = true + } + } + assert.True(t, found, "written tuple should be readable") + }) + + // Switch back to the user's session for runtime calls. + // Drop the admin cookie; runtime resolvers pin the principal from the + // session/access token, NOT the admin cookie. + clearCookies(ts) + ts.GinContext.Request.Header.Set("Cookie", fmt.Sprintf("%s_session=%s", constants.AppCookieName, sessionToken)) + + // ---- Runtime: fga_check allow (principal pinned to the caller). ---- + t.Run("fga_check allows owner on granted object", func(t *testing.T) { + res, err := ts.GraphQLProvider.FgaCheck(ctx, &model.FgaCheckInput{ + Relation: "can_view", Object: "document:1", + }) + require.NoError(t, err) + require.NotNil(t, res) + assert.True(t, res.Allowed) + }) + + // ---- Runtime: fga_check deny on a non-granted object. ---- + t.Run("fga_check denies on ungranted object", func(t *testing.T) { + res, err := ts.GraphQLProvider.FgaCheck(ctx, &model.FgaCheckInput{ + Relation: "can_view", Object: "document:2", + }) + require.NoError(t, err) + require.NotNil(t, res) + assert.False(t, res.Allowed) + }) + + // ---- Runtime: PRINCIPAL PINNING — client cannot ask about another user. ---- + t.Run("fga_check pins principal to caller (no impersonation)", func(t *testing.T) { + // Grant a DIFFERENT user viewer on document:3. + setAdminCookie(t, ts) + _, err := ts.GraphQLProvider.FgaWriteTuples(ctx, &model.FgaWriteTuplesInput{ + Tuples: []*model.FgaTupleInput{ + {User: "user:someone-else", Relation: "viewer", Object: "document:3"}, + }, + }) + require.NoError(t, err) + clearCookies(ts) + ts.GinContext.Request.Header.Set("Cookie", fmt.Sprintf("%s_session=%s", constants.AppCookieName, sessionToken)) + + // The caller (who is NOT someone-else) must be denied on document:3. + // There is no client-supplied "user" field, so impersonation is impossible. + res, err := ts.GraphQLProvider.FgaCheck(ctx, &model.FgaCheckInput{ + Relation: "can_view", Object: "document:3", + }) + require.NoError(t, err) + require.NotNil(t, res) + assert.False(t, res.Allowed, "caller must not inherit another user's grant") + }) + + // ---- Runtime: fga_list_objects returns only the caller's objects. ---- + t.Run("fga_list_objects returns granted objects for caller", func(t *testing.T) { + res, err := ts.GraphQLProvider.FgaListObjects(ctx, &model.FgaListObjectsInput{ + Relation: "can_view", ObjectType: "document", + }) + require.NoError(t, err) + require.NotNil(t, res) + assert.Contains(t, res.Objects, "document:1") + assert.NotContains(t, res.Objects, "document:3") + }) + + // ---- Runtime: fga_batch_check. ---- + t.Run("fga_batch_check positional allow/deny", func(t *testing.T) { + res, err := ts.GraphQLProvider.FgaBatchCheck(ctx, &model.FgaBatchCheckInput{ + Checks: []*model.FgaCheckPairInput{ + {Relation: "can_view", Object: "document:1"}, + {Relation: "can_view", Object: "document:2"}, + }, + }) + require.NoError(t, err) + require.Len(t, res.Results, 2) + assert.True(t, res.Results[0].Allowed) + assert.False(t, res.Results[1].Allowed) + }) + + // ---- Phase 4: validate_session honors required_relations. ---- + t.Run("validate_session passes when required relation is satisfied", func(t *testing.T) { + res, err := ts.GraphQLProvider.ValidateSession(ctx, &model.ValidateSessionRequest{ + Cookie: sessionToken, + RequiredRelations: []*model.FgaRelationInput{ + {Relation: "can_view", Object: "document:1"}, + }, + }) + require.NoError(t, err) + require.NotNil(t, res) + assert.True(t, res.IsValid) + }) + + t.Run("validate_session fails when required relation is not satisfied", func(t *testing.T) { + res, err := ts.GraphQLProvider.ValidateSession(ctx, &model.ValidateSessionRequest{ + Cookie: sessionToken, + RequiredRelations: []*model.FgaRelationInput{ + {Relation: "can_view", Object: "document:2"}, + }, + }) + assert.Error(t, err) + assert.Nil(t, res) + }) + + _ = req + _ = eng +} + +// TestFGADisabled asserts fail-closed behavior when no engine is configured. +func TestFGADisabled(t *testing.T) { + cfg := getTestConfig() + ts := initTestSetup(t, cfg) // no AuthzEngine wired + _, ctx := createContext(ts) + + t.Run("fga_check errors when engine not enabled", func(t *testing.T) { + res, err := ts.GraphQLProvider.FgaCheck(ctx, &model.FgaCheckInput{ + Relation: "can_view", Object: "document:1", + }) + assert.Error(t, err) + assert.Nil(t, res) + assert.Contains(t, err.Error(), "fine-grained authorization is not enabled") + }) + + t.Run("validate_session errors when required_relations set but engine disabled", func(t *testing.T) { + email := "fga_disabled_" + uuid.New().String() + "@authorizer.dev" + password := "Password@123" + _, err := ts.GraphQLProvider.SignUp(ctx, &model.SignUpRequest{ + Email: &email, Password: password, ConfirmPassword: password, + }) + require.NoError(t, err) + _, err = ts.GraphQLProvider.Login(ctx, &model.LoginRequest{Email: &email, Password: password}) + require.NoError(t, err) + sessionToken := latestAppSessionCookie(ts) + require.NotEmpty(t, sessionToken) + + res, err := ts.GraphQLProvider.ValidateSession(ctx, &model.ValidateSessionRequest{ + Cookie: sessionToken, + RequiredRelations: []*model.FgaRelationInput{ + {Relation: "can_view", Object: "document:1"}, + }, + }) + assert.Error(t, err) + assert.Nil(t, res) + }) +} diff --git a/internal/integration_tests/metrics_test.go b/internal/integration_tests/metrics_test.go index 50d2e6bd..2f83a8ad 100644 --- a/internal/integration_tests/metrics_test.go +++ b/internal/integration_tests/metrics_test.go @@ -300,35 +300,6 @@ func TestRecordAuthEventHelpers(t *testing.T) { }) } -// TestMetrics_AuthzCollectorsRegistered verifies the FGA authz collectors -// (checks total, unmatched total, and check duration histogram) are registered -// with the default Prometheus registry and appear in the scrape output once -// incremented. It also asserts the low-cardinality label values are exactly -// the package constants. -func TestMetrics_AuthzCollectorsRegistered(t *testing.T) { - cfg := getTestConfig() - ts := initTestSetup(t, cfg) - - router := gin.New() - router.GET("/metrics", ts.HttpProvider.MetricsHandler()) - - // Bump each collector once so it appears in scrape output. - metrics.RecordAuthzCheck(metrics.AuthzResultUnmatched) - metrics.RecordAuthzUnmatched() - metrics.AuthzCheckDuration.Observe(0.001) - - w := httptest.NewRecorder() - req, err := http.NewRequest(http.MethodGet, "/metrics", nil) - require.NoError(t, err) - router.ServeHTTP(w, req) - - body := w.Body.String() - require.Contains(t, body, "authorizer_authz_checks_total") - require.Contains(t, body, "authorizer_authz_unmatched_total") - require.Contains(t, body, "authorizer_authz_check_duration_seconds") - require.Contains(t, body, `result="unmatched"`) -} - // TestAdminLoginMetrics verifies admin login records metrics. func TestAdminLoginMetrics(t *testing.T) { cfg := getTestConfig() diff --git a/internal/integration_tests/permissions_test.go b/internal/integration_tests/permissions_test.go deleted file mode 100644 index 6cba1fb1..00000000 --- a/internal/integration_tests/permissions_test.go +++ /dev/null @@ -1,119 +0,0 @@ -package integration_tests - -import ( - "fmt" - "sort" - "testing" - - "github.com/google/uuid" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/crypto" - "github.com/authorizerdev/authorizer/internal/graph/model" -) - -// TestPermissions exercises the permissions query end-to-end. It seeds a -// policy graph as admin, signs up a regular user, logs them in, and asserts the -// flat (resource, scope) list returned by permissions matches what the -// "user" role is granted via the policy targets — and that scopes attached to -// roles the principal does not hold are excluded. -func TestPermissions(t *testing.T) { - cfg := getTestConfig() - ts := initTestSetup(t, cfg) - req, ctx := createContext(ts) - - // Authenticate as admin to seed the FGA graph. - adminHash, err := crypto.EncryptPassword(cfg.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - docs, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{Name: "docs"}) - require.NoError(t, err) - billing, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{Name: "billing"}) - require.NoError(t, err) - - read, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{Name: "read"}) - require.NoError(t, err) - write, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{Name: "write"}) - require.NoError(t, err) - - userPolicy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "my-perms-user-role", - Type: "role", - Targets: []*model.PolicyTargetInput{ - {TargetType: "role", TargetValue: "user"}, - }, - }) - require.NoError(t, err) - adminPolicy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "my-perms-admin-role", - Type: "role", - Targets: []*model.PolicyTargetInput{ - {TargetType: "role", TargetValue: "admin"}, - }, - }) - require.NoError(t, err) - - // user role can read docs and read billing; admin role can write docs. - // The signed-up user has role "user" only, so they must see exactly two - // (resource, scope) pairs and NOT docs:write. - _, err = ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "my-perms-docs-read", - ResourceID: docs.ID, - ScopeIds: []string{read.ID}, - PolicyIds: []string{userPolicy.ID}, - }) - require.NoError(t, err) - _, err = ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "my-perms-billing-read", - ResourceID: billing.ID, - ScopeIds: []string{read.ID}, - PolicyIds: []string{userPolicy.ID}, - }) - require.NoError(t, err) - _, err = ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "my-perms-docs-write", - ResourceID: docs.ID, - ScopeIds: []string{write.ID}, - PolicyIds: []string{adminPolicy.ID}, - }) - require.NoError(t, err) - - req.Header.Del("Cookie") - - password := "Password@123" - signupEmail := "my_perms_" + uuid.New().String() + "@authorizer.dev" - _, err = ts.GraphQLProvider.SignUp(ctx, &model.SignUpRequest{ - Email: &signupEmail, - Password: password, - ConfirmPassword: password, - }) - require.NoError(t, err) - _, err = ts.GraphQLProvider.Login(ctx, &model.LoginRequest{ - Email: &signupEmail, - Password: password, - }) - require.NoError(t, err) - - // Use the freshly minted session cookie so permissions resolves the - // caller via the standard session-cookie path. - sessionToken, _ := captureTokens(t, ts) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AppCookieName+"_session", sessionToken)) - t.Cleanup(func() { req.Header.Del("Cookie") }) - - perms, err := ts.GraphQLProvider.Permissions(ctx) - require.NoError(t, err) - require.NotNil(t, perms) - - got := make([]string, 0, len(perms)) - for _, p := range perms { - require.NotNil(t, p) - got = append(got, p.Resource+":"+p.Scope) - } - sort.Strings(got) - - want := []string{"billing:read", "docs:read"} - assert.Equal(t, want, got, "permissions must return the user-role grants and exclude admin-only docs:write") -} diff --git a/internal/integration_tests/required_permissions_test.go b/internal/integration_tests/required_permissions_test.go deleted file mode 100644 index b6866c91..00000000 --- a/internal/integration_tests/required_permissions_test.go +++ /dev/null @@ -1,276 +0,0 @@ -package integration_tests - -import ( - "fmt" - "strings" - "testing" - - "github.com/authorizerdev/authorizer/internal/constants" - "github.com/authorizerdev/authorizer/internal/crypto" - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/metrics" - "github.com/google/uuid" - "github.com/prometheus/client_golang/prometheus/testutil" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// captureTokens returns the most recent session and access tokens from the -// in-memory store. Helper for tests that need to read tokens minted by Login. -func captureTokens(t *testing.T, ts *testSetup) (sessionToken, accessToken string) { - t.Helper() - allData, err := ts.MemoryStoreProvider.GetAllData() - require.NoError(t, err) - for k, v := range allData { - switch { - case strings.Contains(k, constants.TokenTypeSessionToken): - sessionToken = v - case strings.Contains(k, constants.TokenTypeAccessToken): - accessToken = v - } - } - require.NotEmpty(t, sessionToken, "session token must be present") - require.NotEmpty(t, accessToken, "access token must be present") - return sessionToken, accessToken -} - -// TestRequiredPermissions verifies the new optional required_permissions field -// on session, validate_jwt_token, and validate_session. It also asserts the -// backward-compatible path (callers that omit the field see no change). -func TestRequiredPermissions(t *testing.T) { - cfg := getTestConfig() - ts := initTestSetup(t, cfg) - req, ctx := createContext(ts) - - // Seed an authz permission as admin: docs:read granted to the "user" - // role. The default signup assigns "user" role. - adminHash, err := crypto.EncryptPassword(cfg.AdminSecret) - require.NoError(t, err) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, adminHash)) - - resource, err := ts.GraphQLProvider.AuthzAddResource(ctx, &model.AddResourceInput{Name: "docs"}) - require.NoError(t, err) - - scope, err := ts.GraphQLProvider.AuthzAddScope(ctx, &model.AddScopeInput{Name: "read"}) - require.NoError(t, err) - - policy, err := ts.GraphQLProvider.AuthzAddPolicy(ctx, &model.AddPolicyInput{ - Name: "user-role-can-read", - Type: "role", - Targets: []*model.PolicyTargetInput{ - {TargetType: "role", TargetValue: "user"}, - }, - }) - require.NoError(t, err) - - _, err = ts.GraphQLProvider.AuthzAddPermission(ctx, &model.AddPermissionInput{ - Name: "docs-read", - ResourceID: resource.ID, - ScopeIds: []string{scope.ID}, - PolicyIds: []string{policy.ID}, - }) - require.NoError(t, err) - - req.Header.Del("Cookie") - - password := "Password@123" - signupEmail := "required_perms_" + uuid.New().String() + "@authorizer.dev" - _, err = ts.GraphQLProvider.SignUp(ctx, &model.SignUpRequest{ - Email: &signupEmail, - Password: password, - ConfirmPassword: password, - }) - require.NoError(t, err) - - login := func(t *testing.T) { - t.Helper() - _, err := ts.GraphQLProvider.Login(ctx, &model.LoginRequest{ - Email: &signupEmail, - Password: password, - }) - require.NoError(t, err) - } - - // validate_jwt_token and validate_session do NOT rotate, so a single login - // suffices for all six of their subtests. - login(t) - sessionToken, accessToken := captureTokens(t, ts) - - t.Run("validate_jwt_token", func(t *testing.T) { - t.Run("backward compat: no required_permissions still works", func(t *testing.T) { - res, err := ts.GraphQLProvider.ValidateJWTToken(ctx, &model.ValidateJWTTokenRequest{ - Token: accessToken, - TokenType: constants.TokenTypeAccessToken, - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.True(t, res.IsValid) - }) - - t.Run("granted permission passes", func(t *testing.T) { - res, err := ts.GraphQLProvider.ValidateJWTToken(ctx, &model.ValidateJWTTokenRequest{ - Token: accessToken, - TokenType: constants.TokenTypeAccessToken, - RequiredPermissions: []*model.PermissionInput{ - {Resource: "docs", Scope: "read"}, - }, - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.True(t, res.IsValid) - }) - - t.Run("denied permission returns unauthorized", func(t *testing.T) { - res, err := ts.GraphQLProvider.ValidateJWTToken(ctx, &model.ValidateJWTTokenRequest{ - Token: accessToken, - TokenType: constants.TokenTypeAccessToken, - RequiredPermissions: []*model.PermissionInput{ - {Resource: "docs", Scope: "write"}, - }, - }) - require.Error(t, err) - require.Nil(t, res) - assert.Contains(t, err.Error(), "unauthorized") - }) - }) - - t.Run("validate_session", func(t *testing.T) { - t.Run("backward compat: no required_permissions still works", func(t *testing.T) { - res, err := ts.GraphQLProvider.ValidateSession(ctx, &model.ValidateSessionRequest{ - Cookie: sessionToken, - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.True(t, res.IsValid) - }) - - t.Run("granted permission passes", func(t *testing.T) { - res, err := ts.GraphQLProvider.ValidateSession(ctx, &model.ValidateSessionRequest{ - Cookie: sessionToken, - RequiredPermissions: []*model.PermissionInput{ - {Resource: "docs", Scope: "read"}, - }, - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.True(t, res.IsValid) - }) - - t.Run("denied permission returns unauthorized", func(t *testing.T) { - res, err := ts.GraphQLProvider.ValidateSession(ctx, &model.ValidateSessionRequest{ - Cookie: sessionToken, - RequiredPermissions: []*model.PermissionInput{ - {Resource: "docs", Scope: "write"}, - }, - }) - require.Error(t, err) - require.Nil(t, res) - assert.Contains(t, err.Error(), "unauthorized") - }) - }) - - // session() rotates the session on every successful call — re-login per - // subtest so each one starts with a fresh, valid session cookie. - callSession := func(t *testing.T, params *model.SessionQueryRequest) (*model.AuthResponse, error) { - t.Helper() - login(t) - st, _ := captureTokens(t, ts) - req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AppCookieName+"_session", st)) - defer req.Header.Del("Cookie") - return ts.GraphQLProvider.Session(ctx, params) - } - - t.Run("session", func(t *testing.T) { - t.Run("backward compat: no required_permissions still works", func(t *testing.T) { - res, err := callSession(t, &model.SessionQueryRequest{}) - require.NoError(t, err) - require.NotNil(t, res) - assert.NotEmpty(t, res.AccessToken) - }) - - t.Run("granted permission passes", func(t *testing.T) { - res, err := callSession(t, &model.SessionQueryRequest{ - RequiredPermissions: []*model.PermissionInput{ - {Resource: "docs", Scope: "read"}, - }, - }) - require.NoError(t, err) - require.NotNil(t, res) - assert.NotEmpty(t, res.AccessToken) - }) - - t.Run("denied permission returns unauthorized", func(t *testing.T) { - res, err := callSession(t, &model.SessionQueryRequest{ - RequiredPermissions: []*model.PermissionInput{ - {Resource: "docs", Scope: "write"}, - }, - }) - require.Error(t, err) - require.Nil(t, res) - assert.Contains(t, err.Error(), "unauthorized") - }) - }) - - t.Run("metrics counters increment per outcome", func(t *testing.T) { - // Re-login to get a fresh access token — the session subtests above each - // call login() internally (session rotates on every call), which replaces - // the memory-store entries and makes the top-level accessToken stale. - login(t) - _, freshAccessToken := captureTokens(t, ts) - - grantedBefore := testutil.ToFloat64(metrics.RequiredPermissionsChecksTotal.WithLabelValues( - metrics.RequiredPermissionsEndpointValidateJWTToken, - metrics.RequiredPermissionsOutcomeGranted, - )) - deniedBefore := testutil.ToFloat64(metrics.RequiredPermissionsChecksTotal.WithLabelValues( - metrics.RequiredPermissionsEndpointValidateJWTToken, - metrics.RequiredPermissionsOutcomeDenied, - )) - notReqBefore := testutil.ToFloat64(metrics.RequiredPermissionsChecksTotal.WithLabelValues( - metrics.RequiredPermissionsEndpointValidateJWTToken, - metrics.RequiredPermissionsOutcomeNotRequested, - )) - - // not_requested - _, err := ts.GraphQLProvider.ValidateJWTToken(ctx, &model.ValidateJWTTokenRequest{ - Token: freshAccessToken, - TokenType: constants.TokenTypeAccessToken, - }) - require.NoError(t, err) - - // granted - _, err = ts.GraphQLProvider.ValidateJWTToken(ctx, &model.ValidateJWTTokenRequest{ - Token: freshAccessToken, - TokenType: constants.TokenTypeAccessToken, - RequiredPermissions: []*model.PermissionInput{ - {Resource: "docs", Scope: "read"}, - }, - }) - require.NoError(t, err) - - // denied — error is intentional; only the counter increment matters. - // outcome=error is not exercised here: simulating a CheckPermission - // storage fault from an integration test requires fault injection - // the provider doesn't currently expose. - _, _ = ts.GraphQLProvider.ValidateJWTToken(ctx, &model.ValidateJWTTokenRequest{ - Token: freshAccessToken, - TokenType: constants.TokenTypeAccessToken, - RequiredPermissions: []*model.PermissionInput{ - {Resource: "docs", Scope: "write"}, - }, - }) - - assert.Equal(t, grantedBefore+1, testutil.ToFloat64(metrics.RequiredPermissionsChecksTotal.WithLabelValues( - metrics.RequiredPermissionsEndpointValidateJWTToken, - metrics.RequiredPermissionsOutcomeGranted, - ))) - assert.Equal(t, deniedBefore+1, testutil.ToFloat64(metrics.RequiredPermissionsChecksTotal.WithLabelValues( - metrics.RequiredPermissionsEndpointValidateJWTToken, - metrics.RequiredPermissionsOutcomeDenied, - ))) - assert.Equal(t, notReqBefore+1, testutil.ToFloat64(metrics.RequiredPermissionsChecksTotal.WithLabelValues( - metrics.RequiredPermissionsEndpointValidateJWTToken, - metrics.RequiredPermissionsOutcomeNotRequested, - ))) - }) -} diff --git a/internal/integration_tests/test_helper.go b/internal/integration_tests/test_helper.go index f4005c35..d154500b 100644 --- a/internal/integration_tests/test_helper.go +++ b/internal/integration_tests/test_helper.go @@ -15,7 +15,6 @@ import ( "github.com/authorizerdev/authorizer/internal/audit" "github.com/authorizerdev/authorizer/internal/authenticators" - "github.com/authorizerdev/authorizer/internal/authorization" "github.com/authorizerdev/authorizer/internal/config" "github.com/authorizerdev/authorizer/internal/constants" "github.com/authorizerdev/authorizer/internal/email" @@ -44,9 +43,6 @@ type testSetup struct { MemoryStoreProvider memory_store.Provider AuthenticatorProvider authenticators.Provider TokenProvider token.Provider - // Authz is the authorization provider, exposed for tests that exercise - // CheckPermission / GetPrincipalPermissions directly (bypassing GraphQL). - Authz authorization.Provider } func createContext(s *testSetup) (*http.Request, context.Context) { @@ -188,19 +184,6 @@ func initTestSetup(t *testing.T, cfg *config.Config) *testSetup { }) require.NoError(t, err) - // Initialize authorization provider. Tests that need the decision cache - // active can set cfg.AuthorizationCacheTTL > 0 in their getTestConfig - // equivalent; the default (0) keeps existing tests on the no-cache path - // they were written against. - authzProvider, err := authorization.New(&authorization.Config{ - CacheTTL: cfg.AuthorizationCacheTTL, - }, &authorization.Dependencies{ - Log: &logger, - StorageProvider: storageProvider, - MemoryStoreProvider: memoryStoreProvider, - }) - require.NoError(t, err) - // Initialize audit provider auditProvider := audit.New(&audit.Dependencies{ Log: &logger, @@ -212,7 +195,6 @@ func initTestSetup(t *testing.T, cfg *config.Config) *testSetup { Log: &logger, AuditProvider: auditProvider, AuthenticatorProvider: authProvider, - AuthorizationProvider: authzProvider, EmailProvider: emailProvider, EventsProvider: eventsProvider, MemoryStoreProvider: memoryStoreProvider, @@ -279,7 +261,6 @@ func initTestSetup(t *testing.T, cfg *config.Config) *testSetup { MemoryStoreProvider: memoryStoreProvider, AuthenticatorProvider: authProvider, TokenProvider: tokenProvider, - Authz: authzProvider, } } diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index f76d482b..56e6e9c3 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -35,32 +35,6 @@ const ( StatusFailure = "failure" ) -// Authorization check result labels. -const ( - AuthzResultAllowed = "allowed" // matched policy, granted - AuthzResultDenied = "denied" // matched policy, denied - AuthzResultUnmatched = "unmatched" // no permission row for (resource, scope) - AuthzResultError = "error" // validation / storage error -) - -// Outcome constants for the required_permissions counter (per-request bucket, -// distinct from per-CheckPermission AuthzResult* above). Low cardinality. -const ( - RequiredPermissionsOutcomeGranted = "granted" // all listed permissions allowed - RequiredPermissionsOutcomeDenied = "denied" // one or more denied by policy - RequiredPermissionsOutcomeNotRequested = "not_requested" // caller omitted required_permissions - RequiredPermissionsOutcomeError = "error" // CheckPermission errored (DB/validation) -) - -// RequiredPermissionsEndpoint* are the bounded endpoint label values for the -// required_permissions counter. New endpoints adopting required_permissions -// must add a constant here rather than passing raw strings. -const ( - RequiredPermissionsEndpointSession = "session" - RequiredPermissionsEndpointValidateSession = "validate_session" - RequiredPermissionsEndpointValidateJWTToken = "validate_jwt_token" -) - var ( // HTTPRequestsTotal is the total number of HTTP requests received. HTTPRequestsTotal = prometheus.NewCounterVec( @@ -155,44 +129,6 @@ var ( Help: "Total requests that omitted X-Authorizer-Client-ID (allowed for some routes)", }, ) - - // AuthzChecksTotal counts every CheckPermission call, labelled by result. - AuthzChecksTotal = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "authorizer_authz_checks_total", - Help: "Total fine-grained authorization checks. result=allowed|denied|unmatched|error", - }, - []string{"result"}, - ) - - // AuthzUnmatchedTotal counts checks that found no matching permission. - AuthzUnmatchedTotal = prometheus.NewCounter( - prometheus.CounterOpts{ - Name: "authorizer_authz_unmatched_total", - Help: "Total CheckPermission calls where no permission matched the (resource, scope) pair.", - }, - ) - - // AuthzCheckDuration measures end-to-end CheckPermission latency. - AuthzCheckDuration = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Name: "authorizer_authz_check_duration_seconds", - Help: "CheckPermission latency including validation, cache, and storage queries", - Buckets: prometheus.DefBuckets, - }, - ) - - // RequiredPermissionsChecksTotal counts each endpoint invocation that the - // required_permissions field flows through, labelled by endpoint and the - // per-request outcome. This is the FGA adoption + enforcement signal; - // the per-CheckPermission AuthzChecksTotal is the evaluator signal. - RequiredPermissionsChecksTotal = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "authorizer_required_permissions_checks_total", - Help: "Per-endpoint required_permissions outcome. endpoint=session|validate_session|validate_jwt_token. outcome=granted|denied|not_requested|error.", - }, - []string{"endpoint", "outcome"}, - ) ) // staticAssetPathSuffixes are path suffixes (after lowercasing) treated as static files @@ -275,10 +211,6 @@ func Init() { prometheus.MustRegister(GraphQLRequestDuration) prometheus.MustRegister(DBHealthCheckTotal) prometheus.MustRegister(ClientIDHeaderMissingTotal) - prometheus.MustRegister(AuthzChecksTotal) - prometheus.MustRegister(AuthzUnmatchedTotal) - prometheus.MustRegister(AuthzCheckDuration) - prometheus.MustRegister(RequiredPermissionsChecksTotal) }) } @@ -328,21 +260,3 @@ func RecordGraphQLLimitRejection(limit string) { func RecordClientIDHeaderMissing() { ClientIDHeaderMissingTotal.Inc() } - -// RecordAuthzCheck records a CheckPermission call outcome. -// result must be one of AuthzResult* constants. -func RecordAuthzCheck(result string) { - AuthzChecksTotal.WithLabelValues(result).Inc() -} - -// RecordAuthzUnmatched records a CheckPermission call that found no matching permission. -func RecordAuthzUnmatched() { - AuthzUnmatchedTotal.Inc() -} - -// RecordRequiredPermissionsCheck records the per-request outcome of -// enforceRequiredPermissions. endpoint must be one of RequiredPermissionsEndpoint*; -// outcome must be one of RequiredPermissionsOutcome*. -func RecordRequiredPermissionsCheck(endpoint, outcome string) { - RequiredPermissionsChecksTotal.WithLabelValues(endpoint, outcome).Inc() -} diff --git a/internal/storage/db/arangodb/permission.go b/internal/storage/db/arangodb/permission.go deleted file mode 100644 index 7476c08c..00000000 --- a/internal/storage/db/arangodb/permission.go +++ /dev/null @@ -1,363 +0,0 @@ -package arangodb - -import ( - "context" - "fmt" - "time" - - arangoDriver "github.com/arangodb/go-driver" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPermission creates a new authorization permission. -func (p *provider) AddPermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - if permission.ID == "" { - permission.ID = uuid.New().String() - } - permission.Key = permission.ID - permission.CreatedAt = time.Now().Unix() - permission.UpdatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.Permission) - meta, err := collection.CreateDocument(ctx, permission) - if err != nil { - return nil, err - } - permission.Key = meta.Key - return permission, nil -} - -// UpdatePermission updates an existing authorization permission. -func (p *provider) UpdatePermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - permission.UpdatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.Permission) - meta, err := collection.UpdateDocument(ctx, permission.Key, permission) - if err != nil { - return nil, err - } - permission.Key = meta.Key - return permission, nil -} - -// DeletePermission deletes an authorization permission by ID. -// Cascade-deletes associated permission_scopes and permission_policies. -func (p *provider) DeletePermission(ctx context.Context, id string) error { - // Cascade-delete permission_scopes - deleteScopesQuery := fmt.Sprintf("FOR d IN %s FILTER d.permission_id == @permission_id REMOVE d IN %s", schemas.Collections.PermissionScope, schemas.Collections.PermissionScope) - scopeCursor, err := p.db.Query(ctx, deleteScopesQuery, map[string]interface{}{ - "permission_id": id, - }) - if err != nil { - return err - } - defer scopeCursor.Close() - - // Cascade-delete permission_policies - deletePoliciesQuery := fmt.Sprintf("FOR d IN %s FILTER d.permission_id == @permission_id REMOVE d IN %s", schemas.Collections.PermissionPolicy, schemas.Collections.PermissionPolicy) - policyCursor, err := p.db.Query(ctx, deletePoliciesQuery, map[string]interface{}{ - "permission_id": id, - }) - if err != nil { - return err - } - defer policyCursor.Close() - - // Find the document key for this permission - permission, err := p.GetPermissionByID(ctx, id) - if err != nil { - return err - } - collection, _ := p.db.Collection(ctx, schemas.Collections.Permission) - _, err = collection.RemoveDocument(ctx, permission.Key) - return err -} - -// GetPermissionByID returns an authorization permission by its ID. -func (p *provider) GetPermissionByID(ctx context.Context, id string) (*schemas.Permission, error) { - var permission *schemas.Permission - query := fmt.Sprintf("FOR d IN %s FILTER d._key == @id RETURN d", schemas.Collections.Permission) - bindVars := map[string]interface{}{ - "id": id, - } - cursor, err := p.db.Query(ctx, query, bindVars) - if err != nil { - return nil, err - } - defer cursor.Close() - for { - if !cursor.HasMore() { - if permission == nil { - return nil, fmt.Errorf("permission not found") - } - break - } - _, err := cursor.ReadDocument(ctx, &permission) - if err != nil { - return nil, err - } - } - return permission, nil -} - -// ListPermissions returns a paginated list of authorization permissions. -func (p *provider) ListPermissions(ctx context.Context, pagination *model.Pagination) ([]*schemas.Permission, *model.Pagination, error) { - permissions := []*schemas.Permission{} - query := fmt.Sprintf("FOR d IN %s SORT d.created_at DESC LIMIT %d, %d RETURN d", schemas.Collections.Permission, pagination.Offset, pagination.Limit) - sctx := arangoDriver.WithQueryFullCount(ctx) - cursor, err := p.db.Query(sctx, query, nil) - if err != nil { - return nil, nil, err - } - defer cursor.Close() - paginationClone := *pagination - paginationClone.Total = cursor.Statistics().FullCount() - for { - var permission *schemas.Permission - meta, err := cursor.ReadDocument(ctx, &permission) - if arangoDriver.IsNoMoreDocuments(err) { - break - } else if err != nil { - return nil, nil, err - } - if meta.Key != "" { - permissions = append(permissions, permission) - } - } - return permissions, &paginationClone, nil -} - -// AddPermissionScope links a scope to a permission. -func (p *provider) AddPermissionScope(ctx context.Context, ps *schemas.PermissionScope) (*schemas.PermissionScope, error) { - if ps.ID == "" { - ps.ID = uuid.New().String() - } - ps.Key = ps.ID - ps.CreatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.PermissionScope) - meta, err := collection.CreateDocument(ctx, ps) - if err != nil { - return nil, err - } - ps.Key = meta.Key - return ps, nil -} - -// DeletePermissionScopesByPermissionID removes all scope links for a permission. -func (p *provider) DeletePermissionScopesByPermissionID(ctx context.Context, permissionID string) error { - query := fmt.Sprintf("FOR d IN %s FILTER d.permission_id == @permission_id REMOVE d IN %s", schemas.Collections.PermissionScope, schemas.Collections.PermissionScope) - cursor, err := p.db.Query(ctx, query, map[string]interface{}{ - "permission_id": permissionID, - }) - if err != nil { - return err - } - defer cursor.Close() - return nil -} - -// GetPermissionScopes returns all scope links for a permission. -func (p *provider) GetPermissionScopes(ctx context.Context, permissionID string) ([]*schemas.PermissionScope, error) { - scopes := []*schemas.PermissionScope{} - query := fmt.Sprintf("FOR d IN %s FILTER d.permission_id == @permission_id RETURN d", schemas.Collections.PermissionScope) - cursor, err := p.db.Query(ctx, query, map[string]interface{}{ - "permission_id": permissionID, - }) - if err != nil { - return nil, err - } - defer cursor.Close() - for { - var ps *schemas.PermissionScope - if _, err := cursor.ReadDocument(ctx, &ps); arangoDriver.IsNoMoreDocuments(err) { - break - } else if err != nil { - return nil, err - } - scopes = append(scopes, ps) - } - return scopes, nil -} - -// AddPermissionPolicy links a policy to a permission. -func (p *provider) AddPermissionPolicy(ctx context.Context, pp *schemas.PermissionPolicy) (*schemas.PermissionPolicy, error) { - if pp.ID == "" { - pp.ID = uuid.New().String() - } - pp.Key = pp.ID - pp.CreatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.PermissionPolicy) - meta, err := collection.CreateDocument(ctx, pp) - if err != nil { - return nil, err - } - pp.Key = meta.Key - return pp, nil -} - -// DeletePermissionPoliciesByPermissionID removes all policy links for a permission. -func (p *provider) DeletePermissionPoliciesByPermissionID(ctx context.Context, permissionID string) error { - query := fmt.Sprintf("FOR d IN %s FILTER d.permission_id == @permission_id REMOVE d IN %s", schemas.Collections.PermissionPolicy, schemas.Collections.PermissionPolicy) - cursor, err := p.db.Query(ctx, query, map[string]interface{}{ - "permission_id": permissionID, - }) - if err != nil { - return err - } - defer cursor.Close() - return nil -} - -// GetPermissionPolicies returns all policy links for a permission. -func (p *provider) GetPermissionPolicies(ctx context.Context, permissionID string) ([]*schemas.PermissionPolicy, error) { - policies := []*schemas.PermissionPolicy{} - query := fmt.Sprintf("FOR d IN %s FILTER d.permission_id == @permission_id RETURN d", schemas.Collections.PermissionPolicy) - cursor, err := p.db.Query(ctx, query, map[string]interface{}{ - "permission_id": permissionID, - }) - if err != nil { - return nil, err - } - defer cursor.Close() - for { - var pp *schemas.PermissionPolicy - if _, err := cursor.ReadDocument(ctx, &pp); arangoDriver.IsNoMoreDocuments(err) { - break - } else if err != nil { - return nil, err - } - policies = append(policies, pp) - } - return policies, nil -} - -// GetPermissionsForResourceScope returns all permissions (with their policies and targets) -// that match a given resource name and scope name. This is the hot-path query used by -// the evaluation engine. Uses sequential lookups across collections. -func (p *provider) GetPermissionsForResourceScope(ctx context.Context, resourceName string, scopeName string) ([]*schemas.PermissionWithPolicies, error) { - // Step 1: Find the resource by name - resource, err := p.GetResourceByName(ctx, resourceName) - if err != nil { - return nil, nil // Resource not found means no permissions - } - - // Step 2: Find the scope by name - scope, err := p.GetScopeByName(ctx, scopeName) - if err != nil { - return nil, nil // Scope not found means no permissions - } - - // Step 3: Find permissions for this resource - permQuery := fmt.Sprintf("FOR d IN %s FILTER d.resource_id == @resource_id RETURN d", schemas.Collections.Permission) - permCursor, err := p.db.Query(ctx, permQuery, map[string]interface{}{ - "resource_id": resource.ID, - }) - if err != nil { - return nil, err - } - defer permCursor.Close() - - var permissions []*schemas.Permission - for { - var perm *schemas.Permission - if _, err := permCursor.ReadDocument(ctx, &perm); arangoDriver.IsNoMoreDocuments(err) { - break - } else if err != nil { - return nil, err - } - permissions = append(permissions, perm) - } - - if len(permissions) == 0 { - return nil, nil - } - - // Step 4: Filter permissions that have this scope linked - var matchedPermissions []*schemas.Permission - for _, perm := range permissions { - psQuery := fmt.Sprintf("FOR d IN %s FILTER d.permission_id == @permission_id AND d.scope_id == @scope_id RETURN d", schemas.Collections.PermissionScope) - psCursor, err := p.db.Query(ctx, psQuery, map[string]interface{}{ - "permission_id": perm.ID, - "scope_id": scope.ID, - }) - if err != nil { - return nil, err - } - var ps *schemas.PermissionScope - if _, err := psCursor.ReadDocument(ctx, &ps); err == nil && ps != nil { - matchedPermissions = append(matchedPermissions, perm) - } - psCursor.Close() - } - - if len(matchedPermissions) == 0 { - return nil, nil - } - - // Step 5: For each matched permission, resolve policies and targets - var result []*schemas.PermissionWithPolicies - for _, perm := range matchedPermissions { - pwp := &schemas.PermissionWithPolicies{ - PermissionID: perm.ID, - PermissionName: perm.Name, - DecisionStrategy: perm.DecisionStrategy, - } - - // Get permission_policies for this permission - ppQuery := fmt.Sprintf("FOR d IN %s FILTER d.permission_id == @permission_id RETURN d", schemas.Collections.PermissionPolicy) - ppCursor, err := p.db.Query(ctx, ppQuery, map[string]interface{}{ - "permission_id": perm.ID, - }) - if err != nil { - return nil, err - } - - var permPolicies []*schemas.PermissionPolicy - for { - var pp *schemas.PermissionPolicy - if _, err := ppCursor.ReadDocument(ctx, &pp); arangoDriver.IsNoMoreDocuments(err) { - break - } else if err != nil { - ppCursor.Close() - return nil, err - } - permPolicies = append(permPolicies, pp) - } - ppCursor.Close() - - // For each linked policy, resolve the policy and its targets - for _, pp := range permPolicies { - policy, err := p.GetPolicyByID(ctx, pp.PolicyID) - if err != nil { - continue // Skip policies that can't be found - } - - pwt := schemas.PolicyWithTargets{ - PolicyID: policy.ID, - PolicyName: policy.Name, - Type: policy.Type, - Logic: policy.Logic, - DecisionStrategy: policy.DecisionStrategy, - } - - // Get targets for this policy - targets, err := p.GetPolicyTargets(ctx, policy.ID) - if err != nil { - return nil, err - } - for _, t := range targets { - pwt.Targets = append(pwt.Targets, schemas.PolicyTargetView{ - TargetType: t.TargetType, - TargetValue: t.TargetValue, - }) - } - - pwp.Policies = append(pwp.Policies, pwt) - } - - result = append(result, pwp) - } - - return result, nil -} diff --git a/internal/storage/db/arangodb/policy.go b/internal/storage/db/arangodb/policy.go deleted file mode 100644 index aec4e431..00000000 --- a/internal/storage/db/arangodb/policy.go +++ /dev/null @@ -1,191 +0,0 @@ -package arangodb - -import ( - "context" - "fmt" - "time" - - arangoDriver "github.com/arangodb/go-driver" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPolicy creates a new authorization policy. -func (p *provider) AddPolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - if policy.ID == "" { - policy.ID = uuid.New().String() - } - policy.Key = policy.ID - policy.CreatedAt = time.Now().Unix() - policy.UpdatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.Policy) - meta, err := collection.CreateDocument(ctx, policy) - if err != nil { - return nil, err - } - policy.Key = meta.Key - return policy, nil -} - -// UpdatePolicy updates an existing authorization policy. -func (p *provider) UpdatePolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - policy.UpdatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.Policy) - meta, err := collection.UpdateDocument(ctx, policy.Key, policy) - if err != nil { - return nil, err - } - policy.Key = meta.Key - return policy, nil -} - -// DeletePolicy deletes an authorization policy by ID. -// Returns an error if any permission_policy references this policy. -// Cascade-deletes associated policy targets. -func (p *provider) DeletePolicy(ctx context.Context, id string) error { - // Check for referencing permission_policies - countQuery := fmt.Sprintf("FOR d IN %s FILTER d.policy_id == @policy_id COLLECT WITH COUNT INTO length RETURN length", schemas.Collections.PermissionPolicy) - cursor, err := p.db.Query(ctx, countQuery, map[string]interface{}{ - "policy_id": id, - }) - if err != nil { - return err - } - defer cursor.Close() - var count int64 - if cursor.HasMore() { - if _, err := cursor.ReadDocument(ctx, &count); err != nil { - return err - } - } - if count > 0 { - return fmt.Errorf("cannot delete policy: %d permission_policy(s) reference it", count) - } - - // Cascade-delete policy targets - deleteTargetsQuery := fmt.Sprintf("FOR d IN %s FILTER d.policy_id == @policy_id REMOVE d IN %s", schemas.Collections.PolicyTarget, schemas.Collections.PolicyTarget) - targetCursor, err := p.db.Query(ctx, deleteTargetsQuery, map[string]interface{}{ - "policy_id": id, - }) - if err != nil { - return err - } - defer targetCursor.Close() - - // Find the document key for this policy - policy, err := p.GetPolicyByID(ctx, id) - if err != nil { - return err - } - collection, _ := p.db.Collection(ctx, schemas.Collections.Policy) - _, err = collection.RemoveDocument(ctx, policy.Key) - return err -} - -// GetPolicyByID returns an authorization policy by its ID. -func (p *provider) GetPolicyByID(ctx context.Context, id string) (*schemas.Policy, error) { - var policy *schemas.Policy - query := fmt.Sprintf("FOR d IN %s FILTER d._key == @id RETURN d", schemas.Collections.Policy) - bindVars := map[string]interface{}{ - "id": id, - } - cursor, err := p.db.Query(ctx, query, bindVars) - if err != nil { - return nil, err - } - defer cursor.Close() - for { - if !cursor.HasMore() { - if policy == nil { - return nil, fmt.Errorf("policy not found") - } - break - } - _, err := cursor.ReadDocument(ctx, &policy) - if err != nil { - return nil, err - } - } - return policy, nil -} - -// ListPolicies returns a paginated list of authorization policies. -func (p *provider) ListPolicies(ctx context.Context, pagination *model.Pagination) ([]*schemas.Policy, *model.Pagination, error) { - policies := []*schemas.Policy{} - query := fmt.Sprintf("FOR d IN %s SORT d.created_at DESC LIMIT %d, %d RETURN d", schemas.Collections.Policy, pagination.Offset, pagination.Limit) - sctx := arangoDriver.WithQueryFullCount(ctx) - cursor, err := p.db.Query(sctx, query, nil) - if err != nil { - return nil, nil, err - } - defer cursor.Close() - paginationClone := *pagination - paginationClone.Total = cursor.Statistics().FullCount() - for { - var policy *schemas.Policy - meta, err := cursor.ReadDocument(ctx, &policy) - if arangoDriver.IsNoMoreDocuments(err) { - break - } else if err != nil { - return nil, nil, err - } - if meta.Key != "" { - policies = append(policies, policy) - } - } - return policies, &paginationClone, nil -} - -// AddPolicyTarget adds a target (role name or user ID) to a policy. -func (p *provider) AddPolicyTarget(ctx context.Context, target *schemas.PolicyTarget) (*schemas.PolicyTarget, error) { - if target.ID == "" { - target.ID = uuid.New().String() - } - target.Key = target.ID - target.CreatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.PolicyTarget) - meta, err := collection.CreateDocument(ctx, target) - if err != nil { - return nil, err - } - target.Key = meta.Key - return target, nil -} - -// DeletePolicyTargetsByPolicyID removes all targets for a policy. -func (p *provider) DeletePolicyTargetsByPolicyID(ctx context.Context, policyID string) error { - query := fmt.Sprintf("FOR d IN %s FILTER d.policy_id == @policy_id REMOVE d IN %s", schemas.Collections.PolicyTarget, schemas.Collections.PolicyTarget) - cursor, err := p.db.Query(ctx, query, map[string]interface{}{ - "policy_id": policyID, - }) - if err != nil { - return err - } - defer cursor.Close() - return nil -} - -// GetPolicyTargets returns all targets for a policy. -func (p *provider) GetPolicyTargets(ctx context.Context, policyID string) ([]*schemas.PolicyTarget, error) { - targets := []*schemas.PolicyTarget{} - query := fmt.Sprintf("FOR d IN %s FILTER d.policy_id == @policy_id RETURN d", schemas.Collections.PolicyTarget) - cursor, err := p.db.Query(ctx, query, map[string]interface{}{ - "policy_id": policyID, - }) - if err != nil { - return nil, err - } - defer cursor.Close() - for { - var target *schemas.PolicyTarget - if _, err := cursor.ReadDocument(ctx, &target); arangoDriver.IsNoMoreDocuments(err) { - break - } else if err != nil { - return nil, err - } - targets = append(targets, target) - } - return targets, nil -} diff --git a/internal/storage/db/arangodb/provider.go b/internal/storage/db/arangodb/provider.go index 79c3e422..0b840197 100644 --- a/internal/storage/db/arangodb/provider.go +++ b/internal/storage/db/arangodb/provider.go @@ -348,161 +348,6 @@ func NewProvider(cfg *config.Config, deps *Dependencies) (*provider, error) { Sparse: true, }) - // Resource collection and indexes - resourceCollectionExists, err := arangodb.CollectionExists(ctx, schemas.Collections.Resource) - if err != nil { - return nil, err - } - if !resourceCollectionExists { - _, err = arangodb.CreateCollection(ctx, schemas.Collections.Resource, nil) - if err != nil { - return nil, err - } - } - resourceCollection, err := arangodb.Collection(ctx, schemas.Collections.Resource) - if err != nil { - return nil, err - } - resourceCollection.EnsureHashIndex(ctx, []string{"name"}, &arangoDriver.EnsureHashIndexOptions{ - Unique: true, - Sparse: true, - }) - - // Scope collection and indexes - scopeCollectionExists, err := arangodb.CollectionExists(ctx, schemas.Collections.Scope) - if err != nil { - return nil, err - } - if !scopeCollectionExists { - _, err = arangodb.CreateCollection(ctx, schemas.Collections.Scope, nil) - if err != nil { - return nil, err - } - } - scopeCollection, err := arangodb.Collection(ctx, schemas.Collections.Scope) - if err != nil { - return nil, err - } - scopeCollection.EnsureHashIndex(ctx, []string{"name"}, &arangoDriver.EnsureHashIndexOptions{ - Unique: true, - Sparse: true, - }) - - // Policy collection and indexes - policyCollectionExists, err := arangodb.CollectionExists(ctx, schemas.Collections.Policy) - if err != nil { - return nil, err - } - if !policyCollectionExists { - _, err = arangodb.CreateCollection(ctx, schemas.Collections.Policy, nil) - if err != nil { - return nil, err - } - } - policyCollection, err := arangodb.Collection(ctx, schemas.Collections.Policy) - if err != nil { - return nil, err - } - policyCollection.EnsureHashIndex(ctx, []string{"name"}, &arangoDriver.EnsureHashIndexOptions{ - Unique: true, - Sparse: true, - }) - policyCollection.EnsureHashIndex(ctx, []string{"type"}, &arangoDriver.EnsureHashIndexOptions{ - Sparse: true, - }) - - // PolicyTarget collection and indexes - policyTargetCollectionExists, err := arangodb.CollectionExists(ctx, schemas.Collections.PolicyTarget) - if err != nil { - return nil, err - } - if !policyTargetCollectionExists { - _, err = arangodb.CreateCollection(ctx, schemas.Collections.PolicyTarget, nil) - if err != nil { - return nil, err - } - } - policyTargetCollection, err := arangodb.Collection(ctx, schemas.Collections.PolicyTarget) - if err != nil { - return nil, err - } - policyTargetCollection.EnsureHashIndex(ctx, []string{"policy_id"}, &arangoDriver.EnsureHashIndexOptions{ - Sparse: true, - }) - policyTargetCollection.EnsureHashIndex(ctx, []string{"policy_id", "target_type", "target_value"}, &arangoDriver.EnsureHashIndexOptions{ - Unique: true, - Sparse: true, - }) - - // Permission collection and indexes - permissionCollectionExists, err := arangodb.CollectionExists(ctx, schemas.Collections.Permission) - if err != nil { - return nil, err - } - if !permissionCollectionExists { - _, err = arangodb.CreateCollection(ctx, schemas.Collections.Permission, nil) - if err != nil { - return nil, err - } - } - permissionCollection, err := arangodb.Collection(ctx, schemas.Collections.Permission) - if err != nil { - return nil, err - } - permissionCollection.EnsureHashIndex(ctx, []string{"name"}, &arangoDriver.EnsureHashIndexOptions{ - Unique: true, - Sparse: true, - }) - permissionCollection.EnsureHashIndex(ctx, []string{"resource_id"}, &arangoDriver.EnsureHashIndexOptions{ - Sparse: true, - }) - - // PermissionScope collection and indexes - permissionScopeCollectionExists, err := arangodb.CollectionExists(ctx, schemas.Collections.PermissionScope) - if err != nil { - return nil, err - } - if !permissionScopeCollectionExists { - _, err = arangodb.CreateCollection(ctx, schemas.Collections.PermissionScope, nil) - if err != nil { - return nil, err - } - } - permissionScopeCollection, err := arangodb.Collection(ctx, schemas.Collections.PermissionScope) - if err != nil { - return nil, err - } - permissionScopeCollection.EnsureHashIndex(ctx, []string{"permission_id"}, &arangoDriver.EnsureHashIndexOptions{ - Sparse: true, - }) - permissionScopeCollection.EnsureHashIndex(ctx, []string{"permission_id", "scope_id"}, &arangoDriver.EnsureHashIndexOptions{ - Unique: true, - Sparse: true, - }) - - // PermissionPolicy collection and indexes - permissionPolicyCollectionExists, err := arangodb.CollectionExists(ctx, schemas.Collections.PermissionPolicy) - if err != nil { - return nil, err - } - if !permissionPolicyCollectionExists { - _, err = arangodb.CreateCollection(ctx, schemas.Collections.PermissionPolicy, nil) - if err != nil { - return nil, err - } - } - permissionPolicyCollection, err := arangodb.Collection(ctx, schemas.Collections.PermissionPolicy) - if err != nil { - return nil, err - } - permissionPolicyCollection.EnsureHashIndex(ctx, []string{"permission_id"}, &arangoDriver.EnsureHashIndexOptions{ - Sparse: true, - }) - permissionPolicyCollection.EnsureHashIndex(ctx, []string{"permission_id", "policy_id"}, &arangoDriver.EnsureHashIndexOptions{ - Unique: true, - Sparse: true, - }) - return &provider{ config: cfg, dependencies: deps, diff --git a/internal/storage/db/arangodb/resource.go b/internal/storage/db/arangodb/resource.go deleted file mode 100644 index af5ae05d..00000000 --- a/internal/storage/db/arangodb/resource.go +++ /dev/null @@ -1,155 +0,0 @@ -package arangodb - -import ( - "context" - "fmt" - "time" - - arangoDriver "github.com/arangodb/go-driver" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddResource creates a new authorization resource. -func (p *provider) AddResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - if resource.ID == "" { - resource.ID = uuid.New().String() - } - resource.Key = resource.ID - resource.CreatedAt = time.Now().Unix() - resource.UpdatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.Resource) - meta, err := collection.CreateDocument(ctx, resource) - if err != nil { - return nil, err - } - resource.Key = meta.Key - return resource, nil -} - -// UpdateResource updates an existing authorization resource. -func (p *provider) UpdateResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - resource.UpdatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.Resource) - meta, err := collection.UpdateDocument(ctx, resource.Key, resource) - if err != nil { - return nil, err - } - resource.Key = meta.Key - return resource, nil -} - -// DeleteResource deletes an authorization resource by ID. -// Returns an error if any permission references this resource. -func (p *provider) DeleteResource(ctx context.Context, id string) error { - // Check for referencing permissions - countQuery := fmt.Sprintf("FOR d IN %s FILTER d.resource_id == @resource_id COLLECT WITH COUNT INTO length RETURN length", schemas.Collections.Permission) - cursor, err := p.db.Query(ctx, countQuery, map[string]interface{}{ - "resource_id": id, - }) - if err != nil { - return err - } - defer cursor.Close() - var count int64 - if cursor.HasMore() { - if _, err := cursor.ReadDocument(ctx, &count); err != nil { - return err - } - } - if count > 0 { - return fmt.Errorf("cannot delete resource: %d permission(s) reference it", count) - } - - // Find the document key for this resource - resource, err := p.GetResourceByID(ctx, id) - if err != nil { - return err - } - collection, _ := p.db.Collection(ctx, schemas.Collections.Resource) - _, err = collection.RemoveDocument(ctx, resource.Key) - return err -} - -// GetResourceByID returns an authorization resource by its ID. -func (p *provider) GetResourceByID(ctx context.Context, id string) (*schemas.Resource, error) { - var resource *schemas.Resource - query := fmt.Sprintf("FOR d IN %s FILTER d._key == @id RETURN d", schemas.Collections.Resource) - bindVars := map[string]interface{}{ - "id": id, - } - cursor, err := p.db.Query(ctx, query, bindVars) - if err != nil { - return nil, err - } - defer cursor.Close() - for { - if !cursor.HasMore() { - if resource == nil { - return nil, fmt.Errorf("resource not found") - } - break - } - _, err := cursor.ReadDocument(ctx, &resource) - if err != nil { - return nil, err - } - } - return resource, nil -} - -// GetResourceByName returns an authorization resource by its unique name. -func (p *provider) GetResourceByName(ctx context.Context, name string) (*schemas.Resource, error) { - var resource *schemas.Resource - query := fmt.Sprintf("FOR d IN %s FILTER d.name == @name RETURN d", schemas.Collections.Resource) - bindVars := map[string]interface{}{ - "name": name, - } - cursor, err := p.db.Query(ctx, query, bindVars) - if err != nil { - return nil, err - } - defer cursor.Close() - for { - if !cursor.HasMore() { - if resource == nil { - return nil, fmt.Errorf("resource not found") - } - break - } - _, err := cursor.ReadDocument(ctx, &resource) - if err != nil { - return nil, err - } - } - return resource, nil -} - -// ListResources returns a paginated list of authorization resources. -func (p *provider) ListResources(ctx context.Context, pagination *model.Pagination) ([]*schemas.Resource, *model.Pagination, error) { - resources := []*schemas.Resource{} - query := fmt.Sprintf("FOR d IN %s SORT d.created_at DESC LIMIT %d, %d RETURN d", schemas.Collections.Resource, pagination.Offset, pagination.Limit) - sctx := arangoDriver.WithQueryFullCount(ctx) - cursor, err := p.db.Query(sctx, query, nil) - if err != nil { - return nil, nil, err - } - defer cursor.Close() - paginationClone := *pagination - paginationClone.Total = cursor.Statistics().FullCount() - for { - var resource *schemas.Resource - meta, err := cursor.ReadDocument(ctx, &resource) - if arangoDriver.IsNoMoreDocuments(err) { - break - } else if err != nil { - return nil, nil, err - } - if meta.Key != "" { - resources = append(resources, resource) - } - } - return resources, &paginationClone, nil -} diff --git a/internal/storage/db/arangodb/scope.go b/internal/storage/db/arangodb/scope.go deleted file mode 100644 index 7455c90d..00000000 --- a/internal/storage/db/arangodb/scope.go +++ /dev/null @@ -1,155 +0,0 @@ -package arangodb - -import ( - "context" - "fmt" - "time" - - arangoDriver "github.com/arangodb/go-driver" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddScope creates a new authorization scope. -func (p *provider) AddScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - if scope.ID == "" { - scope.ID = uuid.New().String() - } - scope.Key = scope.ID - scope.CreatedAt = time.Now().Unix() - scope.UpdatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.Scope) - meta, err := collection.CreateDocument(ctx, scope) - if err != nil { - return nil, err - } - scope.Key = meta.Key - return scope, nil -} - -// UpdateScope updates an existing authorization scope. -func (p *provider) UpdateScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - scope.UpdatedAt = time.Now().Unix() - collection, _ := p.db.Collection(ctx, schemas.Collections.Scope) - meta, err := collection.UpdateDocument(ctx, scope.Key, scope) - if err != nil { - return nil, err - } - scope.Key = meta.Key - return scope, nil -} - -// DeleteScope deletes an authorization scope by ID. -// Returns an error if any permission_scope references this scope. -func (p *provider) DeleteScope(ctx context.Context, id string) error { - // Check for referencing permission_scopes - countQuery := fmt.Sprintf("FOR d IN %s FILTER d.scope_id == @scope_id COLLECT WITH COUNT INTO length RETURN length", schemas.Collections.PermissionScope) - cursor, err := p.db.Query(ctx, countQuery, map[string]interface{}{ - "scope_id": id, - }) - if err != nil { - return err - } - defer cursor.Close() - var count int64 - if cursor.HasMore() { - if _, err := cursor.ReadDocument(ctx, &count); err != nil { - return err - } - } - if count > 0 { - return fmt.Errorf("cannot delete scope: %d permission_scope(s) reference it", count) - } - - // Find the document key for this scope - scope, err := p.GetScopeByID(ctx, id) - if err != nil { - return err - } - collection, _ := p.db.Collection(ctx, schemas.Collections.Scope) - _, err = collection.RemoveDocument(ctx, scope.Key) - return err -} - -// GetScopeByID returns an authorization scope by its ID. -func (p *provider) GetScopeByID(ctx context.Context, id string) (*schemas.Scope, error) { - var scope *schemas.Scope - query := fmt.Sprintf("FOR d IN %s FILTER d._key == @id RETURN d", schemas.Collections.Scope) - bindVars := map[string]interface{}{ - "id": id, - } - cursor, err := p.db.Query(ctx, query, bindVars) - if err != nil { - return nil, err - } - defer cursor.Close() - for { - if !cursor.HasMore() { - if scope == nil { - return nil, fmt.Errorf("scope not found") - } - break - } - _, err := cursor.ReadDocument(ctx, &scope) - if err != nil { - return nil, err - } - } - return scope, nil -} - -// GetScopeByName returns an authorization scope by its unique name. -func (p *provider) GetScopeByName(ctx context.Context, name string) (*schemas.Scope, error) { - var scope *schemas.Scope - query := fmt.Sprintf("FOR d IN %s FILTER d.name == @name RETURN d", schemas.Collections.Scope) - bindVars := map[string]interface{}{ - "name": name, - } - cursor, err := p.db.Query(ctx, query, bindVars) - if err != nil { - return nil, err - } - defer cursor.Close() - for { - if !cursor.HasMore() { - if scope == nil { - return nil, fmt.Errorf("scope not found") - } - break - } - _, err := cursor.ReadDocument(ctx, &scope) - if err != nil { - return nil, err - } - } - return scope, nil -} - -// ListScopes returns a paginated list of authorization scopes. -func (p *provider) ListScopes(ctx context.Context, pagination *model.Pagination) ([]*schemas.Scope, *model.Pagination, error) { - scopes := []*schemas.Scope{} - query := fmt.Sprintf("FOR d IN %s SORT d.created_at DESC LIMIT %d, %d RETURN d", schemas.Collections.Scope, pagination.Offset, pagination.Limit) - sctx := arangoDriver.WithQueryFullCount(ctx) - cursor, err := p.db.Query(sctx, query, nil) - if err != nil { - return nil, nil, err - } - defer cursor.Close() - paginationClone := *pagination - paginationClone.Total = cursor.Statistics().FullCount() - for { - var scope *schemas.Scope - meta, err := cursor.ReadDocument(ctx, &scope) - if arangoDriver.IsNoMoreDocuments(err) { - break - } else if err != nil { - return nil, nil, err - } - if meta.Key != "" { - scopes = append(scopes, scope) - } - } - return scopes, &paginationClone, nil -} diff --git a/internal/storage/db/cassandradb/permission.go b/internal/storage/db/cassandradb/permission.go deleted file mode 100644 index 5307c9ff..00000000 --- a/internal/storage/db/cassandradb/permission.go +++ /dev/null @@ -1,423 +0,0 @@ -package cassandradb - -import ( - "context" - "encoding/json" - "fmt" - "strings" - "time" - - "github.com/gocql/gocql" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPermission creates a new authorization permission. -func (p *provider) AddPermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - if permission.ID == "" { - permission.ID = uuid.New().String() - } - permission.Key = permission.ID - permission.CreatedAt = time.Now().Unix() - permission.UpdatedAt = time.Now().Unix() - insertQuery := fmt.Sprintf("INSERT INTO %s (id, name, description, resource_id, decision_strategy, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)", - KeySpace+"."+schemas.Collections.Permission) - err := p.db.Query(insertQuery, permission.ID, permission.Name, permission.Description, permission.ResourceID, permission.DecisionStrategy, permission.CreatedAt, permission.UpdatedAt).Exec() - if err != nil { - return nil, err - } - return permission, nil -} - -// UpdatePermission updates an existing authorization permission. -func (p *provider) UpdatePermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - permission.UpdatedAt = time.Now().Unix() - bytes, err := json.Marshal(permission) - if err != nil { - return nil, err - } - decoder := json.NewDecoder(strings.NewReader(string(bytes))) - decoder.UseNumber() - permissionMap := map[string]interface{}{} - err = decoder.Decode(&permissionMap) - if err != nil { - return nil, err - } - convertMapValues(permissionMap) - updateFields := "" - var updateValues []interface{} - for key, value := range permissionMap { - if key == "_id" || key == "_key" || key == "id" || key == "key" { - continue - } - if value == nil { - updateFields += fmt.Sprintf("%s = null,", key) - continue - } - updateFields += fmt.Sprintf("%s = ?, ", key) - updateValues = append(updateValues, value) - } - updateFields = strings.Trim(updateFields, " ") - updateFields = strings.TrimSuffix(updateFields, ",") - updateValues = append(updateValues, permission.ID) - query := fmt.Sprintf("UPDATE %s SET %s WHERE id = ?", KeySpace+"."+schemas.Collections.Permission, updateFields) - err = p.db.Query(query, updateValues...).Exec() - if err != nil { - return nil, err - } - return permission, nil -} - -// DeletePermission deletes an authorization permission by ID. -// Cascade-deletes associated permission_scopes and permission_policies. -func (p *provider) DeletePermission(ctx context.Context, id string) error { - // Cascade-delete permission_scopes - getScopesQuery := fmt.Sprintf("SELECT id FROM %s WHERE permission_id = ? ALLOW FILTERING", KeySpace+"."+schemas.Collections.PermissionScope) - scanner := p.db.Query(getScopesQuery, id).Iter().Scanner() - var scopeIDs []string - for scanner.Next() { - var scopeID string - err := scanner.Scan(&scopeID) - if err != nil { - return err - } - scopeIDs = append(scopeIDs, scopeID) - } - if len(scopeIDs) > 0 { - placeholders := strings.Repeat("?,", len(scopeIDs)) - placeholders = strings.TrimSuffix(placeholders, ",") - deleteValues := make([]interface{}, len(scopeIDs)) - for i, sid := range scopeIDs { - deleteValues[i] = sid - } - deleteScopesQuery := fmt.Sprintf("DELETE FROM %s WHERE id IN (%s)", KeySpace+"."+schemas.Collections.PermissionScope, placeholders) - err := p.db.Query(deleteScopesQuery, deleteValues...).Exec() - if err != nil { - return err - } - } - // Cascade-delete permission_policies - getPoliciesQuery := fmt.Sprintf("SELECT id FROM %s WHERE permission_id = ? ALLOW FILTERING", KeySpace+"."+schemas.Collections.PermissionPolicy) - scanner = p.db.Query(getPoliciesQuery, id).Iter().Scanner() - var policyIDs []string - for scanner.Next() { - var policyID string - err := scanner.Scan(&policyID) - if err != nil { - return err - } - policyIDs = append(policyIDs, policyID) - } - if len(policyIDs) > 0 { - placeholders := strings.Repeat("?,", len(policyIDs)) - placeholders = strings.TrimSuffix(placeholders, ",") - deleteValues := make([]interface{}, len(policyIDs)) - for i, pid := range policyIDs { - deleteValues[i] = pid - } - deletePoliciesQuery := fmt.Sprintf("DELETE FROM %s WHERE id IN (%s)", KeySpace+"."+schemas.Collections.PermissionPolicy, placeholders) - err := p.db.Query(deletePoliciesQuery, deleteValues...).Exec() - if err != nil { - return err - } - } - // Delete the permission itself - query := fmt.Sprintf("DELETE FROM %s WHERE id = ?", KeySpace+"."+schemas.Collections.Permission) - err := p.db.Query(query, id).Exec() - if err != nil { - return err - } - return nil -} - -// GetPermissionByID returns an authorization permission by its ID. -func (p *provider) GetPermissionByID(ctx context.Context, id string) (*schemas.Permission, error) { - var permission schemas.Permission - query := fmt.Sprintf("SELECT id, name, description, resource_id, decision_strategy, created_at, updated_at FROM %s WHERE id = ? LIMIT 1", - KeySpace+"."+schemas.Collections.Permission) - err := p.db.Query(query, id).Consistency(gocql.One).Scan( - &permission.ID, &permission.Name, &permission.Description, &permission.ResourceID, &permission.DecisionStrategy, &permission.CreatedAt, &permission.UpdatedAt) - if err != nil { - return nil, err - } - return &permission, nil -} - -// ListPermissions returns a paginated list of authorization permissions. -func (p *provider) ListPermissions(ctx context.Context, pagination *model.Pagination) ([]*schemas.Permission, *model.Pagination, error) { - permissions := []*schemas.Permission{} - paginationClone := *pagination - totalCountQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s", KeySpace+"."+schemas.Collections.Permission) - err := p.db.Query(totalCountQuery).Consistency(gocql.One).Scan(&paginationClone.Total) - if err != nil { - return nil, nil, err - } - query := fmt.Sprintf("SELECT id, name, description, resource_id, decision_strategy, created_at, updated_at FROM %s LIMIT %d", - KeySpace+"."+schemas.Collections.Permission, pagination.Limit+pagination.Offset) - scanner := p.db.Query(query).Iter().Scanner() - counter := int64(0) - for scanner.Next() { - if counter >= pagination.Offset { - var permission schemas.Permission - err := scanner.Scan(&permission.ID, &permission.Name, &permission.Description, &permission.ResourceID, &permission.DecisionStrategy, &permission.CreatedAt, &permission.UpdatedAt) - if err != nil { - return nil, nil, err - } - permissions = append(permissions, &permission) - } - counter++ - } - return permissions, &paginationClone, nil -} - -// AddPermissionScope links a scope to a permission. -func (p *provider) AddPermissionScope(ctx context.Context, ps *schemas.PermissionScope) (*schemas.PermissionScope, error) { - if ps.ID == "" { - ps.ID = uuid.New().String() - } - ps.Key = ps.ID - ps.CreatedAt = time.Now().Unix() - insertQuery := fmt.Sprintf("INSERT INTO %s (id, permission_id, scope_id, created_at) VALUES (?, ?, ?, ?)", - KeySpace+"."+schemas.Collections.PermissionScope) - err := p.db.Query(insertQuery, ps.ID, ps.PermissionID, ps.ScopeID, ps.CreatedAt).Exec() - if err != nil { - return nil, err - } - return ps, nil -} - -// DeletePermissionScopesByPermissionID removes all scope links for a permission. -func (p *provider) DeletePermissionScopesByPermissionID(ctx context.Context, permissionID string) error { - getQuery := fmt.Sprintf("SELECT id FROM %s WHERE permission_id = ? ALLOW FILTERING", KeySpace+"."+schemas.Collections.PermissionScope) - scanner := p.db.Query(getQuery, permissionID).Iter().Scanner() - var ids []string - for scanner.Next() { - var id string - err := scanner.Scan(&id) - if err != nil { - return err - } - ids = append(ids, id) - } - if len(ids) > 0 { - placeholders := strings.Repeat("?,", len(ids)) - placeholders = strings.TrimSuffix(placeholders, ",") - deleteValues := make([]interface{}, len(ids)) - for i, id := range ids { - deleteValues[i] = id - } - query := fmt.Sprintf("DELETE FROM %s WHERE id IN (%s)", KeySpace+"."+schemas.Collections.PermissionScope, placeholders) - err := p.db.Query(query, deleteValues...).Exec() - if err != nil { - return err - } - } - return nil -} - -// GetPermissionScopes returns all scope links for a permission. -func (p *provider) GetPermissionScopes(ctx context.Context, permissionID string) ([]*schemas.PermissionScope, error) { - scopes := []*schemas.PermissionScope{} - query := fmt.Sprintf("SELECT id, permission_id, scope_id, created_at FROM %s WHERE permission_id = ? ALLOW FILTERING", - KeySpace+"."+schemas.Collections.PermissionScope) - scanner := p.db.Query(query, permissionID).Iter().Scanner() - for scanner.Next() { - var ps schemas.PermissionScope - err := scanner.Scan(&ps.ID, &ps.PermissionID, &ps.ScopeID, &ps.CreatedAt) - if err != nil { - return nil, err - } - scopes = append(scopes, &ps) - } - return scopes, nil -} - -// AddPermissionPolicy links a policy to a permission. -func (p *provider) AddPermissionPolicy(ctx context.Context, pp *schemas.PermissionPolicy) (*schemas.PermissionPolicy, error) { - if pp.ID == "" { - pp.ID = uuid.New().String() - } - pp.Key = pp.ID - pp.CreatedAt = time.Now().Unix() - insertQuery := fmt.Sprintf("INSERT INTO %s (id, permission_id, policy_id, created_at) VALUES (?, ?, ?, ?)", - KeySpace+"."+schemas.Collections.PermissionPolicy) - err := p.db.Query(insertQuery, pp.ID, pp.PermissionID, pp.PolicyID, pp.CreatedAt).Exec() - if err != nil { - return nil, err - } - return pp, nil -} - -// DeletePermissionPoliciesByPermissionID removes all policy links for a permission. -func (p *provider) DeletePermissionPoliciesByPermissionID(ctx context.Context, permissionID string) error { - getQuery := fmt.Sprintf("SELECT id FROM %s WHERE permission_id = ? ALLOW FILTERING", KeySpace+"."+schemas.Collections.PermissionPolicy) - scanner := p.db.Query(getQuery, permissionID).Iter().Scanner() - var ids []string - for scanner.Next() { - var id string - err := scanner.Scan(&id) - if err != nil { - return err - } - ids = append(ids, id) - } - if len(ids) > 0 { - placeholders := strings.Repeat("?,", len(ids)) - placeholders = strings.TrimSuffix(placeholders, ",") - deleteValues := make([]interface{}, len(ids)) - for i, id := range ids { - deleteValues[i] = id - } - query := fmt.Sprintf("DELETE FROM %s WHERE id IN (%s)", KeySpace+"."+schemas.Collections.PermissionPolicy, placeholders) - err := p.db.Query(query, deleteValues...).Exec() - if err != nil { - return err - } - } - return nil -} - -// GetPermissionPolicies returns all policy links for a permission. -func (p *provider) GetPermissionPolicies(ctx context.Context, permissionID string) ([]*schemas.PermissionPolicy, error) { - policies := []*schemas.PermissionPolicy{} - query := fmt.Sprintf("SELECT id, permission_id, policy_id, created_at FROM %s WHERE permission_id = ? ALLOW FILTERING", - KeySpace+"."+schemas.Collections.PermissionPolicy) - scanner := p.db.Query(query, permissionID).Iter().Scanner() - for scanner.Next() { - var pp schemas.PermissionPolicy - err := scanner.Scan(&pp.ID, &pp.PermissionID, &pp.PolicyID, &pp.CreatedAt) - if err != nil { - return nil, err - } - policies = append(policies, &pp) - } - return policies, nil -} - -// GetPermissionsForResourceScope returns all permissions (with their policies and targets) -// that match a given resource name and scope name. This is the hot-path query used by -// the evaluation engine. Uses sequential queries since Cassandra does not support JOINs. -func (p *provider) GetPermissionsForResourceScope(ctx context.Context, resourceName string, scopeName string) ([]*schemas.PermissionWithPolicies, error) { - // 1. Find resource by name - var resourceID string - resourceQuery := fmt.Sprintf("SELECT id FROM %s WHERE name = ? LIMIT 1 ALLOW FILTERING", - KeySpace+"."+schemas.Collections.Resource) - err := p.db.Query(resourceQuery, resourceName).Consistency(gocql.One).Scan(&resourceID) - if err != nil { - return nil, err - } - - // 2. Find scope by name - var scopeID string - scopeQuery := fmt.Sprintf("SELECT id FROM %s WHERE name = ? LIMIT 1 ALLOW FILTERING", - KeySpace+"."+schemas.Collections.Scope) - err = p.db.Query(scopeQuery, scopeName).Consistency(gocql.One).Scan(&scopeID) - if err != nil { - return nil, err - } - - // 3. Find permissions for this resource - permQuery := fmt.Sprintf("SELECT id, name, decision_strategy FROM %s WHERE resource_id = ? ALLOW FILTERING", - KeySpace+"."+schemas.Collections.Permission) - permScanner := p.db.Query(permQuery, resourceID).Iter().Scanner() - - type permInfo struct { - ID string - Name string - DecisionStrategy string - } - var permissions []permInfo - for permScanner.Next() { - var pi permInfo - err := permScanner.Scan(&pi.ID, &pi.Name, &pi.DecisionStrategy) - if err != nil { - return nil, err - } - permissions = append(permissions, pi) - } - - if len(permissions) == 0 { - return nil, nil - } - - // 4. For each permission, check if it has the requested scope - var result []*schemas.PermissionWithPolicies - - for _, perm := range permissions { - var scopeCount int64 - scopeCountQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE permission_id = ? AND scope_id = ? ALLOW FILTERING", - KeySpace+"."+schemas.Collections.PermissionScope) - err := p.db.Query(scopeCountQuery, perm.ID, scopeID).Consistency(gocql.One).Scan(&scopeCount) - if err != nil { - return nil, err - } - if scopeCount == 0 { - continue - } - - // 5. Find permission_policies for this permission - ppQuery := fmt.Sprintf("SELECT policy_id FROM %s WHERE permission_id = ? ALLOW FILTERING", - KeySpace+"."+schemas.Collections.PermissionPolicy) - ppScanner := p.db.Query(ppQuery, perm.ID).Iter().Scanner() - var policyIDs []string - for ppScanner.Next() { - var policyID string - err := ppScanner.Scan(&policyID) - if err != nil { - return nil, err - } - policyIDs = append(policyIDs, policyID) - } - - if len(policyIDs) == 0 { - continue - } - - // 6. For each policy, resolve the policy and its targets - var policiesWithTargets []schemas.PolicyWithTargets - for _, policyID := range policyIDs { - var policy schemas.Policy - policyQuery := fmt.Sprintf("SELECT id, name, type, logic, decision_strategy FROM %s WHERE id = ? LIMIT 1", - KeySpace+"."+schemas.Collections.Policy) - err := p.db.Query(policyQuery, policyID).Consistency(gocql.One).Scan( - &policy.ID, &policy.Name, &policy.Type, &policy.Logic, &policy.DecisionStrategy) - if err != nil { - return nil, err - } - - // Get targets for this policy - targetQuery := fmt.Sprintf("SELECT target_type, target_value FROM %s WHERE policy_id = ? ALLOW FILTERING", - KeySpace+"."+schemas.Collections.PolicyTarget) - targetScanner := p.db.Query(targetQuery, policyID).Iter().Scanner() - var targets []schemas.PolicyTargetView - for targetScanner.Next() { - var tv schemas.PolicyTargetView - err := targetScanner.Scan(&tv.TargetType, &tv.TargetValue) - if err != nil { - return nil, err - } - targets = append(targets, tv) - } - - policiesWithTargets = append(policiesWithTargets, schemas.PolicyWithTargets{ - PolicyID: policy.ID, - PolicyName: policy.Name, - Type: policy.Type, - Logic: policy.Logic, - DecisionStrategy: policy.DecisionStrategy, - Targets: targets, - }) - } - - result = append(result, &schemas.PermissionWithPolicies{ - PermissionID: perm.ID, - PermissionName: perm.Name, - DecisionStrategy: perm.DecisionStrategy, - Policies: policiesWithTargets, - }) - } - - return result, nil -} diff --git a/internal/storage/db/cassandradb/policy.go b/internal/storage/db/cassandradb/policy.go deleted file mode 100644 index a7ca6f6a..00000000 --- a/internal/storage/db/cassandradb/policy.go +++ /dev/null @@ -1,221 +0,0 @@ -package cassandradb - -import ( - "context" - "encoding/json" - "fmt" - "strings" - "time" - - "github.com/gocql/gocql" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPolicy creates a new authorization policy. -func (p *provider) AddPolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - if policy.ID == "" { - policy.ID = uuid.New().String() - } - policy.Key = policy.ID - policy.CreatedAt = time.Now().Unix() - policy.UpdatedAt = time.Now().Unix() - insertQuery := fmt.Sprintf("INSERT INTO %s (id, name, description, type, logic, decision_strategy, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", - KeySpace+"."+schemas.Collections.Policy) - err := p.db.Query(insertQuery, policy.ID, policy.Name, policy.Description, policy.Type, policy.Logic, policy.DecisionStrategy, policy.CreatedAt, policy.UpdatedAt).Exec() - if err != nil { - return nil, err - } - return policy, nil -} - -// UpdatePolicy updates an existing authorization policy. -func (p *provider) UpdatePolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - policy.UpdatedAt = time.Now().Unix() - bytes, err := json.Marshal(policy) - if err != nil { - return nil, err - } - decoder := json.NewDecoder(strings.NewReader(string(bytes))) - decoder.UseNumber() - policyMap := map[string]interface{}{} - err = decoder.Decode(&policyMap) - if err != nil { - return nil, err - } - convertMapValues(policyMap) - updateFields := "" - var updateValues []interface{} - for key, value := range policyMap { - if key == "_id" || key == "_key" || key == "id" || key == "key" { - continue - } - if value == nil { - updateFields += fmt.Sprintf("%s = null,", key) - continue - } - updateFields += fmt.Sprintf("%s = ?, ", key) - updateValues = append(updateValues, value) - } - updateFields = strings.Trim(updateFields, " ") - updateFields = strings.TrimSuffix(updateFields, ",") - updateValues = append(updateValues, policy.ID) - query := fmt.Sprintf("UPDATE %s SET %s WHERE id = ?", KeySpace+"."+schemas.Collections.Policy, updateFields) - err = p.db.Query(query, updateValues...).Exec() - if err != nil { - return nil, err - } - return policy, nil -} - -// DeletePolicy deletes an authorization policy by ID. -// Returns an error if any permission_policy references this policy. -// Cascade-deletes associated policy targets. -func (p *provider) DeletePolicy(ctx context.Context, id string) error { - // Check for referencing permission_policies - var count int64 - countQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE policy_id = ? ALLOW FILTERING", KeySpace+"."+schemas.Collections.PermissionPolicy) - err := p.db.Query(countQuery, id).Consistency(gocql.One).Scan(&count) - if err != nil { - return err - } - if count > 0 { - return fmt.Errorf("cannot delete policy: %d permission_policy(s) reference it", count) - } - // Cascade-delete policy targets - getTargetsQuery := fmt.Sprintf("SELECT id FROM %s WHERE policy_id = ? ALLOW FILTERING", KeySpace+"."+schemas.Collections.PolicyTarget) - scanner := p.db.Query(getTargetsQuery, id).Iter().Scanner() - var targetIDs []string - for scanner.Next() { - var targetID string - err = scanner.Scan(&targetID) - if err != nil { - return err - } - targetIDs = append(targetIDs, targetID) - } - if len(targetIDs) > 0 { - placeholders := strings.Repeat("?,", len(targetIDs)) - placeholders = strings.TrimSuffix(placeholders, ",") - deleteValues := make([]interface{}, len(targetIDs)) - for i, tid := range targetIDs { - deleteValues[i] = tid - } - deleteTargetsQuery := fmt.Sprintf("DELETE FROM %s WHERE id IN (%s)", KeySpace+"."+schemas.Collections.PolicyTarget, placeholders) - err = p.db.Query(deleteTargetsQuery, deleteValues...).Exec() - if err != nil { - return err - } - } - // Delete the policy itself - query := fmt.Sprintf("DELETE FROM %s WHERE id = ?", KeySpace+"."+schemas.Collections.Policy) - err = p.db.Query(query, id).Exec() - if err != nil { - return err - } - return nil -} - -// GetPolicyByID returns an authorization policy by its ID. -func (p *provider) GetPolicyByID(ctx context.Context, id string) (*schemas.Policy, error) { - var policy schemas.Policy - query := fmt.Sprintf("SELECT id, name, description, type, logic, decision_strategy, created_at, updated_at FROM %s WHERE id = ? LIMIT 1", - KeySpace+"."+schemas.Collections.Policy) - err := p.db.Query(query, id).Consistency(gocql.One).Scan( - &policy.ID, &policy.Name, &policy.Description, &policy.Type, &policy.Logic, &policy.DecisionStrategy, &policy.CreatedAt, &policy.UpdatedAt) - if err != nil { - return nil, err - } - return &policy, nil -} - -// ListPolicies returns a paginated list of authorization policies. -func (p *provider) ListPolicies(ctx context.Context, pagination *model.Pagination) ([]*schemas.Policy, *model.Pagination, error) { - policies := []*schemas.Policy{} - paginationClone := *pagination - totalCountQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s", KeySpace+"."+schemas.Collections.Policy) - err := p.db.Query(totalCountQuery).Consistency(gocql.One).Scan(&paginationClone.Total) - if err != nil { - return nil, nil, err - } - query := fmt.Sprintf("SELECT id, name, description, type, logic, decision_strategy, created_at, updated_at FROM %s LIMIT %d", - KeySpace+"."+schemas.Collections.Policy, pagination.Limit+pagination.Offset) - scanner := p.db.Query(query).Iter().Scanner() - counter := int64(0) - for scanner.Next() { - if counter >= pagination.Offset { - var policy schemas.Policy - err := scanner.Scan(&policy.ID, &policy.Name, &policy.Description, &policy.Type, &policy.Logic, &policy.DecisionStrategy, &policy.CreatedAt, &policy.UpdatedAt) - if err != nil { - return nil, nil, err - } - policies = append(policies, &policy) - } - counter++ - } - return policies, &paginationClone, nil -} - -// AddPolicyTarget adds a target (role name or user ID) to a policy. -func (p *provider) AddPolicyTarget(ctx context.Context, target *schemas.PolicyTarget) (*schemas.PolicyTarget, error) { - if target.ID == "" { - target.ID = uuid.New().String() - } - target.Key = target.ID - target.CreatedAt = time.Now().Unix() - insertQuery := fmt.Sprintf("INSERT INTO %s (id, policy_id, target_type, target_value, created_at) VALUES (?, ?, ?, ?, ?)", - KeySpace+"."+schemas.Collections.PolicyTarget) - err := p.db.Query(insertQuery, target.ID, target.PolicyID, target.TargetType, target.TargetValue, target.CreatedAt).Exec() - if err != nil { - return nil, err - } - return target, nil -} - -// DeletePolicyTargetsByPolicyID removes all targets for a policy. -func (p *provider) DeletePolicyTargetsByPolicyID(ctx context.Context, policyID string) error { - getTargetsQuery := fmt.Sprintf("SELECT id FROM %s WHERE policy_id = ? ALLOW FILTERING", KeySpace+"."+schemas.Collections.PolicyTarget) - scanner := p.db.Query(getTargetsQuery, policyID).Iter().Scanner() - var targetIDs []string - for scanner.Next() { - var targetID string - err := scanner.Scan(&targetID) - if err != nil { - return err - } - targetIDs = append(targetIDs, targetID) - } - if len(targetIDs) > 0 { - placeholders := strings.Repeat("?,", len(targetIDs)) - placeholders = strings.TrimSuffix(placeholders, ",") - deleteValues := make([]interface{}, len(targetIDs)) - for i, tid := range targetIDs { - deleteValues[i] = tid - } - query := fmt.Sprintf("DELETE FROM %s WHERE id IN (%s)", KeySpace+"."+schemas.Collections.PolicyTarget, placeholders) - err := p.db.Query(query, deleteValues...).Exec() - if err != nil { - return err - } - } - return nil -} - -// GetPolicyTargets returns all targets for a policy. -func (p *provider) GetPolicyTargets(ctx context.Context, policyID string) ([]*schemas.PolicyTarget, error) { - targets := []*schemas.PolicyTarget{} - query := fmt.Sprintf("SELECT id, policy_id, target_type, target_value, created_at FROM %s WHERE policy_id = ? ALLOW FILTERING", - KeySpace+"."+schemas.Collections.PolicyTarget) - scanner := p.db.Query(query, policyID).Iter().Scanner() - for scanner.Next() { - var target schemas.PolicyTarget - err := scanner.Scan(&target.ID, &target.PolicyID, &target.TargetType, &target.TargetValue, &target.CreatedAt) - if err != nil { - return nil, err - } - targets = append(targets, &target) - } - return targets, nil -} diff --git a/internal/storage/db/cassandradb/provider.go b/internal/storage/db/cassandradb/provider.go index 9e621b32..ff7aa371 100644 --- a/internal/storage/db/cassandradb/provider.go +++ b/internal/storage/db/cassandradb/provider.go @@ -366,110 +366,6 @@ func NewProvider(cfg *config.Config, deps *Dependencies) (*provider, error) { return nil, err } - // Resource table - resourceCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, name text, description text, created_at bigint, updated_at bigint, PRIMARY KEY (id))", KeySpace, schemas.Collections.Resource) - err = session.Query(resourceCollectionQuery).Exec() - if err != nil { - return nil, err - } - resourceNameIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_resource_name ON %s.%s (name)", KeySpace, schemas.Collections.Resource) - err = session.Query(resourceNameIndex).Exec() - if err != nil { - return nil, err - } - - // Scope table - scopeCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, name text, description text, created_at bigint, updated_at bigint, PRIMARY KEY (id))", KeySpace, schemas.Collections.Scope) - err = session.Query(scopeCollectionQuery).Exec() - if err != nil { - return nil, err - } - scopeNameIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_scope_name ON %s.%s (name)", KeySpace, schemas.Collections.Scope) - err = session.Query(scopeNameIndex).Exec() - if err != nil { - return nil, err - } - - // Policy table - policyCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, name text, description text, type text, logic text, decision_strategy text, created_at bigint, updated_at bigint, PRIMARY KEY (id))", KeySpace, schemas.Collections.Policy) - err = session.Query(policyCollectionQuery).Exec() - if err != nil { - return nil, err - } - policyNameIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_policy_name ON %s.%s (name)", KeySpace, schemas.Collections.Policy) - err = session.Query(policyNameIndex).Exec() - if err != nil { - return nil, err - } - policyTypeIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_policy_type ON %s.%s (type)", KeySpace, schemas.Collections.Policy) - err = session.Query(policyTypeIndex).Exec() - if err != nil { - return nil, err - } - - // PolicyTarget table - policyTargetCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, policy_id text, target_type text, target_value text, created_at bigint, PRIMARY KEY (id))", KeySpace, schemas.Collections.PolicyTarget) - err = session.Query(policyTargetCollectionQuery).Exec() - if err != nil { - return nil, err - } - policyTargetPolicyIDIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_policy_target_policy_id ON %s.%s (policy_id)", KeySpace, schemas.Collections.PolicyTarget) - err = session.Query(policyTargetPolicyIDIndex).Exec() - if err != nil { - return nil, err - } - - // Permission table - permissionCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, name text, description text, resource_id text, decision_strategy text, created_at bigint, updated_at bigint, PRIMARY KEY (id))", KeySpace, schemas.Collections.Permission) - err = session.Query(permissionCollectionQuery).Exec() - if err != nil { - return nil, err - } - permissionNameIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_permission_name ON %s.%s (name)", KeySpace, schemas.Collections.Permission) - err = session.Query(permissionNameIndex).Exec() - if err != nil { - return nil, err - } - permissionResourceIDIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_permission_resource_id ON %s.%s (resource_id)", KeySpace, schemas.Collections.Permission) - err = session.Query(permissionResourceIDIndex).Exec() - if err != nil { - return nil, err - } - - // PermissionScope join table - permissionScopeCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, permission_id text, scope_id text, created_at bigint, PRIMARY KEY (id))", KeySpace, schemas.Collections.PermissionScope) - err = session.Query(permissionScopeCollectionQuery).Exec() - if err != nil { - return nil, err - } - permissionScopePermIDIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_permission_scope_permission_id ON %s.%s (permission_id)", KeySpace, schemas.Collections.PermissionScope) - err = session.Query(permissionScopePermIDIndex).Exec() - if err != nil { - return nil, err - } - permissionScopeScopeIDIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_permission_scope_scope_id ON %s.%s (scope_id)", KeySpace, schemas.Collections.PermissionScope) - err = session.Query(permissionScopeScopeIDIndex).Exec() - if err != nil { - return nil, err - } - - // PermissionPolicy join table - permissionPolicyCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, permission_id text, policy_id text, created_at bigint, PRIMARY KEY (id))", KeySpace, schemas.Collections.PermissionPolicy) - err = session.Query(permissionPolicyCollectionQuery).Exec() - if err != nil { - return nil, err - } - permissionPolicyPermIDIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_permission_policy_permission_id ON %s.%s (permission_id)", KeySpace, schemas.Collections.PermissionPolicy) - err = session.Query(permissionPolicyPermIDIndex).Exec() - if err != nil { - return nil, err - } - permissionPolicyPolicyIDIndex := fmt.Sprintf("CREATE INDEX IF NOT EXISTS authorizer_permission_policy_policy_id ON %s.%s (policy_id)", KeySpace, schemas.Collections.PermissionPolicy) - err = session.Query(permissionPolicyPolicyIDIndex).Exec() - if err != nil { - return nil, err - } - return &provider{ config: cfg, dependencies: deps, diff --git a/internal/storage/db/cassandradb/resource.go b/internal/storage/db/cassandradb/resource.go deleted file mode 100644 index 7407287b..00000000 --- a/internal/storage/db/cassandradb/resource.go +++ /dev/null @@ -1,144 +0,0 @@ -package cassandradb - -import ( - "context" - "encoding/json" - "fmt" - "strings" - "time" - - "github.com/gocql/gocql" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddResource creates a new authorization resource. -func (p *provider) AddResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - if resource.ID == "" { - resource.ID = uuid.New().String() - } - resource.Key = resource.ID - resource.CreatedAt = time.Now().Unix() - resource.UpdatedAt = time.Now().Unix() - insertQuery := fmt.Sprintf("INSERT INTO %s (id, name, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?)", - KeySpace+"."+schemas.Collections.Resource) - err := p.db.Query(insertQuery, resource.ID, resource.Name, resource.Description, resource.CreatedAt, resource.UpdatedAt).Exec() - if err != nil { - return nil, err - } - return resource, nil -} - -// UpdateResource updates an existing authorization resource. -func (p *provider) UpdateResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - resource.UpdatedAt = time.Now().Unix() - bytes, err := json.Marshal(resource) - if err != nil { - return nil, err - } - decoder := json.NewDecoder(strings.NewReader(string(bytes))) - decoder.UseNumber() - resourceMap := map[string]interface{}{} - err = decoder.Decode(&resourceMap) - if err != nil { - return nil, err - } - convertMapValues(resourceMap) - updateFields := "" - var updateValues []interface{} - for key, value := range resourceMap { - if key == "_id" || key == "_key" || key == "id" || key == "key" { - continue - } - if value == nil { - updateFields += fmt.Sprintf("%s = null,", key) - continue - } - updateFields += fmt.Sprintf("%s = ?, ", key) - updateValues = append(updateValues, value) - } - updateFields = strings.Trim(updateFields, " ") - updateFields = strings.TrimSuffix(updateFields, ",") - updateValues = append(updateValues, resource.ID) - query := fmt.Sprintf("UPDATE %s SET %s WHERE id = ?", KeySpace+"."+schemas.Collections.Resource, updateFields) - err = p.db.Query(query, updateValues...).Exec() - if err != nil { - return nil, err - } - return resource, nil -} - -// DeleteResource deletes an authorization resource by ID. -// Returns an error if any permission references this resource. -func (p *provider) DeleteResource(ctx context.Context, id string) error { - var count int64 - countQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE resource_id = ? ALLOW FILTERING", KeySpace+"."+schemas.Collections.Permission) - err := p.db.Query(countQuery, id).Consistency(gocql.One).Scan(&count) - if err != nil { - return err - } - if count > 0 { - return fmt.Errorf("cannot delete resource: %d permission(s) reference it", count) - } - query := fmt.Sprintf("DELETE FROM %s WHERE id = ?", KeySpace+"."+schemas.Collections.Resource) - err = p.db.Query(query, id).Exec() - if err != nil { - return err - } - return nil -} - -// GetResourceByID returns an authorization resource by its ID. -func (p *provider) GetResourceByID(ctx context.Context, id string) (*schemas.Resource, error) { - var resource schemas.Resource - query := fmt.Sprintf("SELECT id, name, description, created_at, updated_at FROM %s WHERE id = ? LIMIT 1", - KeySpace+"."+schemas.Collections.Resource) - err := p.db.Query(query, id).Consistency(gocql.One).Scan( - &resource.ID, &resource.Name, &resource.Description, &resource.CreatedAt, &resource.UpdatedAt) - if err != nil { - return nil, err - } - return &resource, nil -} - -// GetResourceByName returns an authorization resource by its unique name. -func (p *provider) GetResourceByName(ctx context.Context, name string) (*schemas.Resource, error) { - var resource schemas.Resource - query := fmt.Sprintf("SELECT id, name, description, created_at, updated_at FROM %s WHERE name = ? LIMIT 1 ALLOW FILTERING", - KeySpace+"."+schemas.Collections.Resource) - err := p.db.Query(query, name).Consistency(gocql.One).Scan( - &resource.ID, &resource.Name, &resource.Description, &resource.CreatedAt, &resource.UpdatedAt) - if err != nil { - return nil, err - } - return &resource, nil -} - -// ListResources returns a paginated list of authorization resources. -func (p *provider) ListResources(ctx context.Context, pagination *model.Pagination) ([]*schemas.Resource, *model.Pagination, error) { - resources := []*schemas.Resource{} - paginationClone := *pagination - totalCountQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s", KeySpace+"."+schemas.Collections.Resource) - err := p.db.Query(totalCountQuery).Consistency(gocql.One).Scan(&paginationClone.Total) - if err != nil { - return nil, nil, err - } - query := fmt.Sprintf("SELECT id, name, description, created_at, updated_at FROM %s LIMIT %d", - KeySpace+"."+schemas.Collections.Resource, pagination.Limit+pagination.Offset) - scanner := p.db.Query(query).Iter().Scanner() - counter := int64(0) - for scanner.Next() { - if counter >= pagination.Offset { - var resource schemas.Resource - err := scanner.Scan(&resource.ID, &resource.Name, &resource.Description, &resource.CreatedAt, &resource.UpdatedAt) - if err != nil { - return nil, nil, err - } - resources = append(resources, &resource) - } - counter++ - } - return resources, &paginationClone, nil -} diff --git a/internal/storage/db/cassandradb/scope.go b/internal/storage/db/cassandradb/scope.go deleted file mode 100644 index f6b56d0a..00000000 --- a/internal/storage/db/cassandradb/scope.go +++ /dev/null @@ -1,144 +0,0 @@ -package cassandradb - -import ( - "context" - "encoding/json" - "fmt" - "strings" - "time" - - "github.com/gocql/gocql" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddScope creates a new authorization scope. -func (p *provider) AddScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - if scope.ID == "" { - scope.ID = uuid.New().String() - } - scope.Key = scope.ID - scope.CreatedAt = time.Now().Unix() - scope.UpdatedAt = time.Now().Unix() - insertQuery := fmt.Sprintf("INSERT INTO %s (id, name, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?)", - KeySpace+"."+schemas.Collections.Scope) - err := p.db.Query(insertQuery, scope.ID, scope.Name, scope.Description, scope.CreatedAt, scope.UpdatedAt).Exec() - if err != nil { - return nil, err - } - return scope, nil -} - -// UpdateScope updates an existing authorization scope. -func (p *provider) UpdateScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - scope.UpdatedAt = time.Now().Unix() - bytes, err := json.Marshal(scope) - if err != nil { - return nil, err - } - decoder := json.NewDecoder(strings.NewReader(string(bytes))) - decoder.UseNumber() - scopeMap := map[string]interface{}{} - err = decoder.Decode(&scopeMap) - if err != nil { - return nil, err - } - convertMapValues(scopeMap) - updateFields := "" - var updateValues []interface{} - for key, value := range scopeMap { - if key == "_id" || key == "_key" || key == "id" || key == "key" { - continue - } - if value == nil { - updateFields += fmt.Sprintf("%s = null,", key) - continue - } - updateFields += fmt.Sprintf("%s = ?, ", key) - updateValues = append(updateValues, value) - } - updateFields = strings.Trim(updateFields, " ") - updateFields = strings.TrimSuffix(updateFields, ",") - updateValues = append(updateValues, scope.ID) - query := fmt.Sprintf("UPDATE %s SET %s WHERE id = ?", KeySpace+"."+schemas.Collections.Scope, updateFields) - err = p.db.Query(query, updateValues...).Exec() - if err != nil { - return nil, err - } - return scope, nil -} - -// DeleteScope deletes an authorization scope by ID. -// Returns an error if any permission_scope references this scope. -func (p *provider) DeleteScope(ctx context.Context, id string) error { - var count int64 - countQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE scope_id = ? ALLOW FILTERING", KeySpace+"."+schemas.Collections.PermissionScope) - err := p.db.Query(countQuery, id).Consistency(gocql.One).Scan(&count) - if err != nil { - return err - } - if count > 0 { - return fmt.Errorf("cannot delete scope: %d permission_scope(s) reference it", count) - } - query := fmt.Sprintf("DELETE FROM %s WHERE id = ?", KeySpace+"."+schemas.Collections.Scope) - err = p.db.Query(query, id).Exec() - if err != nil { - return err - } - return nil -} - -// GetScopeByID returns an authorization scope by its ID. -func (p *provider) GetScopeByID(ctx context.Context, id string) (*schemas.Scope, error) { - var scope schemas.Scope - query := fmt.Sprintf("SELECT id, name, description, created_at, updated_at FROM %s WHERE id = ? LIMIT 1", - KeySpace+"."+schemas.Collections.Scope) - err := p.db.Query(query, id).Consistency(gocql.One).Scan( - &scope.ID, &scope.Name, &scope.Description, &scope.CreatedAt, &scope.UpdatedAt) - if err != nil { - return nil, err - } - return &scope, nil -} - -// GetScopeByName returns an authorization scope by its unique name. -func (p *provider) GetScopeByName(ctx context.Context, name string) (*schemas.Scope, error) { - var scope schemas.Scope - query := fmt.Sprintf("SELECT id, name, description, created_at, updated_at FROM %s WHERE name = ? LIMIT 1 ALLOW FILTERING", - KeySpace+"."+schemas.Collections.Scope) - err := p.db.Query(query, name).Consistency(gocql.One).Scan( - &scope.ID, &scope.Name, &scope.Description, &scope.CreatedAt, &scope.UpdatedAt) - if err != nil { - return nil, err - } - return &scope, nil -} - -// ListScopes returns a paginated list of authorization scopes. -func (p *provider) ListScopes(ctx context.Context, pagination *model.Pagination) ([]*schemas.Scope, *model.Pagination, error) { - scopes := []*schemas.Scope{} - paginationClone := *pagination - totalCountQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s", KeySpace+"."+schemas.Collections.Scope) - err := p.db.Query(totalCountQuery).Consistency(gocql.One).Scan(&paginationClone.Total) - if err != nil { - return nil, nil, err - } - query := fmt.Sprintf("SELECT id, name, description, created_at, updated_at FROM %s LIMIT %d", - KeySpace+"."+schemas.Collections.Scope, pagination.Limit+pagination.Offset) - scanner := p.db.Query(query).Iter().Scanner() - counter := int64(0) - for scanner.Next() { - if counter >= pagination.Offset { - var scope schemas.Scope - err := scanner.Scan(&scope.ID, &scope.Name, &scope.Description, &scope.CreatedAt, &scope.UpdatedAt) - if err != nil { - return nil, nil, err - } - scopes = append(scopes, &scope) - } - counter++ - } - return scopes, &paginationClone, nil -} diff --git a/internal/storage/db/couchbase/permission.go b/internal/storage/db/couchbase/permission.go deleted file mode 100644 index 5900a5ee..00000000 --- a/internal/storage/db/couchbase/permission.go +++ /dev/null @@ -1,429 +0,0 @@ -package couchbase - -import ( - "context" - "encoding/json" - "fmt" - "log" - "strings" - "time" - - "github.com/couchbase/gocb/v2" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPermission creates a new authorization permission. -func (p *provider) AddPermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - if permission.ID == "" { - permission.ID = uuid.New().String() - } - permission.Key = permission.ID - permission.CreatedAt = time.Now().Unix() - permission.UpdatedAt = time.Now().Unix() - insertOpt := gocb.InsertOptions{ - Context: ctx, - } - _, err := p.db.Collection(schemas.Collections.Permission).Insert(permission.ID, permission, &insertOpt) - if err != nil { - return nil, err - } - return permission, nil -} - -// UpdatePermission updates an existing authorization permission. -func (p *provider) UpdatePermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - permission.UpdatedAt = time.Now().Unix() - bytes, err := json.Marshal(permission) - if err != nil { - return nil, err - } - decoder := json.NewDecoder(strings.NewReader(string(bytes))) - decoder.UseNumber() - permissionMap := map[string]interface{}{} - err = decoder.Decode(&permissionMap) - if err != nil { - return nil, err - } - updateFields, params := GetSetFields(permissionMap) - params["id"] = permission.ID - query := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE id=$id`, p.scopeName, schemas.Collections.Permission, updateFields) - _, err = p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - return permission, nil -} - -// DeletePermission deletes an authorization permission by ID. -// Cascade-deletes associated permission_scopes and permission_policies. -func (p *provider) DeletePermission(ctx context.Context, id string) error { - params := make(map[string]interface{}, 1) - params["permission_id"] = id - // Cascade-delete permission_scopes - scopeQuery := fmt.Sprintf(`DELETE FROM %s.%s WHERE permission_id=$permission_id`, p.scopeName, schemas.Collections.PermissionScope) - _, err := p.db.Query(scopeQuery, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return err - } - // Cascade-delete permission_policies - policyQuery := fmt.Sprintf(`DELETE FROM %s.%s WHERE permission_id=$permission_id`, p.scopeName, schemas.Collections.PermissionPolicy) - _, err = p.db.Query(policyQuery, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return err - } - removeOpt := gocb.RemoveOptions{ - Context: ctx, - } - _, err = p.db.Collection(schemas.Collections.Permission).Remove(id, &removeOpt) - if err != nil { - return err - } - return nil -} - -// GetPermissionByID returns an authorization permission by its ID. -func (p *provider) GetPermissionByID(ctx context.Context, id string) (*schemas.Permission, error) { - var permission *schemas.Permission - params := make(map[string]interface{}, 1) - params["id"] = id - query := fmt.Sprintf(`SELECT id, name, description, resource_id, decision_strategy, created_at, updated_at FROM %s.%s WHERE id=$id LIMIT 1`, p.scopeName, schemas.Collections.Permission) - q, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - err = q.One(&permission) - if err != nil { - return nil, err - } - return permission, nil -} - -// ListPermissions returns a paginated list of authorization permissions. -func (p *provider) ListPermissions(ctx context.Context, pagination *model.Pagination) ([]*schemas.Permission, *model.Pagination, error) { - permissions := []*schemas.Permission{} - paginationClone := *pagination - params := make(map[string]interface{}, 1) - params["offset"] = paginationClone.Offset - params["limit"] = paginationClone.Limit - total, err := p.GetTotalDocs(ctx, schemas.Collections.Permission) - if err != nil { - return nil, nil, err - } - paginationClone.Total = total - query := fmt.Sprintf("SELECT id, name, description, resource_id, decision_strategy, created_at, updated_at FROM %s.%s ORDER BY created_at DESC OFFSET $offset LIMIT $limit", p.scopeName, schemas.Collections.Permission) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, nil, err - } - for queryResult.Next() { - var permission schemas.Permission - err := queryResult.Row(&permission) - if err != nil { - log.Fatal(err) - } - permissions = append(permissions, &permission) - } - if err := queryResult.Err(); err != nil { - return nil, nil, err - } - return permissions, &paginationClone, nil -} - -// AddPermissionScope links a scope to a permission. -func (p *provider) AddPermissionScope(ctx context.Context, ps *schemas.PermissionScope) (*schemas.PermissionScope, error) { - if ps.ID == "" { - ps.ID = uuid.New().String() - } - ps.Key = ps.ID - ps.CreatedAt = time.Now().Unix() - insertOpt := gocb.InsertOptions{ - Context: ctx, - } - _, err := p.db.Collection(schemas.Collections.PermissionScope).Insert(ps.ID, ps, &insertOpt) - if err != nil { - return nil, err - } - return ps, nil -} - -// DeletePermissionScopesByPermissionID removes all scope links for a permission. -func (p *provider) DeletePermissionScopesByPermissionID(ctx context.Context, permissionID string) error { - params := make(map[string]interface{}, 1) - params["permission_id"] = permissionID - query := fmt.Sprintf(`DELETE FROM %s.%s WHERE permission_id=$permission_id`, p.scopeName, schemas.Collections.PermissionScope) - _, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return err - } - return nil -} - -// GetPermissionScopes returns all scope links for a permission. -func (p *provider) GetPermissionScopes(ctx context.Context, permissionID string) ([]*schemas.PermissionScope, error) { - scopes := []*schemas.PermissionScope{} - params := make(map[string]interface{}, 1) - params["permission_id"] = permissionID - query := fmt.Sprintf(`SELECT id, permission_id, scope_id, created_at FROM %s.%s WHERE permission_id=$permission_id`, p.scopeName, schemas.Collections.PermissionScope) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - for queryResult.Next() { - var ps schemas.PermissionScope - err := queryResult.Row(&ps) - if err != nil { - log.Fatal(err) - } - scopes = append(scopes, &ps) - } - if err := queryResult.Err(); err != nil { - return nil, err - } - return scopes, nil -} - -// AddPermissionPolicy links a policy to a permission. -func (p *provider) AddPermissionPolicy(ctx context.Context, pp *schemas.PermissionPolicy) (*schemas.PermissionPolicy, error) { - if pp.ID == "" { - pp.ID = uuid.New().String() - } - pp.Key = pp.ID - pp.CreatedAt = time.Now().Unix() - insertOpt := gocb.InsertOptions{ - Context: ctx, - } - _, err := p.db.Collection(schemas.Collections.PermissionPolicy).Insert(pp.ID, pp, &insertOpt) - if err != nil { - return nil, err - } - return pp, nil -} - -// DeletePermissionPoliciesByPermissionID removes all policy links for a permission. -func (p *provider) DeletePermissionPoliciesByPermissionID(ctx context.Context, permissionID string) error { - params := make(map[string]interface{}, 1) - params["permission_id"] = permissionID - query := fmt.Sprintf(`DELETE FROM %s.%s WHERE permission_id=$permission_id`, p.scopeName, schemas.Collections.PermissionPolicy) - _, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return err - } - return nil -} - -// GetPermissionPolicies returns all policy links for a permission. -func (p *provider) GetPermissionPolicies(ctx context.Context, permissionID string) ([]*schemas.PermissionPolicy, error) { - policies := []*schemas.PermissionPolicy{} - params := make(map[string]interface{}, 1) - params["permission_id"] = permissionID - query := fmt.Sprintf(`SELECT id, permission_id, policy_id, created_at FROM %s.%s WHERE permission_id=$permission_id`, p.scopeName, schemas.Collections.PermissionPolicy) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - for queryResult.Next() { - var pp schemas.PermissionPolicy - err := queryResult.Row(&pp) - if err != nil { - log.Fatal(err) - } - policies = append(policies, &pp) - } - if err := queryResult.Err(); err != nil { - return nil, err - } - return policies, nil -} - -// GetPermissionsForResourceScope returns all permissions (with their policies and targets) -// that match a given resource name and scope name. This is the hot-path query used by -// the evaluation engine. Uses sequential queries for clarity. -func (p *provider) GetPermissionsForResourceScope(ctx context.Context, resourceName string, scopeName string) ([]*schemas.PermissionWithPolicies, error) { - // 1. Find resource by name - resource, err := p.GetResourceByName(ctx, resourceName) - if err != nil { - return nil, err - } - - // 2. Find scope by name - scope, err := p.GetScopeByName(ctx, scopeName) - if err != nil { - return nil, err - } - - // 3. Find permissions for this resource - permParams := make(map[string]interface{}, 1) - permParams["resource_id"] = resource.ID - permQuery := fmt.Sprintf(`SELECT id, name, description, resource_id, decision_strategy, created_at, updated_at FROM %s.%s WHERE resource_id=$resource_id`, p.scopeName, schemas.Collections.Permission) - permResult, err := p.db.Query(permQuery, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: permParams, - }) - if err != nil { - return nil, err - } - var permissions []schemas.Permission - for permResult.Next() { - var perm schemas.Permission - if err := permResult.Row(&perm); err != nil { - return nil, err - } - permissions = append(permissions, perm) - } - if err := permResult.Err(); err != nil { - return nil, err - } - - if len(permissions) == 0 { - return nil, nil - } - - // 4. For each permission, check if it has the requested scope - var result []*schemas.PermissionWithPolicies - - for _, perm := range permissions { - // Check if this permission has the requested scope - scopeCheckParams := make(map[string]interface{}, 2) - scopeCheckParams["permission_id"] = perm.ID - scopeCheckParams["scope_id"] = scope.ID - scopeCountQuery := fmt.Sprintf(`SELECT COUNT(*) as Total FROM %s.%s WHERE permission_id=$permission_id AND scope_id=$scope_id`, p.scopeName, schemas.Collections.PermissionScope) - scopeCountResult, err := p.db.Query(scopeCountQuery, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: scopeCheckParams, - }) - if err != nil { - return nil, err - } - var countDocs TotalDocs - err = scopeCountResult.One(&countDocs) - if err != nil { - return nil, err - } - if countDocs.Total == 0 { - continue - } - - // 5. Find permission_policies for this permission - ppParams := make(map[string]interface{}, 1) - ppParams["permission_id"] = perm.ID - ppQuery := fmt.Sprintf(`SELECT id, permission_id, policy_id, created_at FROM %s.%s WHERE permission_id=$permission_id`, p.scopeName, schemas.Collections.PermissionPolicy) - ppResult, err := p.db.Query(ppQuery, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: ppParams, - }) - if err != nil { - return nil, err - } - var permPolicies []schemas.PermissionPolicy - for ppResult.Next() { - var pp schemas.PermissionPolicy - if err := ppResult.Row(&pp); err != nil { - return nil, err - } - permPolicies = append(permPolicies, pp) - } - if err := ppResult.Err(); err != nil { - return nil, err - } - - if len(permPolicies) == 0 { - continue - } - - // 6. For each permission_policy, resolve the policy and its targets - var policiesWithTargets []schemas.PolicyWithTargets - for _, pp := range permPolicies { - policy, err := p.GetPolicyByID(ctx, pp.PolicyID) - if err != nil { - return nil, err - } - - // Get targets for this policy - targetParams := make(map[string]interface{}, 1) - targetParams["policy_id"] = policy.ID - targetQuery := fmt.Sprintf(`SELECT id, policy_id, target_type, target_value, created_at FROM %s.%s WHERE policy_id=$policy_id`, p.scopeName, schemas.Collections.PolicyTarget) - targetResult, err := p.db.Query(targetQuery, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: targetParams, - }) - if err != nil { - return nil, err - } - var targets []schemas.PolicyTargetView - for targetResult.Next() { - var target schemas.PolicyTarget - if err := targetResult.Row(&target); err != nil { - return nil, err - } - targets = append(targets, schemas.PolicyTargetView{ - TargetType: target.TargetType, - TargetValue: target.TargetValue, - }) - } - if err := targetResult.Err(); err != nil { - return nil, err - } - - policiesWithTargets = append(policiesWithTargets, schemas.PolicyWithTargets{ - PolicyID: policy.ID, - PolicyName: policy.Name, - Type: policy.Type, - Logic: policy.Logic, - DecisionStrategy: policy.DecisionStrategy, - Targets: targets, - }) - } - - result = append(result, &schemas.PermissionWithPolicies{ - PermissionID: perm.ID, - PermissionName: perm.Name, - DecisionStrategy: perm.DecisionStrategy, - Policies: policiesWithTargets, - }) - } - - return result, nil -} diff --git a/internal/storage/db/couchbase/policy.go b/internal/storage/db/couchbase/policy.go deleted file mode 100644 index 87fed2d6..00000000 --- a/internal/storage/db/couchbase/policy.go +++ /dev/null @@ -1,223 +0,0 @@ -package couchbase - -import ( - "context" - "encoding/json" - "fmt" - "log" - "strings" - "time" - - "github.com/couchbase/gocb/v2" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPolicy creates a new authorization policy. -func (p *provider) AddPolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - if policy.ID == "" { - policy.ID = uuid.New().String() - } - policy.Key = policy.ID - policy.CreatedAt = time.Now().Unix() - policy.UpdatedAt = time.Now().Unix() - insertOpt := gocb.InsertOptions{ - Context: ctx, - } - _, err := p.db.Collection(schemas.Collections.Policy).Insert(policy.ID, policy, &insertOpt) - if err != nil { - return nil, err - } - return policy, nil -} - -// UpdatePolicy updates an existing authorization policy. -func (p *provider) UpdatePolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - policy.UpdatedAt = time.Now().Unix() - bytes, err := json.Marshal(policy) - if err != nil { - return nil, err - } - decoder := json.NewDecoder(strings.NewReader(string(bytes))) - decoder.UseNumber() - policyMap := map[string]interface{}{} - err = decoder.Decode(&policyMap) - if err != nil { - return nil, err - } - updateFields, params := GetSetFields(policyMap) - params["id"] = policy.ID - query := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE id=$id`, p.scopeName, schemas.Collections.Policy, updateFields) - _, err = p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - return policy, nil -} - -// DeletePolicy deletes an authorization policy by ID. -// Returns an error if any permission_policy references this policy. -// Cascade-deletes associated policy targets. -func (p *provider) DeletePolicy(ctx context.Context, id string) error { - // Check for permission_policy references - params := make(map[string]interface{}, 1) - params["policy_id"] = id - query := fmt.Sprintf(`SELECT COUNT(*) as Total FROM %s.%s WHERE policy_id=$policy_id`, p.scopeName, schemas.Collections.PermissionPolicy) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return err - } - var totalDocs TotalDocs - err = queryResult.One(&totalDocs) - if err != nil { - return err - } - if totalDocs.Total > 0 { - return fmt.Errorf("cannot delete policy: %d permission_policy(s) reference it", totalDocs.Total) - } - // Cascade-delete policy targets - deleteQuery := fmt.Sprintf(`DELETE FROM %s.%s WHERE policy_id=$policy_id`, p.scopeName, schemas.Collections.PolicyTarget) - _, err = p.db.Query(deleteQuery, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return err - } - removeOpt := gocb.RemoveOptions{ - Context: ctx, - } - _, err = p.db.Collection(schemas.Collections.Policy).Remove(id, &removeOpt) - if err != nil { - return err - } - return nil -} - -// GetPolicyByID returns an authorization policy by its ID. -func (p *provider) GetPolicyByID(ctx context.Context, id string) (*schemas.Policy, error) { - var policy *schemas.Policy - params := make(map[string]interface{}, 1) - params["id"] = id - query := fmt.Sprintf(`SELECT id, name, description, type, logic, decision_strategy, created_at, updated_at FROM %s.%s WHERE id=$id LIMIT 1`, p.scopeName, schemas.Collections.Policy) - q, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - err = q.One(&policy) - if err != nil { - return nil, err - } - return policy, nil -} - -// ListPolicies returns a paginated list of authorization policies. -func (p *provider) ListPolicies(ctx context.Context, pagination *model.Pagination) ([]*schemas.Policy, *model.Pagination, error) { - policies := []*schemas.Policy{} - paginationClone := *pagination - params := make(map[string]interface{}, 1) - params["offset"] = paginationClone.Offset - params["limit"] = paginationClone.Limit - total, err := p.GetTotalDocs(ctx, schemas.Collections.Policy) - if err != nil { - return nil, nil, err - } - paginationClone.Total = total - query := fmt.Sprintf("SELECT id, name, description, type, logic, decision_strategy, created_at, updated_at FROM %s.%s ORDER BY created_at DESC OFFSET $offset LIMIT $limit", p.scopeName, schemas.Collections.Policy) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, nil, err - } - for queryResult.Next() { - var policy schemas.Policy - err := queryResult.Row(&policy) - if err != nil { - log.Fatal(err) - } - policies = append(policies, &policy) - } - if err := queryResult.Err(); err != nil { - return nil, nil, err - } - return policies, &paginationClone, nil -} - -// AddPolicyTarget adds a target (role name or user ID) to a policy. -func (p *provider) AddPolicyTarget(ctx context.Context, target *schemas.PolicyTarget) (*schemas.PolicyTarget, error) { - if target.ID == "" { - target.ID = uuid.New().String() - } - target.Key = target.ID - target.CreatedAt = time.Now().Unix() - insertOpt := gocb.InsertOptions{ - Context: ctx, - } - _, err := p.db.Collection(schemas.Collections.PolicyTarget).Insert(target.ID, target, &insertOpt) - if err != nil { - return nil, err - } - return target, nil -} - -// DeletePolicyTargetsByPolicyID removes all targets for a policy. -func (p *provider) DeletePolicyTargetsByPolicyID(ctx context.Context, policyID string) error { - params := make(map[string]interface{}, 1) - params["policy_id"] = policyID - query := fmt.Sprintf(`DELETE FROM %s.%s WHERE policy_id=$policy_id`, p.scopeName, schemas.Collections.PolicyTarget) - _, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return err - } - return nil -} - -// GetPolicyTargets returns all targets for a policy. -func (p *provider) GetPolicyTargets(ctx context.Context, policyID string) ([]*schemas.PolicyTarget, error) { - targets := []*schemas.PolicyTarget{} - params := make(map[string]interface{}, 1) - params["policy_id"] = policyID - query := fmt.Sprintf(`SELECT id, policy_id, target_type, target_value, created_at FROM %s.%s WHERE policy_id=$policy_id`, p.scopeName, schemas.Collections.PolicyTarget) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - for queryResult.Next() { - var target schemas.PolicyTarget - err := queryResult.Row(&target) - if err != nil { - log.Fatal(err) - } - targets = append(targets, &target) - } - if err := queryResult.Err(); err != nil { - return nil, err - } - return targets, nil -} diff --git a/internal/storage/db/couchbase/provider.go b/internal/storage/db/couchbase/provider.go index e0163e19..9efccfcc 100644 --- a/internal/storage/db/couchbase/provider.go +++ b/internal/storage/db/couchbase/provider.go @@ -243,37 +243,5 @@ func getIndex(scopeName string) map[string][]string { auditLogIndex3 := fmt.Sprintf("CREATE INDEX AuditLogTimestampIndex ON %s.%s(timestamp)", scopeName, schemas.Collections.AuditLog) indices[schemas.Collections.AuditLog] = []string{auditLogIndex1, auditLogIndex2, auditLogIndex3} - // Resource index - resourceIndex1 := fmt.Sprintf("CREATE INDEX ResourceNameIndex ON %s.%s(name)", scopeName, schemas.Collections.Resource) - indices[schemas.Collections.Resource] = []string{resourceIndex1} - - // Scope index - scopeIndex1 := fmt.Sprintf("CREATE INDEX ScopeNameIndex ON %s.%s(name)", scopeName, schemas.Collections.Scope) - indices[schemas.Collections.Scope] = []string{scopeIndex1} - - // Policy index - policyIndex1 := fmt.Sprintf("CREATE INDEX PolicyNameIndex ON %s.%s(name)", scopeName, schemas.Collections.Policy) - policyIndex2 := fmt.Sprintf("CREATE INDEX PolicyTypeIndex ON %s.%s(type)", scopeName, schemas.Collections.Policy) - indices[schemas.Collections.Policy] = []string{policyIndex1, policyIndex2} - - // PolicyTarget index - policyTargetIndex1 := fmt.Sprintf("CREATE INDEX PolicyTargetPolicyIdIndex ON %s.%s(policy_id)", scopeName, schemas.Collections.PolicyTarget) - indices[schemas.Collections.PolicyTarget] = []string{policyTargetIndex1} - - // Permission index - permissionIndex1 := fmt.Sprintf("CREATE INDEX PermissionNameIndex ON %s.%s(name)", scopeName, schemas.Collections.Permission) - permissionIndex2 := fmt.Sprintf("CREATE INDEX PermissionResourceIdIndex ON %s.%s(resource_id)", scopeName, schemas.Collections.Permission) - indices[schemas.Collections.Permission] = []string{permissionIndex1, permissionIndex2} - - // PermissionScope index - permissionScopeIndex1 := fmt.Sprintf("CREATE INDEX PermissionScopePermissionIdIndex ON %s.%s(permission_id)", scopeName, schemas.Collections.PermissionScope) - permissionScopeIndex2 := fmt.Sprintf("CREATE INDEX PermissionScopeScopeIdIndex ON %s.%s(scope_id)", scopeName, schemas.Collections.PermissionScope) - indices[schemas.Collections.PermissionScope] = []string{permissionScopeIndex1, permissionScopeIndex2} - - // PermissionPolicy index - permissionPolicyIndex1 := fmt.Sprintf("CREATE INDEX PermissionPolicyPermissionIdIndex ON %s.%s(permission_id)", scopeName, schemas.Collections.PermissionPolicy) - permissionPolicyIndex2 := fmt.Sprintf("CREATE INDEX PermissionPolicyPolicyIdIndex ON %s.%s(policy_id)", scopeName, schemas.Collections.PermissionPolicy) - indices[schemas.Collections.PermissionPolicy] = []string{permissionPolicyIndex1, permissionPolicyIndex2} - return indices } diff --git a/internal/storage/db/couchbase/resource.go b/internal/storage/db/couchbase/resource.go deleted file mode 100644 index f5ebb181..00000000 --- a/internal/storage/db/couchbase/resource.go +++ /dev/null @@ -1,177 +0,0 @@ -package couchbase - -import ( - "context" - "encoding/json" - "fmt" - "log" - "strings" - "time" - - "github.com/couchbase/gocb/v2" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddResource creates a new authorization resource. -// Couchbase has no per-field unique constraints, so we explicitly -// reject duplicates on Name before inserting. -func (p *provider) AddResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - if existing, err := p.GetResourceByName(ctx, resource.Name); err == nil && existing != nil { - return nil, fmt.Errorf("resource with name %q already exists", resource.Name) - } - if resource.ID == "" { - resource.ID = uuid.New().String() - } - resource.Key = resource.ID - resource.CreatedAt = time.Now().Unix() - resource.UpdatedAt = time.Now().Unix() - insertOpt := gocb.InsertOptions{ - Context: ctx, - } - _, err := p.db.Collection(schemas.Collections.Resource).Insert(resource.ID, resource, &insertOpt) - if err != nil { - return nil, err - } - return resource, nil -} - -// UpdateResource updates an existing authorization resource. -func (p *provider) UpdateResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - resource.UpdatedAt = time.Now().Unix() - bytes, err := json.Marshal(resource) - if err != nil { - return nil, err - } - decoder := json.NewDecoder(strings.NewReader(string(bytes))) - decoder.UseNumber() - resourceMap := map[string]interface{}{} - err = decoder.Decode(&resourceMap) - if err != nil { - return nil, err - } - updateFields, params := GetSetFields(resourceMap) - params["id"] = resource.ID - query := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE id=$id`, p.scopeName, schemas.Collections.Resource, updateFields) - _, err = p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - return resource, nil -} - -// DeleteResource deletes an authorization resource by ID. -// Returns an error if any permission references this resource. -func (p *provider) DeleteResource(ctx context.Context, id string) error { - // Check for permission references - params := make(map[string]interface{}, 1) - params["resource_id"] = id - query := fmt.Sprintf(`SELECT COUNT(*) as Total FROM %s.%s WHERE resource_id=$resource_id`, p.scopeName, schemas.Collections.Permission) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return err - } - var totalDocs TotalDocs - err = queryResult.One(&totalDocs) - if err != nil { - return err - } - if totalDocs.Total > 0 { - return fmt.Errorf("cannot delete resource: %d permission(s) reference it", totalDocs.Total) - } - removeOpt := gocb.RemoveOptions{ - Context: ctx, - } - _, err = p.db.Collection(schemas.Collections.Resource).Remove(id, &removeOpt) - if err != nil { - return err - } - return nil -} - -// GetResourceByID returns an authorization resource by its ID. -func (p *provider) GetResourceByID(ctx context.Context, id string) (*schemas.Resource, error) { - var resource *schemas.Resource - params := make(map[string]interface{}, 1) - params["id"] = id - query := fmt.Sprintf(`SELECT id, name, description, created_at, updated_at FROM %s.%s WHERE id=$id LIMIT 1`, p.scopeName, schemas.Collections.Resource) - q, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - err = q.One(&resource) - if err != nil { - return nil, err - } - return resource, nil -} - -// GetResourceByName returns an authorization resource by its unique name. -func (p *provider) GetResourceByName(ctx context.Context, name string) (*schemas.Resource, error) { - var resource *schemas.Resource - params := make(map[string]interface{}, 1) - params["name"] = name - query := fmt.Sprintf(`SELECT id, name, description, created_at, updated_at FROM %s.%s WHERE name=$name LIMIT 1`, p.scopeName, schemas.Collections.Resource) - q, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - err = q.One(&resource) - if err != nil { - return nil, err - } - return resource, nil -} - -// ListResources returns a paginated list of authorization resources. -func (p *provider) ListResources(ctx context.Context, pagination *model.Pagination) ([]*schemas.Resource, *model.Pagination, error) { - resources := []*schemas.Resource{} - paginationClone := *pagination - params := make(map[string]interface{}, 1) - params["offset"] = paginationClone.Offset - params["limit"] = paginationClone.Limit - total, err := p.GetTotalDocs(ctx, schemas.Collections.Resource) - if err != nil { - return nil, nil, err - } - paginationClone.Total = total - query := fmt.Sprintf("SELECT id, name, description, created_at, updated_at FROM %s.%s ORDER BY created_at DESC OFFSET $offset LIMIT $limit", p.scopeName, schemas.Collections.Resource) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, nil, err - } - for queryResult.Next() { - var resource schemas.Resource - err := queryResult.Row(&resource) - if err != nil { - log.Fatal(err) - } - resources = append(resources, &resource) - } - if err := queryResult.Err(); err != nil { - return nil, nil, err - } - return resources, &paginationClone, nil -} diff --git a/internal/storage/db/couchbase/scope.go b/internal/storage/db/couchbase/scope.go deleted file mode 100644 index 5d57f93a..00000000 --- a/internal/storage/db/couchbase/scope.go +++ /dev/null @@ -1,177 +0,0 @@ -package couchbase - -import ( - "context" - "encoding/json" - "fmt" - "log" - "strings" - "time" - - "github.com/couchbase/gocb/v2" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddScope creates a new authorization scope. -// Couchbase has no per-field unique constraints, so we explicitly -// reject duplicates on Name before inserting. -func (p *provider) AddScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - if existing, err := p.GetScopeByName(ctx, scope.Name); err == nil && existing != nil { - return nil, fmt.Errorf("scope with name %q already exists", scope.Name) - } - if scope.ID == "" { - scope.ID = uuid.New().String() - } - scope.Key = scope.ID - scope.CreatedAt = time.Now().Unix() - scope.UpdatedAt = time.Now().Unix() - insertOpt := gocb.InsertOptions{ - Context: ctx, - } - _, err := p.db.Collection(schemas.Collections.Scope).Insert(scope.ID, scope, &insertOpt) - if err != nil { - return nil, err - } - return scope, nil -} - -// UpdateScope updates an existing authorization scope. -func (p *provider) UpdateScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - scope.UpdatedAt = time.Now().Unix() - bytes, err := json.Marshal(scope) - if err != nil { - return nil, err - } - decoder := json.NewDecoder(strings.NewReader(string(bytes))) - decoder.UseNumber() - scopeMap := map[string]interface{}{} - err = decoder.Decode(&scopeMap) - if err != nil { - return nil, err - } - updateFields, params := GetSetFields(scopeMap) - params["id"] = scope.ID - query := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE id=$id`, p.scopeName, schemas.Collections.Scope, updateFields) - _, err = p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - return scope, nil -} - -// DeleteScope deletes an authorization scope by ID. -// Returns an error if any permission_scope references this scope. -func (p *provider) DeleteScope(ctx context.Context, id string) error { - // Check for permission_scope references - params := make(map[string]interface{}, 1) - params["scope_id"] = id - query := fmt.Sprintf(`SELECT COUNT(*) as Total FROM %s.%s WHERE scope_id=$scope_id`, p.scopeName, schemas.Collections.PermissionScope) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return err - } - var totalDocs TotalDocs - err = queryResult.One(&totalDocs) - if err != nil { - return err - } - if totalDocs.Total > 0 { - return fmt.Errorf("cannot delete scope: %d permission_scope(s) reference it", totalDocs.Total) - } - removeOpt := gocb.RemoveOptions{ - Context: ctx, - } - _, err = p.db.Collection(schemas.Collections.Scope).Remove(id, &removeOpt) - if err != nil { - return err - } - return nil -} - -// GetScopeByID returns an authorization scope by its ID. -func (p *provider) GetScopeByID(ctx context.Context, id string) (*schemas.Scope, error) { - var scope *schemas.Scope - params := make(map[string]interface{}, 1) - params["id"] = id - query := fmt.Sprintf(`SELECT id, name, description, created_at, updated_at FROM %s.%s WHERE id=$id LIMIT 1`, p.scopeName, schemas.Collections.Scope) - q, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - err = q.One(&scope) - if err != nil { - return nil, err - } - return scope, nil -} - -// GetScopeByName returns an authorization scope by its unique name. -func (p *provider) GetScopeByName(ctx context.Context, name string) (*schemas.Scope, error) { - var scope *schemas.Scope - params := make(map[string]interface{}, 1) - params["name"] = name - query := fmt.Sprintf(`SELECT id, name, description, created_at, updated_at FROM %s.%s WHERE name=$name LIMIT 1`, p.scopeName, schemas.Collections.Scope) - q, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, err - } - err = q.One(&scope) - if err != nil { - return nil, err - } - return scope, nil -} - -// ListScopes returns a paginated list of authorization scopes. -func (p *provider) ListScopes(ctx context.Context, pagination *model.Pagination) ([]*schemas.Scope, *model.Pagination, error) { - scopes := []*schemas.Scope{} - paginationClone := *pagination - params := make(map[string]interface{}, 1) - params["offset"] = paginationClone.Offset - params["limit"] = paginationClone.Limit - total, err := p.GetTotalDocs(ctx, schemas.Collections.Scope) - if err != nil { - return nil, nil, err - } - paginationClone.Total = total - query := fmt.Sprintf("SELECT id, name, description, created_at, updated_at FROM %s.%s ORDER BY created_at DESC OFFSET $offset LIMIT $limit", p.scopeName, schemas.Collections.Scope) - queryResult, err := p.db.Query(query, &gocb.QueryOptions{ - Context: ctx, - ScanConsistency: gocb.QueryScanConsistencyRequestPlus, - NamedParameters: params, - }) - if err != nil { - return nil, nil, err - } - for queryResult.Next() { - var scope schemas.Scope - err := queryResult.Row(&scope) - if err != nil { - log.Fatal(err) - } - scopes = append(scopes, &scope) - } - if err := queryResult.Err(); err != nil { - return nil, nil, err - } - return scopes, &paginationClone, nil -} diff --git a/internal/storage/db/dynamodb/permission.go b/internal/storage/db/dynamodb/permission.go deleted file mode 100644 index bb421e32..00000000 --- a/internal/storage/db/dynamodb/permission.go +++ /dev/null @@ -1,318 +0,0 @@ -package dynamodb - -import ( - "context" - "errors" - "time" - - "github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression" - "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPermission creates a new authorization permission. -func (p *provider) AddPermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - if permission.ID == "" { - permission.ID = uuid.New().String() - } - permission.Key = permission.ID - permission.CreatedAt = time.Now().Unix() - permission.UpdatedAt = time.Now().Unix() - if err := p.putItem(ctx, schemas.Collections.Permission, permission); err != nil { - return nil, err - } - return permission, nil -} - -// UpdatePermission updates an existing authorization permission. -func (p *provider) UpdatePermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - permission.UpdatedAt = time.Now().Unix() - if err := p.updateByHashKey(ctx, schemas.Collections.Permission, "id", permission.ID, permission); err != nil { - return nil, err - } - return permission, nil -} - -// DeletePermission deletes an authorization permission by ID. -// Cascade-deletes all permission_scopes and permission_policies for this permission. -func (p *provider) DeletePermission(ctx context.Context, id string) error { - if err := p.DeletePermissionScopesByPermissionID(ctx, id); err != nil { - return err - } - if err := p.DeletePermissionPoliciesByPermissionID(ctx, id); err != nil { - return err - } - return p.deleteItemByHash(ctx, schemas.Collections.Permission, "id", id) -} - -// GetPermissionByID returns an authorization permission by its ID. -func (p *provider) GetPermissionByID(ctx context.Context, id string) (*schemas.Permission, error) { - var permission schemas.Permission - if err := p.getItemByHash(ctx, schemas.Collections.Permission, "id", id, &permission); err != nil { - return nil, err - } - if permission.ID == "" { - return nil, errors.New("no document found") - } - return &permission, nil -} - -// ListPermissions returns a paginated list of authorization permissions. -func (p *provider) ListPermissions(ctx context.Context, pagination *model.Pagination) ([]*schemas.Permission, *model.Pagination, error) { - var lastKey map[string]types.AttributeValue - var iteration int64 - paginationClone := *pagination - var permissions []*schemas.Permission - - count, err := p.scanCount(ctx, schemas.Collections.Permission, nil) - if err != nil { - return nil, nil, err - } - - for (paginationClone.Offset + paginationClone.Limit) > iteration { - items, next, err := p.scanPageIter(ctx, schemas.Collections.Permission, nil, int32(paginationClone.Limit), lastKey) - if err != nil { - return nil, nil, err - } - for _, it := range items { - var perm schemas.Permission - if err := unmarshalItem(it, &perm); err != nil { - return nil, nil, err - } - if paginationClone.Offset == iteration { - permissions = append(permissions, &perm) - } - } - lastKey = next - iteration += paginationClone.Limit - if lastKey == nil { - break - } - } - paginationClone.Total = count - return permissions, &paginationClone, nil -} - -// AddPermissionScope links a scope to a permission. -func (p *provider) AddPermissionScope(ctx context.Context, ps *schemas.PermissionScope) (*schemas.PermissionScope, error) { - if ps.ID == "" { - ps.ID = uuid.New().String() - } - ps.Key = ps.ID - ps.CreatedAt = time.Now().Unix() - if err := p.putItem(ctx, schemas.Collections.PermissionScope, ps); err != nil { - return nil, err - } - return ps, nil -} - -// DeletePermissionScopesByPermissionID removes all scope links for a permission. -func (p *provider) DeletePermissionScopesByPermissionID(ctx context.Context, permissionID string) error { - f := expression.Name("permission_id").Equal(expression.Value(permissionID)) - items, err := p.scanFilteredAll(ctx, schemas.Collections.PermissionScope, nil, &f) - if err != nil { - return err - } - for _, it := range items { - var ps schemas.PermissionScope - if err := unmarshalItem(it, &ps); err != nil { - return err - } - if err := p.deleteItemByHash(ctx, schemas.Collections.PermissionScope, "id", ps.ID); err != nil { - return err - } - } - return nil -} - -// GetPermissionScopes returns all scope links for a permission. -func (p *provider) GetPermissionScopes(ctx context.Context, permissionID string) ([]*schemas.PermissionScope, error) { - f := expression.Name("permission_id").Equal(expression.Value(permissionID)) - items, err := p.scanFilteredAll(ctx, schemas.Collections.PermissionScope, nil, &f) - if err != nil { - return nil, err - } - var scopes []*schemas.PermissionScope - for _, it := range items { - var ps schemas.PermissionScope - if err := unmarshalItem(it, &ps); err != nil { - return nil, err - } - scopes = append(scopes, &ps) - } - return scopes, nil -} - -// AddPermissionPolicy links a policy to a permission. -func (p *provider) AddPermissionPolicy(ctx context.Context, pp *schemas.PermissionPolicy) (*schemas.PermissionPolicy, error) { - if pp.ID == "" { - pp.ID = uuid.New().String() - } - pp.Key = pp.ID - pp.CreatedAt = time.Now().Unix() - if err := p.putItem(ctx, schemas.Collections.PermissionPolicy, pp); err != nil { - return nil, err - } - return pp, nil -} - -// DeletePermissionPoliciesByPermissionID removes all policy links for a permission. -func (p *provider) DeletePermissionPoliciesByPermissionID(ctx context.Context, permissionID string) error { - f := expression.Name("permission_id").Equal(expression.Value(permissionID)) - items, err := p.scanFilteredAll(ctx, schemas.Collections.PermissionPolicy, nil, &f) - if err != nil { - return err - } - for _, it := range items { - var pp schemas.PermissionPolicy - if err := unmarshalItem(it, &pp); err != nil { - return err - } - if err := p.deleteItemByHash(ctx, schemas.Collections.PermissionPolicy, "id", pp.ID); err != nil { - return err - } - } - return nil -} - -// GetPermissionPolicies returns all policy links for a permission. -func (p *provider) GetPermissionPolicies(ctx context.Context, permissionID string) ([]*schemas.PermissionPolicy, error) { - f := expression.Name("permission_id").Equal(expression.Value(permissionID)) - items, err := p.scanFilteredAll(ctx, schemas.Collections.PermissionPolicy, nil, &f) - if err != nil { - return nil, err - } - var policies []*schemas.PermissionPolicy - for _, it := range items { - var pp schemas.PermissionPolicy - if err := unmarshalItem(it, &pp); err != nil { - return nil, err - } - policies = append(policies, &pp) - } - return policies, nil -} - -// GetPermissionsForResourceScope returns all permissions (with their policies and targets) -// that apply to a given resource name and scope name. Used by the evaluation engine. -func (p *provider) GetPermissionsForResourceScope(ctx context.Context, resourceName string, scopeName string) ([]*schemas.PermissionWithPolicies, error) { - // 1. Find resource by name - resourceItems, err := p.queryEqLimit(ctx, schemas.Collections.Resource, "name", "name", resourceName, nil, 1) - if err != nil { - return nil, err - } - if len(resourceItems) == 0 { - return nil, errors.New("no document found") - } - var resource schemas.Resource - if err := unmarshalItem(resourceItems[0], &resource); err != nil { - return nil, err - } - - // 2. Find scope by name - scopeItems, err := p.queryEqLimit(ctx, schemas.Collections.Scope, "name", "name", scopeName, nil, 1) - if err != nil { - return nil, err - } - if len(scopeItems) == 0 { - return nil, errors.New("no document found") - } - var scope schemas.Scope - if err := unmarshalItem(scopeItems[0], &scope); err != nil { - return nil, err - } - - // 3. Find permissions for this resource - f := expression.Name("resource_id").Equal(expression.Value(resource.ID)) - permItems, err := p.scanFilteredAll(ctx, schemas.Collections.Permission, nil, &f) - if err != nil { - return nil, err - } - if len(permItems) == 0 { - return nil, nil - } - - var result []*schemas.PermissionWithPolicies - - for _, permItem := range permItems { - var perm schemas.Permission - if err := unmarshalItem(permItem, &perm); err != nil { - return nil, err - } - - // 4. Check if this permission has the requested scope - psFilter := expression.Name("permission_id").Equal(expression.Value(perm.ID)). - And(expression.Name("scope_id").Equal(expression.Value(scope.ID))) - psItems, err := p.scanFilteredAll(ctx, schemas.Collections.PermissionScope, nil, &psFilter) - if err != nil { - return nil, err - } - if len(psItems) == 0 { - continue - } - - // 5. Find permission_policies for this permission - ppFilter := expression.Name("permission_id").Equal(expression.Value(perm.ID)) - ppItems, err := p.scanFilteredAll(ctx, schemas.Collections.PermissionPolicy, nil, &ppFilter) - if err != nil { - return nil, err - } - if len(ppItems) == 0 { - continue - } - - // 6. For each permission_policy, resolve the policy and its targets - var policiesWithTargets []schemas.PolicyWithTargets - for _, ppItem := range ppItems { - var pp schemas.PermissionPolicy - if err := unmarshalItem(ppItem, &pp); err != nil { - return nil, err - } - - var policy schemas.Policy - if err := p.getItemByHash(ctx, schemas.Collections.Policy, "id", pp.PolicyID, &policy); err != nil { - return nil, err - } - - // Get targets for this policy - tFilter := expression.Name("policy_id").Equal(expression.Value(policy.ID)) - tItems, err := p.scanFilteredAll(ctx, schemas.Collections.PolicyTarget, nil, &tFilter) - if err != nil { - return nil, err - } - - var targets []schemas.PolicyTargetView - for _, tItem := range tItems { - var target schemas.PolicyTarget - if err := unmarshalItem(tItem, &target); err != nil { - return nil, err - } - targets = append(targets, schemas.PolicyTargetView{ - TargetType: target.TargetType, - TargetValue: target.TargetValue, - }) - } - - policiesWithTargets = append(policiesWithTargets, schemas.PolicyWithTargets{ - PolicyID: policy.ID, - PolicyName: policy.Name, - Type: policy.Type, - Logic: policy.Logic, - DecisionStrategy: policy.DecisionStrategy, - Targets: targets, - }) - } - - result = append(result, &schemas.PermissionWithPolicies{ - PermissionID: perm.ID, - PermissionName: perm.Name, - DecisionStrategy: perm.DecisionStrategy, - Policies: policiesWithTargets, - }) - } - - return result, nil -} diff --git a/internal/storage/db/dynamodb/policy.go b/internal/storage/db/dynamodb/policy.go deleted file mode 100644 index 4584c3f3..00000000 --- a/internal/storage/db/dynamodb/policy.go +++ /dev/null @@ -1,156 +0,0 @@ -package dynamodb - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression" - "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPolicy creates a new authorization policy. -func (p *provider) AddPolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - if policy.ID == "" { - policy.ID = uuid.New().String() - } - policy.Key = policy.ID - policy.CreatedAt = time.Now().Unix() - policy.UpdatedAt = time.Now().Unix() - if err := p.putItem(ctx, schemas.Collections.Policy, policy); err != nil { - return nil, err - } - return policy, nil -} - -// UpdatePolicy updates an existing authorization policy. -func (p *provider) UpdatePolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - policy.UpdatedAt = time.Now().Unix() - if err := p.updateByHashKey(ctx, schemas.Collections.Policy, "id", policy.ID, policy); err != nil { - return nil, err - } - return policy, nil -} - -// DeletePolicy deletes an authorization policy by ID. -// Returns an error if any permission_policy references this policy. -// Also cascade-deletes all policy_targets for this policy. -func (p *provider) DeletePolicy(ctx context.Context, id string) error { - // Check for referencing permission_policies - f := expression.Name("policy_id").Equal(expression.Value(id)) - items, err := p.scanFilteredAll(ctx, schemas.Collections.PermissionPolicy, nil, &f) - if err != nil { - return err - } - if len(items) > 0 { - return fmt.Errorf("cannot delete policy: %d permission_policy(ies) reference it", len(items)) - } - // Cascade-delete policy targets - if err := p.DeletePolicyTargetsByPolicyID(ctx, id); err != nil { - return err - } - return p.deleteItemByHash(ctx, schemas.Collections.Policy, "id", id) -} - -// GetPolicyByID returns an authorization policy by its ID. -func (p *provider) GetPolicyByID(ctx context.Context, id string) (*schemas.Policy, error) { - var policy schemas.Policy - if err := p.getItemByHash(ctx, schemas.Collections.Policy, "id", id, &policy); err != nil { - return nil, err - } - if policy.ID == "" { - return nil, errors.New("no document found") - } - return &policy, nil -} - -// ListPolicies returns a paginated list of authorization policies. -func (p *provider) ListPolicies(ctx context.Context, pagination *model.Pagination) ([]*schemas.Policy, *model.Pagination, error) { - var lastKey map[string]types.AttributeValue - var iteration int64 - paginationClone := *pagination - var policies []*schemas.Policy - - count, err := p.scanCount(ctx, schemas.Collections.Policy, nil) - if err != nil { - return nil, nil, err - } - - for (paginationClone.Offset + paginationClone.Limit) > iteration { - items, next, err := p.scanPageIter(ctx, schemas.Collections.Policy, nil, int32(paginationClone.Limit), lastKey) - if err != nil { - return nil, nil, err - } - for _, it := range items { - var pol schemas.Policy - if err := unmarshalItem(it, &pol); err != nil { - return nil, nil, err - } - if paginationClone.Offset == iteration { - policies = append(policies, &pol) - } - } - lastKey = next - iteration += paginationClone.Limit - if lastKey == nil { - break - } - } - paginationClone.Total = count - return policies, &paginationClone, nil -} - -// AddPolicyTarget adds a target (role name or user ID) to a policy. -func (p *provider) AddPolicyTarget(ctx context.Context, target *schemas.PolicyTarget) (*schemas.PolicyTarget, error) { - if target.ID == "" { - target.ID = uuid.New().String() - } - target.Key = target.ID - target.CreatedAt = time.Now().Unix() - if err := p.putItem(ctx, schemas.Collections.PolicyTarget, target); err != nil { - return nil, err - } - return target, nil -} - -// DeletePolicyTargetsByPolicyID removes all targets for a policy. -func (p *provider) DeletePolicyTargetsByPolicyID(ctx context.Context, policyID string) error { - f := expression.Name("policy_id").Equal(expression.Value(policyID)) - items, err := p.scanFilteredAll(ctx, schemas.Collections.PolicyTarget, nil, &f) - if err != nil { - return err - } - for _, it := range items { - var target schemas.PolicyTarget - if err := unmarshalItem(it, &target); err != nil { - return err - } - if err := p.deleteItemByHash(ctx, schemas.Collections.PolicyTarget, "id", target.ID); err != nil { - return err - } - } - return nil -} - -// GetPolicyTargets returns all targets for a policy. -func (p *provider) GetPolicyTargets(ctx context.Context, policyID string) ([]*schemas.PolicyTarget, error) { - f := expression.Name("policy_id").Equal(expression.Value(policyID)) - items, err := p.scanFilteredAll(ctx, schemas.Collections.PolicyTarget, nil, &f) - if err != nil { - return nil, err - } - var targets []*schemas.PolicyTarget - for _, it := range items { - var target schemas.PolicyTarget - if err := unmarshalItem(it, &target); err != nil { - return nil, err - } - targets = append(targets, &target) - } - return targets, nil -} diff --git a/internal/storage/db/dynamodb/resource.go b/internal/storage/db/dynamodb/resource.go deleted file mode 100644 index 14cfb366..00000000 --- a/internal/storage/db/dynamodb/resource.go +++ /dev/null @@ -1,122 +0,0 @@ -package dynamodb - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression" - "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddResource creates a new authorization resource. -// DynamoDB lacks unique secondary-index constraints, so we explicitly -// check for an existing resource with the same name before inserting. -func (p *provider) AddResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - if existing, err := p.GetResourceByName(ctx, resource.Name); err == nil && existing != nil { - return nil, fmt.Errorf("resource with name %q already exists", resource.Name) - } - if resource.ID == "" { - resource.ID = uuid.New().String() - } - resource.Key = resource.ID - resource.CreatedAt = time.Now().Unix() - resource.UpdatedAt = time.Now().Unix() - if err := p.putItem(ctx, schemas.Collections.Resource, resource); err != nil { - return nil, err - } - return resource, nil -} - -// UpdateResource updates an existing authorization resource. -func (p *provider) UpdateResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - resource.UpdatedAt = time.Now().Unix() - if err := p.updateByHashKey(ctx, schemas.Collections.Resource, "id", resource.ID, resource); err != nil { - return nil, err - } - return resource, nil -} - -// DeleteResource deletes an authorization resource by ID. -// Returns an error if any permission references this resource. -func (p *provider) DeleteResource(ctx context.Context, id string) error { - // Check for referencing permissions via resource_id GSI - f := expression.Name("resource_id").Equal(expression.Value(id)) - items, err := p.scanFilteredAll(ctx, schemas.Collections.Permission, nil, &f) - if err != nil { - return err - } - if len(items) > 0 { - return fmt.Errorf("cannot delete resource: %d permission(s) reference it", len(items)) - } - return p.deleteItemByHash(ctx, schemas.Collections.Resource, "id", id) -} - -// GetResourceByID returns an authorization resource by its ID. -func (p *provider) GetResourceByID(ctx context.Context, id string) (*schemas.Resource, error) { - var resource schemas.Resource - if err := p.getItemByHash(ctx, schemas.Collections.Resource, "id", id, &resource); err != nil { - return nil, err - } - if resource.ID == "" { - return nil, errors.New("no document found") - } - return &resource, nil -} - -// GetResourceByName returns an authorization resource by its unique name. -func (p *provider) GetResourceByName(ctx context.Context, name string) (*schemas.Resource, error) { - items, err := p.queryEqLimit(ctx, schemas.Collections.Resource, "name", "name", name, nil, 1) - if err != nil { - return nil, err - } - if len(items) == 0 { - return nil, errors.New("no document found") - } - var resource schemas.Resource - if err := unmarshalItem(items[0], &resource); err != nil { - return nil, err - } - return &resource, nil -} - -// ListResources returns a paginated list of authorization resources. -func (p *provider) ListResources(ctx context.Context, pagination *model.Pagination) ([]*schemas.Resource, *model.Pagination, error) { - var lastKey map[string]types.AttributeValue - var iteration int64 - paginationClone := *pagination - var resources []*schemas.Resource - - count, err := p.scanCount(ctx, schemas.Collections.Resource, nil) - if err != nil { - return nil, nil, err - } - - for (paginationClone.Offset + paginationClone.Limit) > iteration { - items, next, err := p.scanPageIter(ctx, schemas.Collections.Resource, nil, int32(paginationClone.Limit), lastKey) - if err != nil { - return nil, nil, err - } - for _, it := range items { - var r schemas.Resource - if err := unmarshalItem(it, &r); err != nil { - return nil, nil, err - } - if paginationClone.Offset == iteration { - resources = append(resources, &r) - } - } - lastKey = next - iteration += paginationClone.Limit - if lastKey == nil { - break - } - } - paginationClone.Total = count - return resources, &paginationClone, nil -} diff --git a/internal/storage/db/dynamodb/scope.go b/internal/storage/db/dynamodb/scope.go deleted file mode 100644 index ba9c3098..00000000 --- a/internal/storage/db/dynamodb/scope.go +++ /dev/null @@ -1,121 +0,0 @@ -package dynamodb - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression" - "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" - "github.com/google/uuid" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddScope creates a new authorization scope. -// DynamoDB lacks unique secondary-index constraints, so we explicitly -// check for an existing scope with the same name before inserting. -func (p *provider) AddScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - if existing, err := p.GetScopeByName(ctx, scope.Name); err == nil && existing != nil { - return nil, fmt.Errorf("scope with name %q already exists", scope.Name) - } - if scope.ID == "" { - scope.ID = uuid.New().String() - } - scope.Key = scope.ID - scope.CreatedAt = time.Now().Unix() - scope.UpdatedAt = time.Now().Unix() - if err := p.putItem(ctx, schemas.Collections.Scope, scope); err != nil { - return nil, err - } - return scope, nil -} - -// UpdateScope updates an existing authorization scope. -func (p *provider) UpdateScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - scope.UpdatedAt = time.Now().Unix() - if err := p.updateByHashKey(ctx, schemas.Collections.Scope, "id", scope.ID, scope); err != nil { - return nil, err - } - return scope, nil -} - -// DeleteScope deletes an authorization scope by ID. -// Returns an error if any permission_scope references this scope. -func (p *provider) DeleteScope(ctx context.Context, id string) error { - f := expression.Name("scope_id").Equal(expression.Value(id)) - items, err := p.scanFilteredAll(ctx, schemas.Collections.PermissionScope, nil, &f) - if err != nil { - return err - } - if len(items) > 0 { - return fmt.Errorf("cannot delete scope: %d permission_scope(s) reference it", len(items)) - } - return p.deleteItemByHash(ctx, schemas.Collections.Scope, "id", id) -} - -// GetScopeByID returns an authorization scope by its ID. -func (p *provider) GetScopeByID(ctx context.Context, id string) (*schemas.Scope, error) { - var scope schemas.Scope - if err := p.getItemByHash(ctx, schemas.Collections.Scope, "id", id, &scope); err != nil { - return nil, err - } - if scope.ID == "" { - return nil, errors.New("no document found") - } - return &scope, nil -} - -// GetScopeByName returns an authorization scope by its unique name. -func (p *provider) GetScopeByName(ctx context.Context, name string) (*schemas.Scope, error) { - items, err := p.queryEqLimit(ctx, schemas.Collections.Scope, "name", "name", name, nil, 1) - if err != nil { - return nil, err - } - if len(items) == 0 { - return nil, errors.New("no document found") - } - var scope schemas.Scope - if err := unmarshalItem(items[0], &scope); err != nil { - return nil, err - } - return &scope, nil -} - -// ListScopes returns a paginated list of authorization scopes. -func (p *provider) ListScopes(ctx context.Context, pagination *model.Pagination) ([]*schemas.Scope, *model.Pagination, error) { - var lastKey map[string]types.AttributeValue - var iteration int64 - paginationClone := *pagination - var scopes []*schemas.Scope - - count, err := p.scanCount(ctx, schemas.Collections.Scope, nil) - if err != nil { - return nil, nil, err - } - - for (paginationClone.Offset + paginationClone.Limit) > iteration { - items, next, err := p.scanPageIter(ctx, schemas.Collections.Scope, nil, int32(paginationClone.Limit), lastKey) - if err != nil { - return nil, nil, err - } - for _, it := range items { - var s schemas.Scope - if err := unmarshalItem(it, &s); err != nil { - return nil, nil, err - } - if paginationClone.Offset == iteration { - scopes = append(scopes, &s) - } - } - lastKey = next - iteration += paginationClone.Limit - if lastKey == nil { - break - } - } - paginationClone.Total = count - return scopes, &paginationClone, nil -} diff --git a/internal/storage/db/dynamodb/tables.go b/internal/storage/db/dynamodb/tables.go index 0109a204..81b8b705 100644 --- a/internal/storage/db/dynamodb/tables.go +++ b/internal/storage/db/dynamodb/tables.go @@ -173,74 +173,6 @@ func (p *provider) ensureTables(ctx context.Context) error { gsi("action", "action"), }, }, - // Authorization tables - { - name: schemas.Collections.Resource, - hash: "id", - attr: []types.AttributeDefinition{ - {AttributeName: aws.String("id"), AttributeType: types.ScalarAttributeTypeS}, - {AttributeName: aws.String("name"), AttributeType: types.ScalarAttributeTypeS}, - }, - gsi: []types.GlobalSecondaryIndex{gsi("name", "name")}, - }, - { - name: schemas.Collections.Scope, - hash: "id", - attr: []types.AttributeDefinition{ - {AttributeName: aws.String("id"), AttributeType: types.ScalarAttributeTypeS}, - {AttributeName: aws.String("name"), AttributeType: types.ScalarAttributeTypeS}, - }, - gsi: []types.GlobalSecondaryIndex{gsi("name", "name")}, - }, - { - name: schemas.Collections.Policy, - hash: "id", - attr: []types.AttributeDefinition{ - {AttributeName: aws.String("id"), AttributeType: types.ScalarAttributeTypeS}, - {AttributeName: aws.String("name"), AttributeType: types.ScalarAttributeTypeS}, - }, - gsi: []types.GlobalSecondaryIndex{gsi("name", "name")}, - }, - { - name: schemas.Collections.PolicyTarget, - hash: "id", - attr: []types.AttributeDefinition{ - {AttributeName: aws.String("id"), AttributeType: types.ScalarAttributeTypeS}, - {AttributeName: aws.String("policy_id"), AttributeType: types.ScalarAttributeTypeS}, - }, - gsi: []types.GlobalSecondaryIndex{gsi("policy_id", "policy_id")}, - }, - { - name: schemas.Collections.Permission, - hash: "id", - attr: []types.AttributeDefinition{ - {AttributeName: aws.String("id"), AttributeType: types.ScalarAttributeTypeS}, - {AttributeName: aws.String("name"), AttributeType: types.ScalarAttributeTypeS}, - {AttributeName: aws.String("resource_id"), AttributeType: types.ScalarAttributeTypeS}, - }, - gsi: []types.GlobalSecondaryIndex{ - gsi("name", "name"), - gsi("resource_id", "resource_id"), - }, - }, - { - name: schemas.Collections.PermissionScope, - hash: "id", - attr: []types.AttributeDefinition{ - {AttributeName: aws.String("id"), AttributeType: types.ScalarAttributeTypeS}, - {AttributeName: aws.String("permission_id"), AttributeType: types.ScalarAttributeTypeS}, - }, - gsi: []types.GlobalSecondaryIndex{gsi("permission_id", "permission_id")}, - }, - { - name: schemas.Collections.PermissionPolicy, - hash: "id", - attr: []types.AttributeDefinition{ - {AttributeName: aws.String("id"), AttributeType: types.ScalarAttributeTypeS}, - {AttributeName: aws.String("permission_id"), AttributeType: types.ScalarAttributeTypeS}, - }, - gsi: []types.GlobalSecondaryIndex{gsi("permission_id", "permission_id")}, - }, } for _, t := range tables { diff --git a/internal/storage/db/mongodb/permission.go b/internal/storage/db/mongodb/permission.go deleted file mode 100644 index 75dd9808..00000000 --- a/internal/storage/db/mongodb/permission.go +++ /dev/null @@ -1,325 +0,0 @@ -package mongodb - -import ( - "context" - "time" - - "github.com/google/uuid" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo/options" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPermission creates a new authorization permission. -func (p *provider) AddPermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - if permission.ID == "" { - permission.ID = uuid.New().String() - } - permission.Key = permission.ID - permission.CreatedAt = time.Now().Unix() - permission.UpdatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.Permission, options.Collection()) - _, err := collection.InsertOne(ctx, permission) - if err != nil { - return nil, err - } - return permission, nil -} - -// UpdatePermission updates an existing authorization permission. -func (p *provider) UpdatePermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - permission.UpdatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.Permission, options.Collection()) - _, err := collection.UpdateOne(ctx, bson.M{"_id": bson.M{"$eq": permission.ID}}, bson.M{"$set": permission}, options.MergeUpdateOptions()) - if err != nil { - return nil, err - } - return permission, nil -} - -// DeletePermission deletes an authorization permission by ID. -// Cascade-deletes associated permission_scopes and permission_policies. -func (p *provider) DeletePermission(ctx context.Context, id string) error { - permissionScopeCollection := p.db.Collection(schemas.Collections.PermissionScope, options.Collection()) - _, err := permissionScopeCollection.DeleteMany(ctx, bson.M{"permission_id": id}, options.Delete()) - if err != nil { - return err - } - permissionPolicyCollection := p.db.Collection(schemas.Collections.PermissionPolicy, options.Collection()) - _, err = permissionPolicyCollection.DeleteMany(ctx, bson.M{"permission_id": id}, options.Delete()) - if err != nil { - return err - } - collection := p.db.Collection(schemas.Collections.Permission, options.Collection()) - _, err = collection.DeleteOne(ctx, bson.M{"_id": id}, options.Delete()) - if err != nil { - return err - } - return nil -} - -// GetPermissionByID returns an authorization permission by its ID. -func (p *provider) GetPermissionByID(ctx context.Context, id string) (*schemas.Permission, error) { - var permission schemas.Permission - collection := p.db.Collection(schemas.Collections.Permission, options.Collection()) - err := collection.FindOne(ctx, bson.M{"_id": id}).Decode(&permission) - if err != nil { - return nil, err - } - return &permission, nil -} - -// ListPermissions returns a paginated list of authorization permissions. -func (p *provider) ListPermissions(ctx context.Context, pagination *model.Pagination) ([]*schemas.Permission, *model.Pagination, error) { - permissions := []*schemas.Permission{} - opts := options.Find() - opts.SetLimit(pagination.Limit) - opts.SetSkip(pagination.Offset) - opts.SetSort(bson.M{"created_at": -1}) - paginationClone := *pagination - collection := p.db.Collection(schemas.Collections.Permission, options.Collection()) - count, err := collection.CountDocuments(ctx, bson.M{}, options.Count()) - if err != nil { - return nil, nil, err - } - paginationClone.Total = count - cursor, err := collection.Find(ctx, bson.M{}, opts) - if err != nil { - return nil, nil, err - } - defer cursor.Close(ctx) - for cursor.Next(ctx) { - var permission *schemas.Permission - err := cursor.Decode(&permission) - if err != nil { - return nil, nil, err - } - permissions = append(permissions, permission) - } - return permissions, &paginationClone, nil -} - -// AddPermissionScope links a scope to a permission. -func (p *provider) AddPermissionScope(ctx context.Context, ps *schemas.PermissionScope) (*schemas.PermissionScope, error) { - if ps.ID == "" { - ps.ID = uuid.New().String() - } - ps.Key = ps.ID - ps.CreatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.PermissionScope, options.Collection()) - _, err := collection.InsertOne(ctx, ps) - if err != nil { - return nil, err - } - return ps, nil -} - -// DeletePermissionScopesByPermissionID removes all scope links for a permission. -func (p *provider) DeletePermissionScopesByPermissionID(ctx context.Context, permissionID string) error { - collection := p.db.Collection(schemas.Collections.PermissionScope, options.Collection()) - _, err := collection.DeleteMany(ctx, bson.M{"permission_id": permissionID}, options.Delete()) - if err != nil { - return err - } - return nil -} - -// GetPermissionScopes returns all scope links for a permission. -func (p *provider) GetPermissionScopes(ctx context.Context, permissionID string) ([]*schemas.PermissionScope, error) { - scopes := []*schemas.PermissionScope{} - collection := p.db.Collection(schemas.Collections.PermissionScope, options.Collection()) - cursor, err := collection.Find(ctx, bson.M{"permission_id": permissionID}) - if err != nil { - return nil, err - } - defer cursor.Close(ctx) - for cursor.Next(ctx) { - var ps *schemas.PermissionScope - err := cursor.Decode(&ps) - if err != nil { - return nil, err - } - scopes = append(scopes, ps) - } - return scopes, nil -} - -// AddPermissionPolicy links a policy to a permission. -func (p *provider) AddPermissionPolicy(ctx context.Context, pp *schemas.PermissionPolicy) (*schemas.PermissionPolicy, error) { - if pp.ID == "" { - pp.ID = uuid.New().String() - } - pp.Key = pp.ID - pp.CreatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.PermissionPolicy, options.Collection()) - _, err := collection.InsertOne(ctx, pp) - if err != nil { - return nil, err - } - return pp, nil -} - -// DeletePermissionPoliciesByPermissionID removes all policy links for a permission. -func (p *provider) DeletePermissionPoliciesByPermissionID(ctx context.Context, permissionID string) error { - collection := p.db.Collection(schemas.Collections.PermissionPolicy, options.Collection()) - _, err := collection.DeleteMany(ctx, bson.M{"permission_id": permissionID}, options.Delete()) - if err != nil { - return err - } - return nil -} - -// GetPermissionPolicies returns all policy links for a permission. -func (p *provider) GetPermissionPolicies(ctx context.Context, permissionID string) ([]*schemas.PermissionPolicy, error) { - policies := []*schemas.PermissionPolicy{} - collection := p.db.Collection(schemas.Collections.PermissionPolicy, options.Collection()) - cursor, err := collection.Find(ctx, bson.M{"permission_id": permissionID}) - if err != nil { - return nil, err - } - defer cursor.Close(ctx) - for cursor.Next(ctx) { - var pp *schemas.PermissionPolicy - err := cursor.Decode(&pp) - if err != nil { - return nil, err - } - policies = append(policies, pp) - } - return policies, nil -} - -// GetPermissionsForResourceScope returns all permissions (with their policies and targets) -// that match a given resource name and scope name. This is the hot-path query used by -// the evaluation engine. Uses sequential queries for clarity. -func (p *provider) GetPermissionsForResourceScope(ctx context.Context, resourceName string, scopeName string) ([]*schemas.PermissionWithPolicies, error) { - // 1. Find resource by name - var resource schemas.Resource - resourceCollection := p.db.Collection(schemas.Collections.Resource, options.Collection()) - err := resourceCollection.FindOne(ctx, bson.M{"name": resourceName}).Decode(&resource) - if err != nil { - return nil, err - } - - // 2. Find scope by name - var scope schemas.Scope - scopeCollection := p.db.Collection(schemas.Collections.Scope, options.Collection()) - err = scopeCollection.FindOne(ctx, bson.M{"name": scopeName}).Decode(&scope) - if err != nil { - return nil, err - } - - // 3. Find permissions for this resource - permissionCollection := p.db.Collection(schemas.Collections.Permission, options.Collection()) - permCursor, err := permissionCollection.Find(ctx, bson.M{"resource_id": resource.ID}) - if err != nil { - return nil, err - } - defer permCursor.Close(ctx) - - var permissions []schemas.Permission - for permCursor.Next(ctx) { - var perm schemas.Permission - if err := permCursor.Decode(&perm); err != nil { - return nil, err - } - permissions = append(permissions, perm) - } - - if len(permissions) == 0 { - return nil, nil - } - - // 4. For each permission, check if it has the requested scope - permissionScopeCollection := p.db.Collection(schemas.Collections.PermissionScope, options.Collection()) - permissionPolicyCollection := p.db.Collection(schemas.Collections.PermissionPolicy, options.Collection()) - policyCollection := p.db.Collection(schemas.Collections.Policy, options.Collection()) - policyTargetCollection := p.db.Collection(schemas.Collections.PolicyTarget, options.Collection()) - - var result []*schemas.PermissionWithPolicies - - for _, perm := range permissions { - // Check if this permission has the requested scope - scopeCount, err := permissionScopeCollection.CountDocuments(ctx, bson.M{ - "permission_id": perm.ID, - "scope_id": scope.ID, - }, options.Count()) - if err != nil { - return nil, err - } - if scopeCount == 0 { - continue - } - - // 5. Find permission_policies for this permission - ppCursor, err := permissionPolicyCollection.Find(ctx, bson.M{"permission_id": perm.ID}) - if err != nil { - return nil, err - } - - var permPolicies []schemas.PermissionPolicy - for ppCursor.Next(ctx) { - var pp schemas.PermissionPolicy - if err := ppCursor.Decode(&pp); err != nil { - ppCursor.Close(ctx) - return nil, err - } - permPolicies = append(permPolicies, pp) - } - ppCursor.Close(ctx) - - if len(permPolicies) == 0 { - continue - } - - // 6. For each permission_policy, resolve the policy and its targets - var policiesWithTargets []schemas.PolicyWithTargets - for _, pp := range permPolicies { - var policy schemas.Policy - err := policyCollection.FindOne(ctx, bson.M{"_id": pp.PolicyID}).Decode(&policy) - if err != nil { - return nil, err - } - - // Get targets for this policy - targetCursor, err := policyTargetCollection.Find(ctx, bson.M{"policy_id": policy.ID}) - if err != nil { - return nil, err - } - - var targets []schemas.PolicyTargetView - for targetCursor.Next(ctx) { - var target schemas.PolicyTarget - if err := targetCursor.Decode(&target); err != nil { - targetCursor.Close(ctx) - return nil, err - } - targets = append(targets, schemas.PolicyTargetView{ - TargetType: target.TargetType, - TargetValue: target.TargetValue, - }) - } - targetCursor.Close(ctx) - - policiesWithTargets = append(policiesWithTargets, schemas.PolicyWithTargets{ - PolicyID: policy.ID, - PolicyName: policy.Name, - Type: policy.Type, - Logic: policy.Logic, - DecisionStrategy: policy.DecisionStrategy, - Targets: targets, - }) - } - - result = append(result, &schemas.PermissionWithPolicies{ - PermissionID: perm.ID, - PermissionName: perm.Name, - DecisionStrategy: perm.DecisionStrategy, - Policies: policiesWithTargets, - }) - } - - return result, nil -} diff --git a/internal/storage/db/mongodb/policy.go b/internal/storage/db/mongodb/policy.go deleted file mode 100644 index dd5dadac..00000000 --- a/internal/storage/db/mongodb/policy.go +++ /dev/null @@ -1,153 +0,0 @@ -package mongodb - -import ( - "context" - "fmt" - "time" - - "github.com/google/uuid" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo/options" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPolicy creates a new authorization policy. -func (p *provider) AddPolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - if policy.ID == "" { - policy.ID = uuid.New().String() - } - policy.Key = policy.ID - policy.CreatedAt = time.Now().Unix() - policy.UpdatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.Policy, options.Collection()) - _, err := collection.InsertOne(ctx, policy) - if err != nil { - return nil, err - } - return policy, nil -} - -// UpdatePolicy updates an existing authorization policy. -func (p *provider) UpdatePolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - policy.UpdatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.Policy, options.Collection()) - _, err := collection.UpdateOne(ctx, bson.M{"_id": bson.M{"$eq": policy.ID}}, bson.M{"$set": policy}, options.MergeUpdateOptions()) - if err != nil { - return nil, err - } - return policy, nil -} - -// DeletePolicy deletes an authorization policy by ID. -// Returns an error if any permission_policy references this policy. -// Cascade-deletes associated policy targets. -func (p *provider) DeletePolicy(ctx context.Context, id string) error { - permissionPolicyCollection := p.db.Collection(schemas.Collections.PermissionPolicy, options.Collection()) - count, err := permissionPolicyCollection.CountDocuments(ctx, bson.M{"policy_id": id}, options.Count()) - if err != nil { - return err - } - if count > 0 { - return fmt.Errorf("cannot delete policy: %d permission_policy(s) reference it", count) - } - // Cascade-delete policy targets - policyTargetCollection := p.db.Collection(schemas.Collections.PolicyTarget, options.Collection()) - _, err = policyTargetCollection.DeleteMany(ctx, bson.M{"policy_id": id}, options.Delete()) - if err != nil { - return err - } - collection := p.db.Collection(schemas.Collections.Policy, options.Collection()) - _, err = collection.DeleteOne(ctx, bson.M{"_id": id}, options.Delete()) - if err != nil { - return err - } - return nil -} - -// GetPolicyByID returns an authorization policy by its ID. -func (p *provider) GetPolicyByID(ctx context.Context, id string) (*schemas.Policy, error) { - var policy schemas.Policy - collection := p.db.Collection(schemas.Collections.Policy, options.Collection()) - err := collection.FindOne(ctx, bson.M{"_id": id}).Decode(&policy) - if err != nil { - return nil, err - } - return &policy, nil -} - -// ListPolicies returns a paginated list of authorization policies. -func (p *provider) ListPolicies(ctx context.Context, pagination *model.Pagination) ([]*schemas.Policy, *model.Pagination, error) { - policies := []*schemas.Policy{} - opts := options.Find() - opts.SetLimit(pagination.Limit) - opts.SetSkip(pagination.Offset) - opts.SetSort(bson.M{"created_at": -1}) - paginationClone := *pagination - collection := p.db.Collection(schemas.Collections.Policy, options.Collection()) - count, err := collection.CountDocuments(ctx, bson.M{}, options.Count()) - if err != nil { - return nil, nil, err - } - paginationClone.Total = count - cursor, err := collection.Find(ctx, bson.M{}, opts) - if err != nil { - return nil, nil, err - } - defer cursor.Close(ctx) - for cursor.Next(ctx) { - var policy *schemas.Policy - err := cursor.Decode(&policy) - if err != nil { - return nil, nil, err - } - policies = append(policies, policy) - } - return policies, &paginationClone, nil -} - -// AddPolicyTarget adds a target (role name or user ID) to a policy. -func (p *provider) AddPolicyTarget(ctx context.Context, target *schemas.PolicyTarget) (*schemas.PolicyTarget, error) { - if target.ID == "" { - target.ID = uuid.New().String() - } - target.Key = target.ID - target.CreatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.PolicyTarget, options.Collection()) - _, err := collection.InsertOne(ctx, target) - if err != nil { - return nil, err - } - return target, nil -} - -// DeletePolicyTargetsByPolicyID removes all targets for a policy. -func (p *provider) DeletePolicyTargetsByPolicyID(ctx context.Context, policyID string) error { - collection := p.db.Collection(schemas.Collections.PolicyTarget, options.Collection()) - _, err := collection.DeleteMany(ctx, bson.M{"policy_id": policyID}, options.Delete()) - if err != nil { - return err - } - return nil -} - -// GetPolicyTargets returns all targets for a policy. -func (p *provider) GetPolicyTargets(ctx context.Context, policyID string) ([]*schemas.PolicyTarget, error) { - targets := []*schemas.PolicyTarget{} - collection := p.db.Collection(schemas.Collections.PolicyTarget, options.Collection()) - cursor, err := collection.Find(ctx, bson.M{"policy_id": policyID}) - if err != nil { - return nil, err - } - defer cursor.Close(ctx) - for cursor.Next(ctx) { - var target *schemas.PolicyTarget - err := cursor.Decode(&target) - if err != nil { - return nil, err - } - targets = append(targets, target) - } - return targets, nil -} diff --git a/internal/storage/db/mongodb/provider.go b/internal/storage/db/mongodb/provider.go index b89f4e5f..273107fc 100644 --- a/internal/storage/db/mongodb/provider.go +++ b/internal/storage/db/mongodb/provider.go @@ -196,96 +196,6 @@ func NewProvider(config *config.Config, deps *Dependencies) (*provider, error) { }, }, options.CreateIndexes()) - // Resource collection and indexes - mongodb.CreateCollection(ctx, schemas.Collections.Resource, options.CreateCollection()) - resourceCollection := mongodb.Collection(schemas.Collections.Resource, options.Collection()) - resourceCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ - { - Keys: bson.M{"name": 1}, - Options: options.Index().SetUnique(true).SetSparse(true), - }, - }, options.CreateIndexes()) - - // Scope collection and indexes - mongodb.CreateCollection(ctx, schemas.Collections.Scope, options.CreateCollection()) - scopeCollection := mongodb.Collection(schemas.Collections.Scope, options.Collection()) - scopeCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ - { - Keys: bson.M{"name": 1}, - Options: options.Index().SetUnique(true).SetSparse(true), - }, - }, options.CreateIndexes()) - - // Policy collection and indexes - mongodb.CreateCollection(ctx, schemas.Collections.Policy, options.CreateCollection()) - policyCollection := mongodb.Collection(schemas.Collections.Policy, options.Collection()) - policyCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ - { - Keys: bson.M{"name": 1}, - Options: options.Index().SetUnique(true).SetSparse(true), - }, - { - Keys: bson.M{"type": 1}, - Options: options.Index().SetSparse(true), - }, - }, options.CreateIndexes()) - - // PolicyTarget collection and indexes - mongodb.CreateCollection(ctx, schemas.Collections.PolicyTarget, options.CreateCollection()) - policyTargetCollection := mongodb.Collection(schemas.Collections.PolicyTarget, options.Collection()) - policyTargetCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ - { - Keys: bson.M{"policy_id": 1}, - Options: options.Index().SetSparse(true), - }, - { - Keys: bson.D{{Key: "policy_id", Value: 1}, {Key: "target_type", Value: 1}, {Key: "target_value", Value: 1}}, - Options: options.Index().SetUnique(true).SetSparse(true), - }, - }, options.CreateIndexes()) - - // Permission collection and indexes - mongodb.CreateCollection(ctx, schemas.Collections.Permission, options.CreateCollection()) - permissionCollection := mongodb.Collection(schemas.Collections.Permission, options.Collection()) - permissionCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ - { - Keys: bson.M{"name": 1}, - Options: options.Index().SetUnique(true).SetSparse(true), - }, - { - Keys: bson.M{"resource_id": 1}, - Options: options.Index().SetSparse(true), - }, - }, options.CreateIndexes()) - - // PermissionScope collection and indexes - mongodb.CreateCollection(ctx, schemas.Collections.PermissionScope, options.CreateCollection()) - permissionScopeCollection := mongodb.Collection(schemas.Collections.PermissionScope, options.Collection()) - permissionScopeCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ - { - Keys: bson.M{"permission_id": 1}, - Options: options.Index().SetSparse(true), - }, - { - Keys: bson.D{{Key: "permission_id", Value: 1}, {Key: "scope_id", Value: 1}}, - Options: options.Index().SetUnique(true).SetSparse(true), - }, - }, options.CreateIndexes()) - - // PermissionPolicy collection and indexes - mongodb.CreateCollection(ctx, schemas.Collections.PermissionPolicy, options.CreateCollection()) - permissionPolicyCollection := mongodb.Collection(schemas.Collections.PermissionPolicy, options.Collection()) - permissionPolicyCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ - { - Keys: bson.M{"permission_id": 1}, - Options: options.Index().SetSparse(true), - }, - { - Keys: bson.D{{Key: "permission_id", Value: 1}, {Key: "policy_id", Value: 1}}, - Options: options.Index().SetUnique(true).SetSparse(true), - }, - }, options.CreateIndexes()) - return &provider{ config: config, dependencies: deps, diff --git a/internal/storage/db/mongodb/resource.go b/internal/storage/db/mongodb/resource.go deleted file mode 100644 index b0cbe4d8..00000000 --- a/internal/storage/db/mongodb/resource.go +++ /dev/null @@ -1,112 +0,0 @@ -package mongodb - -import ( - "context" - "fmt" - "time" - - "github.com/google/uuid" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo/options" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddResource creates a new authorization resource. -func (p *provider) AddResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - if resource.ID == "" { - resource.ID = uuid.New().String() - } - resource.Key = resource.ID - resource.CreatedAt = time.Now().Unix() - resource.UpdatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.Resource, options.Collection()) - _, err := collection.InsertOne(ctx, resource) - if err != nil { - return nil, err - } - return resource, nil -} - -// UpdateResource updates an existing authorization resource. -func (p *provider) UpdateResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - resource.UpdatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.Resource, options.Collection()) - _, err := collection.UpdateOne(ctx, bson.M{"_id": bson.M{"$eq": resource.ID}}, bson.M{"$set": resource}, options.MergeUpdateOptions()) - if err != nil { - return nil, err - } - return resource, nil -} - -// DeleteResource deletes an authorization resource by ID. -// Returns an error if any permission references this resource. -func (p *provider) DeleteResource(ctx context.Context, id string) error { - permissionCollection := p.db.Collection(schemas.Collections.Permission, options.Collection()) - count, err := permissionCollection.CountDocuments(ctx, bson.M{"resource_id": id}, options.Count()) - if err != nil { - return err - } - if count > 0 { - return fmt.Errorf("cannot delete resource: %d permission(s) reference it", count) - } - collection := p.db.Collection(schemas.Collections.Resource, options.Collection()) - _, err = collection.DeleteOne(ctx, bson.M{"_id": id}, options.Delete()) - if err != nil { - return err - } - return nil -} - -// GetResourceByID returns an authorization resource by its ID. -func (p *provider) GetResourceByID(ctx context.Context, id string) (*schemas.Resource, error) { - var resource schemas.Resource - collection := p.db.Collection(schemas.Collections.Resource, options.Collection()) - err := collection.FindOne(ctx, bson.M{"_id": id}).Decode(&resource) - if err != nil { - return nil, err - } - return &resource, nil -} - -// GetResourceByName returns an authorization resource by its unique name. -func (p *provider) GetResourceByName(ctx context.Context, name string) (*schemas.Resource, error) { - var resource schemas.Resource - collection := p.db.Collection(schemas.Collections.Resource, options.Collection()) - err := collection.FindOne(ctx, bson.M{"name": name}).Decode(&resource) - if err != nil { - return nil, err - } - return &resource, nil -} - -// ListResources returns a paginated list of authorization resources. -func (p *provider) ListResources(ctx context.Context, pagination *model.Pagination) ([]*schemas.Resource, *model.Pagination, error) { - resources := []*schemas.Resource{} - opts := options.Find() - opts.SetLimit(pagination.Limit) - opts.SetSkip(pagination.Offset) - opts.SetSort(bson.M{"created_at": -1}) - paginationClone := *pagination - collection := p.db.Collection(schemas.Collections.Resource, options.Collection()) - count, err := collection.CountDocuments(ctx, bson.M{}, options.Count()) - if err != nil { - return nil, nil, err - } - paginationClone.Total = count - cursor, err := collection.Find(ctx, bson.M{}, opts) - if err != nil { - return nil, nil, err - } - defer cursor.Close(ctx) - for cursor.Next(ctx) { - var resource *schemas.Resource - err := cursor.Decode(&resource) - if err != nil { - return nil, nil, err - } - resources = append(resources, resource) - } - return resources, &paginationClone, nil -} diff --git a/internal/storage/db/mongodb/scope.go b/internal/storage/db/mongodb/scope.go deleted file mode 100644 index 9d4b2edb..00000000 --- a/internal/storage/db/mongodb/scope.go +++ /dev/null @@ -1,112 +0,0 @@ -package mongodb - -import ( - "context" - "fmt" - "time" - - "github.com/google/uuid" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo/options" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddScope creates a new authorization scope. -func (p *provider) AddScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - if scope.ID == "" { - scope.ID = uuid.New().String() - } - scope.Key = scope.ID - scope.CreatedAt = time.Now().Unix() - scope.UpdatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.Scope, options.Collection()) - _, err := collection.InsertOne(ctx, scope) - if err != nil { - return nil, err - } - return scope, nil -} - -// UpdateScope updates an existing authorization scope. -func (p *provider) UpdateScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - scope.UpdatedAt = time.Now().Unix() - collection := p.db.Collection(schemas.Collections.Scope, options.Collection()) - _, err := collection.UpdateOne(ctx, bson.M{"_id": bson.M{"$eq": scope.ID}}, bson.M{"$set": scope}, options.MergeUpdateOptions()) - if err != nil { - return nil, err - } - return scope, nil -} - -// DeleteScope deletes an authorization scope by ID. -// Returns an error if any permission_scope references this scope. -func (p *provider) DeleteScope(ctx context.Context, id string) error { - permissionScopeCollection := p.db.Collection(schemas.Collections.PermissionScope, options.Collection()) - count, err := permissionScopeCollection.CountDocuments(ctx, bson.M{"scope_id": id}, options.Count()) - if err != nil { - return err - } - if count > 0 { - return fmt.Errorf("cannot delete scope: %d permission_scope(s) reference it", count) - } - collection := p.db.Collection(schemas.Collections.Scope, options.Collection()) - _, err = collection.DeleteOne(ctx, bson.M{"_id": id}, options.Delete()) - if err != nil { - return err - } - return nil -} - -// GetScopeByID returns an authorization scope by its ID. -func (p *provider) GetScopeByID(ctx context.Context, id string) (*schemas.Scope, error) { - var scope schemas.Scope - collection := p.db.Collection(schemas.Collections.Scope, options.Collection()) - err := collection.FindOne(ctx, bson.M{"_id": id}).Decode(&scope) - if err != nil { - return nil, err - } - return &scope, nil -} - -// GetScopeByName returns an authorization scope by its unique name. -func (p *provider) GetScopeByName(ctx context.Context, name string) (*schemas.Scope, error) { - var scope schemas.Scope - collection := p.db.Collection(schemas.Collections.Scope, options.Collection()) - err := collection.FindOne(ctx, bson.M{"name": name}).Decode(&scope) - if err != nil { - return nil, err - } - return &scope, nil -} - -// ListScopes returns a paginated list of authorization scopes. -func (p *provider) ListScopes(ctx context.Context, pagination *model.Pagination) ([]*schemas.Scope, *model.Pagination, error) { - scopes := []*schemas.Scope{} - opts := options.Find() - opts.SetLimit(pagination.Limit) - opts.SetSkip(pagination.Offset) - opts.SetSort(bson.M{"created_at": -1}) - paginationClone := *pagination - collection := p.db.Collection(schemas.Collections.Scope, options.Collection()) - count, err := collection.CountDocuments(ctx, bson.M{}, options.Count()) - if err != nil { - return nil, nil, err - } - paginationClone.Total = count - cursor, err := collection.Find(ctx, bson.M{}, opts) - if err != nil { - return nil, nil, err - } - defer cursor.Close(ctx) - for cursor.Next(ctx) { - var scope *schemas.Scope - err := cursor.Decode(&scope) - if err != nil { - return nil, nil, err - } - scopes = append(scopes, scope) - } - return scopes, &paginationClone, nil -} diff --git a/internal/storage/db/sql/permission.go b/internal/storage/db/sql/permission.go deleted file mode 100644 index c7c7d89a..00000000 --- a/internal/storage/db/sql/permission.go +++ /dev/null @@ -1,250 +0,0 @@ -package sql - -import ( - "context" - "fmt" - "time" - - "github.com/google/uuid" - "gorm.io/gorm/clause" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPermission creates a new authorization permission. -func (p *provider) AddPermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - if permission.ID == "" { - permission.ID = uuid.New().String() - } - permission.Key = permission.ID - permission.CreatedAt = time.Now().Unix() - permission.UpdatedAt = time.Now().Unix() - res := p.db.Clauses(clause.OnConflict{DoNothing: true}).Create(&permission) - if res.Error != nil { - return nil, res.Error - } - if res.RowsAffected == 0 { - return nil, fmt.Errorf("permission already exists: %s", permission.Name) - } - return permission, nil -} - -// UpdatePermission updates an existing authorization permission. -func (p *provider) UpdatePermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) { - permission.UpdatedAt = time.Now().Unix() - result := p.db.Save(&permission) - if result.Error != nil { - return nil, result.Error - } - return permission, nil -} - -// DeletePermission deletes an authorization permission by ID. -// Cascade-deletes associated permission_scopes and permission_policies. -func (p *provider) DeletePermission(ctx context.Context, id string) error { - result := p.db.Where("permission_id = ?", id).Delete(&schemas.PermissionScope{}) - if result.Error != nil { - return result.Error - } - result = p.db.Where("permission_id = ?", id).Delete(&schemas.PermissionPolicy{}) - if result.Error != nil { - return result.Error - } - result = p.db.Where("id = ?", id).Delete(&schemas.Permission{}) - if result.Error != nil { - return result.Error - } - return nil -} - -// GetPermissionByID returns an authorization permission by its ID. -func (p *provider) GetPermissionByID(ctx context.Context, id string) (*schemas.Permission, error) { - var permission schemas.Permission - result := p.db.Where("id = ?", id).First(&permission) - if result.Error != nil { - return nil, result.Error - } - return &permission, nil -} - -// ListPermissions returns a paginated list of authorization permissions. -func (p *provider) ListPermissions(ctx context.Context, pagination *model.Pagination) ([]*schemas.Permission, *model.Pagination, error) { - var permissions []*schemas.Permission - result := p.db.Limit(int(pagination.Limit)).Offset(int(pagination.Offset)).Order("created_at DESC").Find(&permissions) - if result.Error != nil { - return nil, nil, result.Error - } - var total int64 - totalRes := p.db.Model(&schemas.Permission{}).Count(&total) - if totalRes.Error != nil { - return nil, nil, totalRes.Error - } - paginationClone := *pagination - paginationClone.Total = total - return permissions, &paginationClone, nil -} - -// AddPermissionScope links a scope to a permission. -func (p *provider) AddPermissionScope(ctx context.Context, ps *schemas.PermissionScope) (*schemas.PermissionScope, error) { - if ps.ID == "" { - ps.ID = uuid.New().String() - } - ps.Key = ps.ID - ps.CreatedAt = time.Now().Unix() - res := p.db.Clauses(clause.OnConflict{DoNothing: true}).Create(&ps) - if res.Error != nil { - return nil, res.Error - } - return ps, nil -} - -// DeletePermissionScopesByPermissionID removes all scope links for a permission. -func (p *provider) DeletePermissionScopesByPermissionID(ctx context.Context, permissionID string) error { - result := p.db.Where("permission_id = ?", permissionID).Delete(&schemas.PermissionScope{}) - if result.Error != nil { - return result.Error - } - return nil -} - -// GetPermissionScopes returns all scope links for a permission. -func (p *provider) GetPermissionScopes(ctx context.Context, permissionID string) ([]*schemas.PermissionScope, error) { - var scopes []*schemas.PermissionScope - result := p.db.Where("permission_id = ?", permissionID).Find(&scopes) - if result.Error != nil { - return nil, result.Error - } - return scopes, nil -} - -// AddPermissionPolicy links a policy to a permission. -func (p *provider) AddPermissionPolicy(ctx context.Context, pp *schemas.PermissionPolicy) (*schemas.PermissionPolicy, error) { - if pp.ID == "" { - pp.ID = uuid.New().String() - } - pp.Key = pp.ID - pp.CreatedAt = time.Now().Unix() - res := p.db.Clauses(clause.OnConflict{DoNothing: true}).Create(&pp) - if res.Error != nil { - return nil, res.Error - } - return pp, nil -} - -// DeletePermissionPoliciesByPermissionID removes all policy links for a permission. -func (p *provider) DeletePermissionPoliciesByPermissionID(ctx context.Context, permissionID string) error { - result := p.db.Where("permission_id = ?", permissionID).Delete(&schemas.PermissionPolicy{}) - if result.Error != nil { - return result.Error - } - return nil -} - -// GetPermissionPolicies returns all policy links for a permission. -func (p *provider) GetPermissionPolicies(ctx context.Context, permissionID string) ([]*schemas.PermissionPolicy, error) { - var policies []*schemas.PermissionPolicy - result := p.db.Where("permission_id = ?", permissionID).Find(&policies) - if result.Error != nil { - return nil, result.Error - } - return policies, nil -} - -// permissionRow is an intermediate struct for scanning the multi-JOIN query result -// in GetPermissionsForResourceScope. -type permissionRow struct { - PermissionID string `gorm:"column:permission_id"` - PermissionName string `gorm:"column:permission_name"` - DecisionStrategy string `gorm:"column:decision_strategy"` - PolicyID string `gorm:"column:policy_id"` - PolicyName string `gorm:"column:policy_name"` - PolicyType string `gorm:"column:policy_type"` - PolicyLogic string `gorm:"column:policy_logic"` - PolicyDecisionStrategy string `gorm:"column:policy_decision_strategy"` - TargetType string `gorm:"column:target_type"` - TargetValue string `gorm:"column:target_value"` -} - -// GetPermissionsForResourceScope returns all permissions (with their policies and targets) -// that match a given resource name and scope name. This is the hot-path query used by -// the evaluation engine. -func (p *provider) GetPermissionsForResourceScope(ctx context.Context, resourceName string, scopeName string) ([]*schemas.PermissionWithPolicies, error) { - query := `SELECT p.id AS permission_id, p.name AS permission_name, p.decision_strategy, - pol.id AS policy_id, pol.name AS policy_name, pol.type AS policy_type, pol.logic AS policy_logic, pol.decision_strategy AS policy_decision_strategy, - pt.target_type, pt.target_value -FROM ` + schemas.Prefix + `permissions p -JOIN ` + schemas.Prefix + `resources r ON r.id = p.resource_id -JOIN ` + schemas.Prefix + `permission_scopes ps ON ps.permission_id = p.id -JOIN ` + schemas.Prefix + `scopes s ON s.id = ps.scope_id -JOIN ` + schemas.Prefix + `permission_policies pp ON pp.permission_id = p.id -JOIN ` + schemas.Prefix + `policies pol ON pol.id = pp.policy_id -JOIN ` + schemas.Prefix + `policy_targets pt ON pt.policy_id = pol.id -WHERE r.name = ? AND s.name = ?` - - var rows []permissionRow - result := p.db.Raw(query, resourceName, scopeName).Scan(&rows) - if result.Error != nil { - return nil, result.Error - } - - return groupPermissionRows(rows), nil -} - -// groupPermissionRows groups flat permissionRow results into nested PermissionWithPolicies structs. -func groupPermissionRows(rows []permissionRow) []*schemas.PermissionWithPolicies { - // Track insertion order for permissions and policies - permOrder := make([]string, 0) - permMap := make(map[string]*schemas.PermissionWithPolicies) - policyOrderMap := make(map[string][]string) // permissionID -> ordered policy IDs - policyMap := make(map[string]*schemas.PolicyWithTargets) // "permID:polID" -> policy - - for _, row := range rows { - // Ensure permission exists - perm, ok := permMap[row.PermissionID] - if !ok { - perm = &schemas.PermissionWithPolicies{ - PermissionID: row.PermissionID, - PermissionName: row.PermissionName, - DecisionStrategy: row.DecisionStrategy, - Policies: nil, - } - permMap[row.PermissionID] = perm - permOrder = append(permOrder, row.PermissionID) - } - - // Ensure policy exists within this permission - policyKey := row.PermissionID + ":" + row.PolicyID - pol, ok := policyMap[policyKey] - if !ok { - pol = &schemas.PolicyWithTargets{ - PolicyID: row.PolicyID, - PolicyName: row.PolicyName, - Type: row.PolicyType, - Logic: row.PolicyLogic, - DecisionStrategy: row.PolicyDecisionStrategy, - Targets: nil, - } - policyMap[policyKey] = pol - policyOrderMap[row.PermissionID] = append(policyOrderMap[row.PermissionID], policyKey) - } - - // Add target - pol.Targets = append(pol.Targets, schemas.PolicyTargetView{ - TargetType: row.TargetType, - TargetValue: row.TargetValue, - }) - } - - // Assemble in order - result := make([]*schemas.PermissionWithPolicies, 0, len(permOrder)) - for _, permID := range permOrder { - perm := permMap[permID] - for _, policyKey := range policyOrderMap[permID] { - pol := policyMap[policyKey] - perm.Policies = append(perm.Policies, *pol) - } - result = append(result, perm) - } - return result -} diff --git a/internal/storage/db/sql/policy.go b/internal/storage/db/sql/policy.go deleted file mode 100644 index 6d42d32f..00000000 --- a/internal/storage/db/sql/policy.go +++ /dev/null @@ -1,122 +0,0 @@ -package sql - -import ( - "context" - "fmt" - "time" - - "github.com/google/uuid" - "gorm.io/gorm/clause" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddPolicy creates a new authorization policy. -func (p *provider) AddPolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - if policy.ID == "" { - policy.ID = uuid.New().String() - } - policy.Key = policy.ID - policy.CreatedAt = time.Now().Unix() - policy.UpdatedAt = time.Now().Unix() - res := p.db.Clauses(clause.OnConflict{DoNothing: true}).Create(&policy) - if res.Error != nil { - return nil, res.Error - } - if res.RowsAffected == 0 { - return nil, fmt.Errorf("policy already exists: %s", policy.Name) - } - return policy, nil -} - -// UpdatePolicy updates an existing authorization policy. -func (p *provider) UpdatePolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) { - policy.UpdatedAt = time.Now().Unix() - result := p.db.Save(&policy) - if result.Error != nil { - return nil, result.Error - } - return policy, nil -} - -// DeletePolicy deletes an authorization policy by ID. -// Returns an error if any permission_policy references this policy. -// Cascade-deletes associated policy targets. -func (p *provider) DeletePolicy(ctx context.Context, id string) error { - var count int64 - p.db.Model(&schemas.PermissionPolicy{}).Where("policy_id = ?", id).Count(&count) - if count > 0 { - return fmt.Errorf("cannot delete policy: %d permission_policy(s) reference it", count) - } - // Cascade-delete policy targets - result := p.db.Where("policy_id = ?", id).Delete(&schemas.PolicyTarget{}) - if result.Error != nil { - return result.Error - } - result = p.db.Where("id = ?", id).Delete(&schemas.Policy{}) - if result.Error != nil { - return result.Error - } - return nil -} - -// GetPolicyByID returns an authorization policy by its ID. -func (p *provider) GetPolicyByID(ctx context.Context, id string) (*schemas.Policy, error) { - var policy schemas.Policy - result := p.db.Where("id = ?", id).First(&policy) - if result.Error != nil { - return nil, result.Error - } - return &policy, nil -} - -// ListPolicies returns a paginated list of authorization policies. -func (p *provider) ListPolicies(ctx context.Context, pagination *model.Pagination) ([]*schemas.Policy, *model.Pagination, error) { - var policies []*schemas.Policy - result := p.db.Limit(int(pagination.Limit)).Offset(int(pagination.Offset)).Order("created_at DESC").Find(&policies) - if result.Error != nil { - return nil, nil, result.Error - } - var total int64 - totalRes := p.db.Model(&schemas.Policy{}).Count(&total) - if totalRes.Error != nil { - return nil, nil, totalRes.Error - } - paginationClone := *pagination - paginationClone.Total = total - return policies, &paginationClone, nil -} - -// AddPolicyTarget adds a target (role name or user ID) to a policy. -func (p *provider) AddPolicyTarget(ctx context.Context, target *schemas.PolicyTarget) (*schemas.PolicyTarget, error) { - if target.ID == "" { - target.ID = uuid.New().String() - } - target.Key = target.ID - target.CreatedAt = time.Now().Unix() - res := p.db.Clauses(clause.OnConflict{DoNothing: true}).Create(&target) - if res.Error != nil { - return nil, res.Error - } - return target, nil -} - -// DeletePolicyTargetsByPolicyID removes all targets for a policy. -func (p *provider) DeletePolicyTargetsByPolicyID(ctx context.Context, policyID string) error { - result := p.db.Where("policy_id = ?", policyID).Delete(&schemas.PolicyTarget{}) - if result.Error != nil { - return result.Error - } - return nil -} - -// GetPolicyTargets returns all targets for a policy. -func (p *provider) GetPolicyTargets(ctx context.Context, policyID string) ([]*schemas.PolicyTarget, error) { - var targets []*schemas.PolicyTarget - result := p.db.Where("policy_id = ?", policyID).Find(&targets) - if result.Error != nil { - return nil, result.Error - } - return targets, nil -} diff --git a/internal/storage/db/sql/provider.go b/internal/storage/db/sql/provider.go index 495c1551..52643355 100644 --- a/internal/storage/db/sql/provider.go +++ b/internal/storage/db/sql/provider.go @@ -2,7 +2,6 @@ package sql import ( libsql "github.com/ekristen/gorm-libsql" - "github.com/glebarez/sqlite" "github.com/rs/zerolog" "gorm.io/driver/mysql" "gorm.io/driver/postgres" @@ -12,6 +11,7 @@ import ( "github.com/authorizerdev/authorizer/internal/config" "github.com/authorizerdev/authorizer/internal/constants" + sqlite "github.com/authorizerdev/authorizer/internal/storage/db/sql/sqlitedialect" "github.com/authorizerdev/authorizer/internal/storage/schemas" ) @@ -83,7 +83,7 @@ func NewProvider( } } - err = sqlDB.AutoMigrate(&schemas.User{}, &schemas.VerificationRequest{}, &schemas.Session{}, &schemas.Env{}, &schemas.Webhook{}, &schemas.WebhookLog{}, &schemas.EmailTemplate{}, &schemas.OTP{}, &schemas.Authenticator{}, &schemas.SessionToken{}, &schemas.MFASession{}, &schemas.OAuthState{}, &schemas.AuditLog{}, &schemas.Resource{}, &schemas.Scope{}, &schemas.Policy{}, &schemas.PolicyTarget{}, &schemas.Permission{}, &schemas.PermissionScope{}, &schemas.PermissionPolicy{}) + err = sqlDB.AutoMigrate(&schemas.User{}, &schemas.VerificationRequest{}, &schemas.Session{}, &schemas.Env{}, &schemas.Webhook{}, &schemas.WebhookLog{}, &schemas.EmailTemplate{}, &schemas.OTP{}, &schemas.Authenticator{}, &schemas.SessionToken{}, &schemas.MFASession{}, &schemas.OAuthState{}, &schemas.AuditLog{}) if err != nil { return nil, err } diff --git a/internal/storage/db/sql/resource.go b/internal/storage/db/sql/resource.go deleted file mode 100644 index b8319343..00000000 --- a/internal/storage/db/sql/resource.go +++ /dev/null @@ -1,93 +0,0 @@ -package sql - -import ( - "context" - "fmt" - "time" - - "github.com/google/uuid" - "gorm.io/gorm/clause" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddResource creates a new authorization resource. -func (p *provider) AddResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - if resource.ID == "" { - resource.ID = uuid.New().String() - } - resource.Key = resource.ID - resource.CreatedAt = time.Now().Unix() - resource.UpdatedAt = time.Now().Unix() - res := p.db.Clauses(clause.OnConflict{DoNothing: true}).Create(&resource) - if res.Error != nil { - return nil, res.Error - } - if res.RowsAffected == 0 { - return nil, fmt.Errorf("resource already exists: %s", resource.Name) - } - return resource, nil -} - -// UpdateResource updates an existing authorization resource. -func (p *provider) UpdateResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) { - resource.UpdatedAt = time.Now().Unix() - result := p.db.Save(&resource) - if result.Error != nil { - return nil, result.Error - } - return resource, nil -} - -// DeleteResource deletes an authorization resource by ID. -// Returns an error if any permission references this resource. -func (p *provider) DeleteResource(ctx context.Context, id string) error { - var count int64 - p.db.Model(&schemas.Permission{}).Where("resource_id = ?", id).Count(&count) - if count > 0 { - return fmt.Errorf("cannot delete resource: %d permission(s) reference it", count) - } - result := p.db.Where("id = ?", id).Delete(&schemas.Resource{}) - if result.Error != nil { - return result.Error - } - return nil -} - -// GetResourceByID returns an authorization resource by its ID. -func (p *provider) GetResourceByID(ctx context.Context, id string) (*schemas.Resource, error) { - var resource schemas.Resource - result := p.db.Where("id = ?", id).First(&resource) - if result.Error != nil { - return nil, result.Error - } - return &resource, nil -} - -// GetResourceByName returns an authorization resource by its unique name. -func (p *provider) GetResourceByName(ctx context.Context, name string) (*schemas.Resource, error) { - var resource schemas.Resource - result := p.db.Where("name = ?", name).First(&resource) - if result.Error != nil { - return nil, result.Error - } - return &resource, nil -} - -// ListResources returns a paginated list of authorization resources. -func (p *provider) ListResources(ctx context.Context, pagination *model.Pagination) ([]*schemas.Resource, *model.Pagination, error) { - var resources []*schemas.Resource - result := p.db.Limit(int(pagination.Limit)).Offset(int(pagination.Offset)).Order("created_at DESC").Find(&resources) - if result.Error != nil { - return nil, nil, result.Error - } - var total int64 - totalRes := p.db.Model(&schemas.Resource{}).Count(&total) - if totalRes.Error != nil { - return nil, nil, totalRes.Error - } - paginationClone := *pagination - paginationClone.Total = total - return resources, &paginationClone, nil -} diff --git a/internal/storage/db/sql/scope.go b/internal/storage/db/sql/scope.go deleted file mode 100644 index 39b1fac3..00000000 --- a/internal/storage/db/sql/scope.go +++ /dev/null @@ -1,93 +0,0 @@ -package sql - -import ( - "context" - "fmt" - "time" - - "github.com/google/uuid" - "gorm.io/gorm/clause" - - "github.com/authorizerdev/authorizer/internal/graph/model" - "github.com/authorizerdev/authorizer/internal/storage/schemas" -) - -// AddScope creates a new authorization scope. -func (p *provider) AddScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - if scope.ID == "" { - scope.ID = uuid.New().String() - } - scope.Key = scope.ID - scope.CreatedAt = time.Now().Unix() - scope.UpdatedAt = time.Now().Unix() - res := p.db.Clauses(clause.OnConflict{DoNothing: true}).Create(&scope) - if res.Error != nil { - return nil, res.Error - } - if res.RowsAffected == 0 { - return nil, fmt.Errorf("scope already exists: %s", scope.Name) - } - return scope, nil -} - -// UpdateScope updates an existing authorization scope. -func (p *provider) UpdateScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) { - scope.UpdatedAt = time.Now().Unix() - result := p.db.Save(&scope) - if result.Error != nil { - return nil, result.Error - } - return scope, nil -} - -// DeleteScope deletes an authorization scope by ID. -// Returns an error if any permission_scope references this scope. -func (p *provider) DeleteScope(ctx context.Context, id string) error { - var count int64 - p.db.Model(&schemas.PermissionScope{}).Where("scope_id = ?", id).Count(&count) - if count > 0 { - return fmt.Errorf("cannot delete scope: %d permission_scope(s) reference it", count) - } - result := p.db.Where("id = ?", id).Delete(&schemas.Scope{}) - if result.Error != nil { - return result.Error - } - return nil -} - -// GetScopeByID returns an authorization scope by its ID. -func (p *provider) GetScopeByID(ctx context.Context, id string) (*schemas.Scope, error) { - var scope schemas.Scope - result := p.db.Where("id = ?", id).First(&scope) - if result.Error != nil { - return nil, result.Error - } - return &scope, nil -} - -// GetScopeByName returns an authorization scope by its unique name. -func (p *provider) GetScopeByName(ctx context.Context, name string) (*schemas.Scope, error) { - var scope schemas.Scope - result := p.db.Where("name = ?", name).First(&scope) - if result.Error != nil { - return nil, result.Error - } - return &scope, nil -} - -// ListScopes returns a paginated list of authorization scopes. -func (p *provider) ListScopes(ctx context.Context, pagination *model.Pagination) ([]*schemas.Scope, *model.Pagination, error) { - var scopes []*schemas.Scope - result := p.db.Limit(int(pagination.Limit)).Offset(int(pagination.Offset)).Order("created_at DESC").Find(&scopes) - if result.Error != nil { - return nil, nil, result.Error - } - var total int64 - totalRes := p.db.Model(&schemas.Scope{}).Count(&total) - if totalRes.Error != nil { - return nil, nil, totalRes.Error - } - paginationClone := *pagination - paginationClone.Total = total - return scopes, &paginationClone, nil -} diff --git a/internal/storage/db/sql/sqlitedialect/ddlmod.go b/internal/storage/db/sql/sqlitedialect/ddlmod.go new file mode 100644 index 00000000..dcc22d81 --- /dev/null +++ b/internal/storage/db/sql/sqlitedialect/ddlmod.go @@ -0,0 +1,296 @@ +package sqlitedialect + +import ( + "database/sql" + "errors" + "fmt" + "regexp" + "strconv" + "strings" + + "gorm.io/gorm/migrator" +) + +var ( + sqliteSeparator = "`|\"|'|\t" + indexRegexp = regexp.MustCompile(fmt.Sprintf(`(?is)CREATE(?: UNIQUE)? INDEX [%v]?[\w\d-]+[%v]? ON (.*)$`, sqliteSeparator, sqliteSeparator)) + tableRegexp = regexp.MustCompile(fmt.Sprintf(`(?is)(CREATE TABLE [%v]?[\w\d-]+[%v]?)(?:\s*\((.*)\))?`, sqliteSeparator, sqliteSeparator)) + separatorRegexp = regexp.MustCompile(fmt.Sprintf("[%v]", sqliteSeparator)) + columnsRegexp = regexp.MustCompile(fmt.Sprintf(`[(,][%v]?(\w+)[%v]?`, sqliteSeparator, sqliteSeparator)) + columnRegexp = regexp.MustCompile(fmt.Sprintf(`^[%v]?([\w\d]+)[%v]?\s+([\w\(\)\d]+)(.*)$`, sqliteSeparator, sqliteSeparator)) + defaultValueRegexp = regexp.MustCompile(`(?i) DEFAULT \(?(.+)?\)?( |COLLATE|GENERATED|$)`) + regRealDataType = regexp.MustCompile(`[^\d](\d+)[^\d]?`) +) + +func getAllColumns(s string) []string { + allMatches := columnsRegexp.FindAllStringSubmatch(s, -1) + columns := make([]string, 0, len(allMatches)) + for _, matches := range allMatches { + if len(matches) > 1 { + columns = append(columns, matches[1]) + } + } + return columns +} + +type ddl struct { + head string + fields []string + columns []migrator.ColumnType +} + +func parseDDL(strs ...string) (*ddl, error) { + var result ddl + for _, str := range strs { + if sections := tableRegexp.FindStringSubmatch(str); len(sections) > 0 { + var ( + ddlBody = sections[2] + ddlBodyRunes = []rune(ddlBody) + bracketLevel int + quote rune + buf string + ) + ddlBodyRunesLen := len(ddlBodyRunes) + + result.head = sections[1] + + for idx := 0; idx < ddlBodyRunesLen; idx++ { + var ( + next rune = 0 + c = ddlBodyRunes[idx] + ) + if idx+1 < ddlBodyRunesLen { + next = ddlBodyRunes[idx+1] + } + + if sc := string(c); separatorRegexp.MatchString(sc) { + if c == next { + buf += sc // Skip escaped quote + idx++ + } else if quote > 0 { + quote = 0 + } else { + quote = c + } + } else if quote == 0 { + if c == '(' { + bracketLevel++ + } else if c == ')' { + bracketLevel-- + } else if bracketLevel == 0 { + if c == ',' { + result.fields = append(result.fields, strings.TrimSpace(buf)) + buf = "" + continue + } + } + } + + if bracketLevel < 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + buf += string(c) + } + + if bracketLevel != 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + if buf != "" { + result.fields = append(result.fields, strings.TrimSpace(buf)) + } + + for _, f := range result.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") { + continue + } + + if strings.HasPrefix(fUpper, "PRIMARY KEY") { + for _, name := range getAllColumns(f) { + for idx, column := range result.columns { + if column.NameValue.String == name { + column.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + result.columns[idx] = column + break + } + } + } + } else if matches := columnRegexp.FindStringSubmatch(f); len(matches) > 0 { + columnType := migrator.ColumnType{ + NameValue: sql.NullString{String: matches[1], Valid: true}, + DataTypeValue: sql.NullString{String: matches[2], Valid: true}, + ColumnTypeValue: sql.NullString{String: matches[2], Valid: true}, + PrimaryKeyValue: sql.NullBool{Valid: true}, + UniqueValue: sql.NullBool{Valid: true}, + NullableValue: sql.NullBool{Bool: true, Valid: true}, + DefaultValueValue: sql.NullString{Valid: false}, + } + + matchUpper := strings.ToUpper(matches[3]) + if strings.Contains(matchUpper, " NOT NULL") { + columnType.NullableValue = sql.NullBool{Bool: false, Valid: true} + } else if strings.Contains(matchUpper, " NULL") { + columnType.NullableValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " UNIQUE") { + columnType.UniqueValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " PRIMARY") { + columnType.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + } + if defaultMatches := defaultValueRegexp.FindStringSubmatch(matches[3]); len(defaultMatches) > 1 { + if strings.ToLower(defaultMatches[1]) != "null" { + columnType.DefaultValueValue = sql.NullString{String: strings.Trim(defaultMatches[1], `"`), Valid: true} + } + } + + // data type length + matches := regRealDataType.FindAllStringSubmatch(columnType.DataTypeValue.String, -1) + if len(matches) == 1 && len(matches[0]) == 2 { + size, _ := strconv.Atoi(matches[0][1]) + columnType.LengthValue = sql.NullInt64{Valid: true, Int64: int64(size)} + columnType.DataTypeValue.String = strings.TrimSuffix(columnType.DataTypeValue.String, matches[0][0]) + } + + result.columns = append(result.columns, columnType) + } + } + } else if matches := indexRegexp.FindStringSubmatch(str); len(matches) > 0 { + for _, column := range getAllColumns(matches[1]) { + for idx, c := range result.columns { + if c.NameValue.String == column { + c.UniqueValue = sql.NullBool{Bool: strings.ToUpper(strings.Fields(str)[1]) == "UNIQUE", Valid: true} + result.columns[idx] = c + } + } + } + } else { + return nil, errors.New("invalid DDL") + } + } + + return &result, nil +} + +func (d *ddl) clone() *ddl { + copied := new(ddl) + *copied = *d + + copied.fields = make([]string, len(d.fields)) + copy(copied.fields, d.fields) + copied.columns = make([]migrator.ColumnType, len(d.columns)) + copy(copied.columns, d.columns) + + return copied +} + +func (d *ddl) compile() string { + if len(d.fields) == 0 { + return d.head + } + + return fmt.Sprintf("%s (%s)", d.head, strings.Join(d.fields, ",")) +} + +func (d *ddl) renameTable(dst, src string) error { + tableReg, err := regexp.Compile("\\s*('|`|\")?\\b" + regexp.QuoteMeta(src) + "\\b('|`|\")?\\s*") + if err != nil { + return err + } + + replaced := tableReg.ReplaceAllString(d.head, fmt.Sprintf(" `%s` ", dst)) + if replaced == d.head { + return fmt.Errorf("failed to look up tablename `%s` from DDL head '%s'", src, d.head) + } + + d.head = replaced + return nil +} + +func (d *ddl) addConstraint(name string, sql string) { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields[i] = sql + return + } + } + + d.fields = append(d.fields, sql) +} + +func (d *ddl) removeConstraint(name string) bool { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields = append(d.fields[:i], d.fields[i+1:]...) + return true + } + } + return false +} + +func (d *ddl) hasConstraint(name string) bool { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for _, f := range d.fields { + if reg.MatchString(f) { + return true + } + } + return false +} + +func (d *ddl) getColumns() []string { + res := []string{} + + for _, f := range d.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "PRIMARY KEY") || + strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") || + strings.Contains(fUpper, "GENERATED ALWAYS AS") { + continue + } + + reg := regexp.MustCompile("^[\"`']?([\\w\\d]+)[\"`']?") + match := reg.FindStringSubmatch(f) + + if match != nil { + res = append(res, "`"+match[1]+"`") + } + } + return res +} + +func (d *ddl) alterColumn(name, sql string) bool { + reg := regexp.MustCompile("^(`|'|\"| )" + regexp.QuoteMeta(name) + "(`|'|\"| ) .*?$") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields[i] = sql + return false + } + } + + d.fields = append(d.fields, sql) + return true +} + +func (d *ddl) removeColumn(name string) bool { + reg := regexp.MustCompile("^(`|'|\"| )" + regexp.QuoteMeta(name) + "(`|'|\"| ) .*?$") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields = append(d.fields[:i], d.fields[i+1:]...) + return true + } + } + + return false +} diff --git a/internal/storage/db/sql/sqlitedialect/errors.go b/internal/storage/db/sql/sqlitedialect/errors.go new file mode 100644 index 00000000..b7f401df --- /dev/null +++ b/internal/storage/db/sql/sqlitedialect/errors.go @@ -0,0 +1,7 @@ +package sqlitedialect + +import "errors" + +var ( + ErrConstraintsNotImplemented = errors.New("constraints not implemented on sqlite, consider using DisableForeignKeyConstraintWhenMigrating, more details https://github.com/go-gorm/gorm/wiki/GORM-V2-Release-Note-Draft#all-new-migrator") +) diff --git a/internal/storage/db/sql/sqlitedialect/migrator.go b/internal/storage/db/sql/sqlitedialect/migrator.go new file mode 100644 index 00000000..7bfcf564 --- /dev/null +++ b/internal/storage/db/sql/sqlitedialect/migrator.go @@ -0,0 +1,406 @@ +package sqlitedialect + +import ( + "database/sql" + "fmt" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" +) + +type Migrator struct { + migrator.Migrator +} + +func (m *Migrator) RunWithoutForeignKey(fc func() error) error { + var enabled int + m.DB.Raw("PRAGMA foreign_keys").Scan(&enabled) + if enabled == 1 { + m.DB.Exec("PRAGMA foreign_keys = OFF") + defer m.DB.Exec("PRAGMA foreign_keys = ON") + } + + return fc() +} + +func (m Migrator) HasTable(value interface{}) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + return m.DB.Raw("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", stmt.Table).Row().Scan(&count) + }) + return count > 0 +} + +func (m Migrator) DropTable(values ...interface{}) error { + return m.RunWithoutForeignKey(func() error { + values = m.ReorderModels(values, false) + tx := m.DB.Session(&gorm.Session{}) + + for i := len(values) - 1; i >= 0; i-- { + if err := m.RunWithValue(values[i], func(stmt *gorm.Statement) error { + return tx.Exec("DROP TABLE IF EXISTS ?", clause.Table{Name: stmt.Table}).Error + }); err != nil { + return err + } + } + + return nil + }) +} + +func (m Migrator) GetTables() (tableList []string, err error) { + return tableList, m.DB.Raw("SELECT name FROM sqlite_master where type=?", "table").Scan(&tableList).Error +} + +func (m Migrator) HasColumn(value interface{}, name string) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", stmt.Table, `%"`+name+`" %`, `%`+name+` %`, "%`"+name+"`%", "%["+name+"]%", "%\t"+name+"\t%", + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) AlterColumn(value interface{}, name string) error { + return m.RunWithoutForeignKey(func() error { + return m.recreateTable(value, nil, func(ddl *ddl, stmt *gorm.Statement) (*ddl, []interface{}, error) { + if field := stmt.Schema.LookUpField(name); field != nil { + if ddl.alterColumn(field.DBName, fmt.Sprintf("`%s` ?", field.DBName)) { + return nil, nil, fmt.Errorf("field `%s` not found in origin ddl, ddl= '%s'", name, ddl.compile()) + } + + return ddl, []interface{}{m.FullDataTypeOf(field)}, nil + } + + return nil, nil, fmt.Errorf("failed to alter field with name `%s`", name) + }) + }) +} + +// ColumnTypes return columnTypes []gorm.ColumnType and execErr error +func (m Migrator) ColumnTypes(value interface{}) ([]gorm.ColumnType, error) { + columnTypes := make([]gorm.ColumnType, 0) + execErr := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) { + var ( + sqls []string + sqlDDL *ddl + ) + + if err := m.DB.Raw("SELECT sql FROM sqlite_master WHERE type IN ? AND tbl_name = ? AND sql IS NOT NULL order by type = ? desc", []string{"table", "index"}, stmt.Table, "table").Scan(&sqls).Error; err != nil { + return err + } + + if sqlDDL, err = parseDDL(sqls...); err != nil { + return err + } + + rows, err := m.DB.Session(&gorm.Session{}).Table(stmt.Table).Limit(1).Rows() + if err != nil { + return err + } + defer func() { + err = rows.Close() + }() + + var rawColumnTypes []*sql.ColumnType + rawColumnTypes, err = rows.ColumnTypes() + if err != nil { + return err + } + + for _, c := range rawColumnTypes { + columnType := migrator.ColumnType{SQLColumnType: c} + for _, column := range sqlDDL.columns { + if column.NameValue.String == c.Name() { + column.SQLColumnType = c + columnType = column + break + } + } + columnTypes = append(columnTypes, columnType) + } + + return err + }) + + return columnTypes, execErr +} + +func (m Migrator) DropColumn(value interface{}, name string) error { + return m.recreateTable(value, nil, func(ddl *ddl, stmt *gorm.Statement) (*ddl, []interface{}, error) { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + + ddl.removeColumn(name) + return ddl, nil, nil + }) +} + +func (m Migrator) CreateConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + + return m.recreateTable(value, &table, + func(ddl *ddl, stmt *gorm.Statement) (*ddl, []interface{}, error) { + var ( + constraintName string + constraintSql string + constraintValues []interface{} + ) + + if constraint != nil { + constraintName = constraint.Name + constraintSql, constraintValues = buildConstraint(constraint) + } else if chk != nil { + constraintName = chk.Name + constraintSql = "CONSTRAINT ? CHECK (?)" + constraintValues = []interface{}{clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint}} + } else { + return nil, nil, nil + } + + ddl.addConstraint(constraintName, constraintSql) + return ddl, constraintValues, nil + }) + }) +} + +func (m Migrator) DropConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + return m.recreateTable(value, &table, + func(ddl *ddl, stmt *gorm.Statement) (*ddl, []interface{}, error) { + ddl.removeConstraint(name) + return ddl, nil, nil + }) + }) +} + +func (m Migrator) HasConstraint(value interface{}, name string) bool { + var count int64 + m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", table, `%CONSTRAINT "`+name+`" %`, `%CONSTRAINT `+name+` %`, "%CONSTRAINT `"+name+"`%", "%CONSTRAINT ["+name+"]%", "%CONSTRAINT \t"+name+"\t%", + ).Row().Scan(&count) + + return nil + }) + + return count > 0 +} + +func (m Migrator) CurrentDatabase() (name string) { + var null interface{} + m.DB.Raw("PRAGMA database_list").Row().Scan(&null, &name, &null) + return +} + +func (m Migrator) BuildIndexOptions(opts []schema.IndexOption, stmt *gorm.Statement) (results []interface{}) { + for _, opt := range opts { + str := stmt.Quote(opt.DBName) + if opt.Expression != "" { + str = opt.Expression + } + + if opt.Collate != "" { + str += " COLLATE " + opt.Collate + } + + if opt.Sort != "" { + str += " " + opt.Sort + } + results = append(results, clause.Expr{SQL: str}) + } + return +} + +func (m Migrator) CreateIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if idx := stmt.Schema.LookIndex(name); idx != nil { + opts := m.BuildIndexOptions(idx.Fields, stmt) + values := []interface{}{clause.Column{Name: idx.Name}, clause.Table{Name: stmt.Table}, opts} + + createIndexSQL := "CREATE " + if idx.Class != "" { + createIndexSQL += idx.Class + " " + } + createIndexSQL += "INDEX ?" + + if idx.Type != "" { + createIndexSQL += " USING " + idx.Type + } + createIndexSQL += " ON ??" + + if idx.Where != "" { + createIndexSQL += " WHERE " + idx.Where + } + + return m.DB.Exec(createIndexSQL, values...).Error + } + } + return fmt.Errorf("failed to create index with name %v", name) + }) +} + +func (m Migrator) HasIndex(value interface{}, name string) bool { + var count int + m.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, name, + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) RenameIndex(value interface{}, oldName, newName string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + var sql string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, oldName).Row().Scan(&sql) + if sql != "" { + if err := m.DropIndex(value, oldName); err != nil { + return err + } + return m.DB.Exec(strings.Replace(sql, oldName, newName, 1)).Error + } + return fmt.Errorf("failed to find index with name %v", oldName) + }) +} + +func (m Migrator) DropIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + } + + return m.DB.Exec("DROP INDEX ?", clause.Column{Name: name}).Error + }) +} + +func buildConstraint(constraint *schema.Constraint) (sql string, results []interface{}) { + sql = "CONSTRAINT ? FOREIGN KEY ? REFERENCES ??" + if constraint.OnDelete != "" { + sql += " ON DELETE " + constraint.OnDelete + } + + if constraint.OnUpdate != "" { + sql += " ON UPDATE " + constraint.OnUpdate + } + + var foreignKeys, references []interface{} + for _, field := range constraint.ForeignKeys { + foreignKeys = append(foreignKeys, clause.Column{Name: field.DBName}) + } + + for _, field := range constraint.References { + references = append(references, clause.Column{Name: field.DBName}) + } + results = append(results, clause.Table{Name: constraint.Name}, foreignKeys, clause.Table{Name: constraint.ReferenceSchema.Table}, references) + return +} + +func (m Migrator) getRawDDL(table string) (string, error) { + var createSQL string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "table", table, table).Row().Scan(&createSQL) + + if m.DB.Error != nil { + return "", m.DB.Error + } + return createSQL, nil +} + +func (m Migrator) recreateTable( + value interface{}, tablePtr *string, + getCreateSQL func(ddl *ddl, stmt *gorm.Statement) (sql *ddl, sqlArgs []interface{}, err error), +) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + table := stmt.Table + if tablePtr != nil { + table = *tablePtr + } + + rawDDL, err := m.getRawDDL(table) + if err != nil { + return err + } + + originDDL, err := parseDDL(rawDDL) + if err != nil { + return err + } + + createDDL, sqlArgs, err := getCreateSQL(originDDL.clone(), stmt) + if err != nil { + return err + } + if createDDL == nil { + return nil + } + + newTableName := table + "__temp" + if err := createDDL.renameTable(newTableName, table); err != nil { + return err + } + + columns := createDDL.getColumns() + createSQL := createDDL.compile() + + return m.DB.Transaction(func(tx *gorm.DB) error { + if err := tx.Exec(createSQL, sqlArgs...).Error; err != nil { + return err + } + + queries := []string{ + fmt.Sprintf("INSERT INTO `%v`(%v) SELECT %v FROM `%v`", newTableName, strings.Join(columns, ","), strings.Join(columns, ","), table), + fmt.Sprintf("DROP TABLE `%v`", table), + fmt.Sprintf("ALTER TABLE `%v` RENAME TO `%v`", newTableName, table), + } + for _, query := range queries { + if err := tx.Exec(query).Error; err != nil { + return err + } + } + return nil + }) + }) +} diff --git a/internal/storage/db/sql/sqlitedialect/sqlite.go b/internal/storage/db/sql/sqlitedialect/sqlite.go new file mode 100644 index 00000000..ba4f6f18 --- /dev/null +++ b/internal/storage/db/sql/sqlitedialect/sqlite.go @@ -0,0 +1,298 @@ +// Package sqlitedialect is a pure-Go GORM SQLite dialector. +// +// It is a vendored copy of github.com/glebarez/sqlite v1.10.0 with one surgical +// change: the underlying SQLite driver/error type is sourced from +// modernc.org/sqlite directly instead of github.com/glebarez/go-sqlite (which is +// itself a thin wrapper over modernc.org/sqlite). +// +// Why this exists: glebarez/go-sqlite and modernc.org/sqlite BOTH call +// sql.Register("sqlite", ...) in their init(). OpenFGA's SQL datastores pull in +// modernc.org/sqlite, so linking glebarez/go-sqlite as well panics at startup +// with "sql: Register called twice for driver sqlite". By dropping +// glebarez/sqlite (and thus glebarez/go-sqlite) and using modernc.org/sqlite as +// the SINGLE registrant, Authorizer's GORM SQLite path and OpenFGA's embedded +// SQL datastores coexist in one default binary with no registration conflict. +// +// The dialect logic (DDL, type mapping, clause builders, migrator) is unchanged +// from glebarez/sqlite and is plain SQLite SQL — not driver-specific. +package sqlitedialect + +import ( + "context" + "database/sql" + "strconv" + + "gorm.io/gorm/callbacks" + + // modernc.org/sqlite is a pure-Go (no-cgo) SQLite driver that registers the + // "sqlite" database/sql driver in its init(). It is the single canonical + // registrant of that driver name across the binary (OpenFGA's SQL datastores + // also use it), which is exactly why this dialect targets it directly instead + // of github.com/glebarez/go-sqlite — the latter would register "sqlite" a + // second time and panic at startup ("sql: Register called twice"). + gosqlite "modernc.org/sqlite" + sqlite3 "modernc.org/sqlite/lib" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/logger" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" +) + +// DriverName is the default driver name for SQLite. +const DriverName = "sqlite" + +type Dialector struct { + DriverName string + DSN string + Conn gorm.ConnPool +} + +func Open(dsn string) gorm.Dialector { + return &Dialector{DSN: dsn} +} + +func (dialector Dialector) Name() string { + return "sqlite" +} + +func (dialector Dialector) Initialize(db *gorm.DB) (err error) { + if dialector.DriverName == "" { + dialector.DriverName = DriverName + } + + if dialector.Conn != nil { + db.ConnPool = dialector.Conn + } else { + conn, err := sql.Open(dialector.DriverName, dialector.DSN) + if err != nil { + return err + } + db.ConnPool = conn + } + + var version string + if err := db.ConnPool.QueryRowContext(context.Background(), "select sqlite_version()").Scan(&version); err != nil { + return err + } + // https://www.sqlite.org/releaselog/3_35_0.html + if compareVersion(version, "3.35.0") >= 0 { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + CreateClauses: []string{"INSERT", "VALUES", "ON CONFLICT", "RETURNING"}, + UpdateClauses: []string{"UPDATE", "SET", "FROM", "WHERE", "RETURNING"}, + DeleteClauses: []string{"DELETE", "FROM", "WHERE", "RETURNING"}, + LastInsertIDReversed: true, + }) + } else { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + LastInsertIDReversed: true, + }) + } + + for k, v := range dialector.ClauseBuilders() { + db.ClauseBuilders[k] = v + } + return +} + +func (dialector Dialector) ClauseBuilders() map[string]clause.ClauseBuilder { + return map[string]clause.ClauseBuilder{ + "INSERT": func(c clause.Clause, builder clause.Builder) { + if insert, ok := c.Expression.(clause.Insert); ok { + if stmt, ok := builder.(*gorm.Statement); ok { + stmt.WriteString("INSERT ") + if insert.Modifier != "" { + stmt.WriteString(insert.Modifier) + stmt.WriteByte(' ') + } + + stmt.WriteString("INTO ") + if insert.Table.Name == "" { + stmt.WriteQuoted(stmt.Table) + } else { + stmt.WriteQuoted(insert.Table) + } + return + } + } + + c.Build(builder) + }, + "LIMIT": func(c clause.Clause, builder clause.Builder) { + if limit, ok := c.Expression.(clause.Limit); ok { + var lmt = -1 + if limit.Limit != nil && *limit.Limit >= 0 { + lmt = *limit.Limit + } + if lmt >= 0 || limit.Offset > 0 { + builder.WriteString("LIMIT ") + builder.WriteString(strconv.Itoa(lmt)) + } + if limit.Offset > 0 { + builder.WriteString(" OFFSET ") + builder.WriteString(strconv.Itoa(limit.Offset)) + } + } + }, + "FOR": func(c clause.Clause, builder clause.Builder) { + if _, ok := c.Expression.(clause.Locking); ok { + // SQLite3 does not support row-level locking. + return + } + c.Build(builder) + }, + } +} + +func (dialector Dialector) DefaultValueOf(field *schema.Field) clause.Expression { + if field.AutoIncrement { + return clause.Expr{SQL: "NULL"} + } + + // doesn't work, will raise error + return clause.Expr{SQL: "DEFAULT"} +} + +func (dialector Dialector) Migrator(db *gorm.DB) gorm.Migrator { + return Migrator{migrator.Migrator{Config: migrator.Config{ + DB: db, + Dialector: dialector, + CreateIndexAfterCreateTable: true, + }}} +} + +func (dialector Dialector) BindVarTo(writer clause.Writer, stmt *gorm.Statement, v interface{}) { + writer.WriteByte('?') +} + +func (dialector Dialector) QuoteTo(writer clause.Writer, str string) { + var ( + underQuoted, selfQuoted bool + continuousBacktick int8 + shiftDelimiter int8 + ) + + for _, v := range []byte(str) { + switch v { + case '`': + continuousBacktick++ + if continuousBacktick == 2 { + writer.WriteString("``") + continuousBacktick = 0 + } + case '.': + if continuousBacktick > 0 || !selfQuoted { + shiftDelimiter = 0 + underQuoted = false + continuousBacktick = 0 + writer.WriteString("`") + } + writer.WriteByte(v) + continue + default: + if shiftDelimiter-continuousBacktick <= 0 && !underQuoted { + writer.WriteString("`") + underQuoted = true + if selfQuoted = continuousBacktick > 0; selfQuoted { + continuousBacktick -= 1 + } + } + + for ; continuousBacktick > 0; continuousBacktick -= 1 { + writer.WriteString("``") + } + + writer.WriteByte(v) + } + shiftDelimiter++ + } + + if continuousBacktick > 0 && !selfQuoted { + writer.WriteString("``") + } + writer.WriteString("`") +} + +func (dialector Dialector) Explain(sql string, vars ...interface{}) string { + return logger.ExplainSQL(sql, nil, `"`, vars...) +} + +func (dialector Dialector) DataTypeOf(field *schema.Field) string { + switch field.DataType { + case schema.Bool: + return "numeric" + case schema.Int, schema.Uint: + if field.AutoIncrement { + // doesn't check `PrimaryKey`, to keep backward compatibility + // https://www.sqlite.org/autoinc.html + return "integer PRIMARY KEY AUTOINCREMENT" + } else { + return "integer" + } + case schema.Float: + return "real" + case schema.String: + return "text" + case schema.Time: + // Distinguish between schema.Time and tag time + if val, ok := field.TagSettings["TYPE"]; ok { + return val + } else { + return "datetime" + } + case schema.Bytes: + return "blob" + } + + return string(field.DataType) +} + +func (dialectopr Dialector) SavePoint(tx *gorm.DB, name string) error { + tx.Exec("SAVEPOINT " + name) + return nil +} + +func (dialectopr Dialector) RollbackTo(tx *gorm.DB, name string) error { + tx.Exec("ROLLBACK TO SAVEPOINT " + name) + return nil +} + +func (dialector Dialector) Translate(err error) error { + switch terr := err.(type) { + case *gosqlite.Error: + switch terr.Code() { + case sqlite3.SQLITE_CONSTRAINT_UNIQUE: + return gorm.ErrDuplicatedKey + case sqlite3.SQLITE_CONSTRAINT_PRIMARYKEY: + return gorm.ErrDuplicatedKey + case sqlite3.SQLITE_CONSTRAINT_FOREIGNKEY: + return gorm.ErrForeignKeyViolated + } + } + return err +} + +func compareVersion(version1, version2 string) int { + n, m := len(version1), len(version2) + i, j := 0, 0 + for i < n || j < m { + x := 0 + for ; i < n && version1[i] != '.'; i++ { + x = x*10 + int(version1[i]-'0') + } + i++ + y := 0 + for ; j < m && version2[j] != '.'; j++ { + y = y*10 + int(version2[j]-'0') + } + j++ + if x > y { + return 1 + } + if x < y { + return -1 + } + } + return 0 +} diff --git a/internal/storage/provider.go b/internal/storage/provider.go index 4854dc1f..bbf1b551 100644 --- a/internal/storage/provider.go +++ b/internal/storage/provider.go @@ -174,101 +174,6 @@ type Provider interface { // Close releases resources held by the provider (e.g. database connection pools). Close() error - - // === Authorization: Resources === - - // AddResource creates a new authorization resource. - AddResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) - // UpdateResource updates an existing authorization resource. - UpdateResource(ctx context.Context, resource *schemas.Resource) (*schemas.Resource, error) - // DeleteResource deletes an authorization resource by ID. - // Returns an error if any permission references this resource. - DeleteResource(ctx context.Context, id string) error - // GetResourceByID returns an authorization resource by its ID. - GetResourceByID(ctx context.Context, id string) (*schemas.Resource, error) - // GetResourceByName returns an authorization resource by its unique name. - GetResourceByName(ctx context.Context, name string) (*schemas.Resource, error) - // ListResources returns a paginated list of authorization resources. - ListResources(ctx context.Context, pagination *model.Pagination) ([]*schemas.Resource, *model.Pagination, error) - - // === Authorization: Scopes === - - // AddScope creates a new authorization scope. - AddScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) - // UpdateScope updates an existing authorization scope. - UpdateScope(ctx context.Context, scope *schemas.Scope) (*schemas.Scope, error) - // DeleteScope deletes an authorization scope by ID. - // Returns an error if any permission_scope references this scope. - DeleteScope(ctx context.Context, id string) error - // GetScopeByID returns an authorization scope by its ID. - GetScopeByID(ctx context.Context, id string) (*schemas.Scope, error) - // GetScopeByName returns an authorization scope by its unique name. - GetScopeByName(ctx context.Context, name string) (*schemas.Scope, error) - // ListScopes returns a paginated list of authorization scopes. - ListScopes(ctx context.Context, pagination *model.Pagination) ([]*schemas.Scope, *model.Pagination, error) - - // === Authorization: Policies === - - // AddPolicy creates a new authorization policy. - AddPolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) - // UpdatePolicy updates an existing authorization policy. - UpdatePolicy(ctx context.Context, policy *schemas.Policy) (*schemas.Policy, error) - // DeletePolicy deletes an authorization policy by ID. - // Returns an error if any permission_policy references this policy. - DeletePolicy(ctx context.Context, id string) error - // GetPolicyByID returns an authorization policy by its ID. - GetPolicyByID(ctx context.Context, id string) (*schemas.Policy, error) - // ListPolicies returns a paginated list of authorization policies. - ListPolicies(ctx context.Context, pagination *model.Pagination) ([]*schemas.Policy, *model.Pagination, error) - - // === Authorization: Policy Targets === - - // AddPolicyTarget adds a target (role name or user ID) to a policy. - AddPolicyTarget(ctx context.Context, target *schemas.PolicyTarget) (*schemas.PolicyTarget, error) - // DeletePolicyTargetsByPolicyID removes all targets for a policy. - // Used during policy update to replace targets atomically. - DeletePolicyTargetsByPolicyID(ctx context.Context, policyID string) error - // GetPolicyTargets returns all targets for a policy. - GetPolicyTargets(ctx context.Context, policyID string) ([]*schemas.PolicyTarget, error) - - // === Authorization: Permissions === - - // AddPermission creates a new authorization permission. - AddPermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) - // UpdatePermission updates an existing authorization permission. - UpdatePermission(ctx context.Context, permission *schemas.Permission) (*schemas.Permission, error) - // DeletePermission deletes an authorization permission by ID. - DeletePermission(ctx context.Context, id string) error - // GetPermissionByID returns an authorization permission by its ID. - GetPermissionByID(ctx context.Context, id string) (*schemas.Permission, error) - // ListPermissions returns a paginated list of authorization permissions. - ListPermissions(ctx context.Context, pagination *model.Pagination) ([]*schemas.Permission, *model.Pagination, error) - - // === Authorization: Permission Scopes (join table) === - - // AddPermissionScope links a scope to a permission. - AddPermissionScope(ctx context.Context, ps *schemas.PermissionScope) (*schemas.PermissionScope, error) - // DeletePermissionScopesByPermissionID removes all scope links for a permission. - DeletePermissionScopesByPermissionID(ctx context.Context, permissionID string) error - // GetPermissionScopes returns all scope links for a permission. - GetPermissionScopes(ctx context.Context, permissionID string) ([]*schemas.PermissionScope, error) - - // === Authorization: Permission Policies (join table) === - - // AddPermissionPolicy links a policy to a permission. - AddPermissionPolicy(ctx context.Context, pp *schemas.PermissionPolicy) (*schemas.PermissionPolicy, error) - // DeletePermissionPoliciesByPermissionID removes all policy links for a permission. - DeletePermissionPoliciesByPermissionID(ctx context.Context, permissionID string) error - // GetPermissionPolicies returns all policy links for a permission. - GetPermissionPolicies(ctx context.Context, permissionID string) ([]*schemas.PermissionPolicy, error) - - // === Authorization: Optimized Evaluation Query === - - // GetPermissionsForResourceScope returns all permissions (with their policies and targets) - // that match a given resource name and scope name. This is the hot-path query used by - // the evaluation engine. SQL providers use a single JOIN query. NoSQL providers use - // a denormalized lookup collection. - GetPermissionsForResourceScope(ctx context.Context, resourceName string, scopeName string) ([]*schemas.PermissionWithPolicies, error) } // New creates a new database provider based on the configuration diff --git a/internal/storage/provider_test.go b/internal/storage/provider_test.go index 962d1714..721618e2 100644 --- a/internal/storage/provider_test.go +++ b/internal/storage/provider_test.go @@ -2,7 +2,6 @@ package storage import ( "context" - "fmt" "net" "os" "strings" @@ -163,22 +162,6 @@ func TestStorageProvider(t *testing.T) { testAuditLogOperations(t, ctx, provider) }) - t.Run("Resource Operations", func(t *testing.T) { - testResourceOperations(t, ctx, provider) - }) - - t.Run("Scope Operations", func(t *testing.T) { - testScopeOperations(t, ctx, provider) - }) - - t.Run("Policy Operations", func(t *testing.T) { - testPolicyOperations(t, ctx, provider) - }) - - t.Run("Permission Operations", func(t *testing.T) { - testPermissionOperations(t, ctx, provider) - }) - }) } } @@ -888,827 +871,3 @@ func testOAuthStateOperations(t *testing.T, ctx context.Context, provider Provid } assert.True(t, found, "Should find test_state_key_2 in all states") } - -// testResourceOperations covers all six Provider methods for authorization resources: -// AddResource, GetResourceByID, GetResourceByName, UpdateResource, ListResources, DeleteResource. -func testResourceOperations(t *testing.T, ctx context.Context, provider Provider) { - t.Helper() - - t.Run("add and get by id", func(t *testing.T) { - id := uuid.New().String() - r := &schemas.Resource{ - ID: id, - Key: id, - Name: "res-add-get-" + id[:8], - Description: "test resource", - } - created, err := provider.AddResource(ctx, r) - require.NoError(t, err) - require.NotNil(t, created) - assert.Equal(t, r.Name, created.Name) - - fetched, err := provider.GetResourceByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, r.Name, fetched.Name) - - // cleanup - require.NoError(t, provider.DeleteResource(ctx, id)) - }) - - t.Run("add and get by name", func(t *testing.T) { - id := uuid.New().String() - name := "res-byname-" + id[:8] - r := &schemas.Resource{ID: id, Key: id, Name: name, Description: "by-name test"} - _, err := provider.AddResource(ctx, r) - require.NoError(t, err) - - fetched, err := provider.GetResourceByName(ctx, name) - require.NoError(t, err) - assert.Equal(t, name, fetched.Name) - - require.NoError(t, provider.DeleteResource(ctx, id)) - }) - - t.Run("update mutates persisted fields", func(t *testing.T) { - id := uuid.New().String() - r := &schemas.Resource{ID: id, Key: id, Name: "res-update-" + id[:8], Description: "original"} - created, err := provider.AddResource(ctx, r) - require.NoError(t, err) - - created.Description = "updated description" - updated, err := provider.UpdateResource(ctx, created) - require.NoError(t, err) - assert.Equal(t, "updated description", updated.Description) - - refetched, err := provider.GetResourceByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, "updated description", refetched.Description) - - require.NoError(t, provider.DeleteResource(ctx, id)) - }) - - t.Run("delete removes the row", func(t *testing.T) { - id := uuid.New().String() - r := &schemas.Resource{ID: id, Key: id, Name: "res-delete-" + id[:8]} - _, err := provider.AddResource(ctx, r) - require.NoError(t, err) - - require.NoError(t, provider.DeleteResource(ctx, id)) - - _, err = provider.GetResourceByID(ctx, id) - assert.Error(t, err, "GetResourceByID should return error after deletion") - }) - - t.Run("list returns inserted rows with correct pagination", func(t *testing.T) { - // Insert 3 uniquely-named resources. - suffix := uuid.New().String()[:8] - ids := make([]string, 3) - for i := range ids { - id := uuid.New().String() - ids[i] = id - name := fmt.Sprintf("res-list-%s-%d", suffix, i) - r := &schemas.Resource{ID: id, Key: id, Name: name} - _, err := provider.AddResource(ctx, r) - require.NoError(t, err) - } - - // First page: limit 2, offset 0. - pag1 := &model.Pagination{Limit: 2, Offset: 0} - items1, retPag1, err := provider.ListResources(ctx, pag1) - require.NoError(t, err) - require.NotNil(t, retPag1) - assert.GreaterOrEqual(t, retPag1.Total, int64(3)) - assert.LessOrEqual(t, len(items1), 2) - - // Second page: limit 2, offset 2. - pag2 := &model.Pagination{Limit: 2, Offset: 2} - items2, retPag2, err := provider.ListResources(ctx, pag2) - require.NoError(t, err) - require.NotNil(t, retPag2) - assert.GreaterOrEqual(t, len(items2), 0) - - // cleanup - for _, id := range ids { - _ = provider.DeleteResource(ctx, id) - } - }) - - t.Run("list does not mutate caller pagination pointer", func(t *testing.T) { - pag := &model.Pagination{Limit: 10, Offset: 0} - _, retPag, err := provider.ListResources(ctx, pag) - require.NoError(t, err) - assert.NotSame(t, pag, retPag, "ListResources should return a new pagination object") - }) - - t.Run("add duplicate name returns error", func(t *testing.T) { - if strings.Contains(t.Name(), constants.DbTypeScyllaDB) { - t.Skip("Cassandra/ScyllaDB does not enforce uniqueness constraints on non-partition-key columns") - } - id1 := uuid.New().String() - name := "res-dup-" + id1[:8] - r1 := &schemas.Resource{ID: id1, Key: id1, Name: name} - _, err := provider.AddResource(ctx, r1) - require.NoError(t, err) - - id2 := uuid.New().String() - r2 := &schemas.Resource{ID: id2, Key: id2, Name: name} - _, err = provider.AddResource(ctx, r2) - assert.Error(t, err, "adding a resource with a duplicate name should fail") - - require.NoError(t, provider.DeleteResource(ctx, id1)) - }) -} - -// testScopeOperations covers all six Provider methods for authorization scopes: -// AddScope, GetScopeByID, GetScopeByName, UpdateScope, ListScopes, DeleteScope. -func testScopeOperations(t *testing.T, ctx context.Context, provider Provider) { - t.Helper() - - t.Run("add and get by id", func(t *testing.T) { - id := uuid.New().String() - s := &schemas.Scope{ - ID: id, - Key: id, - Name: "scope-add-" + id[:8], - Description: "test scope", - } - created, err := provider.AddScope(ctx, s) - require.NoError(t, err) - require.NotNil(t, created) - assert.Equal(t, s.Name, created.Name) - - fetched, err := provider.GetScopeByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, s.Name, fetched.Name) - - require.NoError(t, provider.DeleteScope(ctx, id)) - }) - - t.Run("add and get by name", func(t *testing.T) { - id := uuid.New().String() - name := "scope-byname-" + id[:8] - s := &schemas.Scope{ID: id, Key: id, Name: name, Description: "by-name test"} - _, err := provider.AddScope(ctx, s) - require.NoError(t, err) - - fetched, err := provider.GetScopeByName(ctx, name) - require.NoError(t, err) - assert.Equal(t, name, fetched.Name) - - require.NoError(t, provider.DeleteScope(ctx, id)) - }) - - t.Run("update mutates persisted fields", func(t *testing.T) { - id := uuid.New().String() - s := &schemas.Scope{ID: id, Key: id, Name: "scope-update-" + id[:8], Description: "original"} - created, err := provider.AddScope(ctx, s) - require.NoError(t, err) - - created.Description = "updated scope description" - updated, err := provider.UpdateScope(ctx, created) - require.NoError(t, err) - assert.Equal(t, "updated scope description", updated.Description) - - refetched, err := provider.GetScopeByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, "updated scope description", refetched.Description) - - require.NoError(t, provider.DeleteScope(ctx, id)) - }) - - t.Run("delete removes the row", func(t *testing.T) { - id := uuid.New().String() - s := &schemas.Scope{ID: id, Key: id, Name: "scope-delete-" + id[:8]} - _, err := provider.AddScope(ctx, s) - require.NoError(t, err) - - require.NoError(t, provider.DeleteScope(ctx, id)) - - _, err = provider.GetScopeByID(ctx, id) - assert.Error(t, err, "GetScopeByID should return error after deletion") - }) - - t.Run("list returns inserted rows with correct pagination", func(t *testing.T) { - suffix := uuid.New().String()[:8] - ids := make([]string, 3) - for i := range ids { - id := uuid.New().String() - ids[i] = id - name := fmt.Sprintf("scope-list-%s-%d", suffix, i) - s := &schemas.Scope{ID: id, Key: id, Name: name} - _, err := provider.AddScope(ctx, s) - require.NoError(t, err) - } - - pag1 := &model.Pagination{Limit: 2, Offset: 0} - items1, retPag1, err := provider.ListScopes(ctx, pag1) - require.NoError(t, err) - require.NotNil(t, retPag1) - assert.GreaterOrEqual(t, retPag1.Total, int64(3)) - assert.LessOrEqual(t, len(items1), 2) - - pag2 := &model.Pagination{Limit: 2, Offset: 2} - items2, retPag2, err := provider.ListScopes(ctx, pag2) - require.NoError(t, err) - require.NotNil(t, retPag2) - assert.GreaterOrEqual(t, len(items2), 0) - - for _, id := range ids { - _ = provider.DeleteScope(ctx, id) - } - }) - - t.Run("list does not mutate caller pagination pointer", func(t *testing.T) { - pag := &model.Pagination{Limit: 10, Offset: 0} - _, retPag, err := provider.ListScopes(ctx, pag) - require.NoError(t, err) - assert.NotSame(t, pag, retPag, "ListScopes should return a new pagination object") - }) - - t.Run("add duplicate name returns error", func(t *testing.T) { - if strings.Contains(t.Name(), constants.DbTypeScyllaDB) { - t.Skip("Cassandra/ScyllaDB does not enforce uniqueness constraints on non-partition-key columns") - } - id1 := uuid.New().String() - name := "scope-dup-" + id1[:8] - s1 := &schemas.Scope{ID: id1, Key: id1, Name: name} - _, err := provider.AddScope(ctx, s1) - require.NoError(t, err) - - id2 := uuid.New().String() - s2 := &schemas.Scope{ID: id2, Key: id2, Name: name} - _, err = provider.AddScope(ctx, s2) - assert.Error(t, err, "adding a scope with a duplicate name should fail") - - require.NoError(t, provider.DeleteScope(ctx, id1)) - }) -} - -// testPolicyOperations covers all eight Provider methods for authorization policies: -// AddPolicy, GetPolicyByID, UpdatePolicy, ListPolicies, DeletePolicy, -// AddPolicyTarget, GetPolicyTargets, DeletePolicyTargetsByPolicyID. -func testPolicyOperations(t *testing.T, ctx context.Context, provider Provider) { - t.Helper() - - t.Run("add and get by id", func(t *testing.T) { - id := uuid.New().String() - p := &schemas.Policy{ - ID: id, - Key: id, - Name: "pol-add-" + id[:8], - Description: "test policy", - Type: constants.PolicyTypeRole, - Logic: constants.PolicyLogicPositive, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - created, err := provider.AddPolicy(ctx, p) - require.NoError(t, err) - require.NotNil(t, created) - assert.Equal(t, p.Name, created.Name) - assert.Equal(t, constants.PolicyTypeRole, created.Type) - - fetched, err := provider.GetPolicyByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, p.Name, fetched.Name) - assert.Equal(t, constants.PolicyLogicPositive, fetched.Logic) - - require.NoError(t, provider.DeletePolicy(ctx, id)) - }) - - t.Run("update mutates persisted fields", func(t *testing.T) { - id := uuid.New().String() - p := &schemas.Policy{ - ID: id, - Key: id, - Name: "pol-update-" + id[:8], - Type: constants.PolicyTypeRole, - Logic: constants.PolicyLogicPositive, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - created, err := provider.AddPolicy(ctx, p) - require.NoError(t, err) - - created.Description = "updated policy description" - created.Logic = constants.PolicyLogicNegative - updated, err := provider.UpdatePolicy(ctx, created) - require.NoError(t, err) - assert.Equal(t, "updated policy description", updated.Description) - assert.Equal(t, constants.PolicyLogicNegative, updated.Logic) - - refetched, err := provider.GetPolicyByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, constants.PolicyLogicNegative, refetched.Logic) - - require.NoError(t, provider.DeletePolicy(ctx, id)) - }) - - t.Run("delete removes the row", func(t *testing.T) { - id := uuid.New().String() - p := &schemas.Policy{ - ID: id, - Key: id, - Name: "pol-delete-" + id[:8], - Type: constants.PolicyTypeUser, - Logic: constants.PolicyLogicPositive, - DecisionStrategy: constants.DecisionStrategyUnanimous, - } - _, err := provider.AddPolicy(ctx, p) - require.NoError(t, err) - - require.NoError(t, provider.DeletePolicy(ctx, id)) - - _, err = provider.GetPolicyByID(ctx, id) - assert.Error(t, err, "GetPolicyByID should return error after deletion") - }) - - t.Run("list returns inserted rows with correct pagination", func(t *testing.T) { - suffix := uuid.New().String()[:8] - ids := make([]string, 3) - for i := range ids { - id := uuid.New().String() - ids[i] = id - name := fmt.Sprintf("pol-list-%s-%d", suffix, i) - p := &schemas.Policy{ - ID: id, - Key: id, - Name: name, - Type: constants.PolicyTypeRole, - Logic: constants.PolicyLogicPositive, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err := provider.AddPolicy(ctx, p) - require.NoError(t, err) - } - - pag1 := &model.Pagination{Limit: 2, Offset: 0} - items1, retPag1, err := provider.ListPolicies(ctx, pag1) - require.NoError(t, err) - require.NotNil(t, retPag1) - assert.GreaterOrEqual(t, retPag1.Total, int64(3)) - assert.LessOrEqual(t, len(items1), 2) - - pag2 := &model.Pagination{Limit: 2, Offset: 2} - items2, retPag2, err := provider.ListPolicies(ctx, pag2) - require.NoError(t, err) - require.NotNil(t, retPag2) - assert.GreaterOrEqual(t, len(items2), 0) - - for _, id := range ids { - _ = provider.DeletePolicy(ctx, id) - } - }) - - t.Run("list does not mutate caller pagination pointer", func(t *testing.T) { - pag := &model.Pagination{Limit: 10, Offset: 0} - _, retPag, err := provider.ListPolicies(ctx, pag) - require.NoError(t, err) - assert.NotSame(t, pag, retPag, "ListPolicies should return a new pagination object") - }) - - t.Run("policy targets add get and delete", func(t *testing.T) { - // Create parent policy. - polID := uuid.New().String() - pol := &schemas.Policy{ - ID: polID, - Key: polID, - Name: "pol-targets-" + polID[:8], - Type: constants.PolicyTypeRole, - Logic: constants.PolicyLogicPositive, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err := provider.AddPolicy(ctx, pol) - require.NoError(t, err) - - // Add two targets. - t1ID := uuid.New().String() - t2ID := uuid.New().String() - tgt1 := &schemas.PolicyTarget{ - ID: t1ID, - Key: t1ID, - PolicyID: polID, - TargetType: "role", - TargetValue: "editor", - CreatedAt: time.Now().Unix(), - } - tgt2 := &schemas.PolicyTarget{ - ID: t2ID, - Key: t2ID, - PolicyID: polID, - TargetType: "role", - TargetValue: "admin", - CreatedAt: time.Now().Unix(), - } - _, err = provider.AddPolicyTarget(ctx, tgt1) - require.NoError(t, err) - _, err = provider.AddPolicyTarget(ctx, tgt2) - require.NoError(t, err) - - // GetPolicyTargets should return both. - targets, err := provider.GetPolicyTargets(ctx, polID) - require.NoError(t, err) - assert.Len(t, targets, 2, "expected 2 policy targets") - - // DeletePolicyTargetsByPolicyID removes all targets. - require.NoError(t, provider.DeletePolicyTargetsByPolicyID(ctx, polID)) - - targets, err = provider.GetPolicyTargets(ctx, polID) - require.NoError(t, err) - assert.Empty(t, targets, "targets should be empty after DeletePolicyTargetsByPolicyID") - - // cleanup policy - require.NoError(t, provider.DeletePolicy(ctx, polID)) - }) -} - -// testPermissionOperations covers all Provider methods for authorization permissions -// and their join tables: -// AddPermission, GetPermissionByID, UpdatePermission, ListPermissions, DeletePermission, -// AddPermissionScope, GetPermissionScopes, DeletePermissionScopesByPermissionID, -// AddPermissionPolicy, GetPermissionPolicies, DeletePermissionPoliciesByPermissionID, -// GetPermissionsForResourceScope. -func testPermissionOperations(t *testing.T, ctx context.Context, provider Provider) { - t.Helper() - - // Helper to create a throwaway resource for permission tests. - newResource := func(t *testing.T, nameSuffix string) *schemas.Resource { - t.Helper() - id := uuid.New().String() - r := &schemas.Resource{ID: id, Key: id, Name: "perm-res-" + nameSuffix + "-" + id[:8]} - created, err := provider.AddResource(ctx, r) - require.NoError(t, err) - return created - } - - t.Run("add and get by id", func(t *testing.T) { - res := newResource(t, "add") - id := uuid.New().String() - perm := &schemas.Permission{ - ID: id, - Key: id, - Name: "perm-add-" + id[:8], - Description: "test permission", - ResourceID: res.ID, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - created, err := provider.AddPermission(ctx, perm) - require.NoError(t, err) - require.NotNil(t, created) - assert.Equal(t, perm.Name, created.Name) - assert.Equal(t, res.ID, created.ResourceID) - - fetched, err := provider.GetPermissionByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, perm.Name, fetched.Name) - - // cleanup: permission first (no join rows), then resource - require.NoError(t, provider.DeletePermission(ctx, id)) - require.NoError(t, provider.DeleteResource(ctx, res.ID)) - }) - - t.Run("update mutates persisted fields", func(t *testing.T) { - res := newResource(t, "upd") - id := uuid.New().String() - perm := &schemas.Permission{ - ID: id, - Key: id, - Name: "perm-upd-" + id[:8], - ResourceID: res.ID, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - created, err := provider.AddPermission(ctx, perm) - require.NoError(t, err) - - created.Description = "updated permission description" - created.DecisionStrategy = constants.DecisionStrategyUnanimous - updated, err := provider.UpdatePermission(ctx, created) - require.NoError(t, err) - assert.Equal(t, "updated permission description", updated.Description) - assert.Equal(t, constants.DecisionStrategyUnanimous, updated.DecisionStrategy) - - refetched, err := provider.GetPermissionByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, constants.DecisionStrategyUnanimous, refetched.DecisionStrategy) - - require.NoError(t, provider.DeletePermission(ctx, id)) - require.NoError(t, provider.DeleteResource(ctx, res.ID)) - }) - - t.Run("delete removes the row", func(t *testing.T) { - res := newResource(t, "del") - id := uuid.New().String() - perm := &schemas.Permission{ - ID: id, - Key: id, - Name: "perm-del-" + id[:8], - ResourceID: res.ID, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err := provider.AddPermission(ctx, perm) - require.NoError(t, err) - - require.NoError(t, provider.DeletePermission(ctx, id)) - - _, err = provider.GetPermissionByID(ctx, id) - assert.Error(t, err, "GetPermissionByID should return error after deletion") - - require.NoError(t, provider.DeleteResource(ctx, res.ID)) - }) - - t.Run("list returns inserted rows with correct pagination", func(t *testing.T) { - res := newResource(t, "list") - suffix := uuid.New().String()[:8] - ids := make([]string, 3) - for i := range ids { - id := uuid.New().String() - ids[i] = id - name := fmt.Sprintf("perm-list-%s-%d", suffix, i) - perm := &schemas.Permission{ - ID: id, - Key: id, - Name: name, - ResourceID: res.ID, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err := provider.AddPermission(ctx, perm) - require.NoError(t, err) - } - - pag1 := &model.Pagination{Limit: 2, Offset: 0} - items1, retPag1, err := provider.ListPermissions(ctx, pag1) - require.NoError(t, err) - require.NotNil(t, retPag1) - assert.GreaterOrEqual(t, retPag1.Total, int64(3)) - assert.LessOrEqual(t, len(items1), 2) - - pag2 := &model.Pagination{Limit: 2, Offset: 2} - items2, retPag2, err := provider.ListPermissions(ctx, pag2) - require.NoError(t, err) - require.NotNil(t, retPag2) - assert.GreaterOrEqual(t, len(items2), 0) - - // cleanup: permissions first, then resource - for _, id := range ids { - _ = provider.DeletePermission(ctx, id) - } - require.NoError(t, provider.DeleteResource(ctx, res.ID)) - }) - - t.Run("list does not mutate caller pagination pointer", func(t *testing.T) { - pag := &model.Pagination{Limit: 10, Offset: 0} - _, retPag, err := provider.ListPermissions(ctx, pag) - require.NoError(t, err) - assert.NotSame(t, pag, retPag, "ListPermissions should return a new pagination object") - }) - - t.Run("permission scopes add get and delete", func(t *testing.T) { - res := newResource(t, "ps") - permID := uuid.New().String() - perm := &schemas.Permission{ - ID: permID, - Key: permID, - Name: "perm-ps-" + permID[:8], - ResourceID: res.ID, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err := provider.AddPermission(ctx, perm) - require.NoError(t, err) - - // Create two scopes and link them. - scopeID1 := uuid.New().String() - scope1 := &schemas.Scope{ID: scopeID1, Key: scopeID1, Name: "scope-ps1-" + scopeID1[:8]} - _, err = provider.AddScope(ctx, scope1) - require.NoError(t, err) - - scopeID2 := uuid.New().String() - scope2 := &schemas.Scope{ID: scopeID2, Key: scopeID2, Name: "scope-ps2-" + scopeID2[:8]} - _, err = provider.AddScope(ctx, scope2) - require.NoError(t, err) - - ps1ID := uuid.New().String() - ps1 := &schemas.PermissionScope{ - ID: ps1ID, - Key: ps1ID, - PermissionID: permID, - ScopeID: scopeID1, - CreatedAt: time.Now().Unix(), - } - ps2ID := uuid.New().String() - ps2 := &schemas.PermissionScope{ - ID: ps2ID, - Key: ps2ID, - PermissionID: permID, - ScopeID: scopeID2, - CreatedAt: time.Now().Unix(), - } - _, err = provider.AddPermissionScope(ctx, ps1) - require.NoError(t, err) - _, err = provider.AddPermissionScope(ctx, ps2) - require.NoError(t, err) - - psLinks, err := provider.GetPermissionScopes(ctx, permID) - require.NoError(t, err) - assert.Len(t, psLinks, 2, "expected 2 permission-scope links") - - require.NoError(t, provider.DeletePermissionScopesByPermissionID(ctx, permID)) - - psLinks, err = provider.GetPermissionScopes(ctx, permID) - require.NoError(t, err) - assert.Empty(t, psLinks, "permission scopes should be empty after delete") - - // cleanup - require.NoError(t, provider.DeletePermission(ctx, permID)) - require.NoError(t, provider.DeleteScope(ctx, scopeID1)) - require.NoError(t, provider.DeleteScope(ctx, scopeID2)) - require.NoError(t, provider.DeleteResource(ctx, res.ID)) - }) - - t.Run("permission policies add get and delete", func(t *testing.T) { - res := newResource(t, "pp") - permID := uuid.New().String() - perm := &schemas.Permission{ - ID: permID, - Key: permID, - Name: "perm-pp-" + permID[:8], - ResourceID: res.ID, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err := provider.AddPermission(ctx, perm) - require.NoError(t, err) - - // Create two policies and link them. - polID1 := uuid.New().String() - pol1 := &schemas.Policy{ - ID: polID1, - Key: polID1, - Name: "pol-pp1-" + polID1[:8], - Type: constants.PolicyTypeRole, - Logic: constants.PolicyLogicPositive, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err = provider.AddPolicy(ctx, pol1) - require.NoError(t, err) - - polID2 := uuid.New().String() - pol2 := &schemas.Policy{ - ID: polID2, - Key: polID2, - Name: "pol-pp2-" + polID2[:8], - Type: constants.PolicyTypeUser, - Logic: constants.PolicyLogicPositive, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err = provider.AddPolicy(ctx, pol2) - require.NoError(t, err) - - pp1ID := uuid.New().String() - pp1 := &schemas.PermissionPolicy{ - ID: pp1ID, - Key: pp1ID, - PermissionID: permID, - PolicyID: polID1, - CreatedAt: time.Now().Unix(), - } - pp2ID := uuid.New().String() - pp2 := &schemas.PermissionPolicy{ - ID: pp2ID, - Key: pp2ID, - PermissionID: permID, - PolicyID: polID2, - CreatedAt: time.Now().Unix(), - } - _, err = provider.AddPermissionPolicy(ctx, pp1) - require.NoError(t, err) - _, err = provider.AddPermissionPolicy(ctx, pp2) - require.NoError(t, err) - - ppLinks, err := provider.GetPermissionPolicies(ctx, permID) - require.NoError(t, err) - assert.Len(t, ppLinks, 2, "expected 2 permission-policy links") - - require.NoError(t, provider.DeletePermissionPoliciesByPermissionID(ctx, permID)) - - ppLinks, err = provider.GetPermissionPolicies(ctx, permID) - require.NoError(t, err) - assert.Empty(t, ppLinks, "permission policies should be empty after delete") - - // cleanup - require.NoError(t, provider.DeletePermission(ctx, permID)) - require.NoError(t, provider.DeletePolicy(ctx, polID1)) - require.NoError(t, provider.DeletePolicy(ctx, polID2)) - require.NoError(t, provider.DeleteResource(ctx, res.ID)) - }) - - t.Run("GetPermissionsForResourceScope evaluator hot-path", func(t *testing.T) { - // Seed: resource + scope + policy (with one target) + permission linking all three. - resID := uuid.New().String() - suffix := resID[:8] - resource := &schemas.Resource{ID: resID, Key: resID, Name: "evalres-" + suffix} - _, err := provider.AddResource(ctx, resource) - require.NoError(t, err) - - scopeID := uuid.New().String() - scope := &schemas.Scope{ID: scopeID, Key: scopeID, Name: "evalscope-" + suffix} - _, err = provider.AddScope(ctx, scope) - require.NoError(t, err) - - polID := uuid.New().String() - policy := &schemas.Policy{ - ID: polID, - Key: polID, - Name: "evalpol-" + suffix, - Type: constants.PolicyTypeRole, - Logic: constants.PolicyLogicPositive, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err = provider.AddPolicy(ctx, policy) - require.NoError(t, err) - - tgtID := uuid.New().String() - tgt := &schemas.PolicyTarget{ - ID: tgtID, - Key: tgtID, - PolicyID: polID, - TargetType: "role", - TargetValue: "editor", - CreatedAt: time.Now().Unix(), - } - _, err = provider.AddPolicyTarget(ctx, tgt) - require.NoError(t, err) - - permID := uuid.New().String() - perm := &schemas.Permission{ - ID: permID, - Key: permID, - Name: "evalperm-" + suffix, - ResourceID: resID, - DecisionStrategy: constants.DecisionStrategyAffirmative, - } - _, err = provider.AddPermission(ctx, perm) - require.NoError(t, err) - - // Link scope to permission. - psID := uuid.New().String() - ps := &schemas.PermissionScope{ - ID: psID, - Key: psID, - PermissionID: permID, - ScopeID: scopeID, - CreatedAt: time.Now().Unix(), - } - _, err = provider.AddPermissionScope(ctx, ps) - require.NoError(t, err) - - // Link policy to permission. - ppID := uuid.New().String() - pp := &schemas.PermissionPolicy{ - ID: ppID, - Key: ppID, - PermissionID: permID, - PolicyID: polID, - CreatedAt: time.Now().Unix(), - } - _, err = provider.AddPermissionPolicy(ctx, pp) - require.NoError(t, err) - - // Query the evaluator hot-path by resource name and scope name. - results, err := provider.GetPermissionsForResourceScope(ctx, resource.Name, scope.Name) - require.NoError(t, err) - require.NotEmpty(t, results, "expected at least one PermissionWithPolicies") - - // Find our seeded permission in the results (other tests may have left rows). - var found *schemas.PermissionWithPolicies - for _, r := range results { - if r.PermissionID == permID { - found = r - break - } - } - require.NotNil(t, found, "seeded permission not found in GetPermissionsForResourceScope result") - assert.Equal(t, perm.Name, found.PermissionName) - assert.Equal(t, constants.DecisionStrategyAffirmative, found.DecisionStrategy) - require.NotEmpty(t, found.Policies, "expected at least one policy in the result") - - var foundPol *schemas.PolicyWithTargets - for i := range found.Policies { - if found.Policies[i].PolicyID == polID { - foundPol = &found.Policies[i] - break - } - } - require.NotNil(t, foundPol, "seeded policy not found in PermissionWithPolicies.Policies") - assert.Equal(t, policy.Name, foundPol.PolicyName) - assert.Equal(t, constants.PolicyTypeRole, foundPol.Type) - require.NotEmpty(t, foundPol.Targets, "expected policy target in result") - assert.Equal(t, "role", foundPol.Targets[0].TargetType) - assert.Equal(t, "editor", foundPol.Targets[0].TargetValue) - - // cleanup: join rows first, then leaves, then root resource - _ = provider.DeletePermissionScopesByPermissionID(ctx, permID) - _ = provider.DeletePermissionPoliciesByPermissionID(ctx, permID) - _ = provider.DeletePermission(ctx, permID) - _ = provider.DeletePolicyTargetsByPolicyID(ctx, polID) - _ = provider.DeletePolicy(ctx, polID) - _ = provider.DeleteScope(ctx, scopeID) - _ = provider.DeleteResource(ctx, resID) - }) -} diff --git a/internal/storage/schemas/model.go b/internal/storage/schemas/model.go index 86653692..43f4e464 100644 --- a/internal/storage/schemas/model.go +++ b/internal/storage/schemas/model.go @@ -16,14 +16,6 @@ type CollectionList struct { MFASession string OAuthState string AuditLog string - // Authorization tables - Resource string - Scope string - Policy string - PolicyTarget string - Permission string - PermissionScope string - PermissionPolicy string } var ( @@ -45,13 +37,5 @@ var ( MFASession: Prefix + "mfa_sessions", OAuthState: Prefix + "oauth_states", AuditLog: Prefix + "audit_logs", - // Authorization collections - Resource: Prefix + "resources", - Scope: Prefix + "scopes", - Policy: Prefix + "policies", - PolicyTarget: Prefix + "policy_targets", - Permission: Prefix + "permissions", - PermissionScope: Prefix + "permission_scopes", - PermissionPolicy: Prefix + "permission_policies", } ) diff --git a/internal/storage/schemas/permission.go b/internal/storage/schemas/permission.go deleted file mode 100644 index 5d4fd89f..00000000 --- a/internal/storage/schemas/permission.go +++ /dev/null @@ -1,112 +0,0 @@ -package schemas - -import "github.com/authorizerdev/authorizer/internal/graph/model" - -// Permission is the binding layer of the authorization model. -// It connects a Resource to Scopes (via PermissionScope) and Policies (via PermissionPolicy). -// A permission answers: "WHO can do WHAT on WHICH resource?" -type Permission struct { - // ID is the unique identifier (UUID v4). - ID string `json:"id" gorm:"primaryKey;type:char(36)" bson:"_id" cql:"id" dynamo:"id,hash"` - // Key is an alias for ID used by some NoSQL providers (json tag is "_key" for arangodb document key). - Key string `json:"_key,omitempty" gorm:"type:char(36)" bson:"key" cql:"key" dynamo:"key"` - // Name is a unique human-readable identifier (e.g., "edit-documents"). - Name string `json:"name" gorm:"type:varchar(100);uniqueIndex" bson:"name" cql:"name" dynamo:"name"` - // Description provides optional context about this permission. - Description string `json:"description" gorm:"type:text" bson:"description" cql:"description" dynamo:"description"` - // ResourceID is the foreign key to the Resource this permission protects. - ResourceID string `json:"resource_id" gorm:"type:char(36);index" bson:"resource_id" cql:"resource_id" dynamo:"resource_id"` - // DecisionStrategy controls how multiple policies attached to this permission are evaluated. - // "affirmative" = any policy grants access (OR), "unanimous" = all must agree (AND). - DecisionStrategy string `json:"decision_strategy" gorm:"type:varchar(20);default:affirmative" bson:"decision_strategy" cql:"decision_strategy" dynamo:"decision_strategy"` - // CreatedAt is the unix timestamp of creation. - CreatedAt int64 `json:"created_at" gorm:"autoCreateTime" bson:"created_at" cql:"created_at" dynamo:"created_at"` - // UpdatedAt is the unix timestamp of last update. - UpdatedAt int64 `json:"updated_at" gorm:"autoUpdateTime" bson:"updated_at" cql:"updated_at" dynamo:"updated_at"` -} - -// PermissionScope is the join table linking a Permission to its allowed Scopes. -// A permission can cover multiple scopes (e.g., "read" and "write"). -type PermissionScope struct { - // ID is the unique identifier (UUID v4). - ID string `json:"id" gorm:"primaryKey;type:char(36)" bson:"_id" cql:"id" dynamo:"id,hash"` - // Key is an alias for ID used by some NoSQL providers (json tag is "_key" for arangodb document key). - Key string `json:"_key,omitempty" gorm:"type:char(36)" bson:"key" cql:"key" dynamo:"key"` - // PermissionID is the foreign key to the parent Permission. - PermissionID string `json:"permission_id" gorm:"type:char(36);index;uniqueIndex:idx_ps_unique" bson:"permission_id" cql:"permission_id" dynamo:"permission_id"` - // ScopeID is the foreign key to the Scope. - ScopeID string `json:"scope_id" gorm:"type:char(36);index;uniqueIndex:idx_ps_unique" bson:"scope_id" cql:"scope_id" dynamo:"scope_id"` - // CreatedAt is the unix timestamp of creation. - CreatedAt int64 `json:"created_at" gorm:"autoCreateTime" bson:"created_at" cql:"created_at" dynamo:"created_at"` -} - -// PermissionPolicy is the join table linking a Permission to its governing Policies. -// A permission can be governed by multiple policies, evaluated using the permission's DecisionStrategy. -type PermissionPolicy struct { - // ID is the unique identifier (UUID v4). - ID string `json:"id" gorm:"primaryKey;type:char(36)" bson:"_id" cql:"id" dynamo:"id,hash"` - // Key is an alias for ID used by some NoSQL providers (json tag is "_key" for arangodb document key). - Key string `json:"_key,omitempty" gorm:"type:char(36)" bson:"key" cql:"key" dynamo:"key"` - // PermissionID is the foreign key to the parent Permission. - PermissionID string `json:"permission_id" gorm:"type:char(36);index;uniqueIndex:idx_pp_unique" bson:"permission_id" cql:"permission_id" dynamo:"permission_id"` - // PolicyID is the foreign key to the Policy. - PolicyID string `json:"policy_id" gorm:"type:char(36);index;uniqueIndex:idx_pp_unique" bson:"policy_id" cql:"policy_id" dynamo:"policy_id"` - // CreatedAt is the unix timestamp of creation. - CreatedAt int64 `json:"created_at" gorm:"autoCreateTime" bson:"created_at" cql:"created_at" dynamo:"created_at"` -} - -// PermissionWithPolicies is a denormalized view used by the evaluation engine. -// It bundles a permission with its resolved policies and targets for efficient -// single-query evaluation. Not a database table -- constructed by -// GetPermissionsForResourceScope(). -type PermissionWithPolicies struct { - // PermissionID is the permission being evaluated. - PermissionID string - // PermissionName is for logging and debugging. - PermissionName string - // DecisionStrategy is how to combine policy results for this permission. - DecisionStrategy string - // Policies contains the resolved policies with their targets. - Policies []PolicyWithTargets -} - -// PolicyWithTargets bundles a policy with its resolved targets. -// Used by the evaluation engine to avoid N+1 queries. -type PolicyWithTargets struct { - // PolicyID is the policy identifier. - PolicyID string - // PolicyName is for logging and debugging. - PolicyName string - // Type is the policy type discriminator (role, user, client, agent). - Type string - // Logic is positive or negative. - Logic string - // DecisionStrategy is how to combine targets within this policy. - DecisionStrategy string - // Targets are the resolved policy targets. - Targets []PolicyTargetView -} - -// PolicyTargetView is a read-only view of a policy target for evaluation. -type PolicyTargetView struct { - // TargetType is "role", "user", "client", or "agent". - TargetType string - // TargetValue is the role name, user ID, client ID, or agent ID. - TargetValue string -} - -// AsAPIPermission converts a storage Permission to the GraphQL API model -// with its resolved resource, scopes, and policies. -func (p *Permission) AsAPIPermission(resource *model.AuthzResource, scopes []*model.AuthzScope, policies []*model.AuthzPolicy) *model.AuthzPermission { - return &model.AuthzPermission{ - ID: p.ID, - Name: p.Name, - Description: &p.Description, - Resource: resource, - Scopes: scopes, - Policies: policies, - DecisionStrategy: p.DecisionStrategy, - CreatedAt: p.CreatedAt, - UpdatedAt: p.UpdatedAt, - } -} diff --git a/internal/storage/schemas/policy.go b/internal/storage/schemas/policy.go deleted file mode 100644 index d6ac60ec..00000000 --- a/internal/storage/schemas/policy.go +++ /dev/null @@ -1,73 +0,0 @@ -package schemas - -import "github.com/authorizerdev/authorizer/internal/graph/model" - -// Policy defines conditions for granting or denying access. -// Policies are the brain of the authorization model -- they determine WHO gets access. -// A policy has a Type (role-based, user-based, etc.) and Logic (positive=grant, negative=deny). -type Policy struct { - // ID is the unique identifier (UUID v4). - ID string `json:"id" gorm:"primaryKey;type:char(36)" bson:"_id" cql:"id" dynamo:"id,hash"` - // Key is an alias for ID used by some NoSQL providers (json tag is "_key" for arangodb document key). - Key string `json:"_key,omitempty" gorm:"type:char(36)" bson:"key" cql:"key" dynamo:"key"` - // Name is a unique human-readable identifier (e.g., "editors-policy"). - Name string `json:"name" gorm:"type:varchar(100);uniqueIndex" bson:"name" cql:"name" dynamo:"name"` - // Description provides optional context about this policy. - Description string `json:"description" gorm:"type:text" bson:"description" cql:"description" dynamo:"description"` - // Type is the policy type discriminator: "role" or "user" (extensible to "client", "agent"). - // See constants.PolicyTypeRole, constants.PolicyTypeUser. - Type string `json:"type" gorm:"type:varchar(50);index" bson:"type" cql:"type" dynamo:"type"` - // Logic determines whether matching GRANTS or DENIES access. - // "positive" = grant when matched, "negative" = deny when matched. - // See constants.PolicyLogicPositive, constants.PolicyLogicNegative. - Logic string `json:"logic" gorm:"type:varchar(10);default:positive" bson:"logic" cql:"logic" dynamo:"logic"` - // DecisionStrategy controls how multiple targets within this policy are evaluated. - // "affirmative" = any target match grants, "unanimous" = all targets must match. - // See constants.DecisionStrategyAffirmative, constants.DecisionStrategyUnanimous. - DecisionStrategy string `json:"decision_strategy" gorm:"type:varchar(20);default:affirmative" bson:"decision_strategy" cql:"decision_strategy" dynamo:"decision_strategy"` - // CreatedAt is the unix timestamp of creation. - CreatedAt int64 `json:"created_at" gorm:"autoCreateTime" bson:"created_at" cql:"created_at" dynamo:"created_at"` - // UpdatedAt is the unix timestamp of last update. - UpdatedAt int64 `json:"updated_at" gorm:"autoUpdateTime" bson:"updated_at" cql:"updated_at" dynamo:"updated_at"` -} - -// PolicyTarget specifies who/what a policy applies to. -// For a role-based policy, targets are role names. For a user-based policy, targets are user IDs. -type PolicyTarget struct { - // ID is the unique identifier (UUID v4). - ID string `json:"id" gorm:"primaryKey;type:char(36)" bson:"_id" cql:"id" dynamo:"id,hash"` - // Key is an alias for ID used by some NoSQL providers (json tag is "_key" for arangodb document key). - Key string `json:"_key,omitempty" gorm:"type:char(36)" bson:"key" cql:"key" dynamo:"key"` - // PolicyID is the foreign key to the parent Policy. - PolicyID string `json:"policy_id" gorm:"type:char(36);index;uniqueIndex:idx_pt_unique" bson:"policy_id" cql:"policy_id" dynamo:"policy_id"` - // TargetType describes what kind of target this is: "role" or "user" - // (extensible to "client", "agent"). - TargetType string `json:"target_type" gorm:"type:varchar(50);uniqueIndex:idx_pt_unique" bson:"target_type" cql:"target_type" dynamo:"target_type"` - // TargetValue is the role name or user/client/agent ID this target matches. - TargetValue string `json:"target_value" gorm:"type:varchar(256);uniqueIndex:idx_pt_unique" bson:"target_value" cql:"target_value" dynamo:"target_value"` - // CreatedAt is the unix timestamp of creation. - CreatedAt int64 `json:"created_at" gorm:"autoCreateTime" bson:"created_at" cql:"created_at" dynamo:"created_at"` -} - -// AsAPIPolicy converts a storage Policy and its targets to the GraphQL API model. -func (p *Policy) AsAPIPolicy(targets []*PolicyTarget) *model.AuthzPolicy { - apiTargets := make([]*model.AuthzPolicyTarget, len(targets)) - for i, t := range targets { - apiTargets[i] = &model.AuthzPolicyTarget{ - ID: t.ID, - TargetType: t.TargetType, - TargetValue: t.TargetValue, - } - } - return &model.AuthzPolicy{ - ID: p.ID, - Name: p.Name, - Description: &p.Description, - Type: p.Type, - Logic: p.Logic, - DecisionStrategy: p.DecisionStrategy, - Targets: apiTargets, - CreatedAt: p.CreatedAt, - UpdatedAt: p.UpdatedAt, - } -} diff --git a/internal/storage/schemas/resource.go b/internal/storage/schemas/resource.go deleted file mode 100644 index b66d66d2..00000000 --- a/internal/storage/schemas/resource.go +++ /dev/null @@ -1,33 +0,0 @@ -package schemas - -import "github.com/authorizerdev/authorizer/internal/graph/model" - -// Resource represents a protected resource type in the authorization model. -// Resources are types (e.g., "document", "invoice"), not instances. -// They define WHAT is being protected. -type Resource struct { - // ID is the unique identifier (UUID v4). - ID string `json:"id" gorm:"primaryKey;type:char(36)" bson:"_id" cql:"id" dynamo:"id,hash"` - // Key is an alias for ID used by some NoSQL providers (json tag is "_key" for arangodb document key). - Key string `json:"_key,omitempty" gorm:"type:char(36)" bson:"key" cql:"key" dynamo:"key"` - // Name is a unique human-readable identifier (e.g., "document", "invoice"). - // Must be alphanumeric with hyphens and underscores, max 100 chars. - Name string `json:"name" gorm:"type:varchar(100);uniqueIndex" bson:"name" cql:"name" dynamo:"name"` - // Description provides optional context about what this resource represents. - Description string `json:"description" gorm:"type:text" bson:"description" cql:"description" dynamo:"description"` - // CreatedAt is the unix timestamp of creation. - CreatedAt int64 `json:"created_at" gorm:"autoCreateTime" bson:"created_at" cql:"created_at" dynamo:"created_at"` - // UpdatedAt is the unix timestamp of last update. - UpdatedAt int64 `json:"updated_at" gorm:"autoUpdateTime" bson:"updated_at" cql:"updated_at" dynamo:"updated_at"` -} - -// AsAPIResource converts a storage Resource to the GraphQL API model. -func (r *Resource) AsAPIResource() *model.AuthzResource { - return &model.AuthzResource{ - ID: r.ID, - Name: r.Name, - Description: &r.Description, - CreatedAt: r.CreatedAt, - UpdatedAt: r.UpdatedAt, - } -} diff --git a/internal/storage/schemas/scope.go b/internal/storage/schemas/scope.go deleted file mode 100644 index c8597c07..00000000 --- a/internal/storage/schemas/scope.go +++ /dev/null @@ -1,33 +0,0 @@ -package schemas - -import "github.com/authorizerdev/authorizer/internal/graph/model" - -// Scope represents an action that can be performed on a resource. -// Scopes are global verbs (e.g., "read", "write", "delete", "approve"). -// They define WHAT ACTIONS are allowed. -type Scope struct { - // ID is the unique identifier (UUID v4). - ID string `json:"id" gorm:"primaryKey;type:char(36)" bson:"_id" cql:"id" dynamo:"id,hash"` - // Key is an alias for ID used by some NoSQL providers (json tag is "_key" for arangodb document key). - Key string `json:"_key,omitempty" gorm:"type:char(36)" bson:"key" cql:"key" dynamo:"key"` - // Name is a unique human-readable identifier (e.g., "read", "write"). - // Must be alphanumeric with hyphens and underscores, max 100 chars. - Name string `json:"name" gorm:"type:varchar(100);uniqueIndex" bson:"name" cql:"name" dynamo:"name"` - // Description provides optional context about what this scope represents. - Description string `json:"description" gorm:"type:text" bson:"description" cql:"description" dynamo:"description"` - // CreatedAt is the unix timestamp of creation. - CreatedAt int64 `json:"created_at" gorm:"autoCreateTime" bson:"created_at" cql:"created_at" dynamo:"created_at"` - // UpdatedAt is the unix timestamp of last update. - UpdatedAt int64 `json:"updated_at" gorm:"autoUpdateTime" bson:"updated_at" cql:"updated_at" dynamo:"updated_at"` -} - -// AsAPIScope converts a storage Scope to the GraphQL API model. -func (s *Scope) AsAPIScope() *model.AuthzScope { - return &model.AuthzScope{ - ID: s.ID, - Name: s.Name, - Description: &s.Description, - CreatedAt: s.CreatedAt, - UpdatedAt: s.UpdatedAt, - } -} diff --git a/web/dashboard/src/components/FgaNotEnabled.tsx b/web/dashboard/src/components/FgaNotEnabled.tsx new file mode 100644 index 00000000..2ca1016c --- /dev/null +++ b/web/dashboard/src/components/FgaNotEnabled.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { ShieldOff } from 'lucide-react'; + +// FgaNotEnabled renders an informative empty state shown when the backend +// reports that fine-grained authorization is not enabled (the server is not +// running with --authorization-engine=fga). +const FgaNotEnabled = () => { + return ( +
+ +

+ Fine-Grained Authorization is not enabled +

+

+ Start the Authorizer server with{' '} + + --authorization-engine=fga + {' '} + to manage authorization models, relationship tuples and run access + checks from this dashboard. +

+
+ ); +}; + +export default FgaNotEnabled; diff --git a/web/dashboard/src/components/Sidebar.tsx b/web/dashboard/src/components/Sidebar.tsx index bc4d7dbd..91b3b696 100644 --- a/web/dashboard/src/components/Sidebar.tsx +++ b/web/dashboard/src/components/Sidebar.tsx @@ -11,7 +11,10 @@ import { LogOut, Menu, ExternalLink, - Shield, + ShieldCheck, + FileCode, + Network, + SearchCheck, } from 'lucide-react'; import type { LucideIcon } from 'lucide-react'; import { cn } from '../lib/utils'; @@ -32,8 +35,42 @@ const navItems: NavItemConfig[] = [ { name: 'Users', icon: Users, route: '/users' }, { name: 'Webhooks', icon: Webhook, route: '/webhooks' }, { name: 'Email Templates', icon: Mail, route: '/email-templates' }, - { name: 'Authorization', icon: Shield, route: '/authorization' }, { name: 'Audit Logs', icon: ScrollText, route: '/audit-logs' }, +]; + +interface NavGroupConfig { + name: string; + icon: LucideIcon; + basePath: string; + items: NavItemConfig[]; +} + +const navGroups: NavGroupConfig[] = [ + { + name: 'Authorization', + icon: ShieldCheck, + basePath: '/authorization', + items: [ + { + name: 'Authorization Model', + icon: FileCode, + route: '/authorization/model', + }, + { + name: 'Relationship Tuples', + icon: Network, + route: '/authorization/tuples', + }, + { + name: 'Access Tester', + icon: SearchCheck, + route: '/authorization/tester', + }, + ], + }, +]; + +const externalNavItems: NavItemConfig[] = [ { name: 'API Playground', icon: SquareTerminal, @@ -76,24 +113,8 @@ export const Sidebar = ({ onClose }: SidebarProps) => { {/* Navigation */} -