appidea-restapi/routers/api/v1/user/user.go

191 lines
3.7 KiB
Go

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)
}