feat: add api for getting configurations

This commit is contained in:
Lakhan Samani 2021-12-31 17:24:22 +05:30
parent 9c8e9baa39
commit f7f1a3e4b3
8 changed files with 95 additions and 61 deletions

View File

@ -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)
})
}

View File

@ -47,6 +47,7 @@ func TestResolvers(t *testing.T) {
adminLoginTests(s, t) adminLoginTests(s, t)
adminSessionTests(s, t) adminSessionTests(s, t)
updateConfigTests(s, t) updateConfigTests(s, t)
configTests(s, t)
}) })
} }
} }

View File

@ -88,7 +88,6 @@ type ComplexityRoot struct {
SMTPPort func(childComplexity int) int SMTPPort func(childComplexity int) int
SenderEmail func(childComplexity int) int SenderEmail func(childComplexity int) int
SenderPassword func(childComplexity int) int SenderPassword func(childComplexity int) int
Version func(childComplexity int) int
} }
Error struct { Error struct {
@ -473,13 +472,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.Config.SenderPassword(childComplexity), true 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": case "Error.message":
if e.complexity.Error.Message == nil { if e.complexity.Error.Message == nil {
break break
@ -1058,7 +1050,6 @@ type AdminLoginResponse {
type Config { type Config {
ADMIN_SECRET: String ADMIN_SECRET: String
VERSION: String
DATABASE_TYPE: String DATABASE_TYPE: String
DATABASE_URL: String DATABASE_URL: String
DATABASE_NAME: String DATABASE_NAME: String
@ -1094,7 +1085,6 @@ type Config {
input UpdateConfigInput { input UpdateConfigInput {
ADMIN_SECRET: String ADMIN_SECRET: String
VERSION: String
DATABASE_TYPE: String DATABASE_TYPE: String
DATABASE_URL: String DATABASE_URL: String
DATABASE_NAME: 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) 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) { func (ec *executionContext) _Config_DATABASE_TYPE(ctx context.Context, field graphql.CollectedField, obj *model.Config) (ret graphql.Marshaler) {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
@ -6207,14 +6165,6 @@ func (ec *executionContext) unmarshalInputUpdateConfigInput(ctx context.Context,
if err != nil { if err != nil {
return it, err 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": case "DATABASE_TYPE":
var err error var err error
@ -6792,8 +6742,6 @@ func (ec *executionContext) _Config(ctx context.Context, sel ast.SelectionSet, o
out.Values[i] = graphql.MarshalString("Config") out.Values[i] = graphql.MarshalString("Config")
case "ADMIN_SECRET": case "ADMIN_SECRET":
out.Values[i] = ec._Config_ADMIN_SECRET(ctx, field, obj) out.Values[i] = ec._Config_ADMIN_SECRET(ctx, field, obj)
case "VERSION":
out.Values[i] = ec._Config_VERSION(ctx, field, obj)
case "DATABASE_TYPE": case "DATABASE_TYPE":
out.Values[i] = ec._Config_DATABASE_TYPE(ctx, field, obj) out.Values[i] = ec._Config_DATABASE_TYPE(ctx, field, obj)
case "DATABASE_URL": case "DATABASE_URL":

View File

@ -20,7 +20,6 @@ type AuthResponse struct {
type Config struct { type Config struct {
AdminSecret *string `json:"ADMIN_SECRET"` AdminSecret *string `json:"ADMIN_SECRET"`
Version *string `json:"VERSION"`
DatabaseType *string `json:"DATABASE_TYPE"` DatabaseType *string `json:"DATABASE_TYPE"`
DatabaseURL *string `json:"DATABASE_URL"` DatabaseURL *string `json:"DATABASE_URL"`
DatabaseName *string `json:"DATABASE_NAME"` DatabaseName *string `json:"DATABASE_NAME"`
@ -120,7 +119,6 @@ type SignUpInput struct {
type UpdateConfigInput struct { type UpdateConfigInput struct {
AdminSecret *string `json:"ADMIN_SECRET"` AdminSecret *string `json:"ADMIN_SECRET"`
Version *string `json:"VERSION"`
DatabaseType *string `json:"DATABASE_TYPE"` DatabaseType *string `json:"DATABASE_TYPE"`
DatabaseURL *string `json:"DATABASE_URL"` DatabaseURL *string `json:"DATABASE_URL"`
DatabaseName *string `json:"DATABASE_NAME"` DatabaseName *string `json:"DATABASE_NAME"`

View File

@ -69,7 +69,6 @@ type AdminLoginResponse {
type Config { type Config {
ADMIN_SECRET: String ADMIN_SECRET: String
VERSION: String
DATABASE_TYPE: String DATABASE_TYPE: String
DATABASE_URL: String DATABASE_URL: String
DATABASE_NAME: String DATABASE_NAME: String
@ -105,7 +104,6 @@ type Config {
input UpdateConfigInput { input UpdateConfigInput {
ADMIN_SECRET: String ADMIN_SECRET: String
VERSION: String
DATABASE_TYPE: String DATABASE_TYPE: String
DATABASE_URL: String DATABASE_URL: String
DATABASE_NAME: String DATABASE_NAME: String

View File

@ -5,7 +5,6 @@ package graph
import ( import (
"context" "context"
"fmt"
"github.com/authorizerdev/authorizer/server/graph/generated" "github.com/authorizerdev/authorizer/server/graph/generated"
"github.com/authorizerdev/authorizer/server/graph/model" "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) { func (r *queryResolver) Config(ctx context.Context) (*model.Config, error) {
panic(fmt.Errorf("not implemented")) return resolvers.ConfigResolver(ctx)
} }
// Mutation returns generated.MutationResolver implementation. // Mutation returns generated.MutationResolver implementation.
@ -98,5 +97,7 @@ func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResol
// Query returns generated.QueryResolver implementation. // Query returns generated.QueryResolver implementation.
func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} } func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} }
type mutationResolver struct{ *Resolver } type (
type queryResolver struct{ *Resolver } mutationResolver struct{ *Resolver }
queryResolver struct{ *Resolver }
)

View File

@ -10,7 +10,8 @@ import (
func DashboardHandler() gin.HandlerFunc { func DashboardHandler() gin.HandlerFunc {
return func(c *gin.Context) { return func(c *gin.Context) {
isOnboardingCompleted := false isOnboardingCompleted := false
if constants.EnvData.ADMIN_SECRET != "" && constants.EnvData.DATABASE_TYPE != "" && constants.EnvData.DATABASE_URL != "" {
if constants.EnvData.ADMIN_SECRET != "" {
isOnboardingCompleted = true isOnboardingCompleted = true
} }

View File

@ -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
}