portal/api/s5/errors.go

123 lines
4.6 KiB
Go

package s5
import (
"fmt"
"net/http"
)
// S5-specific error keys
const (
// File-related errors
ErrKeyFileUploadFailed = "ErrFileUploadFailed"
ErrKeyFileDownloadFailed = "ErrFileDownloadFailed"
ErrKeyMetadataFetchFailed = "ErrMetadataFetchFailed"
ErrKeyInvalidFileFormat = "ErrInvalidFileFormat"
ErrKeyUnsupportedFileType = "ErrUnsupportedFileType"
ErrKeyFileProcessingFailed = "ErrFileProcessingFailed"
// Storage and data handling errors
ErrKeyStorageOperationFailed = "ErrStorageOperationFailed"
ErrKeyResourceNotFound = "ErrResourceNotFound"
ErrKeyResourceLimitExceeded = "ErrResourceLimitExceeded"
ErrKeyDataIntegrityError = "ErrDataIntegrityError"
// User and permission errors
ErrKeyPermissionDenied = "ErrPermissionDenied"
ErrKeyInvalidOperation = "ErrInvalidOperation"
ErrKeyAuthenticationFailed = "ErrAuthenticationFailed"
ErrKeyAuthorizationFailed = "ErrAuthorizationFailed"
// Network and communication errors
ErrKeyNetworkError = "ErrNetworkError"
ErrKeyServiceUnavailable = "ErrServiceUnavailable"
// General errors
ErrKeyInternalError = "ErrInternalError"
ErrKeyConfigurationError = "ErrConfigurationError"
ErrKeyOperationTimeout = "ErrOperationTimeout"
)
// Default error messages for S5-specific errors
var defaultErrorMessages = map[string]string{
ErrKeyFileUploadFailed: "File upload failed due to an internal error.",
ErrKeyFileDownloadFailed: "File download failed.",
ErrKeyMetadataFetchFailed: "Failed to fetch metadata for the resource.",
ErrKeyInvalidFileFormat: "Invalid file format provided.",
ErrKeyUnsupportedFileType: "Unsupported file type.",
ErrKeyFileProcessingFailed: "Failed to process the file.",
ErrKeyStorageOperationFailed: "Storage operation failed unexpectedly.",
ErrKeyResourceNotFound: "The specified resource was not found.",
ErrKeyResourceLimitExceeded: "The operation exceeded the resource limit.",
ErrKeyDataIntegrityError: "Data integrity check failed.",
ErrKeyPermissionDenied: "Permission denied for the requested operation.",
ErrKeyInvalidOperation: "Invalid or unsupported operation requested.",
ErrKeyAuthenticationFailed: "Authentication failed.",
ErrKeyAuthorizationFailed: "Authorization failed or insufficient permissions.",
ErrKeyNetworkError: "Network error or connectivity issue.",
ErrKeyServiceUnavailable: "The requested service is temporarily unavailable.",
ErrKeyInternalError: "An internal server error occurred.",
ErrKeyConfigurationError: "Configuration error or misconfiguration detected.",
ErrKeyOperationTimeout: "The operation timed out.",
}
// Mapping of S5-specific error keys to HTTP status codes
var errorCodeToHttpStatus = map[string]int{
ErrKeyFileUploadFailed: http.StatusInternalServerError,
ErrKeyFileDownloadFailed: http.StatusInternalServerError,
ErrKeyMetadataFetchFailed: http.StatusInternalServerError,
ErrKeyInvalidFileFormat: http.StatusBadRequest,
ErrKeyUnsupportedFileType: http.StatusBadRequest,
ErrKeyFileProcessingFailed: http.StatusInternalServerError,
ErrKeyStorageOperationFailed: http.StatusInternalServerError,
ErrKeyResourceNotFound: http.StatusNotFound,
ErrKeyResourceLimitExceeded: http.StatusForbidden,
ErrKeyDataIntegrityError: http.StatusInternalServerError,
ErrKeyPermissionDenied: http.StatusForbidden,
ErrKeyInvalidOperation: http.StatusBadRequest,
ErrKeyAuthenticationFailed: http.StatusUnauthorized,
ErrKeyAuthorizationFailed: http.StatusUnauthorized,
ErrKeyNetworkError: http.StatusBadGateway,
ErrKeyServiceUnavailable: http.StatusServiceUnavailable,
ErrKeyInternalError: http.StatusInternalServerError,
ErrKeyConfigurationError: http.StatusInternalServerError,
ErrKeyOperationTimeout: http.StatusRequestTimeout,
}
// S5Error struct for representing S5-specific errors
type S5Error struct {
Key string
Message string
Err error
}
// Error method to implement the error interface
func (e *S5Error) Error() string {
if e.Err != nil {
return fmt.Sprintf("%s: %v", e.Message, e.Err)
}
return e.Message
}
func (e *S5Error) HttpStatus() int {
if code, exists := errorCodeToHttpStatus[e.Key]; exists {
return code
}
return http.StatusInternalServerError
}
func NewS5Error(key string, err error, customMessage ...string) *S5Error {
message, exists := defaultErrorMessages[key]
if !exists {
message = "An unknown error occurred"
}
if len(customMessage) > 0 {
message = customMessage[0]
}
return &S5Error{
Key: key,
Message: message,
Err: err,
}
}