fix(users): avoid promo activation FK conflict on user deletion
This commit is contained in:
+14
-2
@@ -344,13 +344,25 @@ async def delete_user_and_relations(session: AsyncSession, user_id: int) -> bool
|
|||||||
or_(MessageLog.user_id == user_id, MessageLog.target_user_id == user_id)
|
or_(MessageLog.user_id == user_id, MessageLog.target_user_id == user_id)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
await session.execute(delete(Payment).where(Payment.user_id == user_id))
|
|
||||||
|
user_payment_ids_subquery = select(Payment.payment_id).where(Payment.user_id == user_id)
|
||||||
|
|
||||||
|
# Keep activations of other users intact if they reference this user's payments
|
||||||
await session.execute(
|
await session.execute(
|
||||||
delete(Subscription).where(Subscription.user_id == user_id)
|
update(PromoCodeActivation)
|
||||||
|
.where(
|
||||||
|
PromoCodeActivation.payment_id.in_(user_payment_ids_subquery),
|
||||||
|
PromoCodeActivation.user_id != user_id,
|
||||||
|
)
|
||||||
|
.values(payment_id=None)
|
||||||
)
|
)
|
||||||
await session.execute(
|
await session.execute(
|
||||||
delete(PromoCodeActivation).where(PromoCodeActivation.user_id == user_id)
|
delete(PromoCodeActivation).where(PromoCodeActivation.user_id == user_id)
|
||||||
)
|
)
|
||||||
|
await session.execute(delete(Payment).where(Payment.user_id == user_id))
|
||||||
|
await session.execute(
|
||||||
|
delete(Subscription).where(Subscription.user_id == user_id)
|
||||||
|
)
|
||||||
await session.execute(
|
await session.execute(
|
||||||
delete(UserPaymentMethod).where(UserPaymentMethod.user_id == user_id)
|
delete(UserPaymentMethod).where(UserPaymentMethod.user_id == user_id)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user