fix: P1 activation path hardening - Bug 4-9
Bug 4: resolveRenewalActivationSubscription - add fallback by user_id+subscribe_id with SELECT FOR UPDATE when token lookup fails Bug 5: appleIAPNotifyLogic - return error on product ID mapping failure instead of silently dropping the notification Bug 6: NewPurchase fallback query - wrap in transaction with SELECT FOR UPDATE to prevent concurrent duplicate subscription creation Bug 7: appleIAPNotifyLogic - fix UserId=0 by reverse-lookup from original purchase order; create renewal audit order record for DID_RENEW/SUBSCRIBED notifications Bug 8: UpdateOrderStatus - pre-delete cache before DB write (double-delete) to close TOCTOU window between DB update and cache invalidation Bug 9: validateNewUserOnlyEligibilityAtActivation - add Redis distributed lock on user_id to serialise concurrent new-user-only order activations Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
@@ -110,6 +110,10 @@ func (m *customOrderModel) UpdateOrderStatus(ctx context.Context, orderNo string
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
keys := m.getCacheKeys(orderInfo)
|
||||
// Pre-delete: evict cache before the DB write so concurrent reads during the update
|
||||
// window go to DB instead of getting a stale cached status (double-delete pattern).
|
||||
_ = m.DelCacheCtx(ctx, keys...)
|
||||
return m.ExecCtx(ctx, func(conn *gorm.DB) error {
|
||||
if len(tx) > 0 {
|
||||
conn = tx[0]
|
||||
@@ -123,7 +127,7 @@ func (m *customOrderModel) UpdateOrderStatus(ctx context.Context, orderNo string
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
}, m.getCacheKeys(orderInfo)...)
|
||||
}, keys...)
|
||||
}
|
||||
|
||||
// FindOneDetailsByOrderNo Find order details by order number
|
||||
|
||||
Reference in New Issue
Block a user