Go-TestAPI/libs/libs.go

78 lines
2.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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