diff --git a/server/__test__/config_test.go b/server/__test__/config_test.go new file mode 100644 index 0000000..09df58a --- /dev/null +++ b/server/__test__/config_test.go @@ -0,0 +1,28 @@ +package test + +import ( + "log" + "testing" + + "github.com/authorizerdev/authorizer/server/constants" + "github.com/authorizerdev/authorizer/server/resolvers" + "github.com/authorizerdev/authorizer/server/utils" + "github.com/stretchr/testify/assert" +) + +func configTests(s TestSetup, t *testing.T) { + t.Run(`should get config`, func(t *testing.T) { + req, ctx := createContext(s) + _, err := resolvers.ConfigResolver(ctx) + log.Println("error:", err) + assert.NotNil(t, err) + + h, err := utils.HashPassword(constants.EnvData.ADMIN_SECRET) + assert.Nil(t, err) + req.Header.Add("Authorization", "Bearer "+h) + res, err := resolvers.ConfigResolver(ctx) + + assert.Nil(t, err) + assert.Equal(t, *res.AdminSecret, constants.EnvData.ADMIN_SECRET) + }) +} diff --git a/server/__test__/resolvers_test.go b/server/__test__/resolvers_test.go index 83559bc..59224e7 100644 --- a/server/__test__/resolvers_test.go +++ b/server/__test__/resolvers_test.go @@ -47,6 +47,7 @@ func TestResolvers(t *testing.T) { adminLoginTests(s, t) adminSessionTests(s, t) updateConfigTests(s, t) + configTests(s, t) }) } } diff --git a/server/graph/generated/generated.go b/server/graph/generated/generated.go index 5230e13..c7f2882 100644 --- a/server/graph/generated/generated.go +++ b/server/graph/generated/generated.go @@ -88,7 +88,6 @@ type ComplexityRoot struct { SMTPPort func(childComplexity int) int SenderEmail func(childComplexity int) int SenderPassword func(childComplexity int) int - Version func(childComplexity int) int } Error struct { @@ -473,13 +472,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Config.SenderPassword(childComplexity), true - case "Config.VERSION": - if e.complexity.Config.Version == nil { - break - } - - return e.complexity.Config.Version(childComplexity), true - case "Error.message": if e.complexity.Error.Message == nil { break @@ -1058,7 +1050,6 @@ type AdminLoginResponse { type Config { ADMIN_SECRET: String - VERSION: String DATABASE_TYPE: String DATABASE_URL: String DATABASE_NAME: String @@ -1094,7 +1085,6 @@ type Config { input UpdateConfigInput { ADMIN_SECRET: String - VERSION: String DATABASE_TYPE: String DATABASE_URL: String DATABASE_NAME: String @@ -1726,38 +1716,6 @@ func (ec *executionContext) _Config_ADMIN_SECRET(ctx context.Context, field grap return ec.marshalOString2ᚖstring(ctx, field.Selections, res) } -func (ec *executionContext) _Config_VERSION(ctx context.Context, field graphql.CollectedField, obj *model.Config) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "Config", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Version, 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) _Config_DATABASE_TYPE(ctx context.Context, field graphql.CollectedField, obj *model.Config) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { @@ -6207,14 +6165,6 @@ func (ec *executionContext) unmarshalInputUpdateConfigInput(ctx context.Context, if err != nil { return it, err } - case "VERSION": - var err error - - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("VERSION")) - it.Version, err = ec.unmarshalOString2ᚖstring(ctx, v) - if err != nil { - return it, err - } case "DATABASE_TYPE": var err error @@ -6792,8 +6742,6 @@ func (ec *executionContext) _Config(ctx context.Context, sel ast.SelectionSet, o out.Values[i] = graphql.MarshalString("Config") case "ADMIN_SECRET": out.Values[i] = ec._Config_ADMIN_SECRET(ctx, field, obj) - case "VERSION": - out.Values[i] = ec._Config_VERSION(ctx, field, obj) case "DATABASE_TYPE": out.Values[i] = ec._Config_DATABASE_TYPE(ctx, field, obj) case "DATABASE_URL": diff --git a/server/graph/model/models_gen.go b/server/graph/model/models_gen.go index a06cb59..877ee96 100644 --- a/server/graph/model/models_gen.go +++ b/server/graph/model/models_gen.go @@ -20,7 +20,6 @@ type AuthResponse struct { type Config struct { AdminSecret *string `json:"ADMIN_SECRET"` - Version *string `json:"VERSION"` DatabaseType *string `json:"DATABASE_TYPE"` DatabaseURL *string `json:"DATABASE_URL"` DatabaseName *string `json:"DATABASE_NAME"` @@ -120,7 +119,6 @@ type SignUpInput struct { type UpdateConfigInput struct { AdminSecret *string `json:"ADMIN_SECRET"` - Version *string `json:"VERSION"` DatabaseType *string `json:"DATABASE_TYPE"` DatabaseURL *string `json:"DATABASE_URL"` DatabaseName *string `json:"DATABASE_NAME"` diff --git a/server/graph/schema.graphqls b/server/graph/schema.graphqls index b03a78c..cfb5ad8 100644 --- a/server/graph/schema.graphqls +++ b/server/graph/schema.graphqls @@ -69,7 +69,6 @@ type AdminLoginResponse { type Config { ADMIN_SECRET: String - VERSION: String DATABASE_TYPE: String DATABASE_URL: String DATABASE_NAME: String @@ -105,7 +104,6 @@ type Config { input UpdateConfigInput { ADMIN_SECRET: String - VERSION: String DATABASE_TYPE: String DATABASE_URL: String DATABASE_NAME: String diff --git a/server/graph/schema.resolvers.go b/server/graph/schema.resolvers.go index 8edc26e..4bf8a5a 100644 --- a/server/graph/schema.resolvers.go +++ b/server/graph/schema.resolvers.go @@ -5,7 +5,6 @@ package graph import ( "context" - "fmt" "github.com/authorizerdev/authorizer/server/graph/generated" "github.com/authorizerdev/authorizer/server/graph/model" @@ -89,7 +88,7 @@ func (r *queryResolver) AdminSession(ctx context.Context) (*model.AdminLoginResp } func (r *queryResolver) Config(ctx context.Context) (*model.Config, error) { - panic(fmt.Errorf("not implemented")) + return resolvers.ConfigResolver(ctx) } // Mutation returns generated.MutationResolver implementation. @@ -98,5 +97,7 @@ func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResol // Query returns generated.QueryResolver implementation. func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} } -type mutationResolver struct{ *Resolver } -type queryResolver struct{ *Resolver } +type ( + mutationResolver struct{ *Resolver } + queryResolver struct{ *Resolver } +) diff --git a/server/handlers/dashboard.go b/server/handlers/dashboard.go index 050ba3c..f16e442 100644 --- a/server/handlers/dashboard.go +++ b/server/handlers/dashboard.go @@ -10,7 +10,8 @@ import ( func DashboardHandler() gin.HandlerFunc { return func(c *gin.Context) { isOnboardingCompleted := false - if constants.EnvData.ADMIN_SECRET != "" && constants.EnvData.DATABASE_TYPE != "" && constants.EnvData.DATABASE_URL != "" { + + if constants.EnvData.ADMIN_SECRET != "" { isOnboardingCompleted = true } diff --git a/server/resolvers/config.go b/server/resolvers/config.go new file mode 100644 index 0000000..6165eea --- /dev/null +++ b/server/resolvers/config.go @@ -0,0 +1,59 @@ +package resolvers + +import ( + "context" + "fmt" + + "github.com/authorizerdev/authorizer/server/constants" + "github.com/authorizerdev/authorizer/server/graph/model" + "github.com/authorizerdev/authorizer/server/utils" +) + +func ConfigResolver(ctx context.Context) (*model.Config, error) { + gc, err := utils.GinContextFromContext(ctx) + var res *model.Config + + if err != nil { + return res, err + } + + if !utils.IsSuperAdmin(gc) { + return res, fmt.Errorf("unauthorized") + } + + res = &model.Config{ + AdminSecret: &constants.EnvData.ADMIN_SECRET, + DatabaseType: &constants.EnvData.DATABASE_TYPE, + DatabaseURL: &constants.EnvData.DATABASE_URL, + DatabaseName: &constants.EnvData.DATABASE_NAME, + SMTPHost: &constants.EnvData.SMTP_HOST, + SMTPPort: &constants.EnvData.SMTP_PORT, + SenderEmail: &constants.EnvData.SENDER_EMAIL, + SenderPassword: &constants.EnvData.SENDER_PASSWORD, + JwtType: &constants.EnvData.JWT_TYPE, + JwtSecret: &constants.EnvData.JWT_SECRET, + AllowedOrigins: constants.EnvData.ALLOWED_ORIGINS, + AuthorizerURL: &constants.EnvData.AUTHORIZER_URL, + AppURL: &constants.EnvData.APP_URL, + RedisURL: &constants.EnvData.REDIS_URL, + CookieName: &constants.EnvData.COOKIE_NAME, + ResetPasswordURL: &constants.EnvData.RESET_PASSWORD_URL, + DisableEmailVerification: &constants.EnvData.DISABLE_EMAIL_VERIFICATION, + DisableBasicAuthentication: &constants.EnvData.DISABLE_BASIC_AUTHENTICATION, + DisableMagicLinkLogin: &constants.EnvData.DISABLE_MAGIC_LINK_LOGIN, + DisableLoginPage: &constants.EnvData.DISABLE_LOGIN_PAGE, + Roles: constants.EnvData.ROLES, + ProtectedRoles: constants.EnvData.PROTECTED_ROLES, + DefaultRoles: constants.EnvData.DEFAULT_ROLES, + JwtRoleClaim: &constants.EnvData.JWT_ROLE_CLAIM, + GoogleClientID: &constants.EnvData.GOOGLE_CLIENT_ID, + GoogleClientSecret: &constants.EnvData.GOOGLE_CLIENT_SECRET, + GithubClientID: &constants.EnvData.GITHUB_CLIENT_ID, + GithubClientSecret: &constants.EnvData.GITHUB_CLIENT_SECRET, + FacebookClientID: &constants.EnvData.FACEBOOK_CLIENT_ID, + FacebookClientSecret: &constants.EnvData.FACEBOOK_CLIENT_SECRET, + OrganizationName: &constants.EnvData.ORGANIZATION_NAME, + OrganizationLogo: &constants.EnvData.ORGANIZATION_LOGO, + } + return res, nil +}