package libs import ( "crypto/rand" "encoding/base64" "errors" "golang-test/database" "strings" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" ) // ValidationErrorsType определяет тип для хранения ошибок валидации. type ValidationErrorsType struct { Errors map[string]string `json:"errors"` } // GetValidationErrors преобразует ошибки валидации в удобный для использования формат. func GetValidationErrors(errs validator.ValidationErrors) ValidationErrorsType { errors := make(map[string]string) for _, err := range errs { errors[err.Field()] = err.Error() } return ValidationErrorsType{Errors: errors} } // ToSnakeCase преобразует строку из CamelCase в snake_case. func ToSnakeCase(str string) string { var result []rune for i, r := range str { if i > 0 && 'A' <= r && r <= 'Z' { result = append(result, '_') } result = append(result, r) } return strings.ToLower(string(result)) } // GetUserFromHeaders извлекает пользователя из заголовков запроса. func GetUserFromHeaders(c *gin.Context) (database.User, error) { var tokenObject database.Token var user database.User db := database.Connector() // Проверка наличия заголовка Authorization if c.Request.Header["Authorization"] == nil { return user, errors.New("no Authorization header") } if len(strings.Split(c.Request.Header["Authorization"][0], " ")) < 2 { return user, errors.New("invalid Token. Please Login") } token := strings.Split(c.Request.Header["Authorization"][0], " ")[1] // Поиск токена в базе данных if err := db.Where("token = ?", token).First(&tokenObject).Error; err != nil { return user, err } // Загрузка пользователя с предварительной загрузкой связанных продуктов и производителей if err := db.Preload("Products.Manufacturer").Preload("Products").First(&user, tokenObject.UserID).Error; err != nil { return user, err } return user, nil } func GenerateToken() string { b := make([]byte, 25) if _, err := rand.Read(b); err != nil { return "" } return base64.StdEncoding.EncodeToString(b) }