|
Some checks failed
Frontend CI / test (push) Failing after 0s
Two seller-facing mutations followed the same buggy pattern:
1. s.db.Delete(...all existing rows...) ← committed immediately
2. for range inputs { s.db.Create(new) } ← if any fails mid-loop,
deletes are already
committed → product
left in an inconsistent
state (0 images or
0 licenses) until the
seller retries.
Affected:
- Service.UpdateProductImages — 0 images = product page broken
- Service.SetProductLicenses — 0 licenses = product unsellable
Fix: wrap each function body in s.db.WithContext(ctx).Transaction,
using tx.* instead of s.db.* throughout. Rollback on any error in
the loop restores the previous images/licenses.
Side benefit: ctx is now propagated into the reads (WithContext on
the transaction root), so timeout middleware applies to the whole
sequence — previously the reads bypassed request timeouts.
Tests: ./internal/core/marketplace/ green (0.478s). go build + vet
clean.
Scope:
- Subscription service already uses Transaction() for multi-step
mutations (service.go:287, :395); its single-row Saves
(scheduleDowngrade, CancelSubscription) are atomic by nature.
- Wishlist / cart / education / discover core services audited —
no matching DELETE+LOOP-CREATE pattern found.
- Single-row mutations (AddProductPreview, UpdateProduct) don't
need wrapping — atomic in Postgres.
Refs: AUDIT_REPORT.md §4.4 "Transactions insuffisantes" + §9 #3
(critical: marketplace/service.go transactions manquantes).
Narrower than the original audit flagged — real bugs were these 2
functions, not the broader "1050+" region.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| admin | ||
| analytics | ||
| auth | ||
| collaboration | ||
| connecterrors | ||
| discover | ||
| distribution | ||
| education | ||
| feed | ||
| marketplace | ||
| moderation | ||
| social | ||
| subscription | ||
| track | ||