Skip to content

Commit 4b86151

Browse files
Fix DB commits of background task
1 parent 5a303f1 commit 4b86151

3 files changed

Lines changed: 23 additions & 10 deletions

File tree

cmd/internal/db/middleware.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func AddDatabaseMiddleware(handler http.Handler, pool *pgxpool.Pool, logger logg
1616
return http.HandlerFunc(
1717
func(w http.ResponseWriter, r *http.Request) {
1818
ctx := r.Context()
19-
repository, tx, err := NewRepositoryWithTx(ctx, pool)
19+
repository, commit, rollback, err := NewRepositoryWithTx(ctx, pool)
2020
if err != nil {
2121
http.Error(w, err.Error(), http.StatusInternalServerError)
2222
}
@@ -31,27 +31,29 @@ func AddDatabaseMiddleware(handler http.Handler, pool *pgxpool.Pool, logger logg
3131
status, ok := r.Context().Value(constants.StatusCodeKey).(int)
3232
if !ok {
3333
logger.Err.Println("No status code found in context, rolling back tx")
34-
_ = tx.Rollback(ctx)
34+
_ = rollback(ctx)
3535
return
3636
}
3737

3838
if status >= http.StatusBadRequest {
39-
_ = tx.Rollback(ctx)
40-
} else if err := tx.Commit(ctx); err != nil {
39+
_ = rollback(ctx)
40+
} else if err := commit(ctx); err != nil {
4141
// Response has already been sent - just log
4242
logger.Err.Printf("tx commit failed: %v", err)
4343
}
4444
},
4545
)
4646
}
4747

48-
func NewRepositoryWithTx(ctx context.Context, pool *pgxpool.Pool) (*queries.Queries, pgx.Tx, error) {
48+
func NewRepositoryWithTx(ctx context.Context, pool *pgxpool.Pool) (q *queries.Queries, commit func(context.Context) error, rollback func(context.Context) error, err error) {
4949
tx, err := pool.BeginTx(ctx, pgx.TxOptions{
5050
IsoLevel: pgx.Serializable,
5151
AccessMode: pgx.ReadWrite,
5252
})
5353
if err != nil {
54-
return nil, nil, fmt.Errorf("failed to start transaction: %w", err)
54+
return nil, nil, nil, fmt.Errorf("failed to start transaction: %w", err)
5555
}
56-
return queries.New(pool).WithTx(tx), tx, nil
56+
commit = func(ctx context.Context) error { return tx.Commit(ctx) }
57+
rollback = func(ctx context.Context) error { return tx.Rollback(ctx) }
58+
return queries.New(pool).WithTx(tx), commit, rollback, nil
5759
}

cmd/internal/logging/logging.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import (
55
"log"
66
)
77

8-
const DateFormat string = "Mon Jan 2 15:04:05 MST 2006"
9-
108
// Logger holds a out and err logger
119
type Logger struct {
1210
Out *log.Logger

cmd/internal/services/recital_service.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,18 @@ func generateRecital(id int32, url string, pool *pgxpool.Pool, logger logging.Lo
4949
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute)
5050
defer cancel()
5151

52-
repository, _, err := db.NewRepositoryWithTx(ctx, pool)
52+
repository, commit, rollback, err := db.NewRepositoryWithTx(ctx, pool)
5353
if err != nil {
5454
return err
5555
}
56+
defer func() {
57+
// Rollback if an error occurred
58+
if err != nil {
59+
if err := rollback(ctx); err != nil {
60+
logger.Err.Println(err)
61+
}
62+
}
63+
}()
5664

5765
articleReader := article.NewReader(3 * time.Second)
5866
articleContent, err := articleReader.Read(url)
@@ -98,7 +106,12 @@ func generateRecital(id int32, url string, pool *pgxpool.Pool, logger logging.Lo
98106
if err := repository.UpdateRecitalStatus(ctx, queries.UpdateRecitalStatusParams{ID: id, Status: string(Completed)}); err != nil {
99107
return err
100108
}
109+
110+
if err := commit(ctx); err != nil {
111+
return err
112+
}
101113
logger.Out.Println("Successfully generated and persisted recital.")
114+
102115
return nil
103116
}
104117

0 commit comments

Comments
 (0)