diff --git a/.env.test b/.env.test index 0df0238..7db07e8 100644 --- a/.env.test +++ b/.env.test @@ -6,4 +6,5 @@ SMTP_HOST=smtp.mailtrap.io SMTP_PORT=2525 SMTP_USERNAME=test SMTP_PASSWORD=test -SENDER_EMAIL="info@authorizer.dev" \ No newline at end of file +SENDER_EMAIL="info@authorizer.dev" +AWS_REGION=ap-south-1 \ No newline at end of file diff --git a/server/db/providers/dynamodb/provider.go b/server/db/providers/dynamodb/provider.go index 0caa6ea..81aa8ce 100644 --- a/server/db/providers/dynamodb/provider.go +++ b/server/db/providers/dynamodb/provider.go @@ -1,9 +1,6 @@ package dynamodb import ( - "fmt" - "os" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" @@ -22,36 +19,29 @@ type provider struct { // NewProvider returns a new Dynamo provider func NewProvider() (*provider, error) { dbURL := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabaseURL - awsRegion := os.Getenv(constants.EnvAwsRegion) - accessKey := os.Getenv(constants.EnvAwsAccessKeyID) - secretKey := os.Getenv(constants.EnvAwsSecretAccessKey) + awsRegion := memorystore.RequiredEnvStoreObj.GetRequiredEnv().AwsRegion + awsAccessKeyID := memorystore.RequiredEnvStoreObj.GetRequiredEnv().AwsAccessKeyID + awsSecretAccessKey := memorystore.RequiredEnvStoreObj.GetRequiredEnv().AwsSecretAccessKey config := aws.Config{ MaxRetries: aws.Int(3), CredentialsChainVerboseErrors: aws.Bool(true), // for full error logs + } if awsRegion != "" { config.Region = aws.String(awsRegion) } - if accessKey == "" { - log.Debugf("%s not found", constants.EnvAwsAccessKeyID) - return nil, fmt.Errorf("invalid aws credentials. %s not found", constants.EnvAwsAccessKeyID) - } - - if secretKey == "" { - log.Debugf("%s not found", constants.EnvAwsSecretAccessKey) - return nil, fmt.Errorf("invalid aws credentials. %s not found", constants.EnvAwsSecretAccessKey) - } - - // custom accessKey, secretkey took first priority, if not then fetch config from aws credentials - if accessKey != "" && secretKey != "" { - config.Credentials = credentials.NewStaticCredentials(accessKey, secretKey, "") + // custom awsAccessKeyID, awsSecretAccessKey took first priority, if not then fetch config from aws credentials + if awsAccessKeyID != "" && awsSecretAccessKey != "" { + config.Credentials = credentials.NewStaticCredentials(awsAccessKeyID, awsSecretAccessKey, "") } else if dbURL != "" { // static config in case of testing or local-setup config.Credentials = credentials.NewStaticCredentials("key", "key", "") config.Endpoint = aws.String(dbURL) + } else { + log.Debugf("%s or %s or %s not found. Trying to load default credentials from aws config", constants.EnvAwsRegion, constants.EnvAwsAccessKeyID, constants.EnvAwsSecretAccessKey) } session := session.Must(session.NewSession(&config)) diff --git a/server/db/providers/dynamodb/user.go b/server/db/providers/dynamodb/user.go index ef780b1..3bd45db 100644 --- a/server/db/providers/dynamodb/user.go +++ b/server/db/providers/dynamodb/user.go @@ -180,7 +180,7 @@ func (p *provider) UpdateUsers(ctx context.Context, data map[string]interface{}, for _, user := range allUsers { err = UpdateByHashKey(userCollection, "id", user.ID, data) - if err != nil { + if err == nil { res = res + 1 } } diff --git a/server/memorystore/memory_store.go b/server/memorystore/memory_store.go index c112c01..15b7248 100644 --- a/server/memorystore/memory_store.go +++ b/server/memorystore/memory_store.go @@ -57,7 +57,7 @@ func InitMemStore() error { } redisURL := requiredEnvs.RedisURL - if redisURL != "" && !requiredEnvs.disableRedisForEnv { + if redisURL != "" && !requiredEnvs.DisableRedisForEnv { log.Info("Initializing Redis memory store") Provider, err = redis.NewRedisProvider(redisURL) if err != nil { diff --git a/server/memorystore/required_env_store.go b/server/memorystore/required_env_store.go index 13166ac..9eafe24 100644 --- a/server/memorystore/required_env_store.go +++ b/server/memorystore/required_env_store.go @@ -27,7 +27,11 @@ type RequiredEnv struct { DatabaseCertKey string `json:"DATABASE_CERT_KEY"` DatabaseCACert string `json:"DATABASE_CA_CERT"` RedisURL string `json:"REDIS_URL"` - disableRedisForEnv bool `json:"DISABLE_REDIS_FOR_ENV"` + DisableRedisForEnv bool `json:"DISABLE_REDIS_FOR_ENV"` + // AWS Related Envs + AwsRegion string `json:"AWS_REGION"` + AwsAccessKeyID string `json:"AWS_ACCESS_KEY_ID"` + AwsSecretAccessKey string `json:"AWS_SECRET_ACCESS_KEY"` } // RequiredEnvObj is a simple in-memory store for sessions. @@ -53,7 +57,8 @@ func (r *RequiredEnvStore) SetRequiredEnv(requiredEnv RequiredEnv) { var RequiredEnvStoreObj *RequiredEnvStore -// InitRequiredEnv to initialize EnvData and through error if required env are not present +// InitRequiredEnv to initialize EnvData and throw error if required env are not present +// This includes env that only configurable via env vars and not the ui func InitRequiredEnv() error { envPath := os.Getenv(constants.EnvKeyEnvPath) @@ -85,6 +90,9 @@ func InitRequiredEnv() error { dbCACert := os.Getenv(constants.EnvKeyDatabaseCACert) redisURL := os.Getenv(constants.EnvKeyRedisURL) disableRedisForEnv := os.Getenv(constants.EnvKeyDisableRedisForEnv) == "true" + awsRegion := os.Getenv(constants.EnvAwsRegion) + awsAccessKeyID := os.Getenv(constants.EnvAwsAccessKeyID) + awsSecretAccessKey := os.Getenv(constants.EnvAwsSecretAccessKey) if strings.TrimSpace(redisURL) == "" { if cli.ARG_REDIS_URL != nil && *cli.ARG_REDIS_URL != "" { @@ -139,7 +147,10 @@ func InitRequiredEnv() error { DatabaseCertKey: dbCertKey, DatabaseCACert: dbCACert, RedisURL: redisURL, - disableRedisForEnv: disableRedisForEnv, + DisableRedisForEnv: disableRedisForEnv, + AwsRegion: awsRegion, + AwsAccessKeyID: awsAccessKeyID, + AwsSecretAccessKey: awsSecretAccessKey, } RequiredEnvStoreObj = &RequiredEnvStore{ diff --git a/server/test/resolvers_test.go b/server/test/resolvers_test.go index 1fc6060..0ff918b 100644 --- a/server/test/resolvers_test.go +++ b/server/test/resolvers_test.go @@ -2,6 +2,7 @@ package test import ( "context" + "fmt" "os" "strings" "testing" @@ -20,7 +21,7 @@ func TestResolvers(t *testing.T) { constants.DbTypeArangodb: "http://localhost:8529", constants.DbTypeMongodb: "mongodb://localhost:27017", constants.DbTypeScyllaDB: "127.0.0.1:9042", - constants.DbTypeDynamoDB: "http://127.0.0.1:8000", + constants.DbTypeDynamoDB: "http://0.0.0.0:8000", } testDBs := strings.Split(os.Getenv("TEST_DBS"), ",") @@ -52,6 +53,12 @@ func TestResolvers(t *testing.T) { os.Setenv(constants.EnvKeyDatabaseURL, dbURL) os.Setenv(constants.EnvKeyDatabaseType, dbType) os.Setenv(constants.EnvKeyDatabaseName, testDb) + + if dbType == constants.DbTypeDynamoDB { + memorystore.Provider.UpdateEnvVariable(constants.EnvAwsRegion, "ap-south-1") + os.Setenv(constants.EnvAwsRegion, "ap-south-1") + } + memorystore.InitRequiredEnv() err := db.InitDB() @@ -61,12 +68,15 @@ func TestResolvers(t *testing.T) { // clean the persisted config for test to use fresh config envData, err := db.Provider.GetEnv(ctx) - if err == nil { + fmt.Println("envData", envData.ID, envData.EnvData) + if err == nil && envData.ID != "" { envData.EnvData = "" _, err = db.Provider.UpdateEnv(ctx, envData) if err != nil { t.Errorf("Error updating env: %s", err.Error()) } + } else if err != nil { + t.Errorf("Error getting env: %s", err.Error()) } err = env.PersistEnv() if err != nil { diff --git a/server/test/test.go b/server/test/test.go index 1e5105b..1fb6492 100644 --- a/server/test/test.go +++ b/server/test/test.go @@ -84,7 +84,7 @@ func testSetup() TestSetup { testData := TestData{ Email: fmt.Sprintf("%d_authorizer_tester@yopmail.com", time.Now().Unix()), Password: "Test@123", - WebhookEndpoint: "https://62cbc6738042b16aa7c22df2.mockapi.io/api/v1/webhook", + WebhookEndpoint: "https://62f93101e05644803533cf36.mockapi.io/authorizer/webhook", TestWebhookEventTypes: []string{constants.UserAccessEnabledWebhookEvent, constants.UserAccessRevokedWebhookEvent, constants.UserCreatedWebhookEvent, constants.UserDeletedWebhookEvent, constants.UserLoginWebhookEvent, constants.UserSignUpWebhookEvent}, TestEmailTemplateEventTypes: []string{constants.VerificationTypeBasicAuthSignup, constants.VerificationTypeForgotPassword, constants.VerificationTypeMagicLinkLogin, constants.VerificationTypeUpdateEmail}, }