package user import ( "crypto/rand" "math/big" "regexp" "strings" "unicode" "git.umbach.dev/app-idea/rest-api/modules/config" "git.umbach.dev/app-idea/rest-api/modules/database" "git.umbach.dev/app-idea/rest-api/modules/structs" "github.com/gofiber/fiber/v2" log "github.com/sirupsen/logrus" "gorm.io/gorm" ) var cfg = &config.Cfg 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++ { num, err := rand.Int(rand.Reader, big.NewInt(int64(len(letters)))) if err != nil { return "", err } r[i] = letters[num.Int64()] } 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, 0) if err != nil { log.Warnln("error generating hashtag:", err) return "", err } go func() { c <- isHashtagValid(db, 0, s) }() if msg := <-c; msg { break } } return s, nil } func isHashtagValid(db *gorm.DB, t int, h string) bool { if t == 1 && !isUpper(h) || len(h) < 2 || len(h) > 6 { return false } var res string db.Raw("SELECT hashtag FROM users WHERE hashtag = ?", h).Scan(&res) if res == "" { return true } else { return false } } func isUpper(s string) bool { for _, r := range s { if !unicode.IsUpper(r) && unicode.IsLetter(r) { return false } } return true } func isUsernameValid(u string) bool { if len(u) < int(cfg.Settings.Lengths.UsernameMinLen) || len(u) > int(cfg.Settings.Lengths.UsernameMaxLen) { return false } return true } var emailRegex = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") func isEmailValid(e string) bool { if len(e) < int(cfg.Settings.Lengths.EmailMinLen) || len(e) > int(cfg.Settings.Lengths.EmailMaxLen) { return false } return emailRegex.MatchString(e) } func isPasswordValid(p string) bool { if len(p) < int(cfg.Settings.Lengths.PasswordMinLen) || len(p) > int(cfg.Settings.Lengths.PasswordMaxLen) { return false } return true } func isEmailAvailable(db *gorm.DB, email string) bool { var res string db.Raw("SELECT email FROM users WHERE email = ?", email).Scan(&res) if res == "" { return true } else { return false } } func getUserIdBySessionId(sessionId string) (string, error) { db := database.DB session := structs.Session{} db.Select("user_id").Where("session_id = ?", sessionId).Find(&session) return session.UserId, nil } func GetUser(c *fiber.Ctx) error { log.Infoln("body", c.Body()) type Input struct { Val []string `json:"val"` } log.Infoln("arr", string(c.Body())) var input Input if err := c.BodyParser(&input); err != nil { log.Infoln("bad", input) return c.SendStatus(fiber.StatusBadRequest) } log.Infoln("test", strings.Join(input.Val, ",")) log.Println("input", input) db := database.DB userId, err := getUserIdBySessionId(c.Cookies("session_id")) if err != nil { return c.SendStatus(fiber.StatusInternalServerError) } user := structs.User{} db.Table("users").Select(strings.Join(input.Val, ",")).First(&user, "id = ?", userId) return c.JSON(&user) } func GetUsers(c *fiber.Ctx) error { list := []string{} /* var ( name string )*/ /* rows, err := db.Query("SELECT username FROM users;") fmt.Println("err", err) defer rows.Close() fmt.Println("reading data:") for rows.Next() { err := rows.Scan(&name) fmt.Printf("Data row = (%s, %s)\n", name, err) list = append(list, name) } err = rows.Err()*/ return c.JSON(list) }