2024-06-05 15:53:24 +00:00
|
|
|
|
package libs
|
|
|
|
|
|
|
|
|
|
import (
|
2024-06-07 12:52:09 +00:00
|
|
|
|
"errors"
|
2024-06-09 12:58:38 +00:00
|
|
|
|
"golang-test/database"
|
|
|
|
|
"strings"
|
|
|
|
|
|
2024-06-05 15:53:24 +00:00
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
"github.com/go-playground/validator/v10"
|
|
|
|
|
)
|
|
|
|
|
|
2024-06-09 12:58:38 +00:00
|
|
|
|
// ValidationErrorsType определяет тип для хранения ошибок валидации.
|
2024-06-07 12:52:09 +00:00
|
|
|
|
type ValidationErrorsType struct {
|
|
|
|
|
Errors map[string]string `json:"errors"`
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-09 12:58:38 +00:00
|
|
|
|
// GetValidationErrors преобразует ошибки валидации в удобный для использования формат.
|
2024-06-07 12:52:09 +00:00
|
|
|
|
func GetValidationErrors(errs validator.ValidationErrors) ValidationErrorsType {
|
|
|
|
|
errors := make(map[string]string)
|
2024-06-05 15:53:24 +00:00
|
|
|
|
for _, err := range errs {
|
|
|
|
|
errors[err.Field()] = err.Error()
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-07 12:52:09 +00:00
|
|
|
|
return ValidationErrorsType{Errors: errors}
|
2024-06-05 15:53:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-09 12:58:38 +00:00
|
|
|
|
// ToSnakeCase преобразует строку из CamelCase в snake_case.
|
2024-06-05 15:53:24 +00:00
|
|
|
|
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))
|
|
|
|
|
}
|
2024-06-07 12:52:09 +00:00
|
|
|
|
|
2024-06-09 12:58:38 +00:00
|
|
|
|
// GetUserFromHeaders извлекает пользователя из заголовков запроса.
|
|
|
|
|
func GetUserFromHeaders(c *gin.Context) (database.User, error) {
|
|
|
|
|
var tokenObject database.Token
|
|
|
|
|
var user database.User
|
|
|
|
|
db := database.Connector()
|
|
|
|
|
|
|
|
|
|
// Проверка наличия заголовка Authorization
|
2024-06-07 12:52:09 +00:00
|
|
|
|
if c.Request.Header["Authorization"] == nil {
|
2024-06-09 12:58:38 +00:00
|
|
|
|
return user, errors.New("no Authorization header")
|
2024-06-07 12:52:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(strings.Split(c.Request.Header["Authorization"][0], " ")) < 2 {
|
2024-06-09 12:58:38 +00:00
|
|
|
|
return user, errors.New("invalid Token. Please Login")
|
2024-06-07 12:52:09 +00:00
|
|
|
|
}
|
2024-06-09 12:58:38 +00:00
|
|
|
|
|
2024-06-07 12:52:09 +00:00
|
|
|
|
token := strings.Split(c.Request.Header["Authorization"][0], " ")[1]
|
|
|
|
|
|
2024-06-09 12:58:38 +00:00
|
|
|
|
// Поиск токена в базе данных
|
|
|
|
|
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
|
2024-06-07 12:52:09 +00:00
|
|
|
|
}
|