feat: move some service declarations to core
All checks were successful
Build and Push Docker Image / Build-And-Push-Docker-Image (push) Successful in 1m18s

This commit is contained in:
2025-12-27 06:58:04 +01:00
parent ea2663a53d
commit 0325fe101c
8 changed files with 59 additions and 61 deletions

View File

@@ -7,7 +7,6 @@ import (
"log/slog"
"spend-sparrow/internal/auth_types"
"spend-sparrow/internal/core"
"spend-sparrow/internal/service"
"github.com/google/uuid"
"github.com/jmoiron/sqlx"
@@ -45,7 +44,7 @@ func (s ServiceImpl) Add(ctx context.Context, user *auth_types.User, name string
return nil, core.ErrInternal
}
err = service.ValidateString(name, "name")
err = core.ValidateString(name, "name")
if err != nil {
return nil, err
}
@@ -81,7 +80,7 @@ func (s ServiceImpl) UpdateName(ctx context.Context, user *auth_types.User, id s
if user == nil {
return nil, core.ErrUnauthorized
}
err := service.ValidateString(name, "name")
err := core.ValidateString(name, "name")
if err != nil {
return nil, err
}

View File

@@ -1,44 +0,0 @@
package core
import (
"errors"
"net/http"
"spend-sparrow/internal/utils"
"strings"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"
)
func HandleError(w http.ResponseWriter, r *http.Request, err error) {
switch {
case errors.Is(err, ErrUnauthorized):
utils.TriggerToastWithStatus(r.Context(), w, r, "error", "You are not autorized to perform this operation.", http.StatusUnauthorized)
return
case errors.Is(err, ErrBadRequest):
utils.TriggerToastWithStatus(r.Context(), w, r, "error", extractErrorMessage(err), http.StatusBadRequest)
return
case errors.Is(err, ErrNotFound):
utils.TriggerToastWithStatus(r.Context(), w, r, "error", extractErrorMessage(err), http.StatusNotFound)
return
}
utils.TriggerToastWithStatus(r.Context(), w, r, "error", "Internal Server Error", http.StatusInternalServerError)
}
func extractErrorMessage(err error) string {
errMsg := err.Error()
if errMsg == "" {
return ""
}
return strings.SplitN(errMsg, ":", 2)[0]
}
func UpdateSpan(r *http.Request) {
currentSpan := trace.SpanFromContext(r.Context())
if currentSpan != nil {
currentSpan.SetAttributes(attribute.String("http.pattern", r.Pattern))
currentSpan.SetAttributes(attribute.String("http.pattern.id", r.PathValue("id")))
}
}

View File

@@ -5,6 +5,9 @@ import (
"database/sql"
"errors"
"log/slog"
"net/http"
"spend-sparrow/internal/utils"
"strings"
)
var (
@@ -41,3 +44,28 @@ func TransformAndLogDbError(ctx context.Context, module string, r sql.Result, er
return nil
}
func HandleError(w http.ResponseWriter, r *http.Request, err error) {
switch {
case errors.Is(err, ErrUnauthorized):
utils.TriggerToastWithStatus(r.Context(), w, r, "error", "You are not autorized to perform this operation.", http.StatusUnauthorized)
return
case errors.Is(err, ErrBadRequest):
utils.TriggerToastWithStatus(r.Context(), w, r, "error", extractErrorMessage(err), http.StatusBadRequest)
return
case errors.Is(err, ErrNotFound):
utils.TriggerToastWithStatus(r.Context(), w, r, "error", extractErrorMessage(err), http.StatusNotFound)
return
}
utils.TriggerToastWithStatus(r.Context(), w, r, "error", "Internal Server Error", http.StatusInternalServerError)
}
func extractErrorMessage(err error) string {
errMsg := err.Error()
if errMsg == "" {
return ""
}
return strings.SplitN(errMsg, ":", 2)[0]
}

View File

@@ -0,0 +1,16 @@
package core
import (
"net/http"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"
)
func UpdateSpan(r *http.Request) {
currentSpan := trace.SpanFromContext(r.Context())
if currentSpan != nil {
currentSpan.SetAttributes(attribute.String("http.pattern", r.Pattern))
currentSpan.SetAttributes(attribute.String("http.pattern.id", r.PathValue("id")))
}
}

View File

@@ -1,13 +1,8 @@
package service
package core
import (
"fmt"
"regexp"
"spend-sparrow/internal/core"
)
const (
DECIMALS_MULTIPLIER = 100
)
var (
@@ -17,9 +12,9 @@ var (
func ValidateString(value string, fieldName string) error {
switch {
case value == "":
return fmt.Errorf("field \"%s\" needs to be set: %w", fieldName, core.ErrBadRequest)
return fmt.Errorf("field \"%s\" needs to be set: %w", fieldName, ErrBadRequest)
case !safeInputRegex.MatchString(value):
return fmt.Errorf("use only letters, dashes and spaces for \"%s\": %w", fieldName, core.ErrBadRequest)
return fmt.Errorf("use only letters, dashes and spaces for \"%s\": %w", fieldName, ErrBadRequest)
default:
return nil
}

View File

@@ -500,13 +500,13 @@ func (s TransactionImpl) validateAndEnrichTransaction(ctx context.Context, tx *s
}
if input.Party != "" {
err = ValidateString(input.Party, "party")
err = core.ValidateString(input.Party, "party")
if err != nil {
return nil, err
}
}
if input.Description != "" {
err = ValidateString(input.Description, "description")
err = core.ValidateString(input.Description, "description")
if err != nil {
return nil, err
}

View File

@@ -16,6 +16,10 @@ import (
"github.com/jmoiron/sqlx"
)
const (
DECIMALS_MULTIPLIER = 100
)
type TransactionRecurring interface {
Add(ctx context.Context, user *auth_types.User, transactionRecurring types.TransactionRecurringInput) (*types.TransactionRecurring, error)
Update(ctx context.Context, user *auth_types.User, transactionRecurring types.TransactionRecurringInput) (*types.TransactionRecurring, error)
@@ -472,13 +476,13 @@ func (s TransactionRecurringImpl) validateAndEnrichTransactionRecurring(
value := int64(math.Round(valueFloat * DECIMALS_MULTIPLIER))
if input.Party != "" {
err = ValidateString(input.Party, "party")
err = core.ValidateString(input.Party, "party")
if err != nil {
return nil, err
}
}
if input.Description != "" {
err = ValidateString(input.Description, "description")
err = core.ValidateString(input.Description, "description")
if err != nil {
return nil, err
}

View File

@@ -46,7 +46,7 @@ func (s TreasureChestImpl) Add(ctx context.Context, user *auth_types.User, paren
return nil, core.ErrInternal
}
err = ValidateString(name, "name")
err = core.ValidateString(name, "name")
if err != nil {
return nil, err
}
@@ -93,7 +93,7 @@ func (s TreasureChestImpl) Update(ctx context.Context, user *auth_types.User, id
if user == nil {
return nil, core.ErrUnauthorized
}
err := ValidateString(name, "name")
err := core.ValidateString(name, "name")
if err != nil {
return nil, err
}