package core import ( "context" "database/sql" "errors" "log/slog" "net/http" "spend-sparrow/internal/utils" "strings" ) var ( ErrNotFound = errors.New("the value does not exist") ErrAlreadyExists = errors.New("row already exists") ErrInternal = errors.New("internal server error") ErrUnauthorized = errors.New("you are not authorized to perform this action") ErrBadRequest = errors.New("bad request") ) func TransformAndLogDbError(ctx context.Context, module string, r sql.Result, err error) error { if err != nil { if errors.Is(err, sql.ErrNoRows) { return ErrNotFound } slog.ErrorContext(ctx, "database sql", "module", module, "err", err) return ErrInternal } if r != nil { rows, err := r.RowsAffected() if err != nil { slog.ErrorContext(ctx, "database rows affected", "module", module, "err", err) return ErrInternal } if rows == 0 { slog.InfoContext(ctx, "row not found", "module", module) return ErrNotFound } } 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] }