76 lines
2.7 KiB
Go
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))
|
|
}
|
|
}
|