marketplace/service.go was at 1737 LOC with nine distinct concerns
crammed into one file. The refund flow is the most cleanly isolated :
no caller outside the file, no shared helpers, all four refund-related
sentinels declared right next to the methods that use them. Lifted
into service_refunds.go without touching signatures.
What moved (5 declarations + 5 functions, 397 LOC) :
- refundProvider interface
- ErrOrderNotRefundable, ErrRefundNotAvailable, ErrRefundForbidden,
ErrRefundAlreadyRequested sentinels
- RefundOrder (Phase 1/2/3 PSP coordination)
- ProcessRefundWebhook (Hyperswitch webhook dispatcher)
- finalizeSuccessfulRefund (terminal: succeeded)
- finalizeFailedRefund (terminal: failed)
- reverseSellerAccounting (helper: undo seller balance + transfers)
Same package (marketplace), same Service receiver — pure code-org
move. `go build ./internal/core/marketplace/...` clean ;
`go test ./internal/core/marketplace -short` passes.
service.go is now 1340 LOC ; eight other concerns remain in it
(product CRUD, order create/list/get + payment webhook, seller
transfers, promo codes, downloads, seller stats, reviews, invoices).
Future splits should follow the same pattern : one file per cohesive
concern, sentinels co-located with the methods that use them, no
signature changes. Recommended order if continuing :
service_orders.go (CreateOrder + ProcessPaymentWebhook +
processSellerTransfers + Hyperswitch
webhook helpers — ~700 LOC, biggest
remaining cluster)
service_seller_stats.go (4 stats methods — ~150 LOC)
service_reviews.go (CreateReview + ListReviews — ~100 LOC)
Behaviour-preserving by construction. No tests changed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>