aboutsummaryrefslogtreecommitdiff
path: root/utils/shortcuts/error.go
blob: ae6cec3b1178819b605b0d18e11635ad03787904 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package shortcuts

import "github.com/gofiber/fiber/v2"

type ErrorKind string

const (
	BadRequest    ErrorKind = "bad_request"
	Forbidden     ErrorKind = "forbidden"
	Internal      ErrorKind = "internal"
	NotFound      ErrorKind = "not_found"
	Unauthorized  ErrorKind = "unauthorized"
	Unprocessable ErrorKind = "unprocessable"
)

type Error struct {
	Kind    ErrorKind
	Message string
}

func (self *Error) Error() string {
	return self.Message
}

var statusMap = map[ErrorKind]int{
	BadRequest:    fiber.StatusBadRequest,
	Forbidden:     fiber.StatusForbidden,
	Internal:      fiber.StatusInternalServerError,
	NotFound:      fiber.StatusNotFound,
	Unauthorized:  fiber.StatusUnauthorized,
	Unprocessable: fiber.StatusUnprocessableEntity,
}

func ServiceError(kind ErrorKind, message string) *Error {
	return &Error{
		Kind:    kind,
		Message: message,
	}
}

func isHtmxRequest(context *fiber.Ctx) bool {
	return context.Get("HX-Request") == "true" && context.Get("HX-Boosted") != "true"
}

func renderAlert(context *fiber.Ctx, message string, statusCode int) error {
	context.Status(statusCode)
	return context.Render("partials/alert", fiber.Map{
		"ErrorMessage": message,
	})
}

func HandleError(context *fiber.Ctx, serviceError *Error) error {
	statusCode, exists := statusMap[serviceError.Kind]
	if !exists {
		statusCode = fiber.StatusInternalServerError
	}

	if isHtmxRequest(context) {
		return renderAlert(context, serviceError.Message, statusCode)
	}

	return RenderWithStatus(context, "error", fiber.Map{
		"ErrorMessage": serviceError.Message,
	}, statusCode)
}

func BadRequestError(context *fiber.Ctx, err error) error {
	if isHtmxRequest(context) {
		return renderAlert(context, err.Error(), fiber.StatusBadRequest)
	}

	return RenderWithStatus(context, "error", fiber.Map{
		"ErrorMessage": err.Error(),
	}, fiber.StatusBadRequest)
}

func ForbiddenError(context *fiber.Ctx, err error) error {
	if isHtmxRequest(context) {
		return renderAlert(context, err.Error(), fiber.StatusForbidden)
	}

	return RenderWithStatus(context, "error", fiber.Map{
		"ErrorMessage": err.Error(),
	}, fiber.StatusForbidden)
}

func InternalServerError(context *fiber.Ctx, err error) error {
	if isHtmxRequest(context) {
		return renderAlert(context, err.Error(), fiber.StatusInternalServerError)
	}

	return RenderWithStatus(context, "error", fiber.Map{
		"ErrorMessage": err.Error(),
	}, fiber.StatusInternalServerError)
}

func NotFoundError(context *fiber.Ctx, err error) error {
	if isHtmxRequest(context) {
		return renderAlert(context, err.Error(), fiber.StatusNotFound)
	}

	return RenderWithStatus(context, "error", fiber.Map{
		"ErrorMessage": err.Error(),
	}, fiber.StatusNotFound)
}

func UnauthorizedError(context *fiber.Ctx, err error) error {
	if isHtmxRequest(context) {
		return renderAlert(context, err.Error(), fiber.StatusUnauthorized)
	}

	return RenderWithStatus(context, "error", fiber.Map{
		"ErrorMessage": err.Error(),
	}, fiber.StatusUnauthorized)
}