diff --git a/server/db/arangodb.go b/server/db/arangodb.go index e8eb1b1..e577d2b 100644 --- a/server/db/arangodb.go +++ b/server/db/arangodb.go @@ -23,7 +23,7 @@ func initArangodb() (arangoDriver.Database, error) { return nil, err } - client, err := arangoDriver.NewClient(arangoDriver.ClientConfig{ + arangoClient, err := arangoDriver.NewClient(arangoDriver.ClientConfig{ Connection: conn, }) if err != nil { @@ -32,19 +32,19 @@ func initArangodb() (arangoDriver.Database, error) { var arangodb driver.Database - arangodb_exists, err := client.DatabaseExists(nil, constants.DATABASE_NAME) + arangodb_exists, err := arangoClient.DatabaseExists(nil, constants.DATABASE_NAME) if arangodb_exists { log.Println(constants.DATABASE_NAME + " db exists already") - arangodb, err = client.Database(nil, constants.DATABASE_NAME) + arangodb, err = arangoClient.Database(nil, constants.DATABASE_NAME) if err != nil { return nil, err } } else { - arangodb, err = client.CreateDatabase(nil, constants.DATABASE_NAME, nil) + arangodb, err = arangoClient.CreateDatabase(nil, constants.DATABASE_NAME, nil) if err != nil { return nil, err @@ -89,7 +89,6 @@ func initArangodb() (arangoDriver.Database, error) { Sparse: true, }) verificationRequestCollection.EnsureHashIndex(ctx, []string{"token"}, &arangoDriver.EnsureHashIndexOptions{ - Unique: true, Sparse: true, }) diff --git a/server/db/db.go b/server/db/db.go index 730b6e5..3031c3f 100644 --- a/server/db/db.go +++ b/server/db/db.go @@ -6,6 +6,7 @@ import ( arangoDriver "github.com/arangodb/go-driver" "github.com/authorizerdev/authorizer/server/constants" "github.com/authorizerdev/authorizer/server/enum" + "go.mongodb.org/mongo-driver/mongo" "gorm.io/driver/mysql" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" @@ -32,6 +33,7 @@ type Manager interface { type manager struct { sqlDB *gorm.DB arangodb arangoDriver.Database + mongodb *mongo.Database } // mainly used by nosql dbs @@ -42,11 +44,12 @@ type CollectionList struct { } var ( - IsSQL bool - IsArangoDB bool - Mgr Manager - Prefix = "authorizer_" - Collections = CollectionList{ + IsORMSupported bool + IsArangoDB bool + IsMongoDB bool + Mgr Manager + Prefix = "authorizer_" + Collections = CollectionList{ User: Prefix + "users", VerificationRequest: Prefix + "verification_requests", Session: Prefix + "sessions", @@ -57,8 +60,9 @@ func InitDB() { var sqlDB *gorm.DB var err error - IsSQL = constants.DATABASE_TYPE != enum.Arangodb.String() + IsORMSupported = constants.DATABASE_TYPE != enum.Arangodb.String() && constants.DATABASE_TYPE != enum.Mongodb.String() IsArangoDB = constants.DATABASE_TYPE == enum.Arangodb.String() + IsMongoDB = constants.DATABASE_TYPE == enum.Mongodb.String() // sql db orm config ormConfig := &gorm.Config{ @@ -85,19 +89,31 @@ func InitDB() { case enum.Arangodb.String(): arangodb, err := initArangodb() if err != nil { - log.Fatal("error initing arangodb:", err) + log.Fatal("error initializing arangodb:", err) } Mgr = &manager{ sqlDB: nil, + mongodb: nil, arangodb: arangodb, } break + case enum.Mongodb.String(): + mongodb, err := initMongodb() + if err != nil { + log.Fatal("error initializing mongodb connection:", err) + } + + Mgr = &manager{ + sqlDB: nil, + arangodb: nil, + mongodb: mongodb, + } } - // common for all sql dbs that are configured via gorm - if IsSQL { + // common for all sql dbs that are configured via go-orm + if IsORMSupported { if err != nil { log.Fatal("Failed to init sqlDB:", err) } else { @@ -106,6 +122,7 @@ func InitDB() { Mgr = &manager{ sqlDB: sqlDB, arangodb: nil, + mongodb: nil, } } } diff --git a/server/db/mongodb.go b/server/db/mongodb.go new file mode 100644 index 0000000..d0b1c55 --- /dev/null +++ b/server/db/mongodb.go @@ -0,0 +1,81 @@ +package db + +import ( + "context" + "time" + + "github.com/authorizerdev/authorizer/server/constants" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/mongo/readpref" +) + +func initMongodb() (*mongo.Database, error) { + mongodbOptions := options.Client().ApplyURI(constants.DATABASE_URL) + maxWait := time.Duration(5 * time.Second) + mongodbOptions.ConnectTimeout = &maxWait + mongoClient, err := mongo.NewClient(mongodbOptions) + if err != nil { + return nil, err + } + ctx, _ := context.WithTimeout(context.Background(), 30*time.Second) + err = mongoClient.Connect(ctx) + if err != nil { + return nil, err + } + + err = mongoClient.Ping(ctx, readpref.Primary()) + if err != nil { + return nil, err + } + + mongodb := mongoClient.Database(constants.DATABASE_NAME, options.Database()) + + mongodb.CreateCollection(ctx, Collections.User, options.CreateCollection()) + userCollection := mongodb.Collection(Collections.User, options.Collection()) + userCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ + mongo.IndexModel{ + Keys: bson.M{"id": 1}, + Options: options.Index().SetUnique(true).SetSparse(true), + }, + }, options.CreateIndexes()) + userCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ + mongo.IndexModel{ + Keys: bson.M{"email": 1}, + Options: options.Index().SetUnique(true).SetSparse(true), + }, + }, options.CreateIndexes()) + + mongodb.CreateCollection(ctx, Collections.VerificationRequest, options.CreateCollection()) + verificationRequestCollection := mongodb.Collection(Collections.VerificationRequest, options.Collection()) + verificationRequestCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ + mongo.IndexModel{ + Keys: bson.M{"id": 1}, + Options: options.Index().SetUnique(true).SetSparse(true), + }, + }, options.CreateIndexes()) + verificationRequestCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ + mongo.IndexModel{ + Keys: bson.M{"email": 1, "identifier": 1}, + Options: options.Index().SetUnique(true).SetSparse(true), + }, + }, options.CreateIndexes()) + verificationRequestCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ + mongo.IndexModel{ + Keys: bson.M{"token": 1}, + Options: options.Index().SetSparse(true), + }, + }, options.CreateIndexes()) + + mongodb.CreateCollection(ctx, Collections.Session, options.CreateCollection()) + sessionCollection := mongodb.Collection(Collections.Session, options.Collection()) + sessionCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{ + mongo.IndexModel{ + Keys: bson.M{"id": 1}, + Options: options.Index().SetUnique(true).SetSparse(true), + }, + }, options.CreateIndexes()) + + return mongodb, nil +} diff --git a/server/db/session.go b/server/db/session.go index 07baca5..574696a 100644 --- a/server/db/session.go +++ b/server/db/session.go @@ -5,19 +5,20 @@ import ( "time" "github.com/google/uuid" + "go.mongodb.org/mongo-driver/mongo/options" "gorm.io/gorm/clause" ) type Session struct { - Key string `json:"_key,omitempty"` // for arangodb - ObjectID string `json:"_id,omitempty"` // for arangodb & mongodb - ID string `gorm:"primaryKey;type:char(36)" json:"id"` - UserID string `gorm:"type:char(36)" json:"user_id"` - User User `json:"-"` - UserAgent string `json:"user_agent"` - IP string `json:"ip"` - CreatedAt int64 `gorm:"autoCreateTime" json:"created_at"` - UpdatedAt int64 `gorm:"autoUpdateTime" json:"updated_at"` + Key string `json:"_key,omitempty" bson:"_key,omitempty"` // for arangodb + ObjectID string `json:"_id,omitempty" bson:"_id"` // for arangodb & mongodb + ID string `gorm:"primaryKey;type:char(36)" json:"id" bson:"id"` + UserID string `gorm:"type:char(36)" json:"user_id" bson:"user_id"` + User User `json:"-" bson:"-"` + UserAgent string `json:"user_agent" bson:"user_agent"` + IP string `json:"ip" bson:"ip"` + CreatedAt int64 `gorm:"autoCreateTime" json:"created_at" bson:"created_at"` + UpdatedAt int64 `gorm:"autoUpdateTime" json:"updated_at" bson:"updated_at"` } // AddSession function to save user sessiosn @@ -26,16 +27,7 @@ func (mgr *manager) AddSession(session Session) error { session.ID = uuid.New().String() } - if session.CreatedAt == 0 { - session.CreatedAt = time.Now().Unix() - } - - if session.UpdatedAt == 0 { - session.CreatedAt = time.Now().Unix() - } - - if IsSQL { - // copy id as value for fields required for mongodb & arangodb + if IsORMSupported { session.Key = session.ID session.ObjectID = session.ID res := mgr.sqlDB.Clauses( @@ -49,7 +41,6 @@ func (mgr *manager) AddSession(session Session) error { } if IsArangoDB { - session.CreatedAt = time.Now().Unix() session.UpdatedAt = time.Now().Unix() sessionCollection, _ := mgr.arangodb.Collection(nil, Collections.Session) @@ -60,5 +51,18 @@ func (mgr *manager) AddSession(session Session) error { } } + if IsMongoDB { + session.Key = session.ID + session.ObjectID = session.ID + session.CreatedAt = time.Now().Unix() + session.UpdatedAt = time.Now().Unix() + sessionCollection := mgr.mongodb.Collection(Collections.Session, options.Collection()) + _, err := sessionCollection.InsertOne(nil, session) + if err != nil { + log.Println(`error saving session`, err) + return err + } + } + return nil } diff --git a/server/db/user.go b/server/db/user.go index fa70b57..0b58d30 100644 --- a/server/db/user.go +++ b/server/db/user.go @@ -1,7 +1,6 @@ package db import ( - "context" "fmt" "log" "time" @@ -9,23 +8,25 @@ import ( "github.com/arangodb/go-driver" arangoDriver "github.com/arangodb/go-driver" "github.com/google/uuid" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" "gorm.io/gorm/clause" ) type User struct { - Key string `json:"_key,omitempty"` // for arangodb - ObjectID string `json:"_id,omitempty"` // for arangodb & mongodb - ID string `gorm:"primaryKey;type:char(36)" json:"id"` - FirstName string `json:"first_name"` - LastName string `json:"last_name"` - Email string `gorm:"unique" json:"email"` - Password string `gorm:"type:text" json:"password"` - SignupMethod string `json:"signup_method"` - EmailVerifiedAt int64 `json:"email_verified_at"` - CreatedAt int64 `gorm:"autoCreateTime" json:"created_at"` - UpdatedAt int64 `gorm:"autoUpdateTime" json:"updated_at"` - Image string `gorm:"type:text" json:"image"` - Roles string `json:"roles"` + Key string `json:"_key,omitempty" bson:"_key"` // for arangodb + ObjectID string `json:"_id,omitempty" bson:"_id"` // for arangodb & mongodb + ID string `gorm:"primaryKey;type:char(36)" json:"id" bson:"id"` + FirstName string `json:"first_name" bson:"first_name"` + LastName string `json:"last_name" bson:"last_name"` + Email string `gorm:"unique" json:"email" bson:"email"` + Password string `gorm:"type:text" json:"password" bson:"password"` + SignupMethod string `json:"signup_method" bson:"signup_method"` + EmailVerifiedAt int64 `json:"email_verified_at" bson:"email_verified_at"` + CreatedAt int64 `gorm:"autoCreateTime" json:"created_at" bson:"created_at"` + UpdatedAt int64 `gorm:"autoUpdateTime" json:"updated_at" bson:"updated_at"` + Image string `gorm:"type:text" json:"image" bson:"image"` + Roles string `json:"roles" bson:"roles"` } // AddUser function to add user even with email conflict @@ -34,7 +35,7 @@ func (mgr *manager) AddUser(user User) (User, error) { user.ID = uuid.New().String() } - if IsSQL { + if IsORMSupported { // copy id as value for fields required for mongodb & arangodb user.Key = user.ID user.ObjectID = user.ID @@ -53,9 +54,8 @@ func (mgr *manager) AddUser(user User) (User, error) { if IsArangoDB { user.CreatedAt = time.Now().Unix() user.UpdatedAt = time.Now().Unix() - ctx := context.Background() userCollection, _ := mgr.arangodb.Collection(nil, Collections.User) - meta, err := userCollection.CreateDocument(arangoDriver.WithOverwrite(ctx), user) + meta, err := userCollection.CreateDocument(arangoDriver.WithOverwrite(nil), user) if err != nil { log.Println("error adding user:", err) return user, err @@ -63,6 +63,20 @@ func (mgr *manager) AddUser(user User) (User, error) { user.Key = meta.Key user.ObjectID = meta.ID.String() } + + if IsMongoDB { + user.CreatedAt = time.Now().Unix() + user.UpdatedAt = time.Now().Unix() + user.Key = user.ID + user.ObjectID = user.ID + userCollection := mgr.mongodb.Collection(Collections.User, options.Collection()) + _, err := userCollection.InsertOne(nil, user) + if err != nil { + log.Println("error adding user:", err) + return user, err + } + } + return user, nil } @@ -70,7 +84,7 @@ func (mgr *manager) AddUser(user User) (User, error) { func (mgr *manager) UpdateUser(user User) (User, error) { user.UpdatedAt = time.Now().Unix() - if IsSQL { + if IsORMSupported { result := mgr.sqlDB.Save(&user) if result.Error != nil { @@ -90,6 +104,16 @@ func (mgr *manager) UpdateUser(user User) (User, error) { user.Key = meta.Key user.ObjectID = meta.ID.String() } + + if IsMongoDB { + userCollection := mgr.mongodb.Collection(Collections.User, options.Collection()) + _, err := userCollection.UpdateOne(nil, bson.M{"id": bson.M{"$eq": user.ID}}, bson.M{"$set": user}, options.MergeUpdateOptions()) + if err != nil { + log.Println("error updating user:", err) + return user, err + } + } + return user, nil } @@ -97,7 +121,7 @@ func (mgr *manager) UpdateUser(user User) (User, error) { func (mgr *manager) GetUsers() ([]User, error) { var users []User - if IsSQL { + if IsORMSupported { result := mgr.sqlDB.Find(&users) if result.Error != nil { log.Println("error getting users:", result.Error) @@ -125,20 +149,37 @@ func (mgr *manager) GetUsers() ([]User, error) { } if meta.Key != "" { - user.Key = meta.Key - user.ObjectID = meta.ID.String() users = append(users, user) } - } } + + if IsMongoDB { + userCollection := mgr.mongodb.Collection(Collections.User, options.Collection()) + cursor, err := userCollection.Find(nil, bson.M{}, options.Find()) + if err != nil { + log.Println("error getting users:", err) + return users, err + } + defer cursor.Close(nil) + + for cursor.Next(nil) { + var user User + err := cursor.Decode(&user) + if err != nil { + return users, err + } + users = append(users, user) + } + } + return users, nil } func (mgr *manager) GetUserByEmail(email string) (User, error) { var user User - if IsSQL { + if IsORMSupported { result := mgr.sqlDB.Where("email = ?", email).First(&user) if result.Error != nil { @@ -172,13 +213,21 @@ func (mgr *manager) GetUserByEmail(email string) (User, error) { } } + if IsMongoDB { + userCollection := mgr.mongodb.Collection(Collections.User, options.Collection()) + err := userCollection.FindOne(nil, bson.M{"email": email}).Decode(&user) + if err != nil { + return user, err + } + } + return user, nil } func (mgr *manager) GetUserByID(id string) (User, error) { var user User - if IsSQL { + if IsORMSupported { result := mgr.sqlDB.Where("id = ?", id).First(&user) if result.Error != nil { @@ -212,11 +261,19 @@ func (mgr *manager) GetUserByID(id string) (User, error) { } } + if IsMongoDB { + userCollection := mgr.mongodb.Collection(Collections.User, options.Collection()) + err := userCollection.FindOne(nil, bson.M{"id": id}).Decode(&user) + if err != nil { + return user, err + } + } + return user, nil } func (mgr *manager) DeleteUser(user User) error { - if IsSQL { + if IsORMSupported { result := mgr.sqlDB.Delete(&user) if result.Error != nil { @@ -234,5 +291,14 @@ func (mgr *manager) DeleteUser(user User) error { } } + if IsMongoDB { + userCollection := mgr.mongodb.Collection(Collections.User, options.Collection()) + _, err := userCollection.DeleteOne(nil, bson.M{"id": user.ID}, options.Delete()) + if err != nil { + log.Println("error deleting user:", err) + return err + } + } + return nil } diff --git a/server/db/verificationRequests.go b/server/db/verificationRequests.go index d43a24b..8a9d271 100644 --- a/server/db/verificationRequests.go +++ b/server/db/verificationRequests.go @@ -3,22 +3,25 @@ package db import ( "fmt" "log" + "time" "github.com/arangodb/go-driver" "github.com/google/uuid" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" "gorm.io/gorm/clause" ) type VerificationRequest struct { - Key string `json:"_key,omitempty"` // for arangodb - ObjectID string `json:"_id,omitempty"` // for arangodb & mongodb - ID string `gorm:"primaryKey;type:char(36)" json:"id"` - Token string `gorm:"type:text" json:"token"` - Identifier string `gorm:"uniqueIndex:idx_email_identifier" json:"identifier"` - ExpiresAt int64 `json:"expires_at"` - CreatedAt int64 `gorm:"autoCreateTime" json:"created_at"` - UpdatedAt int64 `gorm:"autoUpdateTime" json:"updated_at"` - Email string `gorm:"uniqueIndex:idx_email_identifier" json:"email"` + Key string `json:"_key,omitempty" bson:"_key"` // for arangodb + ObjectID string `json:"_id,omitempty" bson:"_id"` // for arangodb & mongodb + ID string `gorm:"primaryKey;type:char(36)" json:"id" bson:"id"` + Token string `gorm:"type:text" json:"token" bson:"token"` + Identifier string `gorm:"uniqueIndex:idx_email_identifier" json:"identifier" bson:"identifier"` + ExpiresAt int64 `json:"expires_at" bson:"expires_at"` + CreatedAt int64 `gorm:"autoCreateTime" json:"created_at" bson:"created_at"` + UpdatedAt int64 `gorm:"autoUpdateTime" json:"updated_at" bson:"updated_at"` + Email string `gorm:"uniqueIndex:idx_email_identifier" json:"email" bson:"email"` } // AddVerification function to add verification record @@ -26,7 +29,7 @@ func (mgr *manager) AddVerification(verification VerificationRequest) (Verificat if verification.ID == "" { verification.ID = uuid.New().String() } - if IsSQL { + if IsORMSupported { // copy id as value for fields required for mongodb & arangodb verification.Key = verification.ID verification.ObjectID = verification.ID @@ -42,14 +45,31 @@ func (mgr *manager) AddVerification(verification VerificationRequest) (Verificat } if IsArangoDB { + verification.CreatedAt = time.Now().Unix() + verification.UpdatedAt = time.Now().Unix() verificationRequestCollection, _ := mgr.arangodb.Collection(nil, Collections.VerificationRequest) meta, err := verificationRequestCollection.CreateDocument(nil, verification) if err != nil { + log.Println("error saving verification record:", err) return verification, err } verification.Key = meta.Key verification.ObjectID = meta.ID.String() } + + if IsMongoDB { + verification.CreatedAt = time.Now().Unix() + verification.UpdatedAt = time.Now().Unix() + verification.Key = verification.ID + verification.ObjectID = verification.ID + verificationRequestCollection := mgr.mongodb.Collection(Collections.VerificationRequest, options.Collection()) + _, err := verificationRequestCollection.InsertOne(nil, verification) + if err != nil { + log.Println("error saving verification record:", err) + return verification, err + } + } + return verification, nil } @@ -57,7 +77,7 @@ func (mgr *manager) AddVerification(verification VerificationRequest) (Verificat func (mgr *manager) GetVerificationRequests() ([]VerificationRequest, error) { var verificationRequests []VerificationRequest - if IsSQL { + if IsORMSupported { result := mgr.sqlDB.Find(&verificationRequests) if result.Error != nil { log.Println("error getting verification requests:", result.Error) @@ -85,20 +105,38 @@ func (mgr *manager) GetVerificationRequests() ([]VerificationRequest, error) { } if meta.Key != "" { - verificationRequest.Key = meta.Key - verificationRequest.ObjectID = meta.ID.String() verificationRequests = append(verificationRequests, verificationRequest) } } } + + if IsMongoDB { + verificationRequestCollection := mgr.mongodb.Collection(Collections.VerificationRequest, options.Collection()) + cursor, err := verificationRequestCollection.Find(nil, bson.M{}, options.Find()) + if err != nil { + log.Println("error getting verification requests:", err) + return verificationRequests, err + } + defer cursor.Close(nil) + + for cursor.Next(nil) { + var verificationRequest VerificationRequest + err := cursor.Decode(&verificationRequest) + if err != nil { + return verificationRequests, err + } + verificationRequests = append(verificationRequests, verificationRequest) + } + } + return verificationRequests, nil } func (mgr *manager) GetVerificationByToken(token string) (VerificationRequest, error) { var verification VerificationRequest - if IsSQL { + if IsORMSupported { result := mgr.sqlDB.Where("token = ?", token).First(&verification) if result.Error != nil { @@ -133,12 +171,20 @@ func (mgr *manager) GetVerificationByToken(token string) (VerificationRequest, e } } + if IsMongoDB { + verificationRequestCollection := mgr.mongodb.Collection(Collections.VerificationRequest, options.Collection()) + err := verificationRequestCollection.FindOne(nil, bson.M{"token": token}).Decode(&verification) + if err != nil { + return verification, err + } + } + return verification, nil } func (mgr *manager) GetVerificationByEmail(email string) (VerificationRequest, error) { var verification VerificationRequest - if IsSQL { + if IsORMSupported { result := mgr.sqlDB.Where("email = ?", email).First(&verification) if result.Error != nil { @@ -173,11 +219,19 @@ func (mgr *manager) GetVerificationByEmail(email string) (VerificationRequest, e } } + if IsMongoDB { + verificationRequestCollection := mgr.mongodb.Collection(Collections.VerificationRequest, options.Collection()) + err := verificationRequestCollection.FindOne(nil, bson.M{"email": email}).Decode(&verification) + if err != nil { + return verification, err + } + } + return verification, nil } func (mgr *manager) DeleteVerificationRequest(verificationRequest VerificationRequest) error { - if IsSQL { + if IsORMSupported { result := mgr.sqlDB.Delete(&verificationRequest) if result.Error != nil { @@ -195,5 +249,14 @@ func (mgr *manager) DeleteVerificationRequest(verificationRequest VerificationRe } } + if IsMongoDB { + verificationRequestCollection := mgr.mongodb.Collection(Collections.VerificationRequest, options.Collection()) + _, err := verificationRequestCollection.DeleteOne(nil, bson.M{"id": verificationRequest.ID}, options.Delete()) + if err != nil { + log.Println("error deleting verification request::", err) + return err + } + } + return nil } diff --git a/server/enum/dbType.go b/server/enum/dbType.go index bbf29f8..d94a332 100644 --- a/server/enum/dbType.go +++ b/server/enum/dbType.go @@ -8,6 +8,7 @@ const ( Mysql SQLServer Arangodb + Mongodb ) func (d DbType) String() string { @@ -17,5 +18,6 @@ func (d DbType) String() string { "mysql", "sqlserver", "arangodb", + "mongodb", }[d] } diff --git a/server/go.mod b/server/go.mod index 1275988..9060d42 100644 --- a/server/go.mod +++ b/server/go.mod @@ -23,6 +23,7 @@ require ( github.com/stretchr/testify v1.7.0 // indirect github.com/ugorji/go v1.2.6 // indirect github.com/vektah/gqlparser/v2 v2.1.0 + go.mongodb.org/mongo-driver v1.8.1 // indirect golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 diff --git a/server/go.sum b/server/go.sum index 9a86e48..9006fb1 100644 --- a/server/go.sum +++ b/server/go.sum @@ -109,6 +109,7 @@ github.com/go-redis/redis/v8 v8.11.0 h1:O1Td0mQ8UFChQ3N9zFQqo6kTU2cJ+/it88gDB+zg github.com/go-redis/redis/v8 v8.11.0/go.mod h1:DLomh7y2e3ggQXQLd1YgmvIfecPJoFl7WU5SOQ/r06M= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -144,6 +145,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -153,6 +156,7 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/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.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -243,6 +247,8 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -281,6 +287,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -331,6 +338,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E= github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= @@ -341,11 +349,21 @@ github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2 github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e/go.mod h1:/HUdMve7rvxZma+2ZELQeNh88+003LL7Pf/CZ089j8U= github.com/vektah/gqlparser/v2 v2.1.0 h1:uiKJ+T5HMGGQM2kRKQ8Pxw8+Zq9qhhZhz/lieYvCMns= github.com/vektah/gqlparser/v2 v2.1.0/go.mod h1:SyUiHgLATUR8BiYURfTirrTcGpcE+4XkV2se04Px1Ms= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.mongodb.org/mongo-driver v1.8.1 h1:OZE4Wni/SJlrcmSIBRYNzunX5TKxjrTS4jKSnA99oKU= +go.mongodb.org/mongo-driver v1.8.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -371,6 +389,7 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= @@ -455,6 +474,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -507,6 +527,7 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -525,6 +546,7 @@ golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190515012406-7d7faa4812bd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= diff --git a/server/resolvers/signup.go b/server/resolvers/signup.go index e39a7ca..23ac14f 100644 --- a/server/resolvers/signup.go +++ b/server/resolvers/signup.go @@ -26,7 +26,7 @@ func Signup(ctx context.Context, params model.SignUpInput) (*model.AuthResponse, return res, fmt.Errorf(`basic authentication is disabled for this instance`) } if params.ConfirmPassword != params.Password { - return res, fmt.Errorf(`passowrd and confirm password does not match`) + return res, fmt.Errorf(`password and confirm password does not match`) } params.Email = strings.ToLower(params.Email) @@ -56,8 +56,11 @@ func Signup(ctx context.Context, params model.SignUpInput) (*model.AuthResponse, if existingUser.EmailVerifiedAt > 0 { // email is verified - return res, fmt.Errorf(`you have already signed up. Please login`) + return res, fmt.Errorf(`%s has already signed up`, params.Email) + } else if existingUser.ID != "" && existingUser.EmailVerifiedAt <= 0 { + return res, fmt.Errorf("%s has already signed up. please complete the email verification process or reset the password", params.Email) } + user := db.User{ Email: params.Email, }