feat: add api for getting configurations
This commit is contained in:
parent
9c8e9baa39
commit
f7f1a3e4b3
28
server/__test__/config_test.go
Normal file
28
server/__test__/config_test.go
Normal 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)
|
||||||
|
})
|
||||||
|
}
|
|
@ -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)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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":
|
||||||
|
|
|
@ -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"`
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 }
|
||||||
|
)
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
59
server/resolvers/config.go
Normal file
59
server/resolvers/config.go
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user