Skip to content

Commit be6b00a

Browse files
Swopxvzf
authored andcommitted
feat: add fiber handler utils functions
1 parent e49abfb commit be6b00a

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

internal/server/handlers/utils.go

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package handlers
2+
3+
import (
4+
"github.com/ankorstore/gh-action-mq-lease-service/internal/lease"
5+
"github.com/go-playground/validator/v10"
6+
"github.com/gofiber/fiber/v2"
7+
"github.com/rs/zerolog"
8+
"github.com/rs/zerolog/log"
9+
)
10+
11+
type apiErrorResponse struct {
12+
Error string `json:"error"`
13+
ErrorContext any `json:"error_context,omitempty"`
14+
}
15+
16+
func getLeaseProviderOrFail(c *fiber.Ctx, orchestrator lease.ProviderOrchestrator) (lease.Provider, error) {
17+
owner := c.Params("owner")
18+
repo := c.Params("repo")
19+
baseRef := c.Params("baseRef")
20+
21+
log.Ctx(c.UserContext()).UpdateContext(func(c zerolog.Context) zerolog.Context {
22+
return c.
23+
Str("repo_owner", owner).
24+
Str("repo_name", repo).
25+
Str("repo_baseRef", baseRef)
26+
})
27+
28+
provider, err := orchestrator.Get(owner, repo, baseRef)
29+
if err != nil {
30+
log.Ctx(c.UserContext()).Error().Err(err).Msg("Error when retrieving provider")
31+
return nil, apiError(c, fiber.StatusBadRequest, err.Error(), nil)
32+
}
33+
34+
return provider, nil
35+
}
36+
37+
func parseBodyOrFail(c *fiber.Ctx, out interface{}) (bool, error) {
38+
if err := c.BodyParser(out); err != nil {
39+
log.Ctx(c.UserContext()).Error().Err(err).Msg("Error when parsing request body")
40+
return false, apiError(c, fiber.StatusUnprocessableEntity, err.Error(), nil)
41+
}
42+
return true, nil
43+
}
44+
45+
type inputValidationError struct {
46+
FailedField string `json:"failed_field"`
47+
Tag string `json:"tag"`
48+
Value string `json:"value"`
49+
}
50+
51+
func validateInputOrFail(c *fiber.Ctx, validate *validator.Validate, subject any) (bool, error) {
52+
errs := validateInput(validate, subject)
53+
if len(errs) > 0 {
54+
return false, apiError(c, fiber.StatusBadRequest, "Invalid request", errs)
55+
}
56+
return true, nil
57+
}
58+
59+
func validateInput(validate *validator.Validate, subject any) []*inputValidationError {
60+
var errs []*inputValidationError
61+
err := validate.Struct(subject)
62+
if err != nil {
63+
for _, err := range err.(validator.ValidationErrors) {
64+
errs = append(errs, &inputValidationError{
65+
FailedField: err.StructNamespace(),
66+
Tag: err.Tag(),
67+
Value: err.Param(),
68+
})
69+
}
70+
}
71+
return errs
72+
}
73+
74+
func apiError(c *fiber.Ctx, status int, err string, errCtx any) error {
75+
return c.Status(status).JSON(apiErrorResponse{Error: err, ErrorContext: errCtx})
76+
}

0 commit comments

Comments
 (0)