server/util/errors.go

89 lines
1.9 KiB
Go

package util
import "net/http"
type ChatErrorCode int
// List off all known error codes
const (
// GENERAL_ERROR for not classified system errros
GENERAL_ERROR ChatErrorCode = iota
DATABASE_CONNECTION_FAULT
DATABASE_QUERY_FAULT
NOT_FOUND
WRONG_PASSWORD
USERNAME_TOO_SHORT
PASSWORD_TOO_SHORT
PASSWORDS_DONT_MATCH
NOT_LOGGED_IN
)
var codeToMessage = map[ChatErrorCode]string{
GENERAL_ERROR: "an unexpected error occurred",
DATABASE_CONNECTION_FAULT: "database connection failed",
DATABASE_QUERY_FAULT: "database query failed",
NOT_FOUND: "item not found",
WRONG_PASSWORD: "incorrect password",
USERNAME_TOO_SHORT: "username is too short",
PASSWORD_TOO_SHORT: "password is too short",
PASSWORDS_DONT_MATCH: "passwords do not match",
NOT_LOGGED_IN: "not logged in",
}
type ChatError struct {
Message string
Code ChatErrorCode
}
// Error returns the original errors message if not empty, else returns ErrorFromCode()
func (e ChatError) Error() string {
if e.Message != "" {
return e.Message
} else {
return e.ErrorFromCode()
}
}
// ErrorFromCode returns a string that is safe to show in API responses
func (e *ChatError) ErrorFromCode() string {
message, ok := codeToMessage[e.Code]
if ok {
return message
} else {
return "unknown error code"
}
}
// Status returns the http status of the error type
func (e *ChatError) Status() int {
switch e.Code {
case NOT_FOUND:
fallthrough
case WRONG_PASSWORD:
fallthrough
case USERNAME_TOO_SHORT:
fallthrough
case PASSWORD_TOO_SHORT:
fallthrough
case PASSWORDS_DONT_MATCH:
return http.StatusOK
case NOT_LOGGED_IN:
return http.StatusUnauthorized
default:
return http.StatusInternalServerError
}
}
// MakeError makes an error with the given code id err exists
func MakeError(err error, code ChatErrorCode) *ChatError {
if err == nil {
return nil
}
return &ChatError{Message: err.Error(), Code: code}
}