From b7c044fe1dc1e494ecb5faa1d347f69aa65e73ee Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 30 May 2021 20:11:07 +0200 Subject: [PATCH] func generateRandomhashtag works now --- routers/api/v1/user/user.go | 122 ++++++++++++++---------------------- 1 file changed, 46 insertions(+), 76 deletions(-) diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index 6f1b10e..f387eb1 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -4,7 +4,6 @@ import ( "crypto/rand" "database/sql" "encoding/base64" - "errors" "math/big" "regexp" "strings" @@ -92,24 +91,20 @@ func NewUser(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusForbidden) } - user := structs.User{} + user := structs.User{Email: input.Email} + db := database.DB - user.Email = input.Email - - //db = database.DB - - if !isEmailAvailable(database.DB, user, input.Email) { + if !isEmailAvailable(db, user.Email) { return c.SendStatus(fiber.StatusUnprocessableEntity) } if input.Hashtag == "" { - input.Hashtag, err = generateRandomString(6) - //input.Hashtag, err = generateRandomHashtag(database.DB, 6) + input.Hashtag, err = generateRandomHashtag(db, 6) if err != nil { return c.SendStatus(fiber.StatusInternalServerError) } - } else if !isHashtagValid(database.DB, input.Hashtag) { + } else if !isHashtagValid(db, 1, input.Hashtag) { return c.SendStatus(fiber.StatusUnprocessableEntity) } @@ -120,33 +115,23 @@ func NewUser(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusInternalServerError) } - userId := strings.Replace(uuid.New().String(), "-", "", -1) - //created := time.Now().Format("2006-01-02 15:04:05") // YYYY-MM-DD hh:mm:ss + now := time.Now() - //user := structs.User{ID: userId, Hashtag: input.Hashtag, Name: input.Username, Email: input.Email, Password: string(hashedPassword), LastLogin: time.Now(), CreatedAt: time.Now()} - - user.ID = userId + user.ID = strings.Replace(uuid.New().String(), "-", "", -1) user.Hashtag = input.Hashtag user.Name = input.Username user.Password = string(hashedPassword) - user.LastLogin = time.Now() - user.CreatedAt = time.Now() + user.LastLogin = now + user.CreatedAt = now - res := database.DB.Create(&user) + res := db.Create(&user) - log.Infoln("inserted", res, user) - - //stmt, err := db.Prepare("INSERT INTO users (user_id, user_hashtag, username, email, password, created) VALUES (?, ?, ?, ?, ?, ?);") - //stmt.Exec(userId, input.Hashtag, input.Username, input.Email, hashedPassword, created) - - //stmt.Close() - - if err != nil { - log.Warnln("Failed to insert user to db:", err.Error()) + if res.Error != nil { + log.Warnln("Failed to insert user to db:", res.Error) return c.SendStatus(fiber.StatusInternalServerError) } - sessionId, err := createUserSession(database.DB, userId, c.IP(), string(c.Context().UserAgent())) + sessionId, err := createUserSession(db, user.ID, c.IP(), string(c.Context().UserAgent())) if err != nil { return c.SendStatus(fiber.StatusInternalServerError) @@ -158,13 +143,20 @@ func NewUser(c *fiber.Ctx) error { c.Cookie(&fiber.Cookie{Name: "username", Value: input.Username, Secure: true, Expires: expires}) c.Cookie(&fiber.Cookie{Name: "user_hashtag", Value: input.Hashtag, Secure: true, Expires: expires}) - log.Debugln("user created", userId, input.Hashtag, input.Username, input.Email) + log.Debugln("user created", user) return c.SendStatus(fiber.StatusCreated) } -func generateRandomString(n int) (string, error) { - const letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +func generateRandomString(n int, t int) (string, error) { + var letters string + + if t == 1 { + letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + } else { + letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + r := make([]byte, n) for i := 0; i < n; i++ { @@ -178,30 +170,21 @@ func generateRandomString(n int) (string, error) { return string(r), nil } -/* func generateRandomHashtag(db *gorm.DB, n int) (string, error) { c := make(chan bool) var s string var err error for { - s, err = generateRandomString(6) + s, err = generateRandomString(6, 0) if err != nil { - log.Warnln("Error generating Hashtag:", err) + log.Warnln("error generating hashtag:", err) return "", err } go func() { - /*err := db.QueryRow("SELECT user_hashtag FROM users WHERE user_hashtag = ?", s).Scan(&s) - - if err == sql.ErrNoRows { - c <- true - } else { - c <- false - } - - c <- true + c <- isHashtagValid(db, 0, s) }() if msg := <-c; msg { @@ -210,21 +193,22 @@ func generateRandomHashtag(db *gorm.DB, n int) (string, error) { } return s, nil -} */ +} -func isHashtagValid(db *gorm.DB, h string) bool { - if !isUpper(h) || len(h) < 2 || len(h) > 6 { +func isHashtagValid(db *gorm.DB, t int, h string) bool { + if t == 1 && !isUpper(h) || len(h) < 2 || len(h) > 6 { return false } - /* - err := db.QueryRow("SELECT user_hashtag FROM users WHERE user_hashtag = ?", h).Scan(&h) - if err == sql.ErrNoRows { - return true - } - return false */ + var res string - return true + db.Raw("SELECT hashtag FROM users WHERE hashtag = ?", h).Scan(&res) + + if res == "" { + return true + } else { + return false + } } func isUpper(s string) bool { @@ -252,24 +236,16 @@ func isEmailValid(e string) bool { return emailRegex.MatchString(e) } -func isEmailAvailable(db *gorm.DB, user structs.User, email string) bool { - log.Infoln("isEmailAvailable email", user.Email) +func isEmailAvailable(db *gorm.DB, email string) bool { + var res string - err := db.First(&user, "email = ?", user.Email).Error + db.Raw("SELECT email FROM users WHERE email = ?", email).Scan(&res) - log.Warnln("isEmailErr", errors.Is(err, gorm.ErrRecordNotFound)) - - if errors.Is(err, gorm.ErrRecordNotFound) { + if res == "" { return true + } else { + return false } - return false - - /*err := db.QueryRow("SELECT email FROM users WHERE email = ?", e).Scan(&e) - - if err == sql.ErrNoRows { - return true - } */ - //return false } func SessionIdCheck(c *fiber.Ctx) error { @@ -334,21 +310,15 @@ func deleteSession(db *sql.DB, sessionId string) { } func deleteExpiredSessions(db *gorm.DB) { - err := db.Exec("DELETE FROM sessions WHERE expires < CURRENT_TIMESTAMP()") - - if err.Error != nil { - log.Warnln("err deleting expired sessions:", err.Error) - } - - /*_, err := db.Exec("DELETE FROM `sessions` WHERE expires < CURRENT_TIMESTAMP()") + err := db.Exec("DELETE FROM sessions WHERE expires < ?", time.Now()).Error if err != nil { log.Warnln("err deleting expired sessions:", err) - } */ + } } func createUserSession(db *gorm.DB, userId string, ip string, userAgent string) (string, error) { - sessionId, err := generateRandomString(32) + sessionId, err := generateRandomString(32, 1) if err != nil { log.Warnln("Failed to generate user session:", err)