Entities for the four wallet tables and a WalletRepository that the wallet processor will build on (PC-103). Every method goes through the caller's transaction, and writes and locks refuse to run without one: outside a transaction a lock is released as soon as it is taken and a balance could move without its ledger row. - LockWallet creates the wallet on first use, taking the organization from the customer, then locks it with SELECT ... FOR UPDATE. - LockWallets always locks in customer_id order so opposite transfers cannot deadlock. - AddBalance and ConsumeLot are conditional updates that return an error when they would overdraw, instead of tripping the CHECK constraint. - ListActiveLots returns unexpired lots with balance in K9 spending order. The tests need a real Postgres and run only when TEST_DATABASE_URL points at a migrated database. Both the lock and the lock ordering were checked by removing them and watching the tests fail (lost update, deadlock detected). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package entities
|
|
|
|
import "gorm.io/gorm"
|
|
|
|
func GetAllEntities() []interface{} {
|
|
return []interface{}{
|
|
&Organization{},
|
|
&Outlet{},
|
|
&OutletSetting{},
|
|
&User{},
|
|
&Category{},
|
|
&Product{},
|
|
&ProductVariant{},
|
|
&Inventory{},
|
|
&Order{},
|
|
&OrderItem{},
|
|
&PaymentMethod{},
|
|
&Payment{},
|
|
&Customer{},
|
|
&Table{},
|
|
&Vendor{},
|
|
&PurchaseOrder{},
|
|
&PurchaseOrderItem{},
|
|
&PurchaseOrderAttachment{},
|
|
&IngredientUnitConverter{},
|
|
// Gamification entities
|
|
&CustomerPoints{},
|
|
&CustomerTokens{},
|
|
&Tier{},
|
|
&Game{},
|
|
&GamePrize{},
|
|
&GamePlay{},
|
|
&OmsetTracker{},
|
|
&Reward{},
|
|
&Campaign{},
|
|
&CampaignRule{},
|
|
&OtpSession{},
|
|
// Analytics entities are not database tables, they are query results
|
|
&UserDevice{},
|
|
// Notification entities
|
|
&Notification{},
|
|
&NotificationReceiver{},
|
|
&NotificationDelivery{},
|
|
&ProductOutletPrice{},
|
|
&Expense{},
|
|
&CashAdvance{},
|
|
// Wallet entities
|
|
&CustomerWallet{},
|
|
&WalletTransaction{},
|
|
&WalletLot{},
|
|
&WalletLotAllocation{},
|
|
}
|
|
}
|
|
|
|
func AutoMigrate(db *gorm.DB) error {
|
|
return db.AutoMigrate(GetAllEntities()...)
|
|
}
|