Go-TestAPI/libs/libs.go

78 lines
2.3 KiB
Go
Raw Permalink Normal View History

package libs
import (
2024-06-10 11:02:14 +00:00
"crypto/rand"
"encoding/base64"
2024-06-07 12:52:09 +00:00
"errors"
2024-06-09 12:58:38 +00:00
"golang-test/database"
"strings"
"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)
for _, err := range errs {
errors[err.Field()] = err.Error()
}
2024-06-07 12:52:09 +00:00
return ValidationErrorsType{Errors: errors}
}
2024-06-09 12:58:38 +00:00
// 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))
}
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
}
func GenerateToken() string {
b := make([]byte, 25)
if _, err := rand.Read(b); err != nil {
return ""
}
return base64.StdEncoding.EncodeToString(b)
}