Files
test_deploy/internal/http/errors.go
Alex Shevchuk d84487d238 1
2025-08-18 17:12:04 +03:00

76 lines
2.7 KiB
Go

package http_router
import (
"errors"
"fmt"
"git-molva.ru/Molva/molva-backend/services/api_gateway/internal/constants"
"log/slog"
"net/http"
)
// =============== CUSTOM LOGO ERRORS ===============
var (
ErrEmptyFile = errors.New("file is empty")
ErrMultipartParse = errors.New("failed to parse multipart form")
ErrFileNotFound = errors.New("failed to get file from form")
ErrTempFileCreate = errors.New("failed to create temporary file")
ErrFileOperation = errors.New("file operation failed")
)
// InvalidImageTypeError представляет ошибку неверного типа изображения
type InvalidImageTypeError struct {
ContentType string
}
func (e *InvalidImageTypeError) Error() string {
return fmt.Sprintf("invalid image type %s: only png, jpg, and webp are allowed", e.ContentType)
}
// FileTooLargeError представляет ошибку превышения размера файла
type FileTooLargeError struct {
Size int64
MaxSize int64
}
func (e *FileTooLargeError) Error() string {
return fmt.Sprintf("file too large: %d bytes, max %d bytes allowed", e.Size, e.MaxSize)
}
// =============== ERROR HANDLERS ===============
// handleAccessError обрабатывает ошибки прав или токенов
func (h *handler) handleAccessError(w http.ResponseWriter, err error, handlerName string) {
if errors.Is(err, constants.ErrUnauthorized) {
http.Error(w, constants.ErrUnauthorized.Error(), http.StatusUnauthorized)
} else if errors.Is(err, constants.ErrForbidden) {
http.Error(w, constants.ErrForbidden.Error(), http.StatusForbidden)
} else {
http.Error(w, constants.ErrInternalServerError.Error(), http.StatusInternalServerError)
h.logger.Error("some permission or authorization error",
slog.String("error", err.Error()),
slog.String("handler", handlerName))
}
}
// handleUploadError обрабатывает ошибки логотипов
func (h *handler) handleUploadError(w http.ResponseWriter, err error, handlerName string) {
var invalidTypeErr *InvalidImageTypeError
var fileTooLargeErr *FileTooLargeError
// Проверяем типизированные ошибки
if errors.As(err, &invalidTypeErr) || errors.As(err, &fileTooLargeErr) ||
errors.Is(err, ErrEmptyFile) || errors.Is(err, ErrMultipartParse) ||
errors.Is(err, ErrFileNotFound) {
http.Error(w, err.Error(), http.StatusBadRequest)
h.logger.Error("client error uploading logo",
slog.String("error", err.Error()),
slog.String("handler", handlerName))
} else {
http.Error(w, constants.ErrInternalServerError.Error(), http.StatusInternalServerError)
h.logger.Error("error processing logo upload",
slog.String("error", err.Error()),
slog.String("handler", handlerName))
}
}