123 lines
4.6 KiB
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,
|
||
|
}
|
||
|
}
|