Skip to content

Commit 6582fd6

Browse files
committed
♻ refactor: improve error handling
1 parent 4249ab0 commit 6582fd6

File tree

4 files changed

+26
-20
lines changed

4 files changed

+26
-20
lines changed

api/handlers.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,18 @@ type AddBookRequest struct {
1717
}
1818

1919
func (h *BookHandler) AddBook(c echo.Context) error {
20+
ctx := c.Request().Context()
2021
var req AddBookRequest
2122
if err := c.Bind(&req); err != nil {
2223
return c.JSON(http.StatusBadRequest, echo.Map{"error": "invalid request"})
2324
}
2425

26+
select {
27+
case <-ctx.Done():
28+
return c.JSON(http.StatusRequestTimeout, echo.Map{"error": "request canceled or timed out"})
29+
default:
30+
}
31+
2532
err := h.Service.AddBook(c.Request().Context(), req.Title, req.Description)
2633
if err != nil {
2734
return c.JSON(http.StatusInternalServerError, echo.Map{"error": err.Error()})
@@ -53,5 +60,3 @@ func (h *BookHandler) SearchBooks(c echo.Context) error {
5360

5461
return c.JSON(http.StatusOK, results)
5562
}
56-
57-
// TODO: add redis cache

cmd/main.go

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"context"
5+
"errors"
56
"flag"
67
"fmt"
78
"log/slog"
@@ -16,7 +17,7 @@ import (
1617
"semantic-search/internal/repository"
1718
"semantic-search/internal/service"
1819

19-
"github.com/jackc/pgx/v5/pgxpool"
20+
"github.com/jackc/pgx/v5/pgconn"
2021
"github.com/labstack/echo/v4"
2122
"github.com/labstack/echo/v4/middleware"
2223
"github.com/lmittmann/tint"
@@ -53,11 +54,12 @@ func main() {
5354

5455
ctx := context.Background()
5556

56-
dbpool, err := connectToPostgres(ctx, cfg, logger)
57+
dbpool, err := db.NewPool(ctx, cfg.db.dsn, logger)
5758
if err != nil {
5859
logger.Error("Database connection failed", "error", err)
5960
os.Exit(1)
6061
}
62+
logger.Info("Connected to PostgreSQL")
6163
defer dbpool.Close()
6264

6365
embedder, err := newEmbedder(ctx, cfg, logger)
@@ -186,20 +188,23 @@ func setupLogger(levelStr string) *slog.Logger {
186188
}
187189

188190
func runMigrations(cfg config, logger *slog.Logger) error {
189-
if err := db.RunMigrations(cfg.db.dsn, logger); err != nil {
190-
return err
191+
err := db.RunMigrations(cfg.db.dsn, logger)
192+
if err == nil {
193+
logger.Info("Migrations applied successfully")
194+
return nil
191195
}
192-
logger.Info("Migrations applied successfully")
193-
return nil
194-
}
195196

196-
func connectToPostgres(ctx context.Context, cfg config, logger *slog.Logger) (*pgxpool.Pool, error) {
197-
dbpool, err := db.NewPool(ctx, cfg.db.dsn, logger)
198-
if err != nil {
199-
return nil, err
197+
var pgErr *pgconn.PgError
198+
if errors.As(err, &pgErr) {
199+
logger.Error("Postgres error during migration",
200+
"code", pgErr.Code,
201+
"message", pgErr.Message,
202+
"detail", pgErr.Detail,
203+
"where", pgErr.Where,
204+
)
200205
}
201-
logger.Info("Connected to PostgreSQL")
202-
return dbpool, nil
206+
207+
return fmt.Errorf("failed to run migrations: %w", err)
203208
}
204209

205210
func newEmbedder(ctx context.Context, cfg config, logger *slog.Logger) (embed.Embedder, error) {

internal/db/db.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111

1212
func NewPool(ctx context.Context, dsn string, logger *slog.Logger) (*pgxpool.Pool, error) {
1313
if dsn == "" {
14-
logger.Error("DSN is not set")
1514
return nil, fmt.Errorf("DSN is not set")
1615
}
1716

@@ -20,13 +19,11 @@ func NewPool(ctx context.Context, dsn string, logger *slog.Logger) (*pgxpool.Poo
2019

2120
config, err := pgxpool.ParseConfig(dsn)
2221
if err != nil {
23-
logger.Error("Failed to parse DSN", "error", err)
2422
return nil, fmt.Errorf("failed to parse DSN: %w", err)
2523
}
2624

2725
pool, err := pgxpool.NewWithConfig(ctx, config)
2826
if err != nil {
29-
logger.Error("Failed to create DB pool", "error", err)
3027
return nil, fmt.Errorf("failed to create pool: %w", err)
3128
}
3229

@@ -45,7 +42,6 @@ func NewPool(ctx context.Context, dsn string, logger *slog.Logger) (*pgxpool.Poo
4542
`).Scan(&exists)
4643

4744
if err != nil {
48-
logger.Error("Failed to check books table existence", "error", err)
4945
return nil, fmt.Errorf("failed to check books table: %w", err)
5046
}
5147

internal/db/migrate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func RunMigrations(dsn string, logger *slog.Logger) error {
2222

2323
defer func() {
2424
if err := db.Close(); err != nil {
25-
logger.Error("error closing DB: %v", "error", err)
25+
logger.Error("error closing DB: %w", "error", err)
2626
}
2727
}()
2828

0 commit comments

Comments
 (0)